blob: c8db38706eadf2fd2978f3ea2cc362c9d96ee752 [file] [log] [blame]
<?php
namespace Adldap\Connections;
use Adldap\Adldap;
use Adldap\Auth\Guard;
use Adldap\Query\Cache;
use InvalidArgumentException;
use Adldap\Auth\GuardInterface;
use Adldap\Schemas\ActiveDirectory;
use Adldap\Schemas\SchemaInterface;
use Psr\SimpleCache\CacheInterface;
use Adldap\Models\Factory as ModelFactory;
use Adldap\Query\Factory as SearchFactory;
use Adldap\Configuration\DomainConfiguration;
/**
* Class Provider.
*
* Contains the LDAP connection and domain configuration to
* instantiate factories for retrieving and creating
* LDAP records as well as authentication (binding).
*/
class Provider implements ProviderInterface
{
/**
* The providers connection.
*
* @var ConnectionInterface
*/
protected $connection;
/**
* The providers configuration.
*
* @var DomainConfiguration
*/
protected $configuration;
/**
* The providers schema.
*
* @var SchemaInterface
*/
protected $schema;
/**
* The providers auth guard instance.
*
* @var GuardInterface
*/
protected $guard;
/**
* The providers cache instance.
*
* @var Cache|null
*/
protected $cache;
/**
* {@inheritdoc}
*/
public function __construct($configuration = [], ConnectionInterface $connection = null)
{
$this->setConfiguration($configuration)
->setConnection($connection);
}
/**
* Does nothing. Implemented in order to remain backwards compatible.
*
* @deprecated since v10.3.0
*/
public function __destruct()
{
//
}
/**
* {@inheritdoc}
*/
public function setConfiguration($configuration = [])
{
if (is_array($configuration)) {
$configuration = new DomainConfiguration($configuration);
}
if ($configuration instanceof DomainConfiguration) {
$this->configuration = $configuration;
$schema = $configuration->get('schema');
// We will update our schema here when our configuration is set.
$this->setSchema(new $schema());
return $this;
}
$class = DomainConfiguration::class;
throw new InvalidArgumentException(
"Configuration must be array or instance of $class"
);
}
/**
* {@inheritdoc}
*/
public function setConnection(ConnectionInterface $connection = null)
{
// We will create a standard connection if one isn't given.
$this->connection = $connection ?: new Ldap();
// Prepare the connection.
$this->prepareConnection();
// Instantiate the LDAP connection.
$this->connection->connect(
$this->configuration->get('hosts'),
$this->configuration->get('port')
);
return $this;
}
/**
* {@inheritdoc}
*/
public function setSchema(SchemaInterface $schema = null)
{
$this->schema = $schema ?: new ActiveDirectory();
return $this;
}
/**
* {@inheritdoc}
*/
public function setGuard(GuardInterface $guard)
{
$this->guard = $guard;
return $this;
}
/**
* Sets the cache store.
*
* @param CacheInterface $store
*
* @return $this
*/
public function setCache(CacheInterface $store)
{
$this->cache = new Cache($store);
return $this;
}
/**
* {@inheritdoc}
*/
public function getConfiguration()
{
return $this->configuration;
}
/**
* {@inheritdoc}
*/
public function getConnection()
{
return $this->connection;
}
/**
* {@inheritdoc}
*/
public function getSchema()
{
return $this->schema;
}
/**
* {@inheritdoc}
*/
public function getGuard()
{
if (!$this->guard instanceof GuardInterface) {
$this->setGuard($this->getDefaultGuard($this->connection, $this->configuration));
}
return $this->guard;
}
/**
* {@inheritdoc}
*/
public function getDefaultGuard(ConnectionInterface $connection, DomainConfiguration $configuration)
{
$guard = new Guard($connection, $configuration);
$guard->setDispatcher(Adldap::getEventDispatcher());
return $guard;
}
/**
* {@inheritdoc}
*/
public function make()
{
return new ModelFactory(
$this->search()->newQuery()
);
}
/**
* {@inheritdoc}
*/
public function search()
{
$factory = new SearchFactory(
$this->connection,
$this->schema,
$this->configuration->get('base_dn')
);
if ($this->cache) {
$factory->setCache($this->cache);
}
return $factory;
}
/**
* {@inheritdoc}
*/
public function auth()
{
return $this->getGuard();
}
/**
* {@inheritdoc}
*/
public function connect($username = null, $password = null)
{
// Get the default guard instance.
$guard = $this->getGuard();
if (is_null($username) && is_null($password)) {
// If both the username and password are null, we'll connect to the server
// using the configured administrator username and password.
$guard->bindAsAdministrator();
} else {
// Bind to the server with the specified username and password otherwise.
$guard->bind($username, $password);
}
return $this;
}
/**
* Prepares the connection by setting configured parameters.
*
* @throws \Adldap\Configuration\ConfigurationException When configuration options requested do not exist
*
* @return void
*/
protected function prepareConnection()
{
if ($this->configuration->get('use_ssl')) {
$this->connection->ssl();
} elseif ($this->configuration->get('use_tls')) {
$this->connection->tls();
}
$options = array_replace(
$this->configuration->get('custom_options'),
[
LDAP_OPT_PROTOCOL_VERSION => $this->configuration->get('version'),
LDAP_OPT_NETWORK_TIMEOUT => $this->configuration->get('timeout'),
LDAP_OPT_REFERRALS => $this->configuration->get('follow_referrals'),
]
);
$this->connection->setOptions($options);
}
}