Skip to content

Commit

Permalink
fixup! Add typed events for password_policy
Browse files Browse the repository at this point in the history
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
  • Loading branch information
ChristophWurst committed Nov 19, 2019
1 parent fd0c278 commit 0b80d63
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 47 deletions.
4 changes: 2 additions & 2 deletions lib/private/Share20/Manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
use OCP\IUserManager;
use OCP\L10N\IFactory;
use OCP\Mail\IMailer;
use OCP\Security\Events\ValidatePasswordPolicyEvent;
use OCP\Security\IHasher;
use OCP\Security\ISecureRandom;
use OCP\Share\Exceptions\GenericShareException;
Expand Down Expand Up @@ -191,8 +192,7 @@ protected function verifyPassword($password) {

// Let others verify the password
try {
$event = new GenericEvent($password);
$this->eventDispatcher->dispatch('OCP\PasswordPolicy::validate', $event);
$this->eventDispatcher->dispatch(new ValidatePasswordPolicyEvent($password));
} catch (HintException $e) {
throw new \Exception($e->getHint());
}
Expand Down
15 changes: 7 additions & 8 deletions lib/private/User/Database.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@
namespace OC\User;

use OC\Cache\CappedMemoryCache;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IDBConnection;
use OCP\Security\Events\ValidatePasswordPolicyEvent;
use OCP\User\Backend\ABackend;
use OCP\User\Backend\ICheckPasswordBackend;
use OCP\User\Backend\ICountUsersBackend;
Expand All @@ -68,7 +70,6 @@
use OCP\User\Backend\IGetRealUIDBackend;
use OCP\User\Backend\ISetDisplayNameBackend;
use OCP\User\Backend\ISetPasswordBackend;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;

/**
Expand All @@ -86,7 +87,7 @@ class Database extends ABackend
/** @var CappedMemoryCache */
private $cache;

/** @var EventDispatcherInterface */
/** @var IEventDispatcher */
private $eventDispatcher;

/** @var IDBConnection */
Expand All @@ -98,13 +99,13 @@ class Database extends ABackend
/**
* \OC\User\Database constructor.
*
* @param EventDispatcherInterface $eventDispatcher
* @param IEventDispatcher $eventDispatcher
* @param string $table
*/
public function __construct($eventDispatcher = null, $table = 'users') {
$this->cache = new CappedMemoryCache();
$this->table = $table;
$this->eventDispatcher = $eventDispatcher ? $eventDispatcher : \OC::$server->getEventDispatcher();
$this->eventDispatcher = $eventDispatcher ? $eventDispatcher : \OC::$server->query(IEventDispatcher::class);
}

/**
Expand All @@ -130,8 +131,7 @@ public function createUser(string $uid, string $password): bool {
$this->fixDI();

if (!$this->userExists($uid)) {
$event = new GenericEvent($password);
$this->eventDispatcher->dispatch('OCP\PasswordPolicy::validate', $event);
$this->eventDispatcher->dispatchTyped(new ValidatePasswordPolicyEvent($password));

$qb = $this->dbConn->getQueryBuilder();
$qb->insert($this->table)
Expand Down Expand Up @@ -199,8 +199,7 @@ public function setPassword(string $uid, string $password): bool {
$this->fixDI();

if ($this->userExists($uid)) {
$event = new GenericEvent($password);
$this->eventDispatcher->dispatch('OCP\PasswordPolicy::validate', $event);
$this->eventDispatcher->dispatchTyped(new ValidatePasswordPolicyEvent($password));

$hasher = \OC::$server->getHasher();
$hashedPassword = $hasher->hash($password);
Expand Down
51 changes: 28 additions & 23 deletions tests/lib/Share20/ManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use OC\Files\Mount\MoveableMount;
use OC\HintException;
use OC\Share20\DefaultShareProvider;
use OCP\EventDispatcher\Event;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
Expand All @@ -36,6 +37,7 @@
use OCP\IUserManager;
use OCP\L10N\IFactory;
use OCP\Mail\IMailer;
use OCP\Security\Events\ValidatePasswordPolicyEvent;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IProviderFactory;
use OCP\Share\IShare;
Expand All @@ -51,6 +53,7 @@
use OCP\Security\IHasher;
use OCP\Files\Mount\IMountManager;
use OCP\IGroupManager;
use PHPUnit\Framework\MockObject\MockObject;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;

Expand All @@ -64,37 +67,37 @@ class ManagerTest extends \Test\TestCase {

/** @var Manager */
protected $manager;
/** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */
/** @var ILogger|MockObject */
protected $logger;
/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
/** @var IConfig|MockObject */
protected $config;
/** @var ISecureRandom|\PHPUnit_Framework_MockObject_MockObject */
/** @var ISecureRandom|MockObject */
protected $secureRandom;
/** @var IHasher|\PHPUnit_Framework_MockObject_MockObject */
/** @var IHasher|MockObject */
protected $hasher;
/** @var IShareProvider|\PHPUnit_Framework_MockObject_MockObject */
/** @var IShareProvider|MockObject */
protected $defaultProvider;
/** @var IMountManager|\PHPUnit_Framework_MockObject_MockObject */
/** @var IMountManager|MockObject */
protected $mountManager;
/** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */
/** @var IGroupManager|MockObject */
protected $groupManager;
/** @var IL10N|\PHPUnit_Framework_MockObject_MockObject */
/** @var IL10N|MockObject */
protected $l;
/** @var IFactory|\PHPUnit_Framework_MockObject_MockObject */
/** @var IFactory|MockObject */
protected $l10nFactory;
/** @var DummyFactory */
protected $factory;
/** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */
/** @var IUserManager|MockObject */
protected $userManager;
/** @var IRootFolder | \PHPUnit_Framework_MockObject_MockObject */
/** @var IRootFolder | MockObject */
protected $rootFolder;
/** @var EventDispatcherInterface | \PHPUnit_Framework_MockObject_MockObject */
/** @var EventDispatcherInterface | MockObject */
protected $eventDispatcher;
/** @var IMailer|\PHPUnit_Framework_MockObject_MockObject */
/** @var IMailer|MockObject */
protected $mailer;
/** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */
/** @var IURLGenerator|MockObject */
protected $urlGenerator;
/** @var \OC_Defaults|\PHPUnit_Framework_MockObject_MockObject */
/** @var \OC_Defaults|MockObject */
protected $defaults;

public function setUp() {
Expand Down Expand Up @@ -495,11 +498,12 @@ public function testVerifyPasswordHook() {
]));

$this->eventDispatcher->expects($this->once())->method('dispatch')
->willReturnCallback(function($eventName, GenericEvent $event) {
$this->assertSame('OCP\PasswordPolicy::validate', $eventName);
$this->assertSame('password', $event->getSubject());
->willReturnCallback(function(Event $event) {
$this->assertInstanceOf(ValidatePasswordPolicyEvent::class, $event);
/** @var ValidatePasswordPolicyEvent $event */
$this->assertSame('password', $event->getPassword());
}
);
);

$result = self::invokePrivate($this->manager, 'verifyPassword', ['password']);
$this->assertNull($result);
Expand All @@ -515,12 +519,13 @@ public function testVerifyPasswordHookFails() {
]));

$this->eventDispatcher->expects($this->once())->method('dispatch')
->willReturnCallback(function($eventName, GenericEvent $event) {
$this->assertSame('OCP\PasswordPolicy::validate', $eventName);
$this->assertSame('password', $event->getSubject());
->willReturnCallback(function(Event $event) {
$this->assertInstanceOf(ValidatePasswordPolicyEvent::class, $event);
/** @var ValidatePasswordPolicyEvent $event */
$this->assertSame('password', $event->getPassword());
throw new HintException('message', 'password not accepted');
}
);
);

self::invokePrivate($this->manager, 'verifyPassword', ['password']);
}
Expand Down
33 changes: 19 additions & 14 deletions tests/lib/User/DatabaseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@

namespace Test\User;
use OC\HintException;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Security\Events\ValidatePasswordPolicyEvent;
use PHPUnit\Framework\MockObject\MockObject;
use OC\User\User;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
* Class DatabaseTest
Expand All @@ -34,7 +37,7 @@
class DatabaseTest extends Backend {
/** @var array */
private $users;
/** @var EventDispatcherInterface|\PHPUnit_Framework_MockObject_MockObject */
/** @var IEventDispatcher|MockObject */
private $eventDispatcher;

public function getUser() {
Expand All @@ -46,7 +49,7 @@ public function getUser() {
protected function setUp() {
parent::setUp();

$this->eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);

$this->backend=new \OC\User\Database($this->eventDispatcher);
}
Expand All @@ -65,11 +68,12 @@ public function testVerifyPasswordEvent() {
$user = $this->getUser();
$this->backend->createUser($user, 'pass1');

$this->eventDispatcher->expects($this->once())->method('dispatch')
$this->eventDispatcher->expects($this->once())->method('dispatchTyped')
->willReturnCallback(
function ($eventName, GenericEvent $event) {
$this->assertSame('OCP\PasswordPolicy::validate', $eventName);
$this->assertSame('newpass', $event->getSubject());
function (Event $event) {
$this->assertInstanceOf(ValidatePasswordPolicyEvent::class, $event);
/** @var ValidatePasswordPolicyEvent $event */
$this->assertSame('newpass', $event->getPassword());
}
);

Expand All @@ -85,11 +89,12 @@ public function testVerifyPasswordEventFail() {
$user = $this->getUser();
$this->backend->createUser($user, 'pass1');

$this->eventDispatcher->expects($this->once())->method('dispatch')
$this->eventDispatcher->expects($this->once())->method('dispatchTyped')
->willReturnCallback(
function ($eventName, GenericEvent $event) {
$this->assertSame('OCP\PasswordPolicy::validate', $eventName);
$this->assertSame('newpass', $event->getSubject());
function (Event $event) {
$this->assertInstanceOf(ValidatePasswordPolicyEvent::class, $event);
/** @var ValidatePasswordPolicyEvent $event */
$this->assertSame('newpass', $event->getPassword());
throw new HintException('password change failed', 'password change failed');
}
);
Expand Down Expand Up @@ -124,8 +129,8 @@ public function testSearch() {
$user2 = $this->getUser();
$this->backend->createUser($user2, 'pass1');

$user1Obj = new User($user1, $this->backend, $this->eventDispatcher);
$user2Obj = new User($user2, $this->backend, $this->eventDispatcher);
$user1Obj = new User($user1, $this->backend, $this->createMock(EventDispatcherInterface::class));
$user2Obj = new User($user2, $this->backend, $this->createMock(EventDispatcherInterface::class));
$emailAddr1 = "$user1@nextcloud.com";
$emailAddr2 = "$user2@nextcloud.com";

Expand Down

0 comments on commit 0b80d63

Please sign in to comment.