From e341d07d6b3359dc1659e78916ba03adb1698feb Mon Sep 17 00:00:00 2001 From: Ryan Lue Date: Wed, 1 Aug 2018 17:25:38 +0800 Subject: [PATCH] Stop wrapping tags around URLs without a scheme/protocol (fixes #2139) --- lib/html_sanitizer.rb | 26 +++++++++----------------- test/data/mail/mail003.yml | 2 +- test/unit/aaa_string_test.rb | 32 ++------------------------------ 3 files changed, 12 insertions(+), 48 deletions(-) diff --git a/lib/html_sanitizer.rb b/lib/html_sanitizer.rb index a83892bf9..c4975898b 100644 --- a/lib/html_sanitizer.rb +++ b/lib/html_sanitizer.rb @@ -1,4 +1,5 @@ class HtmlSanitizer + LINKABLE_URL_SCHEMES = URI.scheme_list.keys.map(&:downcase) - ['mailto'] + ['tel'] =begin @@ -25,23 +26,14 @@ satinize html string based on whiltelist scrubber_link = Loofah::Scrubber.new do |node| - # check if text has urls which need to be clickable - if node&.name != 'a' && node.parent && node.parent.name != 'a' && (!node.parent.parent || node.parent.parent.name != 'a') - if node.class == Nokogiri::XML::Text - urls = [] - node.content.scan(%r{((http|https|ftp|tel)://.+?)([[:space:]]|\.[[:space:]]|,[[:space:]]|\.$|,$|\)|\(|$)}mxi).each do |match| - if match[0] - urls.push match[0].to_s.strip - end - end - node.content.scan(/(^|:|;|\s)(www\..+?)([[:space:]]|\.[[:space:]]|,[[:space:]]|\.$|,$|\)|\(|$)/mxi).each do |match| - if match[1] - urls.push match[1].to_s.strip - end - end - next if urls.blank? - add_link(node.content, urls, node) - end + # wrap plain-text URLs in tags + if node.is_a?(Nokogiri::XML::Text) && node.ancestors.map(&:name).exclude?('a') + urls = URI.extract(node.content, LINKABLE_URL_SCHEMES) + .map { |u| u.sub(/[,.]$/, '') } # URI::extract captures trailing dots/commas + .reject { |u| u.match?(/^[^:]+:$/) } # URI::extract will match, e.g., 'tel:' + + next if urls.blank? + add_link(node.content, urls, node) end # prepare links diff --git a/test/data/mail/mail003.yml b/test/data/mail/mail003.yml index 90b7de8db..d6c1f8993 100644 --- a/test/data/mail/mail003.yml +++ b/test/data/mail/mail003.yml @@ -6,7 +6,7 @@ subject: Ticket Templates content_type: text/html body: |-
-

Hallo Martin,

 

ich möchte mich gern für den Beta-Test für die Ticket Templates unter XXXX 2.4 anmelden.

 

 

Mit freundlichen Grüßen

John Günther

 

example.com – profitieren Sie vom umfangreichen Daten-Netzwerk

 

_ __ ___ ____________________________ ___ __ _

 

Example GmbH

Some What

 

Sitz: Someware-Straße 9, XXXXX Someware

 

M: +49 (0) XXX XX XX 70

T: +49 (0) XXX XX XX 22

F: +49 (0) XXX XX XX 11

W: http://www.example.de

 

Geschäftsführer: John Smith

HRB XXXXXX AG Someware

St.-Nr.: 112/107/05858

 

ISO 9001:2008 Zertifiziert -Qualitätsstandard mit Zukunft

_ __ ___ ____________________________ ___ __ _

 

Diese Information ist ausschließlich für den Adressaten bestimmt und kann vertrauliche oder gesetzlich geschützte Informationen enthalten. Wenn Sie nicht der bestimmungsgemäße Adressat sind, unterrichten Sie bitte den Absender und vernichten Sie diese Mail. Anderen als dem bestimmungsgemäßen Adressaten ist es untersagt, diese E-Mail zu lesen, zu speichern, weiterzuleiten oder ihren Inhalt auf welche Weise auch immer zu verwenden.

 

+

Hallo Martin,

 

ich möchte mich gern für den Beta-Test für die Ticket Templates unter XXXX 2.4 anmelden.

 

 

Mit freundlichen Grüßen

John Günther

 

example.com – profitieren Sie vom umfangreichen Daten-Netzwerk

 

_ __ ___ ____________________________ ___ __ _

 

Example GmbH

Some What

 

Sitz: Someware-Straße 9, XXXXX Someware

 

M: +49 (0) XXX XX XX 70

T: +49 (0) XXX XX XX 22

F: +49 (0) XXX XX XX 11

W: www.example.de

 

Geschäftsführer: John Smith

HRB XXXXXX AG Someware

St.-Nr.: 112/107/05858

 

ISO 9001:2008 Zertifiziert -Qualitätsstandard mit Zukunft

_ __ ___ ____________________________ ___ __ _

 

Diese Information ist ausschließlich für den Adressaten bestimmt und kann vertrauliche oder gesetzlich geschützte Informationen enthalten. Wenn Sie nicht der bestimmungsgemäße Adressat sind, unterrichten Sie bitte den Absender und vernichten Sie diese Mail. Anderen als dem bestimmungsgemäßen Adressaten ist es untersagt, diese E-Mail zu lesen, zu speichern, weiterzuleiten oder ihren Inhalt auf welche Weise auch immer zu verwenden.

 

Von: Fritz Bauer [mailto:me@example.com]
Gesendet: Donnerstag, 3. Mai 2012 11:51
An: John Smith
Cc: Smith, John Marian; johnel.fratczak@example.com; ole.brei@example.com; Günther John | Example GmbH; bkopon@example.com; john.heisterhagen@team.example.com; sven.rocked@example.com; michael.house@example.com; tgutzeit@example.com
Betreff: Re: OTRS::XXX Erweiterung - Anhänge an CI's

 

Hallo,

 

ich versuche an den Punkten anzuknüpfen.

 

a) LDAP Muster Konfigdatei

 

diff --git a/test/unit/aaa_string_test.rb b/test/unit/aaa_string_test.rb index cee19da8f..e1068e711 100644 --- a/test/unit/aaa_string_test.rb +++ b/test/unit/aaa_string_test.rb @@ -616,31 +616,7 @@ Men-----------------------' assert_equal(result, html.html2html_strict) html = 'some text www.example.com some other text' - result = 'some text http://www.example.com some other text' - assert_equal(result, html.html2html_strict) - - html = 'some textwwwsome other text' - result = 'some textwwwsome other text' - assert_equal(result, html.html2html_strict) - - html = 'some text wwwsome other text' - result = 'some text wwwsome other text' - assert_equal(result, html.html2html_strict) - - html = 'some text www.some.dom other text' - result = 'some text http://www.some.dom other text' - assert_equal(result, html.html2html_strict) - - html = 'www.some.dom other text' - result = 'http://www.some.dom other text' - assert_equal(result, html.html2html_strict) - - html = 'www.some.dom' - result = 'http://www.some.dom' - assert_equal(result, html.html2html_strict) - - html = 'web:www.some.dom other text' - result = 'web:http://www.some.dom other text' + result = 'some text www.example.com some other text' assert_equal(result, html.html2html_strict) html = 'http://what-different.example.com' @@ -1003,11 +979,7 @@ html.html2html_strict assert_equal(result, html.html2html_strict) html = "
Dear Bob:Mr/Mrs

We are one of the leading manufacturer and supplier of conduits and cars since 3000.

Could you inform me the specification you need?

May I sent you our products catalogues for your reference?

Best regards!

Welcome to our booth B11/1 Hall 13 during SOMEWHERE\n9999.
Bob Smith
Exp. & Imp.
Town Example Electric Co., Ltd.
Tel: 0000-11-12345678 (Ext-220)  Fax: 0000-11-12345678 
Room1234, NO. 638, Smith Road, Town, 200000, Somewhere
Web: www.example.com
" - result = "
-
Dear Bob:Mr/Mrs
 
We are one of the leading manufacturer and supplier of conduits and cars since 3000.
 
Could you inform me the specification you need?
 
May I sent you our products catalogues for your reference?
 
Best regards!
 
Welcome to our booth B11/1 Hall 13 during SOMEWHERE 9999.
-
Bob Smith
-
Exp. & Imp.
Town Example Electric Co., Ltd.
Tel: 0000-11-12345678 (Ext-220) Fax: 0000-11-12345678
Room1234, NO. 638, Smith Road, Town, 200000, Somewhere
" + result = "
\n
Dear Bob:Mr/Mrs
 
We are one of the leading manufacturer and supplier of conduits and cars since 3000.
 
Could you inform me the specification you need?
 
May I sent you our products catalogues for your reference?
 
Best regards!
 
Welcome to our booth B11/1 Hall 13 during SOMEWHERE 9999.
\n
Bob Smith
\n
Exp. & Imp.
Town Example Electric Co., Ltd.
Tel: 0000-11-12345678 (Ext-220) Fax: 0000-11-12345678
Room1234, NO. 638, Smith Road, Town, 200000, Somewhere
Web: www.example.com
" assert_equal(result, html.html2html_strict) html = '
  • Luxemburg
  • '