Merge pull request #29837 from nextcloud/fix/user_ldap-check-cache

This commit is contained in:
Julius Härtl 2021-11-25 16:33:52 +01:00 committed by GitHub
commit 388fa06695
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 16 deletions

View file

@ -91,7 +91,7 @@ class CheckUser extends Command {
$uid = $input->getArgument('ocName');
$this->isAllowed($input->getOption('force'));
$this->confirmUserIsMapped($uid);
$exists = $this->backend->userExistsOnLDAP($uid);
$exists = $this->backend->userExistsOnLDAP($uid, true);
if ($exists === true) {
$output->writeln('The user is still available on LDAP.');
if ($input->getOption('update')) {

View file

@ -296,11 +296,10 @@ class User_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
*
* @param string|\OCA\User_LDAP\User\User $user either the Nextcloud user
* name or an instance of that user
* @return bool
* @throws \Exception
* @throws \OC\ServerNotAvailableException
*/
public function userExistsOnLDAP($user) {
public function userExistsOnLDAP($user, bool $ignoreCache = false): bool {
if (is_string($user)) {
$user = $this->access->userManager->get($user);
}
@ -309,9 +308,11 @@ class User_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
}
$uid = $user instanceof User ? $user->getUsername() : $user->getOCName();
$cacheKey = 'userExistsOnLDAP' . $uid;
$userExists = $this->access->connection->getFromCache($cacheKey);
if (!is_null($userExists)) {
return (bool)$userExists;
if (!$ignoreCache) {
$userExists = $this->access->connection->getFromCache($cacheKey);
if (!is_null($userExists)) {
return (bool)$userExists;
}
}
$dn = $user->getDN();
@ -389,13 +390,27 @@ class User_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
}
}
$marked = $this->ocConfig->getUserValue($uid, 'user_ldap', 'isDeleted', 0);
if ((int)$marked === 0) {
$this->logger->notice(
'User '.$uid . ' is not marked as deleted, not cleaning up.',
['app' => 'user_ldap']
);
return false;
$marked = (int)$this->ocConfig->getUserValue($uid, 'user_ldap', 'isDeleted', 0);
if ($marked === 0) {
try {
$user = $this->access->userManager->get($uid);
if (($user instanceof User) && !$this->userExistsOnLDAP($uid, true)) {
$user->markUser();
$marked = 1;
}
} catch (\Exception $e) {
$this->logger->debug(
$e->getMessage(),
['app' => 'user_ldap', 'exception' => $e]
);
}
if ($marked === 0) {
$this->logger->notice(
'User '.$uid . ' is not marked as deleted, not cleaning up.',
['app' => 'user_ldap']
);
return false;
}
}
$this->logger->info('Cleaning up after user ' . $uid,
['app' => 'user_ldap']);

View file

@ -204,11 +204,10 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface,
*
* @param string|\OCA\User_LDAP\User\User $user either the Nextcloud user
* name or an instance of that user
* @return boolean
*/
public function userExistsOnLDAP($user) {
public function userExistsOnLDAP($user, bool $ignoreCache = false): bool {
$id = ($user instanceof User) ? $user->getUsername() : $user;
return $this->handleRequest($id, 'userExistsOnLDAP', [$user]);
return $this->handleRequest($id, 'userExistsOnLDAP', [$user, $ignoreCache]);
}
/**