'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',
'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',
/** @var array[] */
private $searchProviders = [];
+ /** @var array[] */
+ private $alternativeLogins = [];
+
/** @var ILogger */
private $logger;
$class
);
}
+
+ public function registerAlternativeLogin(string $class): void {
+ $this->context->registerAlternativeLogin(
+ $this->appId,
+ $class
+ );
+ }
};
}
];
}
+ public function registerAlternativeLogin(string $appId, string $class): void {
+ $this->alternativeLogins[] = [
+ 'appId' => $appId,
+ 'class' => $class,
+ ];
+ }
+
/**
* @param App[] $apps
*/
public function getSearchProviders(): array {
return $this->searchProviders;
}
+
+ /**
+ * @return array[]
+ */
+ public function getAlternativeLogins(): array {
+ return $this->alternativeLogins;
+ }
}
*/
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;
/**
// 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');
/**
* @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;
}
* @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;
}
* @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;
}
--- /dev/null
+<?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;
+}