Signed-off-by: Joas Schilling <coding@schilljs.com>tags/v20.0.0beta1
@@ -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; | |||
} |