blob: 6503cead3fd81c137ee69dd644d8ffc56f51d18c [file] [log] [blame]
<?php
namespace LdapRecord;
class Ldap implements LdapInterface
{
use HandlesConnection, DetectsErrors;
/**
* @inheritdoc
*/
public function getEntries($searchResults)
{
return $this->executeFailableOperation(function () use ($searchResults) {
return ldap_get_entries($this->connection, $searchResults);
});
}
/**
* Retrieves the first entry from a search result.
*
* @see http://php.net/manual/en/function.ldap-first-entry.php
*
* @param resource $searchResults
*
* @return resource
*/
public function getFirstEntry($searchResults)
{
return $this->executeFailableOperation(function () use ($searchResults) {
return ldap_first_entry($this->connection, $searchResults);
});
}
/**
* Retrieves the next entry from a search result.
*
* @see http://php.net/manual/en/function.ldap-next-entry.php
*
* @param resource $entry
*
* @return resource
*/
public function getNextEntry($entry)
{
return $this->executeFailableOperation(function () use ($entry) {
return ldap_next_entry($this->connection, $entry);
});
}
/**
* Retrieves the ldap entry's attributes.
*
* @see http://php.net/manual/en/function.ldap-get-attributes.php
*
* @param resource $entry
*
* @return array|false
*/
public function getAttributes($entry)
{
return $this->executeFailableOperation(function () use ($entry) {
return ldap_get_attributes($this->connection, $entry);
});
}
/**
* Returns the number of entries from a search result.
*
* @see http://php.net/manual/en/function.ldap-count-entries.php
*
* @param resource $searchResults
*
* @return int
*/
public function countEntries($searchResults)
{
return $this->executeFailableOperation(function () use ($searchResults) {
return ldap_count_entries($this->connection, $searchResults);
});
}
/**
* Compare value of attribute found in entry specified with DN.
*
* @see http://php.net/manual/en/function.ldap-compare.php
*
* @param string $dn
* @param string $attribute
* @param string $value
*
* @return mixed
*/
public function compare($dn, $attribute, $value)
{
return $this->executeFailableOperation(function () use ($dn, $attribute, $value) {
return ldap_compare($this->connection, $dn, $attribute, $value);
});
}
/**
* @inheritdoc
*/
public function getLastError()
{
if (! $this->connection) {
return;
}
return ldap_error($this->connection);
}
/**
* @inheritdoc
*/
public function getDetailedError()
{
if (! $number = $this->errNo()) {
return;
}
$this->getOption(LDAP_OPT_DIAGNOSTIC_MESSAGE, $message);
return new DetailedError($number, $this->err2Str($number), $message);
}
/**
* Get all binary values from the specified result entry.
*
* @see http://php.net/manual/en/function.ldap-get-values-len.php
*
* @param $entry
* @param $attribute
*
* @return array
*/
public function getValuesLen($entry, $attribute)
{
return $this->executeFailableOperation(function () use ($entry, $attribute) {
return ldap_get_values_len($this->connection, $entry, $attribute);
});
}
/**
* @inheritdoc
*/
public function setOption($option, $value)
{
return ldap_set_option($this->connection, $option, $value);
}
/**
* @inheritdoc
*/
public function getOption($option, &$value = null)
{
ldap_get_option($this->connection, $option, $value);
return $value;
}
/**
* Set a callback function to do re-binds on referral chasing.
*
* @see http://php.net/manual/en/function.ldap-set-rebind-proc.php
*
* @param callable $callback
*
* @return bool
*/
public function setRebindCallback(callable $callback)
{
return ldap_set_rebind_proc($this->connection, $callback);
}
/**
* @inheritdoc
*/
public function startTLS()
{
return $this->executeFailableOperation(function () {
return ldap_start_tls($this->connection);
});
}
/**
* @inheritdoc
*/
public function connect($hosts = [], $port = 389)
{
$this->bound = false;
$this->host = $this->makeConnectionUris($hosts, $port);
return $this->connection = $this->executeFailableOperation(function () {
return ldap_connect($this->host);
});
}
/**
* @inheritdoc
*/
public function close()
{
$result = is_resource($this->connection) ? @ldap_close($this->connection) : false;
$this->connection = null;
$this->bound = false;
$this->host = null;
return $result;
}
/**
* @inheritdoc
*/
public function search($dn, $filter, array $fields, $onlyAttributes = false, $size = 0, $time = 0, $deref = null, $serverControls = [])
{
return $this->executeFailableOperation(function () use (
$dn,
$filter,
$fields,
$onlyAttributes,
$size,
$time,
$deref,
$serverControls
) {
return empty($serverControls)
? ldap_search($this->connection, $dn, $filter, $fields, $onlyAttributes, $size, $time, $deref)
: ldap_search($this->connection, $dn, $filter, $fields, $onlyAttributes, $size, $time, $deref, $serverControls);
});
}
/**
* @inheritdoc
*/
public function listing($dn, $filter, array $fields, $onlyAttributes = false, $size = 0, $time = 0, $deref = null, $serverControls = [])
{
return $this->executeFailableOperation(function () use (
$dn,
$filter,
$fields,
$onlyAttributes,
$size,
$time,
$deref,
$serverControls
) {
return empty($serverControls)
? ldap_list($this->connection, $dn, $filter, $fields, $onlyAttributes, $size, $time, $deref)
: ldap_list($this->connection, $dn, $filter, $fields, $onlyAttributes, $size, $time, $deref, $serverControls);
});
}
/**
* @inheritdoc
*/
public function read($dn, $filter, array $fields, $onlyAttributes = false, $size = 0, $time = 0, $deref = null, $serverControls = [])
{
return $this->executeFailableOperation(function () use (
$dn,
$filter,
$fields,
$onlyAttributes,
$size,
$time,
$deref,
$serverControls
) {
return empty($serverControls)
? ldap_read($this->connection, $dn, $filter, $fields, $onlyAttributes, $size, $time, $deref)
: ldap_read($this->connection, $dn, $filter, $fields, $onlyAttributes, $size, $time, $deref, $serverControls);
});
}
/**
* @inheritdoc
*/
public function parseResult($result, &$errorCode, &$dn, &$errorMessage, &$referrals, &$serverControls = [])
{
return $this->executeFailableOperation(function () use (
$result,
&$errorCode,
&$dn,
&$errorMessage,
&$referrals,
&$serverControls
) {
return empty($serverControls)
? ldap_parse_result($this->connection, $result, $errorCode, $dn, $errorMessage, $referrals)
: ldap_parse_result($this->connection, $result, $errorCode, $dn, $errorMessage, $referrals, $serverControls);
});
}
/**
* @inheritdoc
*/
public function bind($username, $password)
{
return $this->bound = $this->executeFailableOperation(function () use ($username, $password) {
return ldap_bind($this->connection, $username, html_entity_decode($password));
});
}
/**
* @inheritdoc
*/
public function add($dn, array $entry)
{
return $this->executeFailableOperation(function () use ($dn, $entry) {
return ldap_add($this->connection, $dn, $entry);
});
}
/**
* @inheritdoc
*/
public function delete($dn)
{
return $this->executeFailableOperation(function () use ($dn) {
return ldap_delete($this->connection, $dn);
});
}
/**
* @inheritdoc
*/
public function rename($dn, $newRdn, $newParent, $deleteOldRdn = false)
{
return $this->executeFailableOperation(function () use (
$dn,
$newRdn,
$newParent,
$deleteOldRdn
) {
return ldap_rename($this->connection, $dn, $newRdn, $newParent, $deleteOldRdn);
});
}
/**
* @inheritdoc
*/
public function modify($dn, array $entry)
{
return $this->executeFailableOperation(function () use ($dn, $entry) {
return ldap_modify($this->connection, $dn, $entry);
});
}
/**
* @inheritdoc
*/
public function modifyBatch($dn, array $values)
{
return $this->executeFailableOperation(function () use ($dn, $values) {
return ldap_modify_batch($this->connection, $dn, $values);
});
}
/**
* @inheritdoc
*/
public function modAdd($dn, array $entry)
{
return $this->executeFailableOperation(function () use ($dn, $entry) {
return ldap_mod_add($this->connection, $dn, $entry);
});
}
/**
* @inheritdoc
*/
public function modReplace($dn, array $entry)
{
return $this->executeFailableOperation(function () use ($dn, $entry) {
return ldap_mod_replace($this->connection, $dn, $entry);
});
}
/**
* @inheritdoc
*/
public function modDelete($dn, array $entry)
{
return $this->executeFailableOperation(function () use ($dn, $entry) {
return ldap_mod_del($this->connection, $dn, $entry);
});
}
/**
* @inheritdoc
*/
public function controlPagedResult($pageSize = 1000, $isCritical = false, $cookie = '')
{
return $this->executeFailableOperation(function () use ($pageSize, $isCritical, $cookie) {
return ldap_control_paged_result($this->connection, $pageSize, $isCritical, $cookie);
});
}
/**
* @inheritdoc
*/
public function controlPagedResultResponse($result, &$cookie, &$estimated = null)
{
return $this->executeFailableOperation(function () use ($result, &$cookie, &$estimated) {
return ldap_control_paged_result_response($this->connection, $result, $cookie, $estimated);
});
}
/**
* @inheritdoc
*/
public function freeResult($result)
{
return ldap_free_result($result);
}
/**
* @inheritdoc
*/
public function errNo()
{
return $this->connection ? ldap_errno($this->connection) : null;
}
/**
* @inheritdoc
*/
public function err2Str($number)
{
return ldap_err2str($number);
}
/**
* Returns the extended error hex code of the last command.
*
* @return string|null
*/
public function getExtendedErrorHex()
{
if (preg_match("/(?<=data\s).*?(?=,)/", $this->getExtendedError(), $code)) {
return $code[0];
}
}
/**
* Returns the extended error code of the last command.
*
* @return bool|string
*/
public function getExtendedErrorCode()
{
return $this->extractDiagnosticCode($this->getExtendedError());
}
/**
* Extract the diagnostic code from the message.
*
* @param string $message
*
* @return string|bool
*/
public function extractDiagnosticCode($message)
{
preg_match('/^([\da-fA-F]+):/', $message, $matches);
return isset($matches[1]) ? $matches[1] : false;
}
/**
* @inheritdoc
*/
public function getDiagnosticMessage()
{
$this->getOption(LDAP_OPT_ERROR_STRING, $message);
return $message;
}
}