diff options
| author | alecpl <alec@alec.pl> | 2011-02-03 13:58:07 +0000 | 
|---|---|---|
| committer | alecpl <alec@alec.pl> | 2011-02-03 13:58:07 +0000 | 
| commit | e8d5bdc84ecfdf6fe5008655215a258bbdf0c521 (patch) | |
| tree | 24e98fca92b72bcc0ba4b5519f5d2c9265a7c8d5 | |
| parent | 9ebac6616d32d7672ea59da67321380037e2324c (diff) | |
- Fix IDNA support when IDN/INTL modules are in use (#1487742)
| -rw-r--r-- | CHANGELOG | 1 | ||||
| -rw-r--r-- | program/include/main.inc | 33 | ||||
| -rw-r--r-- | program/include/rcmail.php | 4 | ||||
| -rw-r--r-- | program/include/rcube_config.php | 2 | ||||
| -rw-r--r-- | program/include/rcube_ldap.php | 2 | ||||
| -rw-r--r-- | program/include/rcube_shared.inc | 2 | ||||
| -rw-r--r-- | program/include/rcube_smtp.php | 7 | ||||
| -rwxr-xr-x | program/include/rcube_template.php | 2 | ||||
| -rw-r--r-- | program/steps/addressbook/import.inc | 2 | ||||
| -rw-r--r-- | program/steps/addressbook/save.inc | 2 | ||||
| -rw-r--r-- | program/steps/mail/addcontact.inc | 2 | ||||
| -rw-r--r-- | program/steps/mail/compose.inc | 8 | ||||
| -rw-r--r-- | program/steps/mail/func.inc | 6 | ||||
| -rw-r--r-- | program/steps/mail/sendmail.inc | 6 | ||||
| -rw-r--r-- | program/steps/settings/edit_identity.inc | 6 | ||||
| -rw-r--r-- | program/steps/settings/func.inc | 2 | ||||
| -rw-r--r-- | program/steps/settings/save_identity.inc | 14 | 
17 files changed, 68 insertions, 33 deletions
| @@ -1,6 +1,7 @@  CHANGELOG Roundcube Webmail  =========================== +- Fix IDNA support when IDN/INTL modules are in use (#1487742)  - Fix handling of invalid HTML comments in messages (#1487759)  - Fix parsing FETCH response for very long headers (#1487753)  - Fix add/remove columns in message list when message_sort_order isn't set (#1487751) diff --git a/program/include/main.inc b/program/include/main.inc index 7f4945692..697b3ff21 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -1891,6 +1891,39 @@ function check_email($email, $dns_check=true)    return false;  } +/* + * Idn_to_ascii wrapper. + * Intl/Idn modules version of this function doesn't work with e-mail address + */ +function rcube_idn_to_ascii($str) +{ +  return rcube_idn_convert($str, true); +} + +/* + * Idn_to_ascii wrapper. + * Intl/Idn modules version of this function doesn't work with e-mail address + */ +function rcube_idn_to_utf8($str) +{ +  return rcube_idn_convert($str, false); +} + +function rcube_idn_convert($input, $is_utf=false) +{ +  if ($at = strpos($input, '@')) { +    $user   = substr($input, 0, $at); +    $domain = substr($input, $at+1); +  } +  else { +    $domain = $input; +  } + +  $domain = $is_utf ? idn_to_ascii($domain) : idn_to_utf8($domain); + +  return $at ? $user . '@' . $domain : $domain; +} +  /**   * Helper class to turn relative urls into absolute ones diff --git a/program/include/rcmail.php b/program/include/rcmail.php index c2ca51aea..8c80fe20b 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -699,12 +699,12 @@ class rcmail      // Here we need IDNA ASCII      // Only rcube_contacts class is using domain names in Unicode -    $host = idn_to_ascii($host); +    $host = rcube_idn_to_ascii($host);      if (strpos($username, '@')) {        // lowercase domain name        list($local, $domain) = explode('@', $username);        $username = $local . '@' . mb_strtolower($domain); -      $username = idn_to_ascii($username); +      $username = rcube_idn_to_ascii($username);      }      // user already registered -> overwrite username diff --git a/program/include/rcube_config.php b/program/include/rcube_config.php index 058927dba..81b664a29 100644 --- a/program/include/rcube_config.php +++ b/program/include/rcube_config.php @@ -287,7 +287,7 @@ class rcube_config              $domain = rcube_parse_host($this->prop['mail_domain']);          if ($encode) -            $domain = idn_to_ascii($domain); +            $domain = rcube_idn_to_ascii($domain);          return $domain;      } diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php index 4fe74e310..5db92201b 100644 --- a/program/include/rcube_ldap.php +++ b/program/include/rcube_ldap.php @@ -138,7 +138,7 @@ class rcube_ldap extends rcube_addressbook      foreach ($this->prop['hosts'] as $host)      { -      $host = idn_to_ascii(rcube_parse_host($host)); +      $host = rcube_idn_to_ascii(rcube_parse_host($host));        $this->_debug("C: Connect [$host".($this->prop['port'] ? ':'.$this->prop['port'] : '')."]");        if ($lc = @ldap_connect($host, $this->prop['port'])) diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc index 83eefd6da..2aa110092 100644 --- a/program/include/rcube_shared.inc +++ b/program/include/rcube_shared.inc @@ -719,7 +719,7 @@ if (!function_exists('idn_to_utf8'))              $loaded = true;          } -        if ($idn && $domain && preg_match('/(^|@|\.)xn--/i', $domain)) { +        if ($idn && $domain && preg_match('/(^|\.)xn--/i', $domain)) {              try {                  $domain = $idn->decode($domain);              } diff --git a/program/include/rcube_smtp.php b/program/include/rcube_smtp.php index 3eaf052f1..654c7ef86 100644 --- a/program/include/rcube_smtp.php +++ b/program/include/rcube_smtp.php @@ -101,7 +101,7 @@ class rcube_smtp        $helo_host = 'localhost';      // IDNA Support -    $smtp_host = idn_to_ascii($smtp_host); +    $smtp_host = rcube_idn_to_ascii($smtp_host);      $this->conn = new Net_SMTP($smtp_host, $smtp_port, $helo_host); @@ -132,8 +132,9 @@ class rcube_smtp      if ($smtp_user && $smtp_pass)      {        // IDNA Support -      if (strpos($smtp_user, '@')) -        $smtp_user = idn_to_ascii($smtp_user); +      if (strpos($smtp_user, '@')) { +        $smtp_user = rcube_idn_to_ascii($smtp_user); +      }        $result = $this->conn->auth($smtp_user, $smtp_pass, $smtp_auth_type, $use_tls, $smtp_authz); diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php index 1d1a95b90..2102aaa1f 100755 --- a/program/include/rcube_template.php +++ b/program/include/rcube_template.php @@ -1034,7 +1034,7 @@ class rcube_template extends rcube_html_page              $username = $this->app->user->get_username();          } -        return idn_to_utf8($username); +        return rcube_idn_to_utf8($username);      } diff --git a/program/steps/addressbook/import.inc b/program/steps/addressbook/import.inc index 532afdbcd..af6f67dd8 100644 --- a/program/steps/addressbook/import.inc +++ b/program/steps/addressbook/import.inc @@ -136,7 +136,7 @@ if ($_FILES['_file']['tmp_name'] && is_uploaded_file($_FILES['_file']['tmp_name'        }        // We're using UTF8 internally -      $email = idn_to_utf8($email); +      $email = rcube_idn_to_utf8($email);        if (!$replace) {          // compare e-mail address diff --git a/program/steps/addressbook/save.inc b/program/steps/addressbook/save.inc index 4eb24fe82..934db4c73 100644 --- a/program/steps/addressbook/save.inc +++ b/program/steps/addressbook/save.inc @@ -142,7 +142,7 @@ if (empty($a_record['name'])/* || empty($a_record['email'])*/) {  // Validity checks  foreach ($CONTACTS->get_col_values('email', $a_record, true) as $email) {    if (strlen($email)) { -    $_email = idn_to_ascii($email); +    $_email = rcube_idn_to_ascii($email);      if (!check_email($_email, false)) {        $OUTPUT->show_message('emailformaterror', 'warning', array('email' => $email));        rcmail_overwrite_action($return_action); diff --git a/program/steps/mail/addcontact.inc b/program/steps/mail/addcontact.inc index 28086985a..ba9a44aa3 100644 --- a/program/steps/mail/addcontact.inc +++ b/program/steps/mail/addcontact.inc @@ -46,7 +46,7 @@ if (!empty($_POST['_address']) && is_object($CONTACTS))        $OUTPUT->send();      } -    $contact['email'] = idn_to_utf8($contact['email']); +    $contact['email'] = rcube_idn_to_utf8($contact['email']);      // use email address part for name      if (empty($contact['name']) || $contact['name'] == $contact['email']) diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index b2cd584a0..d894b97ff 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -321,7 +321,7 @@ function rcmail_compose_headers($attrib)          if (empty($addr_part['mailto']))            continue; -        $mailto = idn_to_utf8($addr_part['mailto']); +        $mailto = rcube_idn_to_utf8($addr_part['mailto']);          if (!in_array($mailto, $sa_recipients)              && (!$MESSAGE->compose_from @@ -360,7 +360,7 @@ function rcmail_compose_headers($attrib)        if (empty($addr_part['mailto']))          continue; -      $mailto = idn_to_utf8($addr_part['mailto']); +      $mailto = rcube_idn_to_utf8($addr_part['mailto']);        if ($addr_part['name'] && $addr_part['mailto'] != $addr_part['name'])          $string = format_email_recipient($mailto, $addr_part['name']); @@ -437,7 +437,7 @@ function rcmail_compose_header_from($attrib)      // create SELECT element      foreach ($user_identities as $sql_arr)      { -      $email = mb_strtolower(idn_to_utf8($sql_arr['email'])); +      $email = mb_strtolower(rcube_idn_to_utf8($sql_arr['email']));        $identity_id = $sql_arr['identity_id'];        $select_from->add(format_email_recipient($email, $sql_arr['name']), $identity_id); @@ -734,7 +734,7 @@ function rcmail_create_reply_body($body, $bodyIsHtml)    // build reply prefix    $from = array_pop($RCMAIL->imap->decode_address_list($MESSAGE->get_header('from'), 1, false));    $prefix = sprintf("On %s, %s wrote:", -    $MESSAGE->headers->date, $from['name'] ? $from['name'] : idn_to_utf8($from['mailto'])); +    $MESSAGE->headers->date, $from['name'] ? $from['name'] : rcube_idn_to_utf8($from['mailto']));    if (!$bodyIsHtml) {      $body = preg_replace('/\r?\n/', "\n", $body); diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 9abfef761..b1b5d916a 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -1250,10 +1250,10 @@ function rcmail_address_string($input, $max=null, $linked=false, $addicon=null)      // IDNA ASCII to Unicode      if ($name == $mailto) -      $name = idn_to_utf8($name); +      $name = rcube_idn_to_utf8($name);      if ($string == $mailto) -      $string = idn_to_utf8($string); -    $mailto = idn_to_utf8($mailto); +      $string = rcube_idn_to_utf8($string); +    $mailto = rcube_idn_to_utf8($mailto);      if ($PRINT_MODE) {        $out .= sprintf('%s <%s>', Q($name), $mailto); diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 74b8c00df..118e9edeb 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -153,11 +153,11 @@ function rcmail_email_input_format($mailto, $count=false, $check=true)      $item = trim($item);      // address in brackets without name (do nothing)      if (preg_match('/^<\S+@\S+>$/', $item)) { -      $item = idn_to_ascii($item); +      $item = rcube_idn_to_ascii($item);        $result[] = $item;      // address without brackets and without name (add brackets)      } else if (preg_match('/^\S+@\S+$/', $item)) { -      $item = idn_to_ascii($item); +      $item = rcube_idn_to_ascii($item);        $result[] = '<'.$item.'>';      // address with name (handle name)      } else if (preg_match('/\S+@\S+>*$/', $item, $matches)) { @@ -168,7 +168,7 @@ function rcmail_email_input_format($mailto, $count=false, $check=true)            && preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name)) {              $name = '"'.addcslashes($name, '"').'"';        } -      $address = idn_to_ascii($address); +      $address = rcube_idn_to_ascii($address);        if (!preg_match('/^<\S+@\S+>$/', $address))          $address = '<'.$address.'>'; diff --git a/program/steps/settings/edit_identity.inc b/program/steps/settings/edit_identity.inc index 9bf8dcae4..71bd349a3 100644 --- a/program/steps/settings/edit_identity.inc +++ b/program/steps/settings/edit_identity.inc @@ -94,9 +94,9 @@ function rcube_identity_form($attrib)      $form['addressing']['content']['email']['class'] = 'disabled';    } -  $IDENTITY_RECORD['email']    = idn_to_utf8($IDENTITY_RECORD['email']); -  $IDENTITY_RECORD['reply-to'] = idn_to_utf8($IDENTITY_RECORD['reply-to']); -  $IDENTITY_RECORD['bcc']      = idn_to_utf8($IDENTITY_RECORD['bcc']); +  $IDENTITY_RECORD['email']    = rcube_idn_to_utf8($IDENTITY_RECORD['email']); +  $IDENTITY_RECORD['reply-to'] = rcube_idn_to_utf8($IDENTITY_RECORD['reply-to']); +  $IDENTITY_RECORD['bcc']      = rcube_idn_to_utf8($IDENTITY_RECORD['bcc']);    // Allow plugins to modify identity form content    $plugin = $RCMAIL->plugins->exec_hook('identity_form', array( diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc index 7f4e28255..271ee408a 100644 --- a/program/steps/settings/func.inc +++ b/program/steps/settings/func.inc @@ -72,7 +72,7 @@ function rcmail_identities_list($attrib)    // get identities list and define 'mail' column    $list = $USER->list_identities();    foreach ($list as $idx => $row) -    $list[$idx]['mail'] = trim($row['name'] . ' <' . idn_to_utf8($row['email']) .'>'); +    $list[$idx]['mail'] = trim($row['name'] . ' <' . rcube_idn_to_utf8($row['email']) .'>');    // get all identites from DB and define list of cols to be displayed    $plugin = $RCMAIL->plugins->exec_hook('identities_list', array( diff --git a/program/steps/settings/save_identity.inc b/program/steps/settings/save_identity.inc index e3bbce979..f0d25f35a 100644 --- a/program/steps/settings/save_identity.inc +++ b/program/steps/settings/save_identity.inc @@ -59,7 +59,7 @@ if (IDENTITIES_LEVEL == 1 || IDENTITIES_LEVEL == 3)  // Validate e-mail addresses  foreach (array('email', 'reply-to', 'bcc') as $item) {    if ($email = $save_data[$item]) { -    $ascii_email = idn_to_ascii($email); +    $ascii_email = rcube_idn_to_ascii($email);      if (!check_email($ascii_email, false)) {        // show error message        $OUTPUT->show_message('emailformaterror', 'error', array('email' => $email), false); @@ -77,11 +77,11 @@ if ($_POST['_iid'])    $save_data = $plugin['record'];    if ($save_data['email']) -    $save_data['email'] = idn_to_ascii($save_data['email']); +    $save_data['email'] = rcube_idn_to_ascii($save_data['email']);    if ($save_data['bcc']) -    $save_data['bcc'] = idn_to_ascii($save_data['bcc']); +    $save_data['bcc'] = rcube_idn_to_ascii($save_data['bcc']);    if ($save_data['reply-to']) -    $save_data['reply-to'] = idn_to_ascii($save_data['reply-to']); +    $save_data['reply-to'] = rcube_idn_to_ascii($save_data['reply-to']);    if (!$plugin['abort'])      $updated = $USER->update_identity($iid, $save_data); @@ -116,9 +116,9 @@ else if (IDENTITIES_LEVEL < 2)    $plugin = $RCMAIL->plugins->exec_hook('identity_create', array('record' => $save_data));    $save_data = $plugin['record']; -  $save_data['email']    = idn_to_ascii($save_data['email']); -  $save_data['bcc']      = idn_to_ascii($save_data['bcc']); -  $save_data['reply-to'] = idn_to_ascii($save_data['reply-to']); +  $save_data['email']    = rcube_idn_to_ascii($save_data['email']); +  $save_data['bcc']      = rcube_idn_to_ascii($save_data['bcc']); +  $save_data['reply-to'] = rcube_idn_to_ascii($save_data['reply-to']);    if (!$plugin['abort'])      $insert_id = $save_data['email'] ? $USER->insert_identity($save_data) : null; | 
