]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add user enabled state backend feature
authorCôme Chilliet <come.chilliet@nextcloud.com>
Wed, 5 Oct 2022 15:13:33 +0000 (17:13 +0200)
committerCôme Chilliet <come.chilliet@nextcloud.com>
Tue, 23 May 2023 09:25:03 +0000 (11:25 +0200)
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
lib/private/User/User.php
lib/public/User/Backend/IProvideEnabledStateBackend.php [new file with mode: 0644]

index c68d4ee290ae5b0509653bb5d59d094dfcd98ff9..8830b4aae71c4994144a6255201b9b3d6e7a4913 100644 (file)
@@ -55,6 +55,7 @@ use OCP\User\GetQuotaEvent;
 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;
@@ -432,25 +433,45 @@ class User implements IUser {
         * @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 (file)
index 0000000..143eca5
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2022 Côme Chilliet <come.chilliet@nextcloud.com>
+ *
+ * @author Côme Chilliet <come.chilliet@nextcloud.com>
+ *
+ * @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/>.
+ *
+ */
+
+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;
+}