]> source.dussan.org Git - nextcloud-server.git/commitdiff
Generate password by password_policy app 22162/head
authorDaniel Kesselberg <mail@danielkesselberg.de>
Sun, 9 Aug 2020 16:13:14 +0000 (18:13 +0200)
committerMorris Jobke <hey@morrisjobke.de>
Tue, 11 Aug 2020 19:58:51 +0000 (21:58 +0200)
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
apps/sharebymail/lib/ShareByMailProvider.php
apps/sharebymail/tests/ShareByMailProviderTest.php
lib/private/Share20/ProviderFactory.php

index 0f1afd43ba40f0bdc685fd7c2e086e7ec3b02bc6..1365899271eb77b9cd835516326f2caea340568b 100644 (file)
@@ -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,31 +211,15 @@ 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);
-
-               return $password;
-       }
-
-       /**
-        * get password policy
-        *
-        * @return array
-        */
-       protected function getPasswordPolicy() {
-               $capabilities = $this->capabilitiesManager->getCapabilities();
-               if (isset($capabilities['password_policy'])) {
-                       return $capabilities['password_policy'];
+               $password = $passwordEvent->getPassword();
+               if ($password === null) {
+                       $password = $this->secureRandom->generate(8, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS);
                }
 
-               return [];
+               return $password;
        }
 
        /**
index aeafc86c509523c067e22d6a9cd5fa96ef6696ea..628487b2aeef722054390acb48a87265b13afd62 100644 (file)
 
 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']);
index 0606fe9c8494ef5c9321f1766640eb5024067382..ea3749318114244f1150ffc8f0570f987b39dab7 100644 (file)
@@ -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)
                        );
                }