Skip to content

Commit 304ed19

Browse files
Merge pull request #790 from nextcloud/fix/noid/emulate-visitor-on-join
emulate initiator on CircleJoin
2 parents cc0f954 + 074034e commit 304ed19

File tree

3 files changed

+36
-9
lines changed

3 files changed

+36
-9
lines changed

lib/Db/MemberRequest.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
use OCA\Circles\Model\Circle;
3939
use OCA\Circles\Model\FederatedUser;
4040
use OCA\Circles\Model\Member;
41+
use OCA\Circles\Model\Probes\CircleProbe;
4142
use OCA\Circles\Model\Probes\MemberProbe;
4243

4344
/**
@@ -288,16 +289,21 @@ public function getInheritedMembers(string $singleId, bool $getData = false, int
288289
/**
289290
* @param string $circleId
290291
* @param string $singleId
292+
* @param CircleProbe|null $probe
291293
*
292294
* @return Member
293295
* @throws MemberNotFoundException
294296
* @throws RequestBuilderException
295297
*/
296-
public function getMember(string $circleId, string $singleId): Member {
298+
public function getMember(string $circleId, string $singleId, ?CircleProbe $probe = null): Member {
297299
$qb = $this->getMemberSelectSql();
298300
$qb->limitToCircleId($circleId);
299301
$qb->limitToSingleId($singleId);
300302

303+
if (!is_null($probe)) {
304+
$qb->setOptions([CoreQueryBuilder::MEMBER], $probe->getAsOptions());
305+
}
306+
301307
return $this->getItemFromRequest($qb);
302308
}
303309

lib/FederatedItems/CircleLeave.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
use OCA\Circles\Model\FederatedUser;
5050
use OCA\Circles\Model\Helpers\MemberHelper;
5151
use OCA\Circles\Model\Member;
52+
use OCA\Circles\Model\Probes\CircleProbe;
5253
use OCA\Circles\Service\ConfigService;
5354
use OCA\Circles\Service\EventService;
5455
use OCA\Circles\Service\MembershipService;
@@ -137,7 +138,13 @@ public function verify(FederatedEvent $event): void {
137138
if ($member->getId() === '') {
138139
try {
139140
// make it works for not-yet-members
140-
$member = $this->memberRequest->getMember($circle->getSingleId(), $member->getSingleId());
141+
$probe = new CircleProbe();
142+
$probe->includeNonVisibleCircles();
143+
$member = $this->memberRequest->getMember(
144+
$circle->getSingleId(),
145+
$member->getSingleId(),
146+
$probe
147+
);
141148
} catch (MemberNotFoundException $e) {
142149
throw new MemberNotFoundException(StatusCode::$CIRCLE_LEAVE[120], 120);
143150
}
@@ -224,10 +231,10 @@ private function selectNewOwner(Circle $circle): Member {
224231
if ($member->getLevel() > $newOwner->getLevel()) {
225232
$newOwner = $member;
226233
} elseif ($member->getLevel() === $newOwner->getLevel()
227-
&& ($member->getJoined() < $newOwner->getJoined()
228-
|| ($this->configService->isLocalInstance($member->getInstance())
229-
&& !$this->configService->isLocalInstance($newOwner->getInstance()))
230-
)) {
234+
&& ($member->getJoined() < $newOwner->getJoined()
235+
|| ($this->configService->isLocalInstance($member->getInstance())
236+
&& !$this->configService->isLocalInstance($newOwner->getInstance()))
237+
)) {
231238
$newOwner = $member;
232239
}
233240
}

lib/Service/CircleService.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,9 +378,15 @@ public function circleJoin(string $circleId): array {
378378
$this->federatedUserService->mustHaveCurrentUser();
379379

380380
$probe = new CircleProbe();
381-
$probe->includeNonVisibleCircles();
381+
$probe->includeNonVisibleCircles()
382+
->emulateVisitor();
383+
384+
$circle = $this->circleRequest->getCircle(
385+
$circleId,
386+
$this->federatedUserService->getCurrentUser(),
387+
$probe
388+
);
382389

383-
$circle = $this->circleRequest->getCircle($circleId, $this->federatedUserService->getCurrentUser(), $probe);
384390
if (!$circle->getInitiator()->hasInvitedBy()) {
385391
$this->federatedUserService->setMemberPatron($circle->getInitiator());
386392
}
@@ -414,7 +420,15 @@ public function circleJoin(string $circleId): array {
414420
public function circleLeave(string $circleId, bool $force = false): array {
415421
$this->federatedUserService->mustHaveCurrentUser();
416422

417-
$circle = $this->circleRequest->getCircle($circleId, $this->federatedUserService->getCurrentUser());
423+
$probe = new CircleProbe();
424+
$probe->includeNonVisibleCircles()
425+
->emulateVisitor();
426+
427+
$circle = $this->circleRequest->getCircle(
428+
$circleId,
429+
$this->federatedUserService->getCurrentUser(),
430+
$probe
431+
);
418432

419433
$event = new FederatedEvent(CircleLeave::class);
420434
$event->setCircle($circle);

0 commit comments

Comments
 (0)