]> source.dussan.org Git - nextcloud-server.git/commitdiff
Allow to register AlternativeLogin on RegistrationContext 21850/head
authorJoas Schilling <coding@schilljs.com>
Wed, 15 Jul 2020 15:06:27 +0000 (17:06 +0200)
committerJoas Schilling <coding@schilljs.com>
Thu, 16 Jul 2020 12:20:24 +0000 (14:20 +0200)
Signed-off-by: Joas Schilling <coding@schilljs.com>
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/AppFramework/Bootstrap/RegistrationContext.php
lib/private/legacy/OC_App.php
lib/public/AppFramework/Bootstrap/IRegistrationContext.php
lib/public/Authentication/IAlternativeLogin.php [new file with mode: 0644]

index 6a53f4e04cf634774edbdaad3b4b0915f7da1124..0b76bf182c1927aaae4d6ed660e3c5b0d16c86ea 100644 (file)
@@ -83,6 +83,7 @@ return array(
     'OCP\\Authentication\\Events\\LoginFailedEvent' => $baseDir . '/lib/public/Authentication/Events/LoginFailedEvent.php',
     'OCP\\Authentication\\Exceptions\\CredentialsUnavailableException' => $baseDir . '/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php',
     'OCP\\Authentication\\Exceptions\\PasswordUnavailableException' => $baseDir . '/lib/public/Authentication/Exceptions/PasswordUnavailableException.php',
+    'OCP\\Authentication\\IAlternativeLogin' => $baseDir . '/lib/public/Authentication/IAlternativeLogin.php',
     'OCP\\Authentication\\IApacheBackend' => $baseDir . '/lib/public/Authentication/IApacheBackend.php',
     'OCP\\Authentication\\LoginCredentials\\ICredentials' => $baseDir . '/lib/public/Authentication/LoginCredentials/ICredentials.php',
     'OCP\\Authentication\\LoginCredentials\\IStore' => $baseDir . '/lib/public/Authentication/LoginCredentials/IStore.php',
index edb51c1865f46daaf10155991063beb3514f902d..8063b0eb6b83f0afca53c2adf4f3e1e1170d3622 100644 (file)
@@ -112,6 +112,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OCP\\Authentication\\Events\\LoginFailedEvent' => __DIR__ . '/../../..' . '/lib/public/Authentication/Events/LoginFailedEvent.php',
         'OCP\\Authentication\\Exceptions\\CredentialsUnavailableException' => __DIR__ . '/../../..' . '/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php',
         'OCP\\Authentication\\Exceptions\\PasswordUnavailableException' => __DIR__ . '/../../..' . '/lib/public/Authentication/Exceptions/PasswordUnavailableException.php',
+        'OCP\\Authentication\\IAlternativeLogin' => __DIR__ . '/../../..' . '/lib/public/Authentication/IAlternativeLogin.php',
         'OCP\\Authentication\\IApacheBackend' => __DIR__ . '/../../..' . '/lib/public/Authentication/IApacheBackend.php',
         'OCP\\Authentication\\LoginCredentials\\ICredentials' => __DIR__ . '/../../..' . '/lib/public/Authentication/LoginCredentials/ICredentials.php',
         'OCP\\Authentication\\LoginCredentials\\IStore' => __DIR__ . '/../../..' . '/lib/public/Authentication/LoginCredentials/IStore.php',
index 270035a290859437f61aecb3716da5e61756bea7..efcf9175b978e9fd02e0305e8eccc197889e05e4 100644 (file)
@@ -63,6 +63,9 @@ class RegistrationContext {
        /** @var array[] */
        private $searchProviders = [];
 
+       /** @var array[] */
+       private $alternativeLogins = [];
+
        /** @var ILogger */
        private $logger;
 
@@ -151,6 +154,13 @@ class RegistrationContext {
                                        $class
                                );
                        }
+
+                       public function registerAlternativeLogin(string $class): void {
+                               $this->context->registerAlternativeLogin(
+                                       $this->appId,
+                                       $class
+                               );
+                       }
                };
        }
 
@@ -223,6 +233,13 @@ class RegistrationContext {
                ];
        }
 
+       public function registerAlternativeLogin(string $appId, string $class): void {
+               $this->alternativeLogins[] = [
+                       'appId' => $appId,
+                       'class' => $class,
+               ];
+       }
+
        /**
         * @param App[] $apps
         */
@@ -386,4 +403,11 @@ class RegistrationContext {
        public function getSearchProviders(): array {
                return $this->searchProviders;
        }
+
+       /**
+        * @return array[]
+        */
+       public function getAlternativeLogins(): array {
+               return $this->alternativeLogins;
+       }
 }
index 4110bee114d5d673ac32f0ead1c840ba37870c55..5851fc01379dc2a4bb02011b528b71f8f3eaf9b5 100644 (file)
@@ -52,11 +52,14 @@ declare(strict_types=1);
  */
 use OC\App\DependencyAnalyzer;
 use OC\App\Platform;
+use OC\AppFramework\Bootstrap\Coordinator;
 use OC\DB\MigrationService;
 use OC\Installer;
 use OC\Repair;
 use OC\ServerNotAvailableException;
 use OCP\App\ManagerEvent;
+use OCP\AppFramework\QueryException;
+use OCP\Authentication\IAlternativeLogin;
 use OCP\ILogger;
 
 /**
@@ -149,8 +152,8 @@ class OC_App {
                // in case someone calls loadApp() directly
                self::registerAutoloading($app, $appPath);
 
-               /** @var \OC\AppFramework\Bootstrap\Coordinator $coordinator */
-               $coordinator = \OC::$server->query(\OC\AppFramework\Bootstrap\Coordinator::class);
+               /** @var Coordinator $coordinator */
+               $coordinator = \OC::$server->query(Coordinator::class);
                $isBootable = $coordinator->isBootable($app);
 
                $hasAppPhpFile = is_file($appPath . '/appinfo/app.php');
@@ -672,8 +675,10 @@ class OC_App {
 
        /**
         * @param array $entry
+        * @deprecated 20.0.0 Please register your alternative login option using the registerAlternativeLogin() on the RegistrationContext in your Application class implementing the OCP\Authentication\IAlternativeLogin interface
         */
        public static function registerLogIn(array $entry) {
+               \OC::$server->getLogger()->debug('OC_App::registerLogIn() is deprecated, please register your alternative login option using the registerAlternativeLogin() on the RegistrationContext in your Application class implementing the OCP\Authentication\IAlternativeLogin interface');
                self::$altLogin[] = $entry;
        }
 
@@ -681,6 +686,47 @@ class OC_App {
         * @return array
         */
        public static function getAlternativeLogIns(): array {
+               /** @var Coordinator $bootstrapCoordinator */
+               $bootstrapCoordinator = \OC::$server->query(Coordinator::class);
+
+               foreach ($bootstrapCoordinator->getRegistrationContext()->getAlternativeLogins() as $registration) {
+                       if (!in_array(IAlternativeLogin::class, class_implements($registration['class']), true)) {
+                               \OC::$server->getLogger()->error('Alternative login option {option} does not implement {interface} and is therefore ignored.', [
+                                       'option' => $registration['class'],
+                                       'interface' => IAlternativeLogin::class,
+                                       'app' => $registration['app'],
+                               ]);
+                               continue;
+                       }
+
+                       try {
+                               /** @var IAlternativeLogin $provider */
+                               $provider = \OC::$server->query($registration['class']);
+                       } catch (QueryException $e) {
+                               \OC::$server->getLogger()->logException($e, [
+                                       'message' => 'Alternative login option {option} can not be initialised.',
+                                       'option' => $registration['class'],
+                                       'app' => $registration['app'],
+                               ]);
+                       }
+
+                       try {
+                               $provider->load();
+
+                               self::$altLogin[] = [
+                                       'name' => $provider->getLabel(),
+                                       'href' => $provider->getLink(),
+                                       'style' => $provider->getClass(),
+                               ];
+                       } catch (Throwable $e) {
+                               \OC::$server->getLogger()->logException($e, [
+                                       'message' => 'Alternative login option {option} had an error while loading.',
+                                       'option' => $registration['class'],
+                                       'app' => $registration['app'],
+                               ]);
+                       }
+               }
+
                return self::$altLogin;
        }
 
index 8ce140996b7002b521c94971df4ecc8fc0a1efb6..94e3aed17e2e0037c159cacbe7c33b5b9d816587 100644 (file)
@@ -139,4 +139,17 @@ interface IRegistrationContext {
         * @since 20.0.0
         */
        public function registerSearchProvider(string $class): void;
+
+       /**
+        * Register an alternative login option
+        *
+        * It is allowed to register more than one option per app.
+        *
+        * @param string $class
+        *
+        * @return void
+        *
+        * @since 20.0.0
+        */
+       public function registerAlternativeLogin(string $class): void;
 }
diff --git a/lib/public/Authentication/IAlternativeLogin.php b/lib/public/Authentication/IAlternativeLogin.php
new file mode 100644 (file)
index 0000000..2b584a8
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.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\Authentication;
+
+/**
+ * @since 20.0.0
+ */
+interface IAlternativeLogin {
+
+       /**
+        * Label shown on the login option
+        * @return string
+        * @since 20.0.0
+        */
+       public function getLabel(): string;
+
+       /**
+        * Relative link to the login option
+        * @return string
+        * @since 20.0.0
+        */
+       public function getLink(): string;
+
+       /**
+        * CSS classes added to the alternative login option on the login screen
+        * @return string
+        * @since 20.0.0
+        */
+       public function getClass(): string;
+
+       /**
+        * Load necessary resources to present the login option, e.g. style-file to style the getClass()
+        * @since 20.0.0
+        */
+       public function load(): void;
+}