[ENTITY][Actor] Basic check if can admin for remote actors

This commit is contained in:
Diogo Peralta Cordeiro 2021-12-28 15:02:03 +00:00
parent b7c82b9dcb
commit 9585472679
No known key found for this signature in database
GPG Key ID: 18D2D35001FBFAB0
2 changed files with 40 additions and 16 deletions

View File

@ -152,6 +152,24 @@ class ActivityPub extends Plugin
return Event::next;
}
/**
* Fill Actor->canAdmin() for Actors that came from ActivityPub
*/
public function onFreeNetworkActorCanAdmin(Actor $actor, Actor $other, bool &$canAdmin): bool
{
// Are both in AP?
if (
!\is_null($ap_actor = ActivitypubActor::getByPK(['actor_id' => $actor->getId()]))
&& !\is_null($ap_other = ActivitypubActor::getByPK(['actor_id' => $other->getId()]))
) {
// Are they both in the same server?
$canAdmin = parse_url($ap_actor->getUri(), PHP_URL_HOST) === parse_url($ap_other->getUri(), PHP_URL_HOST);
return Event::stop;
}
return Event::next;
}
/**
* Overload core endpoints to make resources available in ActivityStreams 2.0
*

View File

@ -517,22 +517,28 @@ class Actor extends Entity
*/
public function canAdmin(self $other): bool
{
switch ($other->getType()) {
case self::PERSON:
return $this->getId() === $other->getId();
case self::GROUP:
return Cache::get(
self::cacheKeys($this->getId(), $other->getId())['can-admin'],
function () use ($other) {
try {
return DB::findOneBy('group_member', ['group_id' => $other->getId(), 'actor_id' => $this->getId()])->getIsAdmin();
} catch (NotFoundException) {
return false;
}
},
);
default:
return false;
if ($this->getIsLocal()) {
switch ($other->getType()) {
case self::PERSON:
return $this->getId() === $other->getId();
case self::GROUP:
return Cache::get(
self::cacheKeys($this->getId(), $other->getId())['can-admin'],
function () use ($other) {
try {
return DB::findOneBy('group_member', ['group_id' => $other->getId(), 'actor_id' => $this->getId()])->getIsAdmin();
} catch (NotFoundException) {
return false;
}
},
);
default:
return false;
}
} else {
$canAdmin = false;
Event::handle('FreeNetworkActorCanAdmin', [$this, $other, &$canAdmin]);
return $canAdmin;
}
}