From 417df8efc930ef27e6bbabdba75c1c55dad0618f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Wed, 5 Oct 2022 17:13:33 +0200 Subject: [PATCH] Add user enabled state backend feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- lib/private/User/User.php | 40 ++++++++++++---- .../Backend/IProvideEnabledStateBackend.php | 47 +++++++++++++++++++ 2 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 lib/public/User/Backend/IProvideEnabledStateBackend.php diff --git a/lib/private/User/User.php b/lib/private/User/User.php index eda6b5f79d946..3b9d1b22ac33e 100644 --- a/lib/private/User/User.php +++ b/lib/private/User/User.php @@ -55,6 +55,7 @@ use OCP\User\Backend\ISetDisplayNameBackend; use OCP\User\Backend\ISetPasswordBackend; use OCP\User\Backend\IProvideAvatarBackend; +use OCP\User\Backend\IProvideEnabledStateBackend; use OCP\User\Backend\IGetHomeBackend; use OCP\UserInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -275,7 +276,6 @@ public function delete() { $this->dispatcher->dispatchTyped(new BeforeUserDeletedEvent($this)); $result = $this->backend->deleteUser($this->uid); if ($result) { - // FIXME: Feels like an hack - suggestions? $groupManager = \OC::$server->getGroupManager(); @@ -429,25 +429,45 @@ public function canChangeDisplayName() { * @return bool */ public function isEnabled() { - if ($this->enabled === null) { - $enabled = $this->config->getUserValue($this->uid, 'core', 'enabled', 'true'); - $this->enabled = $enabled === 'true'; + $queryDatabaseValue = function (): bool { + if ($this->enabled === null) { + $enabled = $this->config->getUserValue($this->uid, 'core', 'enabled', 'true'); + $this->enabled = $enabled === 'true'; + } + return (bool) $this->enabled; + }; + if ($this->backend instanceof IProvideEnabledStateBackend) { + return $this->backend->isUserEnabled($this->uid, $queryDatabaseValue); + } else { + return $queryDatabaseValue(); } - return (bool) $this->enabled; } /** * set the enabled status for the user * - * @param bool $enabled + * @return void */ public function setEnabled(bool $enabled = true) { $oldStatus = $this->isEnabled(); - $this->enabled = $enabled; - if ($oldStatus !== $this->enabled) { - // TODO: First change the value, then trigger the event as done for all other properties. - $this->triggerChange('enabled', $enabled, $oldStatus); + $setDatabaseValue = function (bool $enabled): void { $this->config->setUserValue($this->uid, 'core', 'enabled', $enabled ? 'true' : 'false'); + $this->enabled = $enabled; + }; + if ($this->backend instanceof IProvideEnabledStateBackend) { + $queryDatabaseValue = function (): bool { + if ($this->enabled === null) { + $enabled = $this->config->getUserValue($this->uid, 'core', 'enabled', 'true'); + $this->enabled = $enabled === 'true'; + } + return (bool) $this->enabled; + }; + $this->backend->setUserEnabled($this->uid, $enabled, $queryDatabaseValue, $setDatabaseValue); + } else { + $setDatabaseValue($enabled); + } + if ($oldStatus !== $enabled) { + $this->triggerChange('enabled', $enabled, $oldStatus); } } diff --git a/lib/public/User/Backend/IProvideEnabledStateBackend.php b/lib/public/User/Backend/IProvideEnabledStateBackend.php new file mode 100644 index 0000000000000..143eca548ab92 --- /dev/null +++ b/lib/public/User/Backend/IProvideEnabledStateBackend.php @@ -0,0 +1,47 @@ + + * + * @author Côme Chilliet + * + * @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 . + * + */ + +namespace OCP\User\Backend; + +/** + * @since 26.0.0 + */ +interface IProvideEnabledStateBackend { + /** + * @since 26.0.0 + * + * @param callable():bool $queryDatabaseValue A callable to query the enabled state from database + */ + public function isUserEnabled(string $uid, callable $queryDatabaseValue): bool; + + /** + * @since 26.0.0 + * + * @param callable():bool $queryDatabaseValue A callable to query the enabled state from database + * @param callable(bool):void $setDatabaseValue A callable to set the enabled state in the database. + */ + public function setUserEnabled(string $uid, bool $enabled, callable $queryDatabaseValue, callable $setDatabaseValue): void; +}