icingaweb2/library/Icinga/Protocol/Ldap/LdapUtils.php

130 lines
3.4 KiB
PHP

<?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Protocol\Ldap;
/**
* This class provides useful LDAP-related functions
*
* @copyright Copyright (c) 2013 Icinga-Web Team <info@icinga.org>
* @author Icinga-Web Team <info@icinga.org>
* @package Icinga\Protocol\Ldap
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
*/
class LdapUtils
{
/**
* Extends PHPs ldap_explode_dn() function
*
* UTF-8 chars like German umlauts would otherwise be escaped and shown
* as backslash-prefixed hexcode-sequenzes.
*
* @param string DN
* @param boolean Returns 'type=value' when true and 'value' when false
* @return string
*/
public static function explodeDN($dn, $with_type = true)
{
$res = ldap_explode_dn($dn, $with_type ? 0 : 1);
foreach ($res as $k => $v) {
$res[$k] = preg_replace(
'/\\\([0-9a-f]{2})/ei',
"chr(hexdec('\\1'))",
$v
);
}
unset($res['count']);
return $res;
}
/**
* Implode unquoted RDNs to a DN
*
* TODO: throw away, this is not how it shall be done
*
* @param string DN-component
* @return string
*/
public static function implodeDN($parts)
{
$str = '';
foreach ($parts as $part) {
if ($str !== '') {
$str .= ',';
}
list($key, $val) = preg_split('~=~', $part, 2);
$str .= $key . '=' . self::quoteForDN($val);
}
return $str;
}
/**
* Quote a string that should be used in a DN
*
* Special characters will be escaped
*
* @param string DN-component
* @return string
*/
public static function quoteForDN($str)
{
return self::quoteChars(
$str,
array(
',',
'=',
'+',
'<',
'>',
';',
'\\',
'"',
'#'
)
);
}
/**
* Quote a string that should be used in an LDAP search
*
* Special characters will be escaped
*
* @param string String to be escaped
* @param bool $allow_wildcard
* @return string
*/
public static function quoteForSearch($str, $allow_wildcard = false)
{
if ($allow_wildcard) {
return self::quoteChars($str, array('(', ')', '\\', chr(0)));
}
return self::quoteChars($str, array('*', '(', ')', '\\', chr(0)));
}
/**
* Escape given characters in the given string
*
* Special characters will be escaped
*
* @param $str
* @param $chars
* @internal param String $string to be escaped
* @return string
*/
protected static function quoteChars($str, $chars)
{
$quotedChars = array();
foreach ($chars as $k => $v) {
// Temporarily prefixing with illegal '('
$quotedChars[$k] = '(' . str_pad(dechex(ord($v)), 2, '0');
}
$str = str_replace($chars, $quotedChars, $str);
// Replacing temporary '(' with '\\'. This is a workaround, as
// str_replace behaves pretty strange with leading a backslash:
$str = preg_replace('~\(~', '\\', $str);
return $str;
}
}