From e8ab3d96bd4340fb262e5d83a2e5988f47bba3b0 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 12 Apr 2016 11:51:46 +0200 Subject: [PATCH] Fix converting mail addresses with @www. into mailto links (#5197) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_string_replacer.php | 8 ++++++-- tests/Framework/StringReplacer.php | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 27855822748..33deb8214b0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -35,6 +35,7 @@ CHANGELOG Roundcube Webmail - Fix so contactlist_fields option can be set via config file - Fix so SPECIAL-USE assignments are forced only until user sets special folders (#4782) - Fix performance in reverting order of THREAD result +- Fix converting mail addresses with @www. into mailto links (#5197) RELEASE 1.2-beta ---------------- diff --git a/program/lib/Roundcube/rcube_string_replacer.php b/program/lib/Roundcube/rcube_string_replacer.php index eb281ee5408..284d585478c 100644 --- a/program/lib/Roundcube/rcube_string_replacer.php +++ b/program/lib/Roundcube/rcube_string_replacer.php @@ -34,6 +34,7 @@ class rcube_string_replacer protected $options = array(); protected $linkrefs = array(); protected $urls = array(); + protected $noword = '[^\w@.#-]'; function __construct($options = array()) @@ -44,10 +45,13 @@ function __construct($options = array()) $url1 = '.:;,'; $url2 = 'a-zA-Z0-9%=#$@+?|!&\\/_~\\[\\]\\(\\){}\*\x80-\xFE-'; + // Supported link prefixes + $link_prefix = "([\w]+:\/\/|{$this->noword}[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)"; + $this->options = $options; $this->linkref_index = '/\[([^\]#]+)\](:?\s*##str_replacement_(\d+)##)/'; $this->linkref_pattern = '/\[([^\]#]+)\]/'; - $this->link_pattern = "/([\w]+:\/\/|\W[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)($utf_domain([$url1]*[$url2]+)*)/"; + $this->link_pattern = "/$link_prefix($utf_domain([$url1]*[$url2]+)*)/"; $this->mailto_pattern = "/(" ."[-\w!\#\$%&\'*+~\/^`|{}=]+(?:\.[-\w!\#\$%&\'*+~\/^`|{}=]+)*" // local-part ."@$utf_domain" // domain-part @@ -91,7 +95,7 @@ public function link_callback($matches) if (preg_match('!^(http|ftp|file)s?://!i', $scheme)) { $url = $matches[1] . $matches[2]; } - else if (preg_match('/^(\W*)(www\.)$/i', $matches[1], $m)) { + else if (preg_match("/^({$this->noword}*)(www\.)$/i", $matches[1], $m)) { $url = $m[2] . $matches[2]; $url_prefix = 'http://'; $prefix = $m[1]; diff --git a/tests/Framework/StringReplacer.php b/tests/Framework/StringReplacer.php index 7d9600a78c2..543601d35b1 100644 --- a/tests/Framework/StringReplacer.php +++ b/tests/Framework/StringReplacer.php @@ -39,6 +39,7 @@ function data_replace() array('https://github.com/a/b/compare/3a0f82...1f4b2a after', 'https://github.com/a/b/compare/3a0f82...1f4b2a after'), array('http://', 'http://'), array('http://', 'http://'), + array('test@www.test', 'test@www.test'), array('1@1.com www.domain.tld', '1@1.com www.domain.tld'), array(' www.domain.tld ', ' www.domain.tld '), array(' www.domain.tld/#!download|856p1|2 ', ' www.domain.tld/#!download|856p1|2 '),