Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
This commit is contained in:
Christoph Wurst 2016-12-19 17:46:32 +01:00
Родитель 3321e0dc84
Коммит f7fb7700a3
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: CC42AC2A7F0E56D8
5 изменённых файлов: 383 добавлений и 3 удалений

Просмотреть файл

@ -42,6 +42,13 @@ class U2FManager {
/** @var IManager */ /** @var IManager */
private $activityManager; private $activityManager;
/**
* @param RegistrationMapper $mapper
* @param ISession $session
* @param ILogger $logger
* @param IRequest $request
* @param IManager $activityManager
*/
public function __construct(RegistrationMapper $mapper, ISession $session, ILogger $logger, IRequest $request, IManager $activityManager) { public function __construct(RegistrationMapper $mapper, ISession $session, ILogger $logger, IRequest $request, IManager $activityManager) {
$this->mapper = $mapper; $this->mapper = $mapper;
$this->session = $session; $this->session = $session;
@ -127,8 +134,8 @@ class U2FManager {
$activity->setApp('twofactor_u2f') $activity->setApp('twofactor_u2f')
->setType('twofactor') ->setType('twofactor')
->setAuthor($user->getUID()) ->setAuthor($user->getUID())
->setAffectedUser($user->getUID()); ->setAffectedUser($user->getUID())
$activity->setSubject($event); ->setSubject($event);
$this->activityManager->publish($activity); $this->activityManager->publish($activity);
} }

Просмотреть файл

@ -13,4 +13,4 @@ require_once __DIR__.'/../../../lib/base.php';
require_once __DIR__.'/../vendor/autoload.php'; require_once __DIR__.'/../vendor/autoload.php';
OC::$loader->addValidRoot(OC::$SERVERROOT . '/tests'); OC::$loader->addValidRoot(OC::$SERVERROOT . '/tests');
OC_App::loadApp('twofactor_totp'); OC_App::loadApp('twofactor_u2f');

Просмотреть файл

@ -0,0 +1,106 @@
<?php
/**
* Nextcloud - U2F 2FA
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @copyright Christoph Wurst 2016
*/
namespace OCA\TwoFactorU2F\Test\Unit\Controller;
use OCA\TwoFactorU2F\Controller\SettingsController;
use OCA\TwoFactorU2F\Service\U2FManager;
use OCP\IRequest;
use OCP\IUser;
use OCP\IUserSession;
use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
class SettingsControllerTest extends TestCase {
/** @var IRequest|PHPUnit_Framework_MockObject_MockObject */
private $request;
/** @var U2FManager|PHPUnit_Framework_MockObject_MockObject */
private $u2fManager;
/** @var IUserSession|PHPUnit_Framework_MockObject_MockObject */
private $userSession;
/** @var SettingsController */
private $controller;
protected function setUp() {
parent::setUp();
$this->request = $this->createMock(IRequest::class);
$this->u2fManager = $this->getMockBuilder(U2FManager::class)
->disableOriginalConstructor()
->getMock();
$this->userSession = $this->createMock(IUserSession::class);
$this->controller = new SettingsController('twofactor_u2f', $this->request, $this->u2fManager, $this->userSession);
}
public function testState() {
$user = $this->createMock(IUser::class);
$this->userSession->expects($this->once())
->method('getUser')
->will($this->returnValue($user));
$this->u2fManager->expects($this->once())
->method('isEnabled')
->with($this->equalTo($user))
->will($this->returnValue(true));
$expected = [
'enabled' => true,
];
$this->assertSame($expected, $this->controller->state());
}
public function testDisable() {
$user = $this->createMock(IUser::class);
$this->userSession->expects($this->once())
->method('getUser')
->will($this->returnValue($user));
$this->u2fManager->expects($this->once())
->method('disableU2F')
->with($this->equalTo($user));
$this->controller->disable();
}
public function testStartRegister() {
$user = $this->createMock(IUser::class);
$this->userSession->expects($this->once())
->method('getUser')
->will($this->returnValue($user));
$this->u2fManager->expects($this->once())
->method('startRegistration')
->with($this->equalTo($user))
->will($this->returnValue([]));
$this->assertEquals([], $this->controller->startRegister());
}
public function testFinishRegister() {
$user = $this->createMock(IUser::class);
$this->userSession->expects($this->once())
->method('getUser')
->will($this->returnValue($user));
$registrationData = 'regData';
$data = 'some data';
$this->u2fManager->expects($this->once())
->method('finishRegistration')
->with($this->equalTo($user), $this->equalTo($registrationData), $this->equalTo($data));
$this->controller->finishRegister($registrationData, $data);
}
}

Просмотреть файл

@ -0,0 +1,97 @@
<?php
/**
* Nextcloud - U2F 2FA
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @copyright Christoph Wurst 2016
*/
namespace OCA\TwoFactorU2F\Test\Unit\Provider;
use OCA\TwoFactorU2F\Provider\U2FProvider;
use OCA\TwoFactorU2F\Service\U2FManager;
use OCP\IL10N;
use OCP\IUser;
use OCP\Template;
use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
class U2FProviderTest extends TestCase {
/** @var IL10N|PHPUnit_Framework_MockObject_MockObject */
private $l10n;
/** @var U2FManager|PHPUnit_Framework_MockObject_MockObject */
private $manager;
/** @var U2FProvider */
private $provider;
protected function setUp() {
parent::setUp();
$this->l10n = $this->createMock(IL10N::class);
$this->manager = $this->getMockBuilder(U2FManager::class)
->disableOriginalConstructor()
->getMock();
$this->provider = new U2FProvider($this->l10n, $this->manager);
}
public function testGetId() {
$this->assertSame('u2f', $this->provider->getId());
}
public function testGetDisplayName() {
$this->assertSame('U2F device', $this->provider->getDisplayName());
}
public function testGetDescription() {
$this->l10n->expects($this->once())
->method('t')
->with('Authenticate with an U2F device')
->will($this->returnValue('translated'));
$this->assertSame('translated', $this->provider->getDescription());
}
public function testGetTemplate() {
$user = $this->createMock(IUser::class);
$this->manager->expects($this->once())
->method('startAuthenticate')
->willReturn([]);
$tmpl = new Template('twofactor_u2f', 'challenge');
$tmpl->assign('reqs', []);
$actual = $this->provider->getTemplate($user);
$this->assertEquals($tmpl, $actual);
$actual->fetchPage();
}
public function testVerifyChallenge() {
$user = $this->createMock(IUser::class);
$val = '123';
$this->manager->expects($this->once())
->method('finishAuthenticate')
->will($this->returnValue(false));
$this->assertFalse($this->provider->verifyChallenge($user, $val));
}
public function testIsTwoFactorAuthEnabledForUser() {
$user = $this->createMock(IUser::class);
$this->manager->expects($this->once())
->method('isEnabled')
->will($this->returnValue(false));
$this->assertFalse($this->provider->isTwoFactorAuthEnabledForUser($user));
}
}

Просмотреть файл

@ -0,0 +1,170 @@
<?php
/**
* Nextcloud - U2F 2FA
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @copyright Christoph Wurst 2016
*/
namespace OCA\TwoFactorU2F\Test\Unit\Service;
use OCA\TwoFactorU2F\Db\Registration;
use OCA\TwoFactorU2F\Db\RegistrationMapper;
use OCA\TwoFactorU2F\Service\U2FManager;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\ILogger;
use OCP\IRequest;
use OCP\ISession;
use OCP\IUser;
use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
use u2flib_server\U2F;
class U2FManagerTest extends TestCase {
/** @var RegistrationMapper|PHPUnit_Framework_MockObject_MockObject */
private $mapper;
/** @var ISession|PHPUnit_Framework_MockObject_MockObject */
private $session;
/** @var ILogger|PHPUnit_Framework_MockObject_MockObject */
private $logger;
/** @var IRequest|PHPUnit_Framework_MockObject_MockObject */
private $request;
/** @var IManager|PHPUnit_Framework_MockObject_MockObject */
private $activityManager;
/** @var U2FManager */
private $manager;
protected function setUp() {
parent::setUp();
$this->mapper = $this->getMockBuilder(RegistrationMapper::class)
->disableOriginalConstructor()
->getMock();
$this->session = $this->createMock(ISession::class);
$this->logger = $this->createMock(ILogger::class);
$this->request = $this->createMock(IRequest::class);
$this->activityManager = $this->createMock(IManager::class);
$this->manager = new U2FManager($this->mapper, $this->session, $this->logger, $this->request, $this->activityManager);
}
/**
* @return U2F
*/
private function getU2f() {
$this->request->expects($this->once())
->method('getServerProtocol')
->willReturn('https');
$this->request->expects($this->once())
->method('getServerHost')
->willReturn('cloud.example.com');
return new U2F('https://cloud.example.com');
}
/**
* @param IUser $user
* @param int $nr
*/
private function mockRegistrations(IUser $user, $nr) {
$regs = [];
for ($i = 0; $i < $nr; $i++) {
$reg = new Registration();
array_push($regs, $reg);
}
$this->mapper->expects($this->once())
->method('findRegistrations')
->with($this->equalTo($user))
->willReturn($regs);
}
public function testIsEnabled() {
$user = $this->createMock(IUser::class);
$this->mockRegistrations($user, 2);
$this->assertTrue($this->manager->isEnabled($user));
}
public function testIsEnabledDisabled() {
$user = $this->createMock(IUser::class);
$this->mockRegistrations($user, 0);
$this->assertFalse($this->manager->isEnabled($user));
}
public function testDisableU2F() {
$user = $this->createMock(IUser::class);
$this->mockRegistrations($user, 1);
$event = $this->createMock(IEvent::class);
$this->mapper->expects($this->once())
->method('delete');
$this->activityManager->expects($this->once())
->method('generateEvent')
->willReturn($event);
$event->expects($this->once())
->method('setApp')
->with($this->equalTo('twofactor_u2f'))
->willReturnSelf();
$event->expects($this->once())
->method('setType')
->with($this->equalTo('twofactor'))
->willReturnSelf();
$user->expects($this->any())
->method('getUID')
->willReturn('ursula');
$event->expects($this->once())
->method('setAuthor')
->with($this->equalTo('ursula'))
->willReturnSelf();
$event->expects($this->once())
->method('setAffectedUser')
->with($this->equalTo('ursula'))
->willReturnSelf();
$event->expects($this->once())
->method('setSubject')
->with($this->equalTo('u2f_device_removed'))
->willReturnSelf();
$this->activityManager->expects($this->once())
->method('publish')
->with($this->equalTo($event));
$this->manager->disableU2F($user);
}
public function testStartRegistrationFirstDevice() {
$user = $this->createMock(IUser::class);
$this->mockRegistrations($user, 0);
$this->session->expects($this->once())
->method('set');
$this->manager->startRegistration($user);
}
public function testFinishRegistration() {
// TODO: get a grasp of how the u2f lib works and feed it with
// realistic data or mock it.
}
public function testStartAuthenticate() {
// TODO: get a grasp of how the u2f lib works and feed it with
// realistic data or mock it.
}
public function testFinishAuthenticate() {
// TODO: get a grasp of how the u2f lib works and feed it with
// realistic data or mock it.
}
}