Move 2FA registration to IBootstrap

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
Roeland Jago Douma 2021-04-16 14:52:59 +02:00
parent 46872e3921
commit 5ee9e1f784
4 changed files with 87 additions and 3 deletions

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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']);
}
}