=0 && $index0) { throw new Zend_Ldap_Exception(null, 'RDN array is malformed.', Zend_Ldap_Exception::LDAP_OTHER); } else if ($count==2) { if ($caseFold==self::RDN_ATTR_CASEFOLD_LOWER) $part[0]=mb_strtolower($part[0], $encoding); else if ($caseFold==self::RDN_ATTR_CASEFOLD_UPPER) $part[0]=mb_strtoupper($part[0], $encoding); return implode('=', $part); } $multiParts=array(); for ($i=0; $i<$count; $i+=2) { $k=$part[$i]; if ($caseFold==self::RDN_ATTR_CASEFOLD_LOWER) $k=mb_strtolower($k, $encoding); else if ($caseFold==self::RDN_ATTR_CASEFOLD_UPPER) $k=mb_strtoupper($k, $encoding); $v=$part[$i+1]; if (isset($multiParts[$k])) { throw new Zend_Ldap_Exception(null, 'RDN array is malformed. Attribute \'' + $k + '\' appears more than once', Zend_Ldap_Exception::LDAP_OTHER); } $multiParts[$k]=implode('=', array($k, $v)); } ksort($multiParts, SORT_STRING); return implode('+', $multiParts); } /** * Implodes an array in the form delivered by {@link explodeDn()} * to a DN string. * * $dnArray must be of type * array( * array("cn", "name1"), * array("cn", "name2"), * array("dc", "example"), * array("dc", "org") * ) * * @param array $dnArray * @param string $caseFold * @param string $separator * @param string $encoding * @return string * @throws Zend_Ldap_Exception */ public static function implodeDn(array $dnArray, $caseFold=self::RDN_ATTR_CASEFOLD_NONE, $separator=',', $encoding='UTF-8') { $parts=array(); foreach ($dnArray as $p) { $parts[]=self::implodeRdn($p, $caseFold, $encoding); } return implode($separator, $parts); } /** * Checks if given $childDn is beneath $parentDn subtree. * * @param string $childDn * @param string $parentDn * @return boolean */ public static function isChildOf($childDn, $parentDn) { try { $cdn=self::explodeDn($childDn); $pdn=self::explodeDn($parentDn); } catch (Zend_Ldap_Exception $e) { return false; } $startIndex=count($cdn)-count($pdn); if ($startIndex<0) return false; for ($i=0; $i * @link http://pear.php.net/package/Net_LDAP2 * @author Benedikt Hallinger * * @param string|array $values Array of values to escape * @return array Array $values, but escaped */ public static function escapeFilterValue($values=array()) { if (!is_array($values)) $values=array($values); foreach ($values as $key => $val) { // Escaping of filter meta characters $val=str_replace('\\', '\5c', $val); $val=str_replace('*', '\2a', $val); $val=str_replace('(', '\28', $val); $val=str_replace(')', '\29', $val); // ASCII < 32 escaping $val=self::ascToHex32($val); if (null===$val) $val='\0'; // apply escaped "null" if string is empty $values[$key]=$val; } return (count($values)==1) ? $values[0] : $values; } /** * Undoes the conversion done by {@link escapeFilterValues()}. * * Converts any sequences of a backslash followed by two hex digits into the corresponding character. * @see Net_LDAP2_Util::escape_filter_value() from Benedikt Hallinger * @link http://pear.php.net/package/Net_LDAP2 * @author Benedikt Hallinger * * @param string|array $values Array of values to escape * @return array Array $values, but unescaped */ public static function unescapeFilterValue($values=array()) { if (!is_array($values)) $values=array($values); foreach ($values as $key => $value) { // Translate hex code into ascii $values[$key]=self::hex32ToAsc($value); } return (count($values)==1) ? $values[0] : $values; } /** * Escapes a DN value according to RFC 2253 * * Escapes the given VALUES according to RFC 2253 so that they can be safely used in LDAP DNs. * The characters ",", "+", """, "\", "<", ">", ";", "#", "=" with a special meaning in RFC 2252 * are preceeded by ba backslash. Control characters with an ASCII code < 32 are represented as \hexpair. * Finally all leading and trailing spaces are converted to sequences of \20. * @see Net_LDAP2_Util::escape_dn_value() from Benedikt Hallinger * @link http://pear.php.net/package/Net_LDAP2 * @author Benedikt Hallinger * * @param string|array $values An array containing the DN values that should be escaped * @return array The array $values, but escaped */ public static function escapeDnValue($values=array()) { if (!is_array($values)) $values=array($values); foreach ($values as $key => $val) { // Escaping of filter meta characters $val=str_replace('\\', '\\\\', $val); $val=str_replace(',', '\,', $val); $val=str_replace('+', '\+', $val); $val=str_replace('"', '\"', $val); $val=str_replace('<', '\<', $val); $val=str_replace('>', '\>', $val); $val=str_replace(';', '\;', $val); $val=str_replace('#', '\#', $val); $val=str_replace('=', '\=', $val); $val=self::ascToHex32($val); // Convert all leading and trailing spaces to sequences of \20. if (preg_match('/^(\s*)(.+?)(\s*)$/', $val, $matches)) { $val=$matches[2]; for ($i=0; $i * @link http://pear.php.net/package/Net_LDAP2 * @author Benedikt Hallinger * * @param string|array $values Array of DN Values * @return array Same as $values, but unescaped */ public static function unescapeDnValue($values=array()) { if (!is_array($values)) $values=array($values); foreach ($values as $key => $val) { // strip slashes from special chars $val=str_replace('\\\\', '\\', $val); $val=str_replace('\,', ',', $val); $val=str_replace('\+', '+', $val); $val=str_replace('\"', '"', $val); $val=str_replace('\<', '<', $val); $val=str_replace('\>', '>', $val); $val=str_replace('\;', ';', $val); $val=str_replace('\#', '#', $val); $val=str_replace('\=', '=', $val); $values[$key] = self::hex32ToAsc($val); } return (count($values)==1) ? $values[0] : $values; } /** * Converts all ASCII chars < 32 to "\HEX" * * @see Net_LDAP2_Util::asc2hex32() from Benedikt Hallinger * @link http://pear.php.net/package/Net_LDAP2 * @author Benedikt Hallinger * * @param string $string String to convert * @return string */ public static function ascToHex32($string) { for ($i=0; $i, * heavily based on work from DavidSmith@byu.net * @link http://pear.php.net/package/Net_LDAP2 * @author Benedikt Hallinger , heavily based on work from DavidSmith@byu.net * * @param string $string String to convert * @return string */ public static function hex32ToAsc($string) { $string = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $string); return $string; } }