Aleksander Machniak
2013-05-10 bde85428d69069637782d9507475df78890f08d0
Fix handling of invalid email addresses in headers (#1489092)

Conflicts:

CHANGELOG
program/steps/mail/func.inc
4 files modified
17 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_mime.php 5 ●●●●● patch | view | raw | blame | history
program/steps/mail/func.inc 7 ●●●●● patch | view | raw | blame | history
tests/Framework/Mime.php 4 ●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Fix handling of invalid email addresses in headers (#1489092)
- Fix IMAP connection issue with default_socket_timeout < 0 and imap_timeout < 0 (#1489090)
- Fix various PHP code bugs found using static analysis (#1489086)
- Fix backslash character handling on vCard import (#1489085)
program/lib/Roundcube/rcube_mime.php
@@ -361,6 +361,11 @@
                $address = $m[1];
                $name    = '';
            }
            // special case (#1489092)
            else if (preg_match('/(\s*<MAILER-DAEMON>)$/', $val, $m)) {
                $address = 'MAILER-DAEMON';
                $name    = substr($val, 0, -strlen($m[1]));
            }
            else {
                $name = $val;
            }
program/steps/mail/func.inc
@@ -1441,9 +1441,10 @@
    $name   = $part['name'];
    $mailto = $part['mailto'];
    $string = $part['string'];
    $valid  = check_email($mailto, false);
    // phishing email prevention (#1488981), e.g. "valid@email.addr <phishing@email.addr>"
    if ($name && $name != $mailto && strpos($name, '@')) {
    if ($name && $valid && $name != $mailto && strpos($name, '@')) {
      $name = '';
    }
@@ -1459,7 +1460,7 @@
      // for printing we display all addresses
      continue;
    }
    else if (check_email($part['mailto'], false)) {
    else if ($valid) {
      if ($linked) {
        $address = html::a(array(
            'href' => 'mailto:'.$mailto,
@@ -1492,7 +1493,7 @@
      if ($name)
        $address .= Q($name);
      if ($mailto)
        $address .= (strlen($address) ? ' ' : '') . sprintf('&lt;%s&gt;', Q($mailto));
        $address = trim($address . ' ' . Q($name ? sprintf('<%s>', $mailto) : $mailto));
    }
    $address = html::span('adr', $address);
tests/Framework/Mime.php
@@ -39,6 +39,8 @@
            19 => 'Test <"test test"@domain.tld>',
            20 => '<"test test"@domain.tld>',
            21 => '"test test"@domain.tld',
            // invalid (#1489092)
            22 => '"John Doe @ SomeBusinessName" <MAILER-DAEMON>',
        );
        $results = array(
@@ -64,6 +66,8 @@
            19 => array(1, 'Test', '"test test"@domain.tld'),
            20 => array(1, '', '"test test"@domain.tld'),
            21 => array(1, '', '"test test"@domain.tld'),
            // invalid (#1489092)
            22 => array(1, 'John Doe @ SomeBusinessName', 'MAILER-DAEMON'),
        );
        foreach ($headers as $idx => $header) {