From 56846b2fe9ff5b50ce0b8c0c05ceee5172e9d0ec Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Tue, 2 Jan 2018 01:36:05 +0100 Subject: [PATCH] Allow a href for paste, images and text link with different content. --- .../app/lib/app_post/image_service.coffee | 40 ++++++--- .../javascripts/app/lib/app_post/utils.coffee | 9 ++- .../app/lib/base/jquery.contenteditable.js | 34 ++++---- .../javascripts/app/models/ticket.coffee | 2 + lib/html_sanitizer.rb | 41 +++------- public/assets/tests/html_utils.js | 9 ++- test/unit/aaa_string_test.rb | 23 +++--- test/unit/email_parser_test.rb | 81 ++++++++++--------- test/unit/email_process_test.rb | 6 +- test/unit/html_sanitizer_test.rb | 18 ++--- test/unit/ticket_xss_test.rb | 4 +- 11 files changed, 142 insertions(+), 125 deletions(-) diff --git a/app/assets/javascripts/app/lib/app_post/image_service.coffee b/app/assets/javascripts/app/lib/app_post/image_service.coffee index eb8eba5c6..5b0656e74 100644 --- a/app/assets/javascripts/app/lib/app_post/image_service.coffee +++ b/app/assets/javascripts/app/lib/app_post/image_service.coffee @@ -20,37 +20,53 @@ class App.ImageService imageWidth = imageObject.width imageHeight = imageObject.height console.log('ImageService', 'current size', imageWidth, imageHeight) + console.log('ImageService', 'sizeFactor', sizeFactor) if y is 'auto' && x is 'auto' x = imageWidth y = imageHeight + # set max x/y + if x isnt 'auto' && x > imageWidth + x = imageWidth + + if y isnt 'auto' && y > imageHeight + y = imageHeight + # get auto dimensions - if y is 'auto' + if y is 'auto'# && (y * factor) >= imageHeight factor = imageWidth / x y = imageHeight / factor - if x is 'auto' + if x is 'auto'# && (y * factor) >= imageWidth factor = imageWidth / y x = imageHeight / factor + canvas = document.createElement('canvas') + # check if resize is needed resize = false - if x < imageWidth || y < imageHeight + if (x < imageWidth && (x * sizeFactor < imageWidth)) || (y < imageHeight && (y * sizeFactor < imageHeight)) resize = true x = x * sizeFactor y = y * sizeFactor + + # set dimensions + canvas.width = x + canvas.height = y + + # draw image on canvas and set image dimensions + context = canvas.getContext('2d') + context.drawImage(imageObject, 0, 0, x, y) + else - x = imageWidth - y = imageHeight - # create canvas and set dimensions - canvas = document.createElement('canvas') - canvas.width = x - canvas.height = y + # set dimensions + canvas.width = imageWidth + canvas.height = imageHeight - # draw image on canvas and set image dimensions - context = canvas.getContext('2d') - context.drawImage(imageObject, 0, 0, x, y) + # draw image on canvas and set image dimensions + context = canvas.getContext('2d') + context.drawImage(imageObject, 0, 0, imageWidth, imageHeight) # set quallity based on image size if quallity == 'auto' diff --git a/app/assets/javascripts/app/lib/app_post/utils.coffee b/app/assets/javascripts/app/lib/app_post/utils.coffee index 6b7c21eef..e626d0ab3 100644 --- a/app/assets/javascripts/app/lib/app_post/utils.coffee +++ b/app/assets/javascripts/app/lib/app_post/utils.coffee @@ -5,6 +5,8 @@ class App.Utils 'TD': ['abbr', 'align', 'axis', 'colspan', 'headers', 'rowspan', 'valign', 'width', 'style'] 'TH': ['abbr', 'align', 'axis', 'colspan', 'headers', 'rowspan', 'scope', 'sorted', 'valign', 'width', 'style'] 'TR': ['width', 'style'] + 'A': ['href', 'hreflang', 'name', 'rel'] + 'IMG': ['align', 'alt', 'border', 'height', 'src', 'srcset', 'width', 'style'] @mapCss: 'TABLE': [ @@ -75,6 +77,9 @@ class App.Utils 'border-bottom-color', 'border-left-color', ] + 'IMG': [ + 'width', 'height', + ] # textCleand = App.Utils.textCleanup(rawText) @textCleanup: (ascii) -> @@ -279,7 +284,7 @@ class App.Utils @_removeWordMarkup(html) # remove tags, keep content - html.find('a, font, small, time, form, label').replaceWith( -> + html.find('font, small, time, form, label').replaceWith( -> $(@).contents() ) @@ -303,7 +308,7 @@ class App.Utils ) # remove tags & content - html.find('font, img, svg, input, select, button, style, applet, embed, noframes, canvas, script, frame, iframe, meta, link, title, head, fieldset').remove() + html.find('font, svg, input, select, button, style, applet, embed, noframes, canvas, script, frame, iframe, meta, link, title, head, fieldset').remove() # remove style and class @_cleanAttributes(html) diff --git a/app/assets/javascripts/app/lib/base/jquery.contenteditable.js b/app/assets/javascripts/app/lib/base/jquery.contenteditable.js index a82a036dc..85618ba36 100644 --- a/app/assets/javascripts/app/lib/base/jquery.contenteditable.js +++ b/app/assets/javascripts/app/lib/base/jquery.contenteditable.js @@ -289,15 +289,16 @@ var result = e.target.result var img = document.createElement('img') img.src = result + maxWidth = _this.$element.width() || 500 + scaleFactor = 2 + //scaleFactor = 1 + //if (window.isRetina && window.isRetina()) { + // scaleFactor = 2 + //} - insert = function(dataUrl, width, height, isRetina) { + insert = function(dataUrl, width, height, isResized) { //console.log('dataUrl', dataUrl) - - // adapt image if we are on retina devices - if (!isRetina && window.isRetina && window.isRetina()) { - width = width / 2 - height = height / 2 - } + //console.log('scaleFactor', scaleFactor, isResized, maxWidth, width, height) _this.log('image inserted') result = dataUrl if (_this.options.imageWidth == 'absolute') { @@ -310,7 +311,7 @@ } // resize if to big - App.ImageService.resize(img.src, 460, 'auto', 2, 'image/jpeg', 'auto', insert) + App.ImageService.resize(img.src, maxWidth, 'auto', scaleFactor, 'image/jpeg', 'auto', insert) } reader.readAsDataURL(imageFile) imageInserted = true @@ -416,17 +417,18 @@ var result = e.target.result var img = document.createElement('img') img.src = result + maxWidth = _this.$element.width() || 500 + scaleFactor = 2 + //scaleFactor = 1 + //if (window.isRetina && window.isRetina()) { + // scaleFactor = 2 + //} //Insert the image at the carat - insert = function(dataUrl, width, height, isRetina) { - - // adapt image if we are on retina devices - if (!isRetina && window.isRetina && window.isRetina()) { - width = width / 2 - height = height / 2 - } + insert = function(dataUrl, width, height, isResized) { //console.log('dataUrl', dataUrl) + //console.log('scaleFactor', scaleFactor, isResized, maxWidth, width, height) _this.log('image inserted') result = dataUrl if (_this.options.imageWidth == 'absolute') { @@ -454,7 +456,7 @@ } // resize if to big - App.ImageService.resize(img.src, 460, 'auto', 2, 'image/jpeg', 'auto', insert) + App.ImageService.resize(img.src, maxWidth, 'auto', scaleFactor, 'image/jpeg', 'auto', insert) }) reader.readAsDataURL(file) } diff --git a/app/assets/javascripts/app/models/ticket.coffee b/app/assets/javascripts/app/models/ticket.coffee index 463e400c9..fb8b879b1 100644 --- a/app/assets/javascripts/app/models/ticket.coffee +++ b/app/assets/javascripts/app/models/ticket.coffee @@ -246,6 +246,8 @@ class App.Ticket extends App.Model result editable: -> + user_id = App.Session.get('id') + return true if user_id is @customer_id group_ids = App.Session.get('group_ids') if _.isEmpty(group_ids[@group_id]) return false diff --git a/lib/html_sanitizer.rb b/lib/html_sanitizer.rb index 4d1d73ac8..d54a5f0fe 100644 --- a/lib/html_sanitizer.rb +++ b/lib/html_sanitizer.rb @@ -24,35 +24,6 @@ satinize html string based on whiltelist scrubber_link = Loofah::Scrubber.new do |node| - # check if href is different to text - if node.name == 'a' && !url_same?(node['href'], node.text) - if node['href'].blank? - node.replace node.children.to_s - Loofah::Scrubber::STOP - elsif ((node.children.blank? || node.children.first.class == Nokogiri::XML::Text) && node.text.present?) || (node.children.size == 1 && node.children.first.content == node.content && node.content.present?) - if node.text.downcase.start_with?('http', 'ftp', '//') - a = Nokogiri::XML::Node.new 'a', node.document - a['href'] = node['href'] - a['rel'] = 'nofollow noreferrer noopener' - a['target'] = '_blank' - a.content = node['href'] - node.add_previous_sibling(a) - text = Nokogiri::XML::Text.new(' (', node.document) - node.add_previous_sibling(text) - node['href'] = cleanup_target(node.text) - else - text = Nokogiri::XML::Text.new("#{node.text} (", node.document) - node.add_previous_sibling(text) - node.content = cleanup_target(node['href']) - node['href'] = cleanup_target(node['href']) - end - text = Nokogiri::XML::Text.new(')', node.document) - node.add_next_sibling(text) - else - node.content = cleanup_target(node['href']) - end - end - # 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 @@ -84,6 +55,18 @@ satinize html string based on whiltelist node.set_attribute('rel', 'nofollow noreferrer noopener') node.set_attribute('target', '_blank') end + + if node.name == 'a' && node['href'].blank? + node.replace node.children.to_s + Loofah::Scrubber::STOP + end + + # check if href is different to text + if node.name == 'a' && !url_same?(node['href'], node.text) + if node['title'].blank? + node['title'] = node['href'] + end + end end scrubber_wipe = Loofah::Scrubber.new do |node| diff --git a/public/assets/tests/html_utils.js b/public/assets/tests/html_utils.js index 4c60dd4f6..10f2f1d48 100644 --- a/public/assets/tests/html_utils.js +++ b/public/assets/tests/html_utils.js @@ -522,12 +522,12 @@ test("htmlCleanup", function() { var source = "
test
" //var should = "
test
" - var should = "test" + var should = "test" var result = App.Utils.htmlCleanup($(source)) equal(result.html(), should, source) source = "
test
" - should = "test" + should = "test" result = App.Utils.htmlCleanup(source) equal(result.html(), should, source) @@ -546,6 +546,11 @@ test("htmlCleanup", function() { result = App.Utils.htmlCleanup($(source)) equal(result.html(), should, source) + source = "

some link to somewhere

" + should = "some link to somewhere" + result = App.Utils.htmlCleanup($(source)) + equal(result.html(), should, source) + source = "

some link to somewhere

" should = "

some link to somewhere

" result = App.Utils.htmlCleanup($(source)) diff --git a/test/unit/aaa_string_test.rb b/test/unit/aaa_string_test.rb index 70f2da1be..f7b61ab6e 100644 --- a/test/unit/aaa_string_test.rb +++ b/test/unit/aaa_string_test.rb @@ -644,7 +644,11 @@ Men-----------------------' assert_equal(result, html.html2html_strict) html = 'http://what-different.example.com' - result = "http://example.com (http://what-different.example.com)" + result = "http://what-different.example.com" + assert_equal(result, html.html2html_strict) + + html = 'http://what-different.example.com' + result = "http://what-different.example.com" assert_equal(result, html.html2html_strict) html = 'http://EXAMPLE.com' @@ -676,7 +680,7 @@ Men-----------------------' assert_equal(result, html.html2html_strict) html = "" - result = 'http://example.com/?abc=123&123=abc' + result = '' assert_equal(result, html.html2html_strict) html = '

https://wiki.lab.example.com/doku.php?id=xxxx:start&#ldap

' @@ -721,7 +725,7 @@ Men-----------------------' assert_equal(result, html.html2html_strict) html = "Damit Sie keinen Tag versäumen, empfehlen wir Ihnen den Link des Adventkalenders in
      Ihrer Lesezeichen-Symbolleiste zu ergänzen.

 " - result = "Damit Sie keinen Tag versäumen, empfehlen wir Ihnen den Link des Adventkalenders (http://newsletters.cylex.de/) in
Ihrer Lesezeichen-Symbolleiste zu ergänzen.
" + result = "Damit Sie keinen Tag versäumen, empfehlen wir Ihnen den Link des Adventkalenders in
Ihrer Lesezeichen-Symbolleiste zu ergänzen.
" assert_equal(result, html.html2html_strict) html = 'Hello Mr Smith,' @@ -955,18 +959,15 @@ html.html2html_strict assert_equal(result, html.html2html_strict) html = '

' - #result = '

http://www.example.com/

' - result = '

http://www.example.com/

' + result = '

' assert_equal(result, html.html2html_strict) html = '

' - #result = '

http://www.example.com/?wm=mail

' - result = '

http://www.example.com/?wm=mail

' + result = '

' assert_equal(result, html.html2html_strict) html = '

' - #result = '

http://www.example.com/?wm=mail

' - result = '

http://www.example.com/?wm=mail

' + result = '

' assert_equal(result, html.html2html_strict) html = '
Wir brauchen also die Instanz example.zammad.com, kann die aber nicht mehr nutzen.

Bitte um Freischaltung.


' @@ -980,7 +981,7 @@ html.html2html_strict assert_equal(result, html.html2html_strict) html = '
http://www.example.com/Community/Passwort-Vergessen/?module_fnc%5BextranetHandler%5D=ChangeForgotPassword&pwchangekey=66901c449dda98a098de4b57ccdf0805
' - result = "
\nhttp://www.example.com/Community/Passwort-Vergessen/?module_fnc=ChangeForgotPassword&pwchangekey=66901c449dda98a098de4b57ccdf0805 (http://www.example.com/Community/Passwort-Vergessen/?module_fnc%5BextranetHandler%5D=ChangeForgotPassword&pwchangekey=66901c449dda98a098de4b57ccdf0805)
" + result = '
http://www.example.com/Community/Passwort-Vergessen/?module_fnc%5BextranetHandler%5D=ChangeForgotPassword&pwchangekey=66901c449dda98a098de4b57ccdf0805
' assert_equal(result, html.html2html_strict) html = '

 

20-29
200
-1
201
country
Target (gross)
Remaining Recruits
Total Recruits
' @@ -1010,7 +1011,7 @@ html.html2html_strict assert_equal(result, html.html2html_strict) html = '
  • Luxemburg
  • ' - result = '
  • Luxemburg (http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0bmFvY3B0LXlhbW9sc2Nhb3NnYy5lL3RpbXJlZi9lbS9ycnJuaWFpZXMsdGxnY25pLGUsdXJ0b3NVTGVpNWZ8fGZh)
  • ' + result = '
  • Luxemburg
  • ' assert_equal(result, html.html2html_strict) end diff --git a/test/unit/email_parser_test.rb b/test/unit/email_parser_test.rb index e0bd4808e..46575969e 100644 --- a/test/unit/email_parser_test.rb +++ b/test/unit/email_parser_test.rb @@ -42,7 +42,7 @@ Old programmers never die. They just branch to a new address. }, { data: IO.binread('test/fixtures/mail3.box'), - body_md5: '4681e5d8ee07ea0b53dfeaf5789c5a00', + body_md5: '0b6eb998e8903ba69a3528dedb5a5476', params: { from: '"Günther John | Example GmbH" ', from_email: 'k.guenther@example.com', @@ -50,7 +50,7 @@ Old programmers never die. They just branch to a new address. 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 (http://www.GeoFachDatenServer.de) – 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: 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.

     

    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

     

    @@ -115,14 +115,14 @@ Liebe Grüße! }, { data: IO.binread('test/fixtures/mail6.box'), - body_md5: 'a05afcf7de7be17e74f191a58974f682', + body_md5: '849105bdee623b4314b4c3daa2495471', params: { from: '"Hans BÄKOSchönland" ', from_email: 'me@bogen.net', from_display_name: 'Hans BÄKOSchönland', subject: 'utf8: 使って / ISO-8859-1: Priorität" / cp-1251: Сергей Углицких', content_type: 'text/html', - body: "

    this is a test



    Compare Cable, DSL or Satellite plans: As low as $2.95. (http://localhost/8HMZENUS/2737??PS=)

    Test1:–
    Test2:&
    Test3:∋
    Test4:&
    Test5:=", + body: "

    this is a test



    Compare Cable, DSL or Satellite plans: As low as $2.95.

    Test1:–
    Test2:&
    Test3:∋
    Test4:&
    Test5:=", }, }, #

    @@ -320,7 +320,7 @@ Managing Director: Martin Edenhofer }, { data: IO.binread('test/fixtures/mail11.box'), - body_md5: 'b211c9c28282ad0dd3fccbbf37d9928d', + body_md5: '260a815b0a7897e4219d210010008202', attachments: [ { md5: '08660cd33ce8c64b95bcf0207ff6c4d6', @@ -340,26 +340,29 @@ Managing Director: Martin Edenhofer

    -http://newsletters.cylex.de/ref/www.cylex.de/sid-105/uid-4134001/lid-2/http://web2.cylex.de/advent2012?b2b

    Lieber CYLEX Eintragsinhaber,

    das Jahr neigt sich dem Ende und die besinnliche Zeit beginnt laut Kalender mit dem
    1. Advent. Und wie immer wird es in der vorweihnachtlichen Zeit meist beruflich und privat
    so richtig schön hektisch.

    Um Ihre Weihnachtsstimmung in Schwung zu bringen kommen wir nun mit unserem Adventskalender ins Spiel. Denn 24 Tage werden Sie unsere netten Geschichten, Rezepte und Gewinnspiele sowie ausgesuchte Geschenktipps und Einkaufsgutscheine online begleiten. Damit lässt sich Ihre Freude auf das Fest garantiert mit jedem Tag steigern.

    +

    Lieber CYLEX Eintragsinhaber,

    das Jahr neigt sich dem Ende und die besinnliche Zeit beginnt laut Kalender mit dem
    1. Advent. Und wie immer wird es in der vorweihnachtlichen Zeit meist beruflich und privat
    so richtig schön hektisch.

    Um Ihre Weihnachtsstimmung in Schwung zu bringen kommen wir nun mit unserem Adventskalender ins Spiel. Denn 24 Tage werden Sie unsere netten Geschichten, Rezepte und Gewinnspiele sowie ausgesuchte Geschenktipps und Einkaufsgutscheine online begleiten. Damit lässt sich Ihre Freude auf das Fest garantiert mit jedem Tag steigern.

    Einen gemütlichen Start in die Adventszeit wünscht Ihnen -http://newsletters.cylex.de/ref/www.cylex.de/sid-105/uid-4134001/lid-1/http://web2.cylex.de/advent2012?b2b +

    Ihr CYLEX Team

    -P.S. Damit Sie keinen Tag versäumen, empfehlen wir Ihnen den Link des Adventkalenders (http://newsletters.cylex.de/ref/www.cylex.de/sid-105/uid-4134001/lid-3/http://web2.cylex.de/advent2012?b2b) in
    Ihrer Lesezeichen-Symbolleiste zu ergänzen.

     

    +P.S. Damit Sie keinen Tag versäumen, empfehlen wir Ihnen den Link des Adventkalenders in
    Ihrer Lesezeichen-Symbolleiste zu ergänzen.

     

    +
    serviceteam@cylex.de
    +Homepage
    +Newsletter abbestellen +
    Impressum
    S.C. CYLEX INTERNATIONAL S.N.C.
    Sat. Palota 119/A RO 417516 Palota Romania
    Tel.: +49 208/62957-0 |
    Geschäftsführer: Francisc Osvald
    Handelsregister: J05/1591/2009
    USt.IdNr.: RO26332771
    -
    serviceteam@cylex.de
    Homepage (http://newsletters.cylex.de/ref/www.cylex.de/sid-105/uid-4134001/lid-98/http://web2.cylex.de/Homepage/Home.asp)
    Newsletter abbestellen (http://newsletters.cylex.de/ref/www.cylex.de/sid-105/uid-4134001/lid-99/http://newsletters.cylex.de/unsubscribe.aspx?uid=4134001&d=www.cylex.de&e=enjoy@znuny.com&sc=3009&l=d)
    ", @@ -506,7 +509,7 @@ Managing Director: Martin Edenhofer }, { data: IO.binread('test/fixtures/mail20.box'), - body_md5: '7cdfb67ce7bf914fa0a5b85f0a365fdc', + body_md5: '56ad8d02f4c7641fd2bb8ebf484d36d7', params: { from: 'Health and Care-Mall ', from_email: 'drugs-cheapest8@sicor.com', @@ -520,7 +523,7 @@ Managing Director: Martin Edenhofer óû5aHw5³½IΨµÁxG⌊o8KHCmς9-Ö½23QgñV6UAD¿ùAX←t¨Lf7⊕®Ir²r½TLA5pYJhjV gPnãM36V®E89RUDΤÅ©ÈI9æsàCΘYEϒAfg∗bT¡1∫rIoiš¦O5oUIN±IsæSعPp Ÿÿq1FΧ⇑eGOz⌈F³R98y§ 74”lTr8r§HÐæuØEÛPËq VmkfB∫SKNElst4S∃Á8üTðG°í lY9åPu×8>RÒ¬⊕ΜIÙzÙCC4³ÌQEΡºSè!XgŒs. -çγ⇓BcwspC L I C K H E R Eëe3¸ ! (http://pxmzcgy.storeprescription.ru?zz=fkxffti)Calm dylan for school today.
    Closing the nursery with you down. Here and made the mess. Maybe the oï from under his mother. Song of course beth touched his pants.
    When someone who gave up from here. Feel of god knows what. +çγ⇓BcwspC L I C K H E R Eëe3¸ !Calm dylan for school today.
    Closing the nursery with you down. Here and made the mess. Maybe the oï from under his mother. Song of course beth touched his pants.
    When someone who gave up from here. Feel of god knows what. TBϖ∃M5T5ΕEf2û–N¶ÁvΖ'®⇓∝5SÐçË5 Χ0jΔHbAgþE—2i6A2lD⇑LGjÓnTOy»¦Hëτ9’:Their mother and tugged it seemed like @@ -595,7 +598,7 @@ Managing Director: Martin Edenhofer }, { data: IO.binread('test/fixtures/mail21.box'), - body_md5: '380ca2bca1d7e013abd4109459a06fac', + body_md5: '7cb50fe6b37420fe9aea61eb5badc25a', params: { from: 'Viagra Super Force Online ', from_email: 'pharmacy_affordable1@ertelecom.ru', @@ -734,14 +737,14 @@ end }, { data: IO.binread('test/fixtures/mail29.box'), - body_md5: 'f18cceddc06b60f5cdf2d39a556ab1f2', + body_md5: '0637f48a0979e479efec07120a2bb700', params: { from: 'Example Sales ', from_email: 'sales@example.com', from_display_name: 'Example Sales', subject: 'Example licensing information: No channel available', to: 'info@znuny.inc', - body: 'Dear Mr. Edenhofer,

    We want to keep you updated on TeamViewer licensing shortages on a regular basis.

    We would like to inform you that since the last message on 25-Nov-2014 there have been temporary session channel exceedances which make it impossible to establish more sessions. Since the last e-mail this has occurred in a total of 1 cases.

    Additional session channels can be added at any time. Please visit our TeamViewer Online Shop (https://www.teamviewer.com/en/licensing/update.aspx?channel=D842CS9BF85-P1009645N-348785E76E) for pricing information.

    Thank you - and again all the best with TeamViewer!

    Best regards,

    Your TeamViewer Team

    P.S.: You receive this e-mail because you are listed in our database as person who ordered a TeamViewer license. Please click here (http://www.teamviewer.com/en/company/unsubscribe.aspx?id=1009645&ident=E37682EAC65E8CA6FF36074907D8BC14) to unsubscribe from further e-mails.

    -----------------------------
    + body: 'Dear Mr. Edenhofer,

    We want to keep you updated on TeamViewer licensing shortages on a regular basis.

    We would like to inform you that since the last message on 25-Nov-2014 there have been temporary session channel exceedances which make it impossible to establish more sessions. Since the last e-mail this has occurred in a total of 1 cases.

    Additional session channels can be added at any time. Please visit our TeamViewer Online Shop for pricing information.

    Thank you - and again all the best with TeamViewer!

    Best regards,

    Your TeamViewer Team

    P.S.: You receive this e-mail because you are listed in our database as person who ordered a TeamViewer license. Please click here to unsubscribe from further e-mails.

    -----------------------------
    www.teamviewer.com

    TeamViewer GmbH * Jahnstr. 30 * 73037 Göppingen * Germany
    Tel. 07161 60692 50 * Fax 07161 60692 79

    Registration AG Ulm HRB 534075 * General Manager Holger Felgner' }, @@ -937,7 +940,7 @@ end }, { data: IO.binread('test/fixtures/mail43.box'), - body_md5: 'a3f7ff5e1876fdbf051c38649b4c9668', + body_md5: '1a4620c40f25a8e238769e56dcdcd373', params: { from: 'Paula ', from_email: 'databases.en@example.com', @@ -946,32 +949,32 @@ end to: 'info@example.ch', cc: nil, body: " - +
    -
    http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0bmFvY3B0LXlhbW9sc2Nhb3NnYy5lL3RpbXJlZi9lbS9ycnJuaWFpZXMsdGxnaWVpLGUzZHx4bnxlZWY=
    Geben Sie diese Information an den Direktor oder den für Marketing und Umsatzsteigerung verantwortlichen Mitarbeiter Ihrer Firma weiter! + +
    Geben Sie diese Information an den Direktor oder den für Marketing und Umsatzsteigerung verantwortlichen Mitarbeiter Ihrer Firma weiter!

    Hallo,

    • Sie suchen nach Möglichkeiten, den Umsatz Ihre Firma zu steigern?
    • Sie brauchen neue Geschäftskontakte?
    • Sie sind es leid, Kontaktdaten manuell zu erfassen?
    • Ihr Kontaktdatenanbieter ist zu teuer oder Sie sind mit seinen Dienstleistungen unzufrieden?
    • -
    • Sie möchten Ihre Kontaktinformationen gern effizienter auf dem neuesten Stand halten?


    Bei uns können Sie mit nur wenigen Clicks Geschäftskontakte verschiedener Länder erwerben.

    Dies ist eine schnelle und bequeme Methode, um Daten zu einem vernünftigen Preis zu erhalten.

    Alle Daten werden ständig aktualisiertm so dass Sie sich keine Sorgen machen müssen.

     

    http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0LnNzdXJobGZzZWVsdGEtLm10cmVzb2YvY2VtL2xpZ25pYWlnaV9hbC9zOG1lOXgyOTdzZW1hL2VlL2xwZWxheHB4Q18ubXhzfEhsODh8Y2M= http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0bmFvY3B0LXlhbW9sc2Nhb3NnYy5lL3RpbXJlZi9lbS9ycnJuaWFpZXMsdGxnaWVpLGUzZHx4bnxlZWY=

    XLS-Muster herunterladen (http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0LnNzdXJobGZzZWVsdGEtLm10cmVzb2YvY2VtL2xpZ25pYWlnaV9hbC9zOG1lOXgyOTdzZW1hL2VlL2xwZWxheHB4Q18ubXhzfEhsODh8Y2M=)

    Datenbank bestellen (http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0bmFvY3B0LXlhbW9sc2Nhb3NnYy5lL3RpbXJlZi9lbS9ycnJuaWFpZXMsdGxnaWVpLGUzZHx4bnxlZWY=)

    Die Anmeldung ist absolut kostenlos und unverbindlich. Sie können die Kataloge gemäß Ihren eigenen Kriterien filtern und ein kostenloses Datenmuster bestellen, sobald Sie sich angemeldet haben.

    Wir haben Datenbanken der folgenden Länder: -

    Anwendungsmöglichkeiten für Geschäftskontakte

    • +
    • Sie möchten Ihre Kontaktinformationen gern effizienter auf dem neuesten Stand halten?


    Bei uns können Sie mit nur wenigen Clicks Geschäftskontakte verschiedener Länder erwerben.

    Dies ist eine schnelle und bequeme Methode, um Daten zu einem vernünftigen Preis zu erhalten.

    Alle Daten werden ständig aktualisiertm so dass Sie sich keine Sorgen machen müssen.

     

    XLS-Muster herunterladen

    Datenbank bestellen

    Die Anmeldung ist absolut kostenlos und unverbindlich. Sie können die Kataloge gemäß Ihren eigenen Kriterien filtern und ein kostenloses Datenmuster bestellen, sobald Sie sich angemeldet haben.

    Wir haben Datenbanken der folgenden Länder: +

    Anwendungsmöglichkeiten für Geschäftskontakte

    • Newsletter senden - Senden von Werbung per E-Mail (besonders effizient).
    • Telemarketing - Telefonwerbung.
    • @@ -983,10 +986,10 @@ end Marktforschung - Telefonumfragen zur Erforschung Ihrer Produkte oder Dienstleistungen.

     

    Sie können Abschnitte wählen (filtern) Empfänger gemäß Tätigkeitsbereichen und Standort der Firmen, um die Effizienz Ihrer Werbemaßnahmen zu erhöhen.

     

    Für jeden Kauf von 2016-11-05 23:59:59 wir gewähren 30% Rabatt RABATTCODE: WZ2124DD -

    Bestellen Sie online bei:

    company-catalogs.com (http://business-catalogs.example.com/ODtpbGs5MWIzbjUyYzExLTA4Yy06Mmg7N3AvL3R0bmFvY3B0LXlhbW9sc2Nhb3NnYy5lL3RpbXJlZi9lbS9ycnJuaWFpZXMsdGxnaWVpLGUzZHx4bnxlZWY=)

    Für weitere Informationen:

    E-Mail: databases.en@example.com
    Telefon: +370-52-071554 (languages: EN, PL, RU, LT)


    Bestellen Sie online bei:

    company-catalogs.com

    Für weitere Informationen:

    E-Mail: databases.en@example.com
    Telefon: +370-52-071554 (languages: EN, PL, RU, LT)


    -
    Unsubscribe from newsletter: Click here (http://business-catalogs.example.com/c2JudXVlcmNic2I4MWk7MTgxOTMyNS1jMmMtNzA=)", +
    Unsubscribe from newsletter: Click here", }, }, { diff --git a/test/unit/email_process_test.rb b/test/unit/email_process_test.rb index a16cbd090..f1f69b467 100644 --- a/test/unit/email_process_test.rb +++ b/test/unit/email_process_test.rb @@ -422,7 +422,7 @@ Some Text",
    9õhH3ÿoIÚõ´GÿiH±6u-û◊NQ4ùäU¹awAq¹JLZμÒIicgT1ζ2Y7⊆t 63‘Mñ36EßÝ→DAå†I048CvJ9A↑3iTc4ÉIΥvXO50ñNÁFJSð­r 154F1HPOÀ£CRxZp tLîT9öXH1b3Es±W mNàBg3õEbPŒSúfτTóY4 sUÖPÒζΔRFkcIÕ1™CÓZ3EΛRq!Cass is good to ask what that
    86ËÏuÕC L I C K H E R E28M (http://piufup.medicatingsafemart.ru)Luke had been thinking about that.
    Shannon said nothing in fact they. Matt placed the sofa with amy smiled. Since the past him with more. Maybe he checked the phone. Neither did her name only. Ryan then went inside matt.
    Maybe we can have anything you sure.
    86ËÏuÕC L I C K H E R E28MLuke had been thinking about that.
    Shannon said nothing in fact they. Matt placed the sofa with amy smiled. Since the past him with more. Maybe he checked the phone. Neither did her name only. Ryan then went inside matt.
    Maybe we can have anything you sure.
    á•XMYÍÅEE£ÓN°kP'dÄÅS4⌉d √p¨HΣ>jE4y4ACüûLì“vT∧4tHXÆX: @@ -498,10 +498,10 @@ Some Text",
    -http://www.avast.com/ + -

    ?????? ?????????????????? ???????????????? ???? ?????????????? ?? ???????????????????????? ???? ?????????????????? avast! Antivirus (http://www.avast.com/) ???????????? ??????????????.

    +

    ?????? ?????????????????? ???????????????? ???? ?????????????? ?? ???????????????????????? ???? ?????????????????? avast! Antivirus ???????????? ??????????????.

    ", diff --git a/test/unit/html_sanitizer_test.rb b/test/unit/html_sanitizer_test.rb index 56d81360a..f441499a9 100644 --- a/test/unit/html_sanitizer_test.rb +++ b/test/unit/html_sanitizer_test.rb @@ -46,19 +46,19 @@ class HtmlSanitizerTest < ActiveSupport::TestCase assert_equal(HtmlSanitizer.strict(''), '') assert_equal(HtmlSanitizer.strict('
    '), '
    ') assert_equal(HtmlSanitizer.strict('
    '), '
    ') - assert_equal(HtmlSanitizer.strict('test'), 'test (/some/path)') - assert_equal(HtmlSanitizer.strict('test'), 'test (https://some/path)') - assert_equal(HtmlSanitizer.strict('test', true), 'test (https://some/path)') + assert_equal(HtmlSanitizer.strict('test'), 'test') + assert_equal(HtmlSanitizer.strict('test'), 'test') + assert_equal(HtmlSanitizer.strict('test', true), 'test') assert_equal(HtmlSanitizer.strict(''), '') assert_equal(HtmlSanitizer.strict(''), '') assert_equal(HtmlSanitizer.strict(' +ADw-SCRIPT+AD4-alert(\'XSS\');+ADw-/SCRIPT+AD4-'), ' +ADw-SCRIPT+AD4-alert(\'XSS\');+ADw-/SCRIPT+AD4-') assert_equal(HtmlSanitizer.strict(''), '') assert_equal(HtmlSanitizer.strict('XSS'), 'XSS (http://66.000146.0x7.147/)') +tt p://6 6.000146.0x7.147/">XSS'), 'XSS') assert_equal(HtmlSanitizer.strict('XSS', true), 'XSS (http://66.000146.0x7.147/)') - assert_equal(HtmlSanitizer.strict('XSS'), 'XSS (//www.google.com/)') - assert_equal(HtmlSanitizer.strict('XSS', true), 'XSS (//www.google.com/)') +tt p://6 6.000146.0x7.147/">XSS', true), 'XSS') + assert_equal(HtmlSanitizer.strict('XSS'), 'XSS') + assert_equal(HtmlSanitizer.strict('XSS', true), 'XSS') assert_equal(HtmlSanitizer.strict('
    '), 'X') assert_equal(HtmlSanitizer.strict('CLICKME'), 'CLICKME') assert_equal(HtmlSanitizer.strict('CLICKME'), 'CLICKME') @@ -73,8 +73,8 @@ tt p://6 6.000146.0x7.147/">XSS', true), 'XSS (XXX'), 'XXX') assert_equal(HtmlSanitizer.strict('XXX', true), 'XXX') assert_equal(HtmlSanitizer.strict(''), 'alert(1)') - assert_equal(HtmlSanitizer.strict(''), 'http://example.com') - assert_equal(HtmlSanitizer.strict('', true), 'http://example.com') + assert_equal(HtmlSanitizer.strict(''), '') + assert_equal(HtmlSanitizer.strict('', true), '') assert_equal(HtmlSanitizer.strict('