aboutsummaryrefslogtreecommitdiffstats
path: root/apps/user_ldap/lib/Proxy.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/user_ldap/lib/Proxy.php')
-rw-r--r--apps/user_ldap/lib/Proxy.php173
1 files changed, 87 insertions, 86 deletions
diff --git a/apps/user_ldap/lib/Proxy.php b/apps/user_ldap/lib/Proxy.php
index dc8c6fc77cc..22b2c6617af 100644
--- a/apps/user_ldap/lib/Proxy.php
+++ b/apps/user_ldap/lib/Proxy.php
@@ -1,99 +1,88 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin McCorkell <robin@mccorkell.me.uk>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Roger Szabo <roger.szabo@web.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
-
namespace OCA\User_LDAP;
-use OCA\User_LDAP\Mapping\UserMapping;
use OCA\User_LDAP\Mapping\GroupMapping;
-use OCA\User_LDAP\User\Manager;
+use OCA\User_LDAP\Mapping\UserMapping;
+use OCP\ICache;
+use OCP\ICacheFactory;
+use OCP\Server;
+/**
+ * @template T
+ */
abstract class Proxy {
- static private $accesses = array();
- private $ldap = null;
+ /** @var array<string,Access> */
+ private static array $accesses = [];
+ private ?bool $isSingleBackend = null;
+ private ?ICache $cache = null;
+
+ /** @var T[] */
+ protected array $backends = [];
+ /** @var ?T */
+ protected $refBackend = null;
+
+ protected bool $isSetUp = false;
+
+ public function __construct(
+ private Helper $helper,
+ private ILDAPWrapper $ldap,
+ private AccessFactory $accessFactory,
+ ) {
+ $memcache = Server::get(ICacheFactory::class);
+ if ($memcache->isAvailable()) {
+ $this->cache = $memcache->createDistributed();
+ }
+ }
- /** @var \OCP\ICache|null */
- private $cache;
+ protected function setup(): void {
+ if ($this->isSetUp) {
+ return;
+ }
- /**
- * @param ILDAPWrapper $ldap
- */
- public function __construct(ILDAPWrapper $ldap) {
- $this->ldap = $ldap;
- $memcache = \OC::$server->getMemCacheFactory();
- if($memcache->isAvailable()) {
- $this->cache = $memcache->createDistributed();
+ $serverConfigPrefixes = $this->helper->getServerConfigurationPrefixes(true);
+ foreach ($serverConfigPrefixes as $configPrefix) {
+ $this->backends[$configPrefix] = $this->newInstance($configPrefix);
+
+ if (is_null($this->refBackend)) {
+ $this->refBackend = $this->backends[$configPrefix];
+ }
}
+
+ $this->isSetUp = true;
}
/**
- * @param string $configPrefix
+ * @return T
*/
- private function addAccess($configPrefix) {
- static $ocConfig;
- static $fs;
- static $log;
- static $avatarM;
- static $userMap;
- static $groupMap;
- static $db;
- static $coreUserManager;
- static $coreNotificationManager;
- if($fs === null) {
- $ocConfig = \OC::$server->getConfig();
- $fs = new FilesystemHelper();
- $log = new LogWrapper();
- $avatarM = \OC::$server->getAvatarManager();
- $db = \OC::$server->getDatabaseConnection();
- $userMap = new UserMapping($db);
- $groupMap = new GroupMapping($db);
- $coreUserManager = \OC::$server->getUserManager();
- $coreNotificationManager = \OC::$server->getNotificationManager();
- }
- $userManager =
- new Manager($ocConfig, $fs, $log, $avatarM, new \OCP\Image(), $db,
- $coreUserManager, $coreNotificationManager);
+ abstract protected function newInstance(string $configPrefix): object;
+
+ /**
+ * @return T
+ */
+ public function getBackend(string $configPrefix): object {
+ $this->setup();
+ return $this->backends[$configPrefix];
+ }
+
+ private function addAccess(string $configPrefix): void {
+ $userMap = Server::get(UserMapping::class);
+ $groupMap = Server::get(GroupMapping::class);
+
$connector = new Connection($this->ldap, $configPrefix);
- $access = new Access($connector, $this->ldap, $userManager, new Helper($ocConfig), $ocConfig);
+ $access = $this->accessFactory->get($connector);
$access->setUserMapper($userMap);
$access->setGroupMapper($groupMap);
self::$accesses[$configPrefix] = $access;
}
- /**
- * @param string $configPrefix
- * @return mixed
- */
- protected function getAccess($configPrefix) {
- if(!isset(self::$accesses[$configPrefix])) {
+ protected function getAccess(string $configPrefix): Access {
+ if (!isset(self::$accesses[$configPrefix])) {
$this->addAccess($configPrefix);
}
return self::$accesses[$configPrefix];
@@ -104,7 +93,7 @@ abstract class Proxy {
* @return string
*/
protected function getUserCacheKey($uid) {
- return 'user-'.$uid.'-lastSeenOn';
+ return 'user-' . $uid . '-lastSeenOn';
}
/**
@@ -112,7 +101,7 @@ abstract class Proxy {
* @return string
*/
protected function getGroupCacheKey($gid) {
- return 'group-'.$gid.'-lastSeenOn';
+ return 'group-' . $gid . '-lastSeenOn';
}
/**
@@ -138,17 +127,29 @@ abstract class Proxy {
*/
abstract public function getLDAPAccess($id);
+ abstract protected function activeBackends(): int;
+
+ protected function isSingleBackend(): bool {
+ if ($this->isSingleBackend === null) {
+ $this->isSingleBackend = $this->activeBackends() === 1;
+ }
+ return $this->isSingleBackend;
+ }
+
/**
* Takes care of the request to the User backend
+ *
* @param string $id
* @param string $method string, the method of the user backend that shall be called
* @param array $parameters an array of parameters to be passed
* @param bool $passOnWhen
- * @return mixed, the result of the specified method
+ * @return mixed the result of the specified method
*/
protected function handleRequest($id, $method, $parameters, $passOnWhen = false) {
- $result = $this->callOnLastSeenOn($id, $method, $parameters, $passOnWhen);
- if($result === $passOnWhen) {
+ if (!$this->isSingleBackend()) {
+ $result = $this->callOnLastSeenOn($id, $method, $parameters, $passOnWhen);
+ }
+ if (!isset($result) || $result === $passOnWhen) {
$result = $this->walkBackends($id, $method, $parameters);
}
return $result;
@@ -160,10 +161,10 @@ abstract class Proxy {
*/
private function getCacheKey($key) {
$prefix = 'LDAP-Proxy-';
- if($key === null) {
+ if ($key === null) {
return $prefix;
}
- return $prefix.md5($key);
+ return $prefix . hash('sha256', $key);
}
/**
@@ -171,7 +172,7 @@ abstract class Proxy {
* @return mixed|null
*/
public function getFromCache($key) {
- if($this->cache === null) {
+ if ($this->cache === null) {
return null;
}
@@ -189,16 +190,16 @@ abstract class Proxy {
* @param mixed $value
*/
public function writeToCache($key, $value) {
- if($this->cache === null) {
+ if ($this->cache === null) {
return;
}
- $key = $this->getCacheKey($key);
+ $key = $this->getCacheKey($key);
$value = base64_encode(json_encode($value));
$this->cache->set($key, $value, 2592000);
}
public function clearCache() {
- if($this->cache === null) {
+ if ($this->cache === null) {
return;
}
$this->cache->clear($this->getCacheKey(null));