Skip to content

Commit 3fd1b51

Browse files
committed
enforce password on new share
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
1 parent 5ac5fe9 commit 3fd1b51

26 files changed

+784
-68
lines changed

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\PreppingFileShareEvent;
4344
use OCA\Circles\Events\MembershipsCreatedEvent;
4445
use OCA\Circles\Events\MembershipsRemovedEvent;
46+
use OCA\Circles\Events\PreppingCircleMemberEvent;
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\PreppingShareSendMail as ListenerFilesPreppingShareSendMail;
5558
use OCA\Circles\Listeners\Files\MemberAddedSendMail as ListenerFilesMemberAddedSendMail;
59+
use OCA\Circles\Listeners\Files\PreppingMemberSendMail as ListenerFilesPreppingMemberSendMail;
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+
PreppingCircleMemberEvent::class,
150+
ListenerFilesPreppingMemberSendMail::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+
PreppingFileShareEvent::class,
162+
ListenerFilesPreppingShareSendMail::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
@@ -1049,6 +1049,13 @@ public function limitToShareToken(string $alias, string $token): void {
10491049
$this->leftJoinShareToken($alias);
10501050

10511051
$aliasShareToken = $this->generateAlias($alias, self::TOKEN, $options);
1052+
$this->generateSelectAlias(
1053+
CoreRequestBuilder::$tables[CoreRequestBuilder::TABLE_TOKEN],
1054+
$aliasShareToken,
1055+
$aliasShareToken,
1056+
[]
1057+
);
1058+
10521059
$this->limit('token', $token, $aliasShareToken);
10531060
}
10541061

lib/Db/MountRequest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class MountRequest extends MountRequestBuilder {
4949
* @param Mount $mount
5050
*/
5151
public function save(Mount $mount): void {
52+
// TODO: fix hash
53+
// TODO: fix hash
5254
// TODO: fix hash
5355
$hash = $this->token();
5456
$qb = $this->getMountInsertSql();
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 <maxence@artificial-owl.com>
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 PreppingFileShareEvent
41+
*
42+
* @package OCA\Circles\Events\Files
43+
*/
44+
class PreppingFileShareEvent extends CircleGenericEvent {
45+
46+
47+
/** @var Mount */
48+
private $mount;
49+
50+
51+
/**
52+
* PreppingFileShareEvent 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 <maxence@artificial-owl.com>
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 PreppingCircleMemberEvent
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 PreppingCircleMemberEvent 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->fileSharePrepping($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
@@ -78,6 +78,11 @@ public function verify(FederatedEvent $event): void {
7878

7979
$event->setMembers($filtered);
8080
$event->setOutcome($this->serializeArray($filtered));
81+
82+
foreach ($event->getMembers() as $member) {
83+
$event->setMember($member);
84+
$this->eventService->memberPrepping($event);
85+
}
8186
}
8287

8388

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,
@@ -180,35 +180,7 @@ public function verify(FederatedEvent $event): void {
180180
$event->setMembers([$member]);
181181
$event->setOutcome($this->serialize($member));
182182

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

214186

@@ -232,7 +204,7 @@ public function manage(FederatedEvent $event): void {
232204
$this->eventService->memberAdding($event);
233205
}
234206

235-
//
207+
236208
// //
237209
// // TODO: verifiez comment se passe le cached name sur un member_add
238210
// //

lib/Listeners/Files/AddingMemberSendMail.php

Lines changed: 16 additions & 5 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
*/
@@ -103,15 +103,22 @@ public function handle(Event $event): void {
103103

104104
$result = [];
105105
$member = $event->getMember();
106-
107106
if ($member->getUserType() === Member::TYPE_CIRCLE) {
108107
$members = $member->getBasedOn()->getInheritedMembers();
109108
} else {
110109
$members = [$member];
111110
}
112111

113112
$circle = $event->getCircle();
113+
$federatedEvent = $event->getFederatedEvent();
114114
$shares = $this->shareWrapperService->getSharesToCircle($circle->getSingleId());
115+
$hashedPasswords = $federatedEvent->getParams()->gArray('hashedPasswords');
116+
117+
\OC::$server->getLogger()->log(
118+
3, '### ??? internal !? (should be empty)' . json_encode(
119+
$federatedEvent->getInternal()
120+
)
121+
);
115122

116123
/** @var Member[] $members */
117124
foreach ($members as $member) {
@@ -124,13 +131,17 @@ public function handle(Event $event): void {
124131
$files = [];
125132
foreach ($shares as $share) {
126133
try {
127-
$shareToken = $this->shareTokenService->generateShareToken($share, $member);
134+
$shareToken = $this->shareTokenService->generateShareToken(
135+
$share,
136+
$member,
137+
$this->get($member->getSingleId(), $hashedPasswords)
138+
);
128139
} catch (Exception $e) {
129140
continue;
130141
}
131142

132143
$share->setShareToken($shareToken);
133-
$files[] = $share;
144+
$files[] = clone $share;
134145
}
135146

136147
$result[$member->getId()] = [
@@ -139,6 +150,6 @@ public function handle(Event $event): void {
139150
];
140151
}
141152

142-
$event->getFederatedEvent()->setResultEntry('files', $result);
153+
$federatedEvent->setResultEntry('files', $result);
143154
}
144155
}

lib/Listeners/Files/CreatingShareSendMail.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ public function handle(Event $event): void {
114114
}
115115

116116
$circle = $event->getCircle();
117-
118117
$federatedEvent = $event->getFederatedEvent();
118+
$hashedPasswords = $federatedEvent->getParams()->gArray('hashedPasswords');
119119

120120
$result = [];
121121
foreach ($circle->getInheritedMembers(false, true) as $member) {
@@ -136,7 +136,12 @@ public function handle(Event $event): void {
136136
throw new ShareWrapperNotFoundException();
137137
}
138138

139-
$shareToken = $this->shareTokenService->generateShareToken($share, $member);
139+
$shareToken = $this->shareTokenService->generateShareToken(
140+
$share,
141+
$member,
142+
$this->get($member->getSingleId(), $hashedPasswords)
143+
);
144+
140145
$share->setShareToken($shareToken);
141146
} catch (Exception $e) {
142147
$share = null;
@@ -149,6 +154,6 @@ public function handle(Event $event): void {
149154
];
150155
}
151156

152-
$event->getFederatedEvent()->setResultEntry('info', $result);
157+
$federatedEvent->setResultEntry('info', $result);
153158
}
154159
}

0 commit comments

Comments
 (0)