Add static methods from old Horde_LDAP library
authorBen Klang <ben@alkaloid.net>
Wed, 30 Dec 2009 16:16:56 +0000 (11:16 -0500)
committerGunnar Wrobel <wrobel@temple.(none)>
Fri, 12 Feb 2010 21:00:33 +0000 (22:00 +0100)
framework/Ldap/lib/Horde/Ldap.php

index 25f45de..1b6dcdc 100644 (file)
@@ -11,6 +11,7 @@
  * @author    Del <del@babel.com.au>
  * @author    Benedikt Hallinger <beni@php.net>
  * @author    Ben Klang <ben@alkaloid.net>
+ * @author    Chuck Hagenbuch <chuck@horde.org>
  * @copyright 2009 The Horde Project
  * @copyright 2003-2007 Tarjej Huse, Jan Wagner, Del Elson, Benedikt Hallinger
  * @license   http://www.gnu.org/licenses/lgpl-3.0.txt LGPLv3
@@ -1686,4 +1687,83 @@ class Horde_Ldap
         }
         return $this->_link;
     }
+
+        /**
+     * Return a boolean expression using the specified operator.
+     *
+     * @param string $lhs    The attribute to test.
+     * @param string $op     The operator.
+     * @param string $rhs    The comparison value.
+     * @param array $params  Any additional parameters for the operator. @since
+     *                       Horde 3.2
+     *
+     * @return string  The LDAP search fragment.
+     */
+    public static function buildClause($lhs, $op, $rhs, $params = array())
+    {
+        switch ($op) {
+        case 'LIKE':
+            if (empty($rhs)) {
+                return '(' . $lhs . '=*)';
+            } elseif (!empty($params['begin'])) {
+                return sprintf('(|(%s=%s*)(%s=* %s*))', $lhs, Horde_LDAP::quote($rhs), $lhs, Horde_LDAP::quote($rhs));
+            } elseif (!empty($params['approximate'])) {
+                return sprintf('(%s=~%s)', $lhs, Horde_LDAP::quote($rhs));
+            }
+            return sprintf('(%s=*%s*)', $lhs, Horde_LDAP::quote($rhs));
+
+        default:
+            return sprintf('(%s%s%s)', $lhs, $op, Horde_LDAP::quote($rhs));
+        }
+    }
+
+
+    /**
+     * Escape characters with special meaning in LDAP searches.
+     *
+     * @param string $clause  The string to escape.
+     *
+     * @return string  The escaped string.
+     */
+    public static function quote($clause)
+    {
+        return str_replace(array('\\',   '(',  ')',  '*',  "\0"),
+                           array('\\5c', '\(', '\)', '\*', "\\00"),
+                           $clause);
+    }
+
+    /**
+     * Take an array of DN elements and properly quote it according to RFC
+     * 1485.
+     *
+     * @param array $parts  An array of tuples containing the attribute
+     *                      name and that attribute's value which make
+     *                      up the DN. Example:
+     *
+     *    $parts = array(0 => array('cn', 'John Smith'),
+     *                   1 => array('dc', 'example'),
+     *                   2 => array('dc', 'com'));
+     *
+     * @return string  The properly quoted string DN.
+     */
+    public static function quoteDN($parts)
+    {
+        $dn = '';
+        $count = count($parts);
+        for ($i = 0; $i < $count; $i++) {
+            if ($i > 0) {
+                $dn .= ',';
+            }
+            $dn .= $parts[$i][0] . '=';
+
+            // See if we need to quote the value.
+            if (preg_match('/^\s|\s$|\s\s|[,+="\r\n<>#;]/', $parts[$i][1])) {
+                $dn .= '"' . str_replace('"', '\\"', $parts[$i][1]) . '"';
+            } else {
+                $dn .= $parts[$i][1];
+            }
+        }
+
+        return $dn;
+    }
 }