lib/api lib/Auth lib/functions.php

Aleksander Machniak machniak at kolabsys.com
Wed Nov 27 10:35:27 CET 2013


 lib/Auth/LDAP.php                        |   26 ++++++++++++++++++++++++--
 lib/api/kolab_api_service_form_value.php |    8 +++++---
 lib/functions.php                        |   18 ++++++++++++++++++
 3 files changed, 47 insertions(+), 5 deletions(-)

New commits:
commit 1d2c64307205709c5cdd7df85fa51dd1fc540b69
Author: Aleksander Machniak <alec at alec.pl>
Date:   Wed Nov 27 10:34:52 2013 +0100

    Fix email address comparissons, so local part is case-sensitive, but domain part is not

diff --git a/lib/Auth/LDAP.php b/lib/Auth/LDAP.php
index 7de9017..25cb754 100644
--- a/lib/Auth/LDAP.php
+++ b/lib/Auth/LDAP.php
@@ -593,6 +593,10 @@ class LDAP extends Net_LDAP3 {
 
     public function find_recipient($address)
     {
+        if (strpos($address, '@') === false) {
+            return false;
+        }
+
         $this->bind($_SESSION['user']->user_bind_dn, $_SESSION['user']->user_bind_pw);
 
         $mail_attrs = $this->conf->get_list('mail_attributes') ?: array('mail', 'alias');
@@ -610,10 +614,28 @@ class LDAP extends Net_LDAP3 {
         $result = $this->search_entries($this->config_get('root_dn'), '(objectclass=*)', 'sub', null, $search);
 
         if ($result && $result->count() > 0) {
-            return $result->entries(TRUE);
+            $result = $result->entries(true);
+
+            // LDAP searches are case-insensitive, post-process result
+            // with correct character case handling
+            foreach ($result as $key => $user) {
+                foreach ($user as $attr => $list) {
+                    foreach ((array) $list as $addr) {
+                        if (compare_email($address, $addr)) {
+                            continue 3;
+                        }
+                    }
+                }
+
+                unset($result[$key]);
+            }
+
+            reset($result);
+
+            return $result;
         }
 
-        return FALSE;
+        return false;
     }
 
     public function get_attributes($subject_dn, $attributes)
diff --git a/lib/api/kolab_api_service_form_value.php b/lib/api/kolab_api_service_form_value.php
index 0ac7420..ffc3750 100644
--- a/lib/api/kolab_api_service_form_value.php
+++ b/lib/api/kolab_api_service_form_value.php
@@ -1087,9 +1087,11 @@ class kolab_api_service_form_value extends kolab_api_service
                         unset($user[$attr_name]);
 
                         foreach ($user as $attr => $list) {
-                            if (in_array($addr, (array) $list)) {
-                                $found = true;
-                                break;
+                            foreach ((array) $list as $email) {
+                                if (compare_email($addr, $email)) {
+                                    $found = true;
+                                    break 2;
+                                }
                             }
                         }
 
diff --git a/lib/functions.php b/lib/functions.php
index 016f1f3..fd5aa4a 100644
--- a/lib/functions.php
+++ b/lib/functions.php
@@ -131,3 +131,21 @@ function timer($time = null, $label = '')
     }
     return $now;
 }
+
+/**
+ * Compare two email addresses with correct character-case handling
+ * i.e. local part is case-sensitive, domain part is not
+ */
+function compare_email($email1, $email2)
+{
+    $email1  = explode('@', $email1);
+    $email2  = explode('@', $email2);
+
+    $domain1 = array_pop($email1);
+    $domain2 = array_pop($email2);
+
+    $email1 = implode('@', $email1) . '@' . mb_strtolower($domain1);
+    $email2 = implode('@', $email2) . '@' . mb_strtolower($domain2);
+
+    return $email1 === $email2;
+}




More information about the commits mailing list