Skip to content

Commit 2981e26

Browse files
Merge pull request #888 from nextcloud/backport/866/stable22
[stable22] enforce password on new share
2 parents da2abed + 89ca584 commit 2981e26

26 files changed

Lines changed: 796 additions & 95 deletions

lib/AppInfo/Application.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@
4040
use OCA\Circles\Events\CircleMemberAddedEvent;
4141
use OCA\Circles\Events\Files\CreatingFileShareEvent;
4242
use OCA\Circles\Events\Files\FileShareCreatedEvent;
43+
use OCA\Circles\Events\Files\PreparingFileShareEvent;
4344
use OCA\Circles\Events\MembershipsCreatedEvent;
4445
use OCA\Circles\Events\MembershipsRemovedEvent;
46+
use OCA\Circles\Events\PreparingCircleMemberEvent;
4547
use OCA\Circles\Events\RemovingCircleMemberEvent;
4648
use OCA\Circles\Events\RequestingCircleMemberEvent;
4749
use OCA\Circles\Handlers\WebfingerHandler;
@@ -52,7 +54,9 @@
5254
use OCA\Circles\Listeners\Examples\ExampleRequestingCircleMember;
5355
use OCA\Circles\Listeners\Files\AddingMemberSendMail as ListenerFilesAddingMemberSendMail;
5456
use OCA\Circles\Listeners\Files\CreatingShareSendMail as ListenerFilesCreatingShareSendMail;
57+
use OCA\Circles\Listeners\Files\PreparingShareSendMail as ListenerFilesPreparingShareSendMail;
5558
use OCA\Circles\Listeners\Files\MemberAddedSendMail as ListenerFilesMemberAddedSendMail;
59+
use OCA\Circles\Listeners\Files\PreparingMemberSendMail as ListenerFilesPreparingMemberSendMail;
5660
use OCA\Circles\Listeners\Files\RemovingMember as ListenerFilesRemovingMember;
5761
use OCA\Circles\Listeners\Files\ShareCreatedSendMail as ListenerFilesShareCreatedSendMail;
5862
use OCA\Circles\Listeners\GroupCreated;
@@ -141,6 +145,10 @@ public function register(IRegistrationContext $context): void {
141145
$context->registerEventListener(UserRemovedEvent::class, GroupMemberRemoved::class);
142146

143147
// Local Events (for Files/Shares/Notifications management)
148+
$context->registerEventListener(
149+
PreparingCircleMemberEvent::class,
150+
ListenerFilesPreparingMemberSendMail::class
151+
);
144152
$context->registerEventListener(
145153
AddingCircleMemberEvent::class,
146154
ListenerFilesAddingMemberSendMail::class
@@ -149,6 +157,10 @@ public function register(IRegistrationContext $context): void {
149157
CircleMemberAddedEvent::class,
150158
ListenerFilesMemberAddedSendMail::class
151159
);
160+
$context->registerEventListener(
161+
PreparingFileShareEvent::class,
162+
ListenerFilesPreparingShareSendMail::class
163+
);
152164
$context->registerEventListener(
153165
CreatingFileShareEvent::class,
154166
ListenerFilesCreatingShareSendMail::class

lib/Db/CoreQueryBuilder.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,6 +1044,13 @@ public function limitToShareToken(string $alias, string $token): void {
10441044
$this->leftJoinShareToken($alias);
10451045

10461046
$aliasShareToken = $this->generateAlias($alias, self::TOKEN, $options);
1047+
$this->generateSelectAlias(
1048+
CoreRequestBuilder::$tables[CoreRequestBuilder::TABLE_TOKEN],
1049+
$aliasShareToken,
1050+
$aliasShareToken,
1051+
[]
1052+
);
1053+
10471054
$this->limit('token', $token, $aliasShareToken);
10481055
}
10491056

lib/Db/MountRequest.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
use OCA\Circles\Model\Mount;
3838

3939
/**
40-
* Class GSSharesRequest
40+
* Class MountRequest
4141
*
4242
* @package OCA\Circles\Db
4343
*/
@@ -49,16 +49,14 @@ class MountRequest extends MountRequestBuilder {
4949
* @param Mount $mount
5050
*/
5151
public function save(Mount $mount): void {
52-
// TODO: fix hash
53-
$hash = $this->token();
5452
$qb = $this->getMountInsertSql();
5553
$qb->setValue('circle_id', $qb->createNamedParameter($mount->getCircleId()))
5654
->setValue('mount_id', $qb->createNamedParameter($mount->getMountId()))
5755
->setValue('single_id', $qb->createNamedParameter($mount->getOwner()->getSingleId()))
5856
->setValue('token', $qb->createNamedParameter($mount->getToken()))
5957
->setValue('parent', $qb->createNamedParameter($mount->getParent()))
6058
->setValue('mountpoint', $qb->createNamedParameter($mount->getMountPoint()))
61-
->setValue('mountpoint_hash', $qb->createNamedParameter($hash));
59+
->setValue('mountpoint_hash', $qb->createNamedParameter(md5($mount->getMountPoint())));
6260

6361
$qb->execute();
6462
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
4+
declare(strict_types=1);
5+
6+
7+
/**
8+
* Circles - Bring cloud-users closer together.
9+
*
10+
* This file is licensed under the Affero General Public License version 3 or
11+
* later. See the COPYING file.
12+
*
13+
* @author Maxence Lange <[email protected]>
14+
* @copyright 2021
15+
* @license GNU AGPL version 3 or any later version
16+
*
17+
* This program is free software: you can redistribute it and/or modify
18+
* it under the terms of the GNU Affero General Public License as
19+
* published by the Free Software Foundation, either version 3 of the
20+
* License, or (at your option) any later version.
21+
*
22+
* This program is distributed in the hope that it will be useful,
23+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
24+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25+
* GNU Affero General Public License for more details.
26+
*
27+
* You should have received a copy of the GNU Affero General Public License
28+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
29+
*
30+
*/
31+
32+
33+
namespace OCA\Circles\Events\Files;
34+
35+
use OCA\Circles\Events\CircleGenericEvent;
36+
use OCA\Circles\Model\Federated\FederatedEvent;
37+
use OCA\Circles\Model\Mount;
38+
39+
/**
40+
* Class PreparingFileShareEvent
41+
*
42+
* @package OCA\Circles\Events\Files
43+
*/
44+
class PreparingFileShareEvent extends CircleGenericEvent {
45+
46+
47+
/** @var Mount */
48+
private $mount;
49+
50+
51+
/**
52+
* PreparingFileShareEvent constructor.
53+
*
54+
* @param FederatedEvent $federatedEvent
55+
*/
56+
public function __construct(FederatedEvent $federatedEvent) {
57+
parent::__construct($federatedEvent);
58+
}
59+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
6+
/**
7+
* Circles - Bring cloud-users closer together.
8+
*
9+
* This file is licensed under the Affero General Public License version 3 or
10+
* later. See the COPYING file.
11+
*
12+
* @author Maxence Lange <[email protected]>
13+
* @copyright 2021
14+
* @license GNU AGPL version 3 or any later version
15+
*
16+
* This program is free software: you can redistribute it and/or modify
17+
* it under the terms of the GNU Affero General Public License as
18+
* published by the Free Software Foundation, either version 3 of the
19+
* License, or (at your option) any later version.
20+
*
21+
* This program is distributed in the hope that it will be useful,
22+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
23+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24+
* GNU Affero General Public License for more details.
25+
*
26+
* You should have received a copy of the GNU Affero General Public License
27+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
28+
*
29+
*/
30+
31+
32+
namespace OCA\Circles\Events;
33+
34+
use OCA\Circles\Model\Federated\FederatedEvent;
35+
36+
/**
37+
* Class PreparingCircleMemberEvent
38+
*
39+
* This event is called when one or multiple members are added to a Circle.
40+
*
41+
* This event is called on the master instance of the circle, before AddingCircleMemberEvent.
42+
*
43+
* @package OCA\Circles\Events
44+
*/
45+
class PreparingCircleMemberEvent extends CircleMemberGenericEvent {
46+
47+
48+
/**
49+
* PreparingCircleMemberEvent constructor.
50+
*
51+
* @param FederatedEvent $federatedEvent
52+
*/
53+
public function __construct(FederatedEvent $federatedEvent) {
54+
parent::__construct($federatedEvent);
55+
}
56+
}

lib/FederatedItems/Files/FileShare.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
namespace OCA\Circles\FederatedItems\Files;
3333

3434
use ArtificialOwl\MySmallPhpTools\Exceptions\InvalidItemException;
35-
use ArtificialOwl\MySmallPhpTools\Exceptions\ItemNotFoundException;
3635
use ArtificialOwl\MySmallPhpTools\Exceptions\UnknownTypeException;
3736
use ArtificialOwl\MySmallPhpTools\Traits\Nextcloud\nc22\TNC22Logger;
3837
use ArtificialOwl\MySmallPhpTools\Traits\TStringTools;
@@ -94,24 +93,26 @@ public function __construct(
9493
* @param FederatedEvent $event
9594
*/
9695
public function verify(FederatedEvent $event): void {
97-
// TODO: check and improve
98-
// TODO: Could we use a share lock ?
96+
// TODO: check (origin of file ?) and improve
97+
// TODO: Use a share lock
98+
99+
$this->eventService->fileSharePreparing($event);
99100
}
100101

101102

102103
/**
103104
* @param FederatedEvent $event
104105
*
106+
* @throws CircleNotFoundException
105107
* @throws InvalidItemException
106108
* @throws UnknownTypeException
107-
* @throws CircleNotFoundException
108-
* @throws ItemNotFoundException
109109
*/
110110
public function manage(FederatedEvent $event): void {
111111
$mount = null;
112112
if (!$this->configService->isLocalInstance($event->getOrigin())) {
113113
/** @var ShareWrapper $wrappedShare */
114114
$wrappedShare = $event->getParams()->gObj('wrappedShare', ShareWrapper::class);
115+
115116
$mount = new Mount();
116117
$mount->fromShare($wrappedShare);
117118
$mount->setMountId($this->token(15));

lib/FederatedItems/MassiveMemberAdd.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ public function verify(FederatedEvent $event): void {
8181

8282
$event->setMembers($filtered);
8383
$event->setOutcome($this->serializeArray($filtered));
84+
85+
foreach ($event->getMembers() as $member) {
86+
$event->setMember($member);
87+
$this->eventService->memberPreparing($event);
88+
}
8489
}
8590

8691

lib/FederatedItems/SingleMemberAdd.php

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@
7676
use OCP\IUserManager;
7777

7878
/**
79-
* Class MemberAdd
79+
* Class SingleMemberAdd
8080
*
81-
* @package OCA\Circles\GlobalScale
81+
* @package OCA\Circles\FederatedItems
8282
*/
8383
class SingleMemberAdd implements
8484
IFederatedItem,
@@ -182,35 +182,7 @@ public function verify(FederatedEvent $event): void {
182182
$event->setMembers([$member]);
183183
$event->setOutcome($this->serialize($member));
184184

185-
return;
186-
187-
188-
// $member = $this->membersRequest->getFreshNewMember(
189-
// $circle->getUniqueId(), $ident, $eventMember->getType(), $eventMember->getInstance()
190-
// );
191-
// $member->hasToBeInviteAble()
192-
//
193-
// $this->membersService->addMemberBasedOnItsType($circle, $member);
194-
//
195-
// $password = '';
196-
// $sendPasswordByMail = false;
197-
// if ($this->configService->enforcePasswordProtection($circle)) {
198-
// if ($circle->getSetting('password_single_enabled') === 'true') {
199-
// $password = $circle->getPasswordSingle();
200-
// } else {
201-
// $sendPasswordByMail = true;
202-
// $password = $this->miscService->token(15);
203-
// }
204-
// }
205-
//
206-
// $event->setData(
207-
// new SimpleDataStore(
208-
// [
209-
// 'password' => $password,
210-
// 'passwordByMail' => $sendPasswordByMail
211-
// ]
212-
// )
213-
// );
185+
$this->eventService->memberPreparing($event);
214186
}
215187

216188

@@ -234,7 +206,7 @@ public function manage(FederatedEvent $event): void {
234206
$this->eventService->memberAdding($event);
235207
}
236208

237-
//
209+
238210
// //
239211
// // TODO: verifiez comment se passe le cached name sur un member_add
240212
// //

lib/Listeners/Files/AddingMemberSendMail.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
use OCP\EventDispatcher\IEventListener;
4747

4848
/**
49-
* Class AddingMember
49+
* Class AddingMemberSendMail
5050
*
5151
* @package OCA\Circles\Listeners\Files
5252
*/
@@ -101,19 +101,19 @@ public function handle(Event $event): void {
101101
return;
102102
}
103103

104-
$result = [];
105104
$member = $event->getMember();
106-
107105
if ($member->getUserType() === Member::TYPE_CIRCLE) {
108106
$members = $member->getBasedOn()->getInheritedMembers();
109107
} else {
110108
$members = [$member];
111109
}
112110

113111
$circle = $event->getCircle();
112+
$federatedEvent = $event->getFederatedEvent();
114113
$shares = $this->shareWrapperService->getSharesToCircle($circle->getSingleId());
114+
$hashedPasswords = $federatedEvent->getParams()->gArray('hashedPasswords');
115115

116-
/** @var Member[] $members */
116+
$result = [];
117117
foreach ($members as $member) {
118118
if ($member->getUserType() !== Member::TYPE_MAIL
119119
&& $member->getUserType() !== Member::TYPE_CONTACT
@@ -124,13 +124,17 @@ public function handle(Event $event): void {
124124
$files = [];
125125
foreach ($shares as $share) {
126126
try {
127-
$shareToken = $this->shareTokenService->generateShareToken($share, $member);
127+
$shareToken = $this->shareTokenService->generateShareToken(
128+
$share,
129+
$member,
130+
$this->get($member->getSingleId(), $hashedPasswords)
131+
);
128132
} catch (Exception $e) {
129133
continue;
130134
}
131135

132136
$share->setShareToken($shareToken);
133-
$files[] = $share;
137+
$files[] = clone $share;
134138
}
135139

136140
$result[$member->getId()] = [
@@ -139,6 +143,6 @@ public function handle(Event $event): void {
139143
];
140144
}
141145

142-
$event->getFederatedEvent()->setResultEntry('files', $result);
146+
$federatedEvent->addResultEntry('files', $result);
143147
}
144148
}

0 commit comments

Comments
 (0)