From 24f785ad75fc2aa515720a83765be77a74764ce6 Mon Sep 17 00:00:00 2001 From: Ben Klang Date: Wed, 30 Dec 2009 11:16:56 -0500 Subject: [PATCH] Add static methods from old Horde_LDAP library --- framework/Ldap/lib/Horde/Ldap.php | 80 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/framework/Ldap/lib/Horde/Ldap.php b/framework/Ldap/lib/Horde/Ldap.php index 25f45de82..1b6dcdce1 100644 --- a/framework/Ldap/lib/Horde/Ldap.php +++ b/framework/Ldap/lib/Horde/Ldap.php @@ -11,6 +11,7 @@ * @author Del * @author Benedikt Hallinger * @author Ben Klang + * @author Chuck Hagenbuch * @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; + } } -- 2.11.0