From c72325faed3d244170650a1bf62ddca6eb1b5fa9 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 17 Aug 2012 09:00:12 -0400
Subject: [PATCH] Fix bug where domain name was converted to lower-case even with login_lc=false (#1488593)

---
 CHANGELOG                  |    1 +
 program/include/rcmail.php |   21 ++++++++++++---------
 config/main.inc.php.dist   |    7 ++++---
 3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 3edbdd4..b1f9ce1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fix bug where domain name was converted to lower-case even with login_lc=false (#1488593)
 - Rewritten test scripts for PHPUnit
 - Fix lower-casing email address on replies (#1488598)
 - Fix line separator in exported messages (#1488603)
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index 58f9ca8..1e9c1fd 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -224,11 +224,12 @@
 // 0 - disabled, 1 - username and host only, 2 - username, host, password
 $rcmail_config['login_autocomplete'] = 0;
 
-// If users authentication is not case sensitive this must be enabled.
-// You can also use it to force conversion of logins to lower case.
+// Forces conversion of logins to lower case.
+// 0 - disabled, 1 - only domain part, 2 - domain and local part.
+// If users authentication is not case-sensitive this must be enabled.
 // After enabling it all user records need to be updated, e.g. with query:
 // UPDATE users SET username = LOWER(username);
-$rcmail_config['login_lc'] = false;
+$rcmail_config['login_lc'] = 0;
 
 // Includes should be interpreted as PHP files
 $rcmail_config['skin_include_php'] = false;
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index a6b0bcd..d866919 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -453,7 +453,14 @@
     // Convert username to lowercase. If storage backend
     // is case-insensitive we need to store always the same username (#1487113)
     if ($config['login_lc']) {
-      $username = mb_strtolower($username);
+      if ($config['login_lc'] == 2 || $config['login_lc'] === true) {
+        $username = mb_strtolower($username);
+      }
+      else if (strpos($username, '@')) {
+        // lowercase domain name
+        list($local, $domain) = explode('@', $username);
+        $username = $local . '@' . mb_strtolower($domain);
+      }
     }
 
     // try to resolve email address from virtuser table
@@ -463,17 +470,13 @@
 
     // Here we need IDNA ASCII
     // Only rcube_contacts class is using domain names in Unicode
-    $host = rcube_utils::idn_to_ascii($host);
-    if (strpos($username, '@')) {
-      // lowercase domain name
-      list($local, $domain) = explode('@', $username);
-      $username = $local . '@' . mb_strtolower($domain);
-      $username = rcube_utils::idn_to_ascii($username);
-    }
+    $host     = rcube_utils::idn_to_ascii($host);
+    $username = rcube_utils::idn_to_ascii($username);
 
     // user already registered -> overwrite username
-    if ($user = rcube_user::query($username, $host))
+    if ($user = rcube_user::query($username, $host)) {
       $username = $user->data['username'];
+    }
 
     $storage = $this->get_storage();
 

--
Gitblit v1.9.1