Move 2FA registration to IBootstrap
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
parent
46872e3921
commit
5ee9e1f784
|
@ -92,7 +92,10 @@ class RegistrationContext {
|
|||
private $templateProviders = [];
|
||||
|
||||
/** @var ServiceRegistration<INotifier>[] */
|
||||
private $notifierServices;
|
||||
private $notifierServices = [];
|
||||
|
||||
/** @var ServiceRegistration<\OCP\Authentication\TwoFactorAuth\IProvider>[] */
|
||||
private $twoFactorProviders = [];
|
||||
|
||||
/** @var ILogger */
|
||||
private $logger;
|
||||
|
@ -217,6 +220,13 @@ class RegistrationContext {
|
|||
$notifierClass
|
||||
);
|
||||
}
|
||||
|
||||
public function registerTwoFactorProvider(string $twoFactorProviderClass): void {
|
||||
$this->context->registerTwoFactorProvider(
|
||||
$this->appId,
|
||||
$twoFactorProviderClass
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -288,6 +298,10 @@ class RegistrationContext {
|
|||
$this->notifierServices[] = new ServiceRegistration($appId, $class);
|
||||
}
|
||||
|
||||
public function registerTwoFactorProvider(string $appId, string $class): void {
|
||||
$this->twoFactorProviders[] = new ServiceRegistration($appId, $class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param App[] $apps
|
||||
*/
|
||||
|
@ -479,4 +493,11 @@ class RegistrationContext {
|
|||
public function getNotifierServices(): array {
|
||||
return $this->notifierServices;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ServiceRegistration<\OCP\Authentication\TwoFactorAuth\IProvider>[]
|
||||
*/
|
||||
public function getTwoFactorProviders(): array {
|
||||
return $this->twoFactorProviders;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,8 +40,12 @@ class ProviderLoader {
|
|||
/** @var IAppManager */
|
||||
private $appManager;
|
||||
|
||||
public function __construct(IAppManager $appManager) {
|
||||
/** @var OC\AppFramework\Bootstrap\Coordinator */
|
||||
private $coordinator;
|
||||
|
||||
public function __construct(IAppManager $appManager, OC\AppFramework\Bootstrap\Coordinator $coordinator) {
|
||||
$this->appManager = $appManager;
|
||||
$this->coordinator = $coordinator;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -72,6 +76,18 @@ class ProviderLoader {
|
|||
}
|
||||
}
|
||||
|
||||
$registeredProviders = $this->coordinator->getRegistrationContext()->getTwoFactorProvider();
|
||||
foreach ($registeredProviders as $provider) {
|
||||
try {
|
||||
$this->loadTwoFactorApp($provider->getAppId());
|
||||
$provider = OC::$server->query($provider->getService());
|
||||
$providers[$provider->getId()] = $provider;
|
||||
} catch (QueryException $exc) {
|
||||
// Provider class can not be resolved
|
||||
throw new Exception('Could not load two-factor auth provider ' . $provider->getService());
|
||||
}
|
||||
}
|
||||
|
||||
return $providers;
|
||||
}
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ declare(strict_types=1);
|
|||
namespace OCP\AppFramework\Bootstrap;
|
||||
|
||||
use OCP\AppFramework\IAppContainer;
|
||||
use OCP\Authentication\TwoFactorAuth\IProvider;
|
||||
use OCP\Capabilities\ICapability;
|
||||
use OCP\EventDispatcher\IEventDispatcher;
|
||||
use OCP\Files\Template\ICustomTemplateProvider;
|
||||
|
@ -219,4 +220,13 @@ interface IRegistrationContext {
|
|||
* @since 22.0.0
|
||||
*/
|
||||
public function registerNotifierService(string $notifierClass): void;
|
||||
|
||||
/**
|
||||
* Register a two-factor provider
|
||||
*
|
||||
* @param string $twoFactorProviderClass
|
||||
* @psalm-param class-string<IProvider> $twoFactorProviderClass
|
||||
* @since 22.0.0
|
||||
*/
|
||||
public function registerTwoFactorProvider(string $twoFactorProviderClass): void;
|
||||
}
|
||||
|
|
|
@ -26,9 +26,13 @@ declare(strict_types=1);
|
|||
|
||||
namespace lib\Authentication\TwoFactorAuth;
|
||||
|
||||
use OC\AppFramework\Bootstrap\Coordinator;
|
||||
use OC\AppFramework\Bootstrap\RegistrationContext;
|
||||
use OC\AppFramework\Bootstrap\ServiceRegistration;
|
||||
use OC\Authentication\TwoFactorAuth\ProviderLoader;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\Authentication\TwoFactorAuth\IProvider;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Test\TestCase;
|
||||
|
||||
class ProviderLoaderTest extends TestCase {
|
||||
|
@ -39,6 +43,9 @@ class ProviderLoaderTest extends TestCase {
|
|||
/** @var \OCP\IUser|\PHPUnit\Framework\MockObject\MockObject */
|
||||
private $user;
|
||||
|
||||
/** @var RegistrationContext|MockObject */
|
||||
private $registrationContext;
|
||||
|
||||
/** @var ProviderLoader */
|
||||
private $loader;
|
||||
|
||||
|
@ -48,7 +55,12 @@ class ProviderLoaderTest extends TestCase {
|
|||
$this->appManager = $this->createMock(IAppManager::class);
|
||||
$this->user = $this->createMock(\OCP\IUser::class);
|
||||
|
||||
$this->loader = new ProviderLoader($this->appManager);
|
||||
$this->registrationContext = $this->createMock(RegistrationContext::class);
|
||||
$coordinator = $this->createMock(Coordinator::class);
|
||||
$coordinator->method('getRegistrationContext')
|
||||
->willReturn($this->registrationContext);
|
||||
|
||||
$this->loader = new ProviderLoader($this->appManager, $coordinator);
|
||||
}
|
||||
|
||||
|
||||
|
@ -97,4 +109,29 @@ class ProviderLoaderTest extends TestCase {
|
|||
$this->assertArrayHasKey('test', $providers);
|
||||
$this->assertSame($provider, $providers['test']);
|
||||
}
|
||||
|
||||
public function testGetProvidersBootstrap() {
|
||||
$provider = $this->createMock(IProvider::class);
|
||||
$provider->method('getId')->willReturn('test');
|
||||
|
||||
\OC::$server->registerService('\\OCA\\TwoFactorTest\\Provider', function () use ($provider) {
|
||||
return $provider;
|
||||
});
|
||||
|
||||
$this->appManager->expects($this->once())
|
||||
->method('getEnabledAppsForUser')
|
||||
->with($this->user)
|
||||
->willReturn([]);
|
||||
|
||||
$this->registrationContext->method('getTwoFactorProvider')
|
||||
->willReturn([
|
||||
new ServiceRegistration('twofactor_test', '\\OCA\\TwoFactorTest\\Provider')
|
||||
]);
|
||||
|
||||
$providers = $this->loader->getProviders($this->user);
|
||||
|
||||
$this->assertCount(1, $providers);
|
||||
$this->assertArrayHasKey('test', $providers);
|
||||
$this->assertSame($provider, $providers['test']);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue