Browse Source

Allow to register AlternativeLogin on RegistrationContext

Signed-off-by: Joas Schilling <coding@schilljs.com>
tags/v20.0.0beta1
Joas Schilling 3 years ago
parent
commit
0dfcc132ca
No account linked to committer's email address

+ 1
- 0
lib/composer/composer/autoload_classmap.php View 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',

+ 1
- 0
lib/composer/composer/autoload_static.php View 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',

+ 24
- 0
lib/private/AppFramework/Bootstrap/RegistrationContext.php View 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;
}
}

+ 48
- 2
lib/private/legacy/OC_App.php View 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;
}


+ 13
- 0
lib/public/AppFramework/Bootstrap/IRegistrationContext.php View 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;
}

+ 58
- 0
lib/public/Authentication/IAlternativeLogin.php View File

@@ -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…
Cancel
Save