git subrepo commit (merge) mailcow/src/mailcow-dockerized

subrepo: subdir:   "mailcow/src/mailcow-dockerized"
  merged:   "02ae5285"
upstream: origin:   "https://github.com/mailcow/mailcow-dockerized.git"
  branch:   "master"
  commit:   "649a5c01"
git-subrepo: version:  "0.4.3"
  origin:   "???"
  commit:   "???"
Change-Id: I870ad468fba026cc5abf3c5699ed1e12ff28b32b
diff --git a/mailcow/src/mailcow-dockerized/data/web/inc/lib/vendor/adldap2/adldap2/src/Adldap.php b/mailcow/src/mailcow-dockerized/data/web/inc/lib/vendor/adldap2/adldap2/src/Adldap.php
new file mode 100644
index 0000000..5e60697
--- /dev/null
+++ b/mailcow/src/mailcow-dockerized/data/web/inc/lib/vendor/adldap2/adldap2/src/Adldap.php
@@ -0,0 +1,194 @@
+<?php
+
+namespace Adldap;
+
+use Adldap\Log\EventLogger;
+use Adldap\Connections\Ldap;
+use InvalidArgumentException;
+use Adldap\Log\LogsInformation;
+use Adldap\Connections\Provider;
+use Adldap\Events\DispatchesEvents;
+use Adldap\Connections\ProviderInterface;
+use Adldap\Connections\ConnectionInterface;
+use Adldap\Configuration\DomainConfiguration;
+
+class Adldap implements AdldapInterface
+{
+    use DispatchesEvents;
+    use LogsInformation;
+    /**
+     * The default provider name.
+     *
+     * @var string
+     */
+    protected $default = 'default';
+
+    /**
+     * The connection providers.
+     *
+     * @var array
+     */
+    protected $providers = [];
+
+    /**
+     * The events to register listeners for during initialization.
+     *
+     * @var array
+     */
+    protected $listen = [
+        'Adldap\Auth\Events\*',
+        'Adldap\Query\Events\*',
+        'Adldap\Models\Events\*',
+    ];
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(array $providers = [])
+    {
+        foreach ($providers as $name => $config) {
+            $this->addProvider($config, $name);
+        }
+
+        if ($default = key($providers)) {
+            $this->setDefaultProvider($default);
+        }
+
+        $this->initEventLogger();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addProvider($config, $name = 'default', ConnectionInterface $connection = null)
+    {
+        if ($this->isValidConfig($config)) {
+            $config = new Provider($config, $connection ?? new Ldap($name));
+        }
+
+        if ($config instanceof ProviderInterface) {
+            $this->providers[$name] = $config;
+
+            return $this;
+        }
+
+        throw new InvalidArgumentException(
+            "You must provide a configuration array or an instance of Adldap\Connections\ProviderInterface."
+        );
+    }
+
+    /**
+     * Determines if the given config is valid.
+     *
+     * @param mixed $config
+     *
+     * @return bool
+     */
+    protected function isValidConfig($config)
+    {
+        return is_array($config) || $config instanceof DomainConfiguration;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getProviders()
+    {
+        return $this->providers;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getProvider($name)
+    {
+        if (array_key_exists($name, $this->providers)) {
+            return $this->providers[$name];
+        }
+
+        throw new AdldapException("The connection provider '$name' does not exist.");
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setDefaultProvider($name = 'default')
+    {
+        if ($this->getProvider($name) instanceof ProviderInterface) {
+            $this->default = $name;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDefaultProvider()
+    {
+        return $this->getProvider($this->default);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function removeProvider($name)
+    {
+        unset($this->providers[$name]);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function connect($name = null, $username = null, $password = null)
+    {
+        $provider = $name ? $this->getProvider($name) : $this->getDefaultProvider();
+
+        return $provider->connect($username, $password);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __call($method, $parameters)
+    {
+        $provider = $this->getDefaultProvider();
+        
+        if (! $provider->getConnection()->isBound()) {
+            $provider->connect();
+        }
+
+        return call_user_func_array([$provider, $method], $parameters);
+    }
+
+    /**
+     * Initializes the event logger.
+     *
+     * @return void
+     */
+    public function initEventLogger()
+    {
+        $dispatcher = static::getEventDispatcher();
+
+        $logger = $this->newEventLogger();
+
+        // We will go through each of our event wildcards and register their listener.
+        foreach ($this->listen as $event) {
+            $dispatcher->listen($event, function ($eventName, $events) use ($logger) {
+                foreach ($events as $event) {
+                    $logger->log($event);
+                }
+            });
+        }
+    }
+
+    /**
+     * Returns a new event logger instance.
+     *
+     * @return EventLogger
+     */
+    protected function newEventLogger()
+    {
+        return new EventLogger(static::getLogger());
+    }
+}