summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2011-02-03 13:58:07 +0000
committeralecpl <alec@alec.pl>2011-02-03 13:58:07 +0000
commite8d5bdc84ecfdf6fe5008655215a258bbdf0c521 (patch)
tree24e98fca92b72bcc0ba4b5519f5d2c9265a7c8d5
parent9ebac6616d32d7672ea59da67321380037e2324c (diff)
- Fix IDNA support when IDN/INTL modules are in use (#1487742)
-rw-r--r--CHANGELOG1
-rw-r--r--program/include/main.inc33
-rw-r--r--program/include/rcmail.php4
-rw-r--r--program/include/rcube_config.php2
-rw-r--r--program/include/rcube_ldap.php2
-rw-r--r--program/include/rcube_shared.inc2
-rw-r--r--program/include/rcube_smtp.php7
-rwxr-xr-xprogram/include/rcube_template.php2
-rw-r--r--program/steps/addressbook/import.inc2
-rw-r--r--program/steps/addressbook/save.inc2
-rw-r--r--program/steps/mail/addcontact.inc2
-rw-r--r--program/steps/mail/compose.inc8
-rw-r--r--program/steps/mail/func.inc6
-rw-r--r--program/steps/mail/sendmail.inc6
-rw-r--r--program/steps/settings/edit_identity.inc6
-rw-r--r--program/steps/settings/func.inc2
-rw-r--r--program/steps/settings/save_identity.inc14
17 files changed, 68 insertions, 33 deletions
diff --git a/CHANGELOG b/CHANGELOG
index c827c0b61..af40cf646 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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 &lt;%s&gt;', 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;