Skip to content

Commit 138f47a

Browse files
authored
Merge pull request #22162 from nextcloud/enh/noid/password-generator-sharebymail
ShareByMail: Migrate to GenerateSecurePasswordEvent
2 parents 50fdd45 + 4dd5076 commit 138f47a

File tree

3 files changed

+30
-54
lines changed

3 files changed

+30
-54
lines changed

apps/sharebymail/lib/ShareByMailProvider.php

Lines changed: 12 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636

3737
namespace OCA\ShareByMail;
3838

39-
use OC\CapabilitiesManager;
4039
use OC\HintException;
4140
use OC\Share20\Exception\InvalidShare;
4241
use OC\Share20\Share;
@@ -45,6 +44,7 @@
4544
use OCP\Activity\IManager;
4645
use OCP\DB\QueryBuilder\IQueryBuilder;
4746
use OCP\Defaults;
47+
use OCP\EventDispatcher\IEventDispatcher;
4848
use OCP\Files\Folder;
4949
use OCP\Files\IRootFolder;
5050
use OCP\Files\Node;
@@ -55,6 +55,7 @@
5555
use OCP\IUser;
5656
use OCP\IUserManager;
5757
use OCP\Mail\IMailer;
58+
use OCP\Security\Events\GenerateSecurePasswordEvent;
5859
use OCP\Security\IHasher;
5960
use OCP\Security\ISecureRandom;
6061
use OCP\Share\Exceptions\GenericShareException;
@@ -105,8 +106,8 @@ class ShareByMailProvider implements IShareProvider {
105106
/** @var IHasher */
106107
private $hasher;
107108

108-
/** @var CapabilitiesManager */
109-
private $capabilitiesManager;
109+
/** @var IEventDispatcher */
110+
private $eventDispatcher;
110111

111112
/**
112113
* Return the identifier of this provider.
@@ -117,23 +118,6 @@ public function identifier() {
117118
return 'ocMailShare';
118119
}
119120

120-
/**
121-
* DefaultShareProvider constructor.
122-
*
123-
* @param IDBConnection $connection
124-
* @param ISecureRandom $secureRandom
125-
* @param IUserManager $userManager
126-
* @param IRootFolder $rootFolder
127-
* @param IL10N $l
128-
* @param ILogger $logger
129-
* @param IMailer $mailer
130-
* @param IURLGenerator $urlGenerator
131-
* @param IManager $activityManager
132-
* @param SettingsManager $settingsManager
133-
* @param Defaults $defaults
134-
* @param IHasher $hasher
135-
* @param CapabilitiesManager $capabilitiesManager
136-
*/
137121
public function __construct(
138122
IDBConnection $connection,
139123
ISecureRandom $secureRandom,
@@ -147,7 +131,7 @@ public function __construct(
147131
SettingsManager $settingsManager,
148132
Defaults $defaults,
149133
IHasher $hasher,
150-
CapabilitiesManager $capabilitiesManager
134+
IEventDispatcher $eventDispatcher
151135
) {
152136
$this->dbConnection = $connection;
153137
$this->secureRandom = $secureRandom;
@@ -161,7 +145,7 @@ public function __construct(
161145
$this->settingsManager = $settingsManager;
162146
$this->defaults = $defaults;
163147
$this->hasher = $hasher;
164-
$this->capabilitiesManager = $capabilitiesManager;
148+
$this->eventDispatcher = $eventDispatcher;
165149
}
166150

167151
/**
@@ -227,31 +211,15 @@ protected function autoGeneratePassword($share) {
227211
);
228212
}
229213

230-
$passwordPolicy = $this->getPasswordPolicy();
231-
$passwordCharset = ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS;
232-
$passwordLength = 8;
233-
if (!empty($passwordPolicy)) {
234-
$passwordLength = (int)$passwordPolicy['minLength'] > 0 ? (int)$passwordPolicy['minLength'] : $passwordLength;
235-
$passwordCharset .= $passwordPolicy['enforceSpecialCharacters'] ? ISecureRandom::CHAR_SYMBOLS : '';
236-
}
214+
$passwordEvent = new GenerateSecurePasswordEvent();
215+
$this->eventDispatcher->dispatchTyped($passwordEvent);
237216

238-
$password = $this->secureRandom->generate($passwordLength, $passwordCharset);
239-
240-
return $password;
241-
}
242-
243-
/**
244-
* get password policy
245-
*
246-
* @return array
247-
*/
248-
protected function getPasswordPolicy() {
249-
$capabilities = $this->capabilitiesManager->getCapabilities();
250-
if (isset($capabilities['password_policy'])) {
251-
return $capabilities['password_policy'];
217+
$password = $passwordEvent->getPassword();
218+
if ($password === null) {
219+
$password = $this->secureRandom->generate(8, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS);
252220
}
253221

254-
return [];
222+
return $password;
255223
}
256224

257225
/**

apps/sharebymail/tests/ShareByMailProviderTest.php

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
3030

3131
namespace OCA\ShareByMail\Tests;
3232

33-
use OC\CapabilitiesManager;
3433
use OC\Mail\Message;
3534
use OCA\ShareByMail\Settings\SettingsManager;
3635
use OCA\ShareByMail\ShareByMailProvider;
3736
use OCP\Defaults;
37+
use OCP\EventDispatcher\IEventDispatcher;
3838
use OCP\Files\File;
3939
use OCP\Files\IRootFolder;
4040
use OCP\IDBConnection;
@@ -46,10 +46,12 @@
4646
use OCP\Mail\IEMailTemplate;
4747
use OCP\Mail\IMailer;
4848
use OCP\Mail\IMessage;
49+
use OCP\Security\Events\GenerateSecurePasswordEvent;
4950
use OCP\Security\IHasher;
5051
use OCP\Security\ISecureRandom;
5152
use OCP\Share\IManager;
5253
use OCP\Share\IShare;
54+
use PHPUnit\Framework\MockObject\MockObject;
5355
use Test\TestCase;
5456

5557
/**
@@ -102,8 +104,8 @@ class ShareByMailProviderTest extends TestCase {
102104
/** @var IHasher | \PHPUnit_Framework_MockObject_MockObject */
103105
private $hasher;
104106

105-
/** @var CapabilitiesManager | \PHPUnit_Framework_MockObject_MockObject */
106-
private $capabilitiesManager;
107+
/** @var IEventDispatcher */
108+
private $eventDispatcher;
107109

108110
protected function setUp(): void {
109111
parent::setUp();
@@ -127,7 +129,7 @@ protected function setUp(): void {
127129
$this->settingsManager = $this->getMockBuilder(SettingsManager::class)->disableOriginalConstructor()->getMock();
128130
$this->defaults = $this->createMock(Defaults::class);
129131
$this->hasher = $this->getMockBuilder(IHasher::class)->getMock();
130-
$this->capabilitiesManager = $this->getMockBuilder(CapabilitiesManager::class)->disableOriginalConstructor()->getMock();
132+
$this->eventDispatcher = $this->getMockBuilder(IEventDispatcher::class)->getMock();
131133

132134
$this->userManager->expects($this->any())->method('userExists')->willReturn(true);
133135
}
@@ -154,7 +156,7 @@ private function getInstance(array $mockedMethods = []) {
154156
$this->settingsManager,
155157
$this->defaults,
156158
$this->hasher,
157-
$this->capabilitiesManager
159+
$this->eventDispatcher
158160
]
159161
);
160162

@@ -176,7 +178,7 @@ private function getInstance(array $mockedMethods = []) {
176178
$this->settingsManager,
177179
$this->defaults,
178180
$this->hasher,
179-
$this->capabilitiesManager
181+
$this->eventDispatcher
180182
);
181183
}
182184

@@ -294,7 +296,15 @@ public function testCreateSendPasswordByMailWithEnforcedPasswordProtection() {
294296
$node = $this->getMockBuilder(File::class)->getMock();
295297
$node->expects($this->any())->method('getName')->willReturn('filename');
296298

297-
$instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity']);
299+
$this->secureRandom->expects($this->once())
300+
->method('generate')
301+
->with(8, ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS)
302+
->willReturn('autogeneratedPassword');
303+
$this->eventDispatcher->expects($this->once())
304+
->method('dispatchTyped')
305+
->with(new GenerateSecurePasswordEvent());
306+
307+
$instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'createPasswordSendActivity']);
298308

299309
$instance->expects($this->once())->method('getSharedWith')->willReturn([]);
300310
$instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
@@ -310,7 +320,6 @@ public function testCreateSendPasswordByMailWithEnforcedPasswordProtection() {
310320
// The autogenerated password should be mailed to the receiver of the share.
311321
$this->settingsManager->expects($this->any())->method('enforcePasswordProtection')->willReturn(true);
312322
$this->settingsManager->expects($this->any())->method('sendPasswordByMail')->willReturn(true);
313-
$instance->expects($this->once())->method('autoGeneratePassword')->with($share)->willReturn('autogeneratedPassword');
314323

315324
$message = $this->createMock(IMessage::class);
316325
$message->expects($this->once())->method('setTo')->with(['receiver@example.com']);

lib/private/Share20/ProviderFactory.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030

3131
namespace OC\Share20;
3232

33-
use OC\CapabilitiesManager;
3433
use OC\Share20\Exception\ProviderException;
3534
use OCA\FederatedFileSharing\AddressHandler;
3635
use OCA\FederatedFileSharing\FederatedShareProvider;
@@ -184,7 +183,7 @@ protected function getShareByMailProvider() {
184183
$settingsManager,
185184
$this->serverContainer->query(Defaults::class),
186185
$this->serverContainer->getHasher(),
187-
$this->serverContainer->query(CapabilitiesManager::class)
186+
$this->serverContainer->get(IEventDispatcher::class)
188187
);
189188
}
190189

0 commit comments

Comments
 (0)