aboutsummaryrefslogtreecommitdiffstats
path: root/apps/user_ldap/lib/LDAPProvider.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/user_ldap/lib/LDAPProvider.php')
-rw-r--r--apps/user_ldap/lib/LDAPProvider.php94
1 files changed, 42 insertions, 52 deletions
diff --git a/apps/user_ldap/lib/LDAPProvider.php b/apps/user_ldap/lib/LDAPProvider.php
index c63bca9724a..d9750ae3fcf 100644
--- a/apps/user_ldap/lib/LDAPProvider.php
+++ b/apps/user_ldap/lib/LDAPProvider.php
@@ -1,63 +1,43 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, Roger Szabo (roger.szabo@web.de)
- *
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Roger Szabo <roger.szabo@web.de>
- * @author root <root@localhost.localdomain>
- * @author Vinicius Cubas Brand <vinicius@eita.org.br>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * 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
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
namespace OCA\User_LDAP;
use OCA\User_LDAP\User\DeletedUsersIndex;
use OCP\IServerContainer;
use OCP\LDAP\IDeletionFlagSupport;
use OCP\LDAP\ILDAPProvider;
+use Psr\Log\LoggerInterface;
/**
- * LDAP provider for pulic access to the LDAP backend.
+ * LDAP provider for public access to the LDAP backend.
*/
class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport {
private $userBackend;
private $groupBackend;
private $logger;
- private $helper;
- private $deletedUsersIndex;
/**
* Create new LDAPProvider
- * @param \OCP\IServerContainer $serverContainer
+ * @param IServerContainer $serverContainer
* @param Helper $helper
* @param DeletedUsersIndex $deletedUsersIndex
* @throws \Exception if user_ldap app was not enabled
*/
- public function __construct(IServerContainer $serverContainer, Helper $helper, DeletedUsersIndex $deletedUsersIndex) {
- $this->logger = $serverContainer->getLogger();
- $this->helper = $helper;
- $this->deletedUsersIndex = $deletedUsersIndex;
+ public function __construct(
+ IServerContainer $serverContainer,
+ private Helper $helper,
+ private DeletedUsersIndex $deletedUsersIndex,
+ ) {
+ $this->logger = $serverContainer->get(LoggerInterface::class);
$userBackendFound = false;
$groupBackendFound = false;
foreach ($serverContainer->getUserManager()->getBackends() as $backend) {
- $this->logger->debug('instance '.get_class($backend).' user backend.', ['app' => 'user_ldap']);
+ $this->logger->debug('instance ' . get_class($backend) . ' user backend.', ['app' => 'user_ldap']);
if ($backend instanceof IUserLDAP) {
$this->userBackend = $backend;
$userBackendFound = true;
@@ -65,7 +45,7 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport {
}
}
foreach ($serverContainer->getGroupManager()->getBackends() as $backend) {
- $this->logger->debug('instance '.get_class($backend).' group backend.', ['app' => 'user_ldap']);
+ $this->logger->debug('instance ' . get_class($backend) . ' group backend.', ['app' => 'user_ldap']);
if ($backend instanceof IGroupLDAP) {
$this->groupBackend = $backend;
$groupBackendFound = true;
@@ -138,8 +118,8 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport {
/**
* Sanitize a DN received from the LDAP server.
- * @param array $dn the DN in question
- * @return array the sanitized DN
+ * @param array|string $dn the DN in question
+ * @return array|string the sanitized DN
*/
public function sanitizeDN($dn) {
return $this->helper->sanitizeDN($dn);
@@ -149,7 +129,7 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport {
* Return a new LDAP connection resource for the specified user.
* The connection must be closed manually.
* @param string $uid user id
- * @return resource of the LDAP connection
+ * @return \LDAP\Connection The LDAP connection
* @throws \Exception if user id was not found in LDAP
*/
public function getLDAPConnection($uid) {
@@ -163,7 +143,7 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport {
* Return a new LDAP connection resource for the specified user.
* The connection must be closed manually.
* @param string $gid group id
- * @return resource of the LDAP connection
+ * @return \LDAP\Connection The LDAP connection
* @throws \Exception if group id was not found in LDAP
*/
public function getGroupLDAPConnection($gid) {
@@ -309,32 +289,42 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport {
/**
* Get an LDAP attribute for a nextcloud user
- * @param string $uid the nextcloud user id to get the attribute for
- * @param string $attribute the name of the attribute to read
- * @return string|null
+ *
* @throws \Exception if user id was not found in LDAP
*/
public function getUserAttribute(string $uid, string $attribute): ?string {
+ $values = $this->getMultiValueUserAttribute($uid, $attribute);
+ if (count($values) === 0) {
+ return null;
+ }
+ return current($values);
+ }
+
+ /**
+ * Get a multi-value LDAP attribute for a nextcloud user
+ *
+ * @throws \Exception if user id was not found in LDAP
+ */
+ public function getMultiValueUserAttribute(string $uid, string $attribute): array {
if (!$this->userBackend->userExists($uid)) {
throw new \Exception('User id not found in LDAP');
}
+
$access = $this->userBackend->getLDAPAccess($uid);
$connection = $access->getConnection();
- $key = $uid . "::" . $attribute;
- $cached = $connection->getFromCache($key);
+ $key = $uid . '-' . $attribute;
- if ($cached !== null) {
+ $cached = $connection->getFromCache($key);
+ if (is_array($cached)) {
return $cached;
}
- $value = $access->readAttribute($access->username2dn($uid), $attribute);
- if (is_array($value) && count($value) > 0) {
- $value = current($value);
- } else {
- return null;
+ $values = $access->readAttribute($access->username2dn($uid), $attribute);
+ if ($values === false) {
+ $values = [];
}
- $connection->writeToCache($key, $value);
- return $value;
+ $connection->writeToCache($key, $values);
+ return $values;
}
}