From 4dd507675c8583a28b948872f6e2e9e3df043fb7 Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Sun, 9 Aug 2020 18:13:14 +0200 Subject: [PATCH] Generate password by password_policy app Signed-off-by: Daniel Kesselberg --- apps/sharebymail/lib/ShareByMailProvider.php | 56 ++++--------------- .../tests/ShareByMailProviderTest.php | 25 ++++++--- lib/private/Share20/ProviderFactory.php | 3 +- 3 files changed, 30 insertions(+), 54 deletions(-) diff --git a/apps/sharebymail/lib/ShareByMailProvider.php b/apps/sharebymail/lib/ShareByMailProvider.php index 0f1afd43ba..1365899271 100644 --- a/apps/sharebymail/lib/ShareByMailProvider.php +++ b/apps/sharebymail/lib/ShareByMailProvider.php @@ -36,7 +36,6 @@ namespace OCA\ShareByMail; -use OC\CapabilitiesManager; use OC\HintException; use OC\Share20\Exception\InvalidShare; use OC\Share20\Share; @@ -45,6 +44,7 @@ use OCA\ShareByMail\Settings\SettingsManager; use OCP\Activity\IManager; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Defaults; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\Node; @@ -55,6 +55,7 @@ use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserManager; use OCP\Mail\IMailer; +use OCP\Security\Events\GenerateSecurePasswordEvent; use OCP\Security\IHasher; use OCP\Security\ISecureRandom; use OCP\Share\Exceptions\GenericShareException; @@ -105,8 +106,8 @@ class ShareByMailProvider implements IShareProvider { /** @var IHasher */ private $hasher; - /** @var CapabilitiesManager */ - private $capabilitiesManager; + /** @var IEventDispatcher */ + private $eventDispatcher; /** * Return the identifier of this provider. @@ -117,23 +118,6 @@ class ShareByMailProvider implements IShareProvider { return 'ocMailShare'; } - /** - * DefaultShareProvider constructor. - * - * @param IDBConnection $connection - * @param ISecureRandom $secureRandom - * @param IUserManager $userManager - * @param IRootFolder $rootFolder - * @param IL10N $l - * @param ILogger $logger - * @param IMailer $mailer - * @param IURLGenerator $urlGenerator - * @param IManager $activityManager - * @param SettingsManager $settingsManager - * @param Defaults $defaults - * @param IHasher $hasher - * @param CapabilitiesManager $capabilitiesManager - */ public function __construct( IDBConnection $connection, ISecureRandom $secureRandom, @@ -147,7 +131,7 @@ class ShareByMailProvider implements IShareProvider { SettingsManager $settingsManager, Defaults $defaults, IHasher $hasher, - CapabilitiesManager $capabilitiesManager + IEventDispatcher $eventDispatcher ) { $this->dbConnection = $connection; $this->secureRandom = $secureRandom; @@ -161,7 +145,7 @@ class ShareByMailProvider implements IShareProvider { $this->settingsManager = $settingsManager; $this->defaults = $defaults; $this->hasher = $hasher; - $this->capabilitiesManager = $capabilitiesManager; + $this->eventDispatcher = $eventDispatcher; } /** @@ -227,33 +211,17 @@ class ShareByMailProvider implements IShareProvider { ); } - $passwordPolicy = $this->getPasswordPolicy(); - $passwordCharset = ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS; - $passwordLength = 8; - if (!empty($passwordPolicy)) { - $passwordLength = (int)$passwordPolicy['minLength'] > 0 ? (int)$passwordPolicy['minLength'] : $passwordLength; - $passwordCharset .= $passwordPolicy['enforceSpecialCharacters'] ? ISecureRandom::CHAR_SYMBOLS : ''; - } + $passwordEvent = new GenerateSecurePasswordEvent(); + $this->eventDispatcher->dispatchTyped($passwordEvent); - $password = $this->secureRandom->generate($passwordLength, $passwordCharset); + $password = $passwordEvent->getPassword(); + if ($password === null) { + $password = $this->secureRandom->generate(8, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS); + } return $password; } - /** - * get password policy - * - * @return array - */ - protected function getPasswordPolicy() { - $capabilities = $this->capabilitiesManager->getCapabilities(); - if (isset($capabilities['password_policy'])) { - return $capabilities['password_policy']; - } - - return []; - } - /** * create activity if a file/folder was shared by mail * diff --git a/apps/sharebymail/tests/ShareByMailProviderTest.php b/apps/sharebymail/tests/ShareByMailProviderTest.php index aeafc86c50..628487b2ae 100644 --- a/apps/sharebymail/tests/ShareByMailProviderTest.php +++ b/apps/sharebymail/tests/ShareByMailProviderTest.php @@ -30,11 +30,11 @@ namespace OCA\ShareByMail\Tests; -use OC\CapabilitiesManager; use OC\Mail\Message; use OCA\ShareByMail\Settings\SettingsManager; use OCA\ShareByMail\ShareByMailProvider; use OCP\Defaults; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\File; use OCP\Files\IRootFolder; use OCP\IDBConnection; @@ -46,10 +46,12 @@ use OCP\IUserManager; use OCP\Mail\IEMailTemplate; use OCP\Mail\IMailer; use OCP\Mail\IMessage; +use OCP\Security\Events\GenerateSecurePasswordEvent; use OCP\Security\IHasher; use OCP\Security\ISecureRandom; use OCP\Share\IManager; use OCP\Share\IShare; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; /** @@ -102,8 +104,8 @@ class ShareByMailProviderTest extends TestCase { /** @var IHasher | \PHPUnit_Framework_MockObject_MockObject */ private $hasher; - /** @var CapabilitiesManager | \PHPUnit_Framework_MockObject_MockObject */ - private $capabilitiesManager; + /** @var IEventDispatcher */ + private $eventDispatcher; protected function setUp(): void { parent::setUp(); @@ -127,7 +129,7 @@ class ShareByMailProviderTest extends TestCase { $this->settingsManager = $this->getMockBuilder(SettingsManager::class)->disableOriginalConstructor()->getMock(); $this->defaults = $this->createMock(Defaults::class); $this->hasher = $this->getMockBuilder(IHasher::class)->getMock(); - $this->capabilitiesManager = $this->getMockBuilder(CapabilitiesManager::class)->disableOriginalConstructor()->getMock(); + $this->eventDispatcher = $this->getMockBuilder(IEventDispatcher::class)->getMock(); $this->userManager->expects($this->any())->method('userExists')->willReturn(true); } @@ -154,7 +156,7 @@ class ShareByMailProviderTest extends TestCase { $this->settingsManager, $this->defaults, $this->hasher, - $this->capabilitiesManager + $this->eventDispatcher ] ); @@ -176,7 +178,7 @@ class ShareByMailProviderTest extends TestCase { $this->settingsManager, $this->defaults, $this->hasher, - $this->capabilitiesManager + $this->eventDispatcher ); } @@ -294,7 +296,15 @@ class ShareByMailProviderTest extends TestCase { $node = $this->getMockBuilder(File::class)->getMock(); $node->expects($this->any())->method('getName')->willReturn('filename'); - $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity']); + $this->secureRandom->expects($this->once()) + ->method('generate') + ->with(8, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS) + ->willReturn('autogeneratedPassword'); + $this->eventDispatcher->expects($this->once()) + ->method('dispatchTyped') + ->with(new GenerateSecurePasswordEvent()); + + $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'createPasswordSendActivity']); $instance->expects($this->once())->method('getSharedWith')->willReturn([]); $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42); @@ -310,7 +320,6 @@ class ShareByMailProviderTest extends TestCase { // The autogenerated password should be mailed to the receiver of the share. $this->settingsManager->expects($this->any())->method('enforcePasswordProtection')->willReturn(true); $this->settingsManager->expects($this->any())->method('sendPasswordByMail')->willReturn(true); - $instance->expects($this->once())->method('autoGeneratePassword')->with($share)->willReturn('autogeneratedPassword'); $message = $this->createMock(IMessage::class); $message->expects($this->once())->method('setTo')->with(['receiver@example.com']); diff --git a/lib/private/Share20/ProviderFactory.php b/lib/private/Share20/ProviderFactory.php index 0606fe9c84..ea37493181 100644 --- a/lib/private/Share20/ProviderFactory.php +++ b/lib/private/Share20/ProviderFactory.php @@ -30,7 +30,6 @@ namespace OC\Share20; -use OC\CapabilitiesManager; use OC\Share20\Exception\ProviderException; use OCA\FederatedFileSharing\AddressHandler; use OCA\FederatedFileSharing\FederatedShareProvider; @@ -184,7 +183,7 @@ class ProviderFactory implements IProviderFactory { $settingsManager, $this->serverContainer->query(Defaults::class), $this->serverContainer->getHasher(), - $this->serverContainer->query(CapabilitiesManager::class) + $this->serverContainer->get(IEventDispatcher::class) ); }