. * */ namespace OCA\user_ldap\lib; class LDAP implements ILDAPWrapper { protected $curFunc = ''; protected $curArgs = array(); public function bind($link, $dn, $password) { return $this->invokeLDAPMethod('bind', $link, $dn, $password); } public function connect($host, $port) { return $this->invokeLDAPMethod('connect', $host, $port); } public function controlPagedResultResponse($link, $result, &$cookie) { $this->preFunctionCall('ldap_control_paged_result_response', array($link, $result, $cookie)); $result = ldap_control_paged_result_response($link, $result, $cookie); $this->postFunctionCall(); return $result; } public function controlPagedResult($link, $pagesize, $isCritical, $cookie) { return $this->invokeLDAPMethod('control_paged_result', $link, $pagesize, $isCritical, $cookie); } public function countEntries($link, $result) { return $this->invokeLDAPMethod('count_entries', $link, $result); } public function errno($link) { return $this->invokeLDAPMethod('errno', $link); } public function error($link) { return $this->invokeLDAPMethod('error', $link); } public function firstEntry($link, $result) { return $this->invokeLDAPMethod('first_entry', $link, $result); } public function getAttributes($link, $result) { return $this->invokeLDAPMethod('get_attributes', $link, $result); } public function getDN($link, $result) { return $this->invokeLDAPMethod('get_dn', $link, $result); } public function getEntries($link, $result) { return $this->invokeLDAPMethod('get_entries', $link, $result); } public function nextEntry($link, $result) { return ldap_next_entry($link, $result); } public function read($link, $baseDN, $filter, $attr) { return $this->invokeLDAPMethod('read', $link, $baseDN, $filter, $attr); } public function search($link, $baseDN, $filter, $attr, $attrsonly = 0, $limit = 0) { return $this->invokeLDAPMethod('search', $link, $baseDN, $filter, $attr, $attrsonly, $limit); } public function setOption($link, $option, $value) { return $this->invokeLDAPMethod('set_option', $link, $option, $value); } public function sort($link, $result, $sortfilter) { return $this->invokeLDAPMethod('sort', $link, $result, $sortfilter); } public function startTls($link) { return $this->invokeLDAPMethod('start_tls', $link); } public function unbind($link) { return $this->invokeLDAPMethod('unbind', $link); } /** * @brief Checks whether the server supports LDAP * @return boolean if it the case, false otherwise * */ public function areLDAPFunctionsAvailable() { return function_exists('ldap_connect'); } /** * @brief Checks whether PHP supports LDAP Paged Results * @return boolean if it the case, false otherwise * */ public function hasPagedResultSupport() { $hasSupport = function_exists('ldap_control_paged_result') && function_exists('ldap_control_paged_result_response'); return $hasSupport; } /** * @brief Checks whether the submitted parameter is a resource * @param $resource the resource variable to check * @return boolean if it is a resource, false otherwise */ public function isResource($resource) { return is_resource($resource); } private function invokeLDAPMethod() { $arguments = func_get_args(); $func = 'ldap_' . array_shift($arguments); if(function_exists($func)) { $this->preFunctionCall($func, $arguments); $result = call_user_func_array($func, $arguments); if ($result === FALSE) { $this->postFunctionCall(); } return $result; } } /** * @param string $functionName */ private function preFunctionCall($functionName, $args) { $this->curFunc = $functionName; $this->curArgs = $args; } private function postFunctionCall() { if($this->isResource($this->curArgs[0])) { $errorCode = ldap_errno($this->curArgs[0]); $errorMsg = ldap_error($this->curArgs[0]); if($errorCode !== 0) { if($this->curFunc === 'ldap_sort' && $errorCode === -4) { //You can safely ignore that decoding error. //… says https://bugs.php.net/bug.php?id=18023 } else if($this->curFunc === 'ldap_get_entries' && $errorCode === -4) { } else if ($errorCode === 32) { //for now } else if ($errorCode === 10) { //referrals, we switch them off, but then there is AD :) } else { \OCP\Util::writeLog('user_ldap', 'LDAP error '.$errorMsg.' (' . $errorCode.') after calling '. $this->curFunc, \OCP\Util::DEBUG); } } } $this->curFunc = ''; $this->curArgs = array(); } }