Allow to register AlternativeLogin on RegistrationContext
Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
parent
b12d3691c3
commit
0dfcc132ca
|
@ -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',
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue