|
|
@@ -46,12 +46,16 @@ namespace OCA\User_LDAP; |
|
|
|
|
|
|
|
use Exception; |
|
|
|
use OC\ServerNotAvailableException; |
|
|
|
use OCA\User_LDAP\User\OfflineUser; |
|
|
|
use OCP\Cache\CappedMemoryCache; |
|
|
|
use OCP\GroupInterface; |
|
|
|
use OCP\Group\Backend\ABackend; |
|
|
|
use OCP\Group\Backend\IDeleteGroupBackend; |
|
|
|
use OCP\Group\Backend\IGetDisplayNameBackend; |
|
|
|
use OCP\IConfig; |
|
|
|
use OCP\Server; |
|
|
|
use Psr\Log\LoggerInterface; |
|
|
|
use function json_decode; |
|
|
|
|
|
|
|
class Group_LDAP extends ABackend implements GroupInterface, IGroupLDAP, IGetDisplayNameBackend, IDeleteGroupBackend { |
|
|
|
protected bool $enabled = false; |
|
|
@@ -83,7 +87,7 @@ class Group_LDAP extends ABackend implements GroupInterface, IGroupLDAP, IGetDis |
|
|
|
$this->cachedGroupsByMember = new CappedMemoryCache(); |
|
|
|
$this->cachedNestedGroups = new CappedMemoryCache(); |
|
|
|
$this->groupPluginManager = $groupPluginManager; |
|
|
|
$this->logger = \OCP\Server::get(LoggerInterface::class); |
|
|
|
$this->logger = Server::get(LoggerInterface::class); |
|
|
|
$this->ldapGroupMemberAssocAttr = strtolower((string)$gAssoc); |
|
|
|
} |
|
|
|
|
|
|
@@ -664,15 +668,28 @@ class Group_LDAP extends ABackend implements GroupInterface, IGroupLDAP, IGetDis |
|
|
|
* @throws Exception |
|
|
|
* @throws ServerNotAvailableException |
|
|
|
*/ |
|
|
|
public function getUserGroups($uid) { |
|
|
|
public function getUserGroups($uid): array { |
|
|
|
if (!$this->enabled) { |
|
|
|
return []; |
|
|
|
} |
|
|
|
$ncUid = $uid; |
|
|
|
|
|
|
|
$cacheKey = 'getUserGroups' . $uid; |
|
|
|
$userGroups = $this->access->connection->getFromCache($cacheKey); |
|
|
|
if (!is_null($userGroups)) { |
|
|
|
return $userGroups; |
|
|
|
} |
|
|
|
|
|
|
|
$user = $this->access->userManager->get($uid); |
|
|
|
if ($user instanceof OfflineUser) { |
|
|
|
// We load known group memberships from configuration for remnants, |
|
|
|
// because LDAP server does not contain them anymore |
|
|
|
/** @var IConfig $config */ |
|
|
|
$config = Server::get(IConfig::class); |
|
|
|
$groupStr = $config->getUserValue($uid, 'user_ldap', 'cached-group-memberships-' . $this->access->connection->getConfigPrefix(), '[]'); |
|
|
|
return json_decode($groupStr) ?? []; |
|
|
|
} |
|
|
|
|
|
|
|
$userDN = $this->access->username2dn($uid); |
|
|
|
if (!$userDN) { |
|
|
|
$this->access->connection->writeToCache($cacheKey, []); |
|
|
@@ -786,6 +803,10 @@ class Group_LDAP extends ABackend implements GroupInterface, IGroupLDAP, IGetDis |
|
|
|
|
|
|
|
$groups = array_unique($groups, SORT_LOCALE_STRING); |
|
|
|
$this->access->connection->writeToCache($cacheKey, $groups); |
|
|
|
/** @var IConfig $config */ |
|
|
|
$config = Server::get(IConfig::class); |
|
|
|
$groupStr = \json_encode($groups); |
|
|
|
$config->setUserValue($ncUid, 'user_ldap', 'cached-group-memberships-' . $this->access->connection->getConfigPrefix(), $groupStr); |
|
|
|
|
|
|
|
return $groups; |
|
|
|
} |