diff options
Diffstat (limited to 'program/lib')
| -rw-r--r-- | program/lib/Roundcube/rcube_addressbook.php | 50 | ||||
| -rw-r--r-- | program/lib/Roundcube/rcube_contacts.php | 25 | ||||
| -rw-r--r-- | program/lib/Roundcube/rcube_ldap.php | 17 | 
3 files changed, 53 insertions, 39 deletions
| diff --git a/program/lib/Roundcube/rcube_addressbook.php b/program/lib/Roundcube/rcube_addressbook.php index 98d8f98ee..ffe35097a 100644 --- a/program/lib/Roundcube/rcube_addressbook.php +++ b/program/lib/Roundcube/rcube_addressbook.php @@ -46,6 +46,7 @@ abstract class rcube_addressbook      public $sort_order = 'ASC';      public $coltypes = array('name' => array('limit'=>1), 'firstname' => array('limit'=>1), 'surname' => array('limit'=>1), 'email' => array('limit'=>1)); +    protected $date_types = array();      protected $error;      /** @@ -222,7 +223,6 @@ abstract class rcube_addressbook          return true;      } -      /**       * Create a new contact record       * @@ -407,7 +407,6 @@ abstract class rcube_addressbook          return array();      } -      /**       * Utility function to return all values of a certain data column       * either as flat list or grouped by subtype @@ -440,7 +439,6 @@ abstract class rcube_addressbook          return $out;      } -      /**       * Normalize the given string for fulltext search.       * Currently only optimized for Latin-1 characters; to be extended @@ -488,7 +486,6 @@ abstract class rcube_addressbook          return $fn;      } -      /**       * Compose the name to display in the contacts list for the given contact record.       * This respects the settings parameter how to list conacts. @@ -526,5 +523,50 @@ abstract class rcube_addressbook          return $fn;      } +    /** +     * Compare search value with contact data +     * +     * @param string       $colname Data name +     * @param string|array $value   Data value +     * @param string       $search  Search value +     * @param int          $mode    Search mode +     * +     * @return bool Comparision result +     */ +    protected function compare_search_value($colname, $value, $search, $mode) +    { +        // The value is a date string, for date we'll +        // use only strict comparison (mode = 1) +        // @TODO: partial search, e.g. match only day and month +        if (in_array($colname, $this->date_types)) { +            return (($value = rcube_utils::strtotime($value)) +                && ($search = rcube_utils::strtotime($search)) +                && date('Ymd', $value) == date('Ymd', $search)); +        } + +        // composite field, e.g. address +        foreach ((array)$value as $val) { +            $val = mb_strtolower($val); +            switch ($mode) { +            case 1: +                $got = ($val == $search); +                break; + +            case 2: +                $got = ($search == substr($val, 0, strlen($search))); +                break; + +            default: +                $got = (strpos($val, $search) !== false); +            } + +            if ($got) { +                return true; +            } +        } + +        return false; +    } +  } diff --git a/program/lib/Roundcube/rcube_contacts.php b/program/lib/Roundcube/rcube_contacts.php index a98b13865..062bd1e19 100644 --- a/program/lib/Roundcube/rcube_contacts.php +++ b/program/lib/Roundcube/rcube_contacts.php @@ -45,6 +45,7 @@ class rcube_contacts extends rcube_addressbook      private $fulltext_cols = array('name', 'firstname', 'surname', 'middlename', 'nickname',        'jobtitle', 'organization', 'department', 'maidenname', 'email', 'phone',        'address', 'street', 'locality', 'zipcode', 'region', 'country', 'website', 'im', 'notes'); +    protected $date_types = array('birthday', 'anniversary');      // public properties      public $primary_key = 'contact_id'; @@ -401,32 +402,16 @@ class rcube_contacts extends rcube_addressbook              for ($i=0; $i<$pages; $i++) {                  $this->list_records(null, $i, true);                  while ($row = $this->result->next()) { -                    $id = $row[$this->primary_key]; +                    $id    = $row[$this->primary_key];                      $found = array();                      foreach (preg_grep($regexp, array_keys($row)) as $col) {                          $pos     = strpos($col, ':');                          $colname = $pos ? substr($col, 0, $pos) : $col;                          $search  = $post_search[$colname];                          foreach ((array)$row[$col] as $value) { -                            // composite field, e.g. address -                            foreach ((array)$value as $val) { -                                $val = mb_strtolower($val); -                                switch ($mode) { -                                case 1: -                                    $got = ($val == $search); -                                    break; -                                case 2: -                                    $got = ($search == substr($val, 0, strlen($search))); -                                    break; -                                default: -                                    $got = (strpos($val, $search) !== false); -                                    break; -                                } - -                                if ($got) { -                                    $found[$colname] = true; -                                    break 2; -                                } +                            if ($this->compare_search_value($colname, $value, $search, $mode)) { +                                $found[$colname] = true; +                                break 2;                              }                          }                      } diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php index d4bc669fd..700c6f60c 100644 --- a/program/lib/Roundcube/rcube_ldap.php +++ b/program/lib/Roundcube/rcube_ldap.php @@ -794,27 +794,14 @@ class rcube_ldap extends rcube_addressbook              $this->_debug("S: ".ldap_count_entries($this->conn, $this->ldap_result)." record(s)");              // get all entries of this page and post-filter those that really match the query -            $search = mb_strtolower($value); +            $search  = mb_strtolower($value);              $entries = ldap_get_entries($this->conn, $this->ldap_result);              for ($i = 0; $i < $entries['count']; $i++) {                  $rec = $this->_ldap2result($entries[$i]);                  foreach ($fields as $f) {                      foreach ((array)$rec[$f] as $val) { -                        $val = mb_strtolower($val); -                        switch ($mode) { -                        case 1: -                            $got = ($val == $search); -                            break; -                        case 2: -                            $got = ($search == substr($val, 0, strlen($search))); -                            break; -                        default: -                            $got = (strpos($val, $search) !== false); -                            break; -                        } - -                        if ($got) { +                        if ($this->compare_search_value($f, $val, $search, $mode)) {                              $this->result->add($rec);                              $this->result->count++;                              break 2; | 
