Add configurable limit on the depth of likes

This commit is contained in:
Maxim Leshchenko 2021-11-12 20:08:06 +02:00
parent e44cfa5bc4
commit edc93fd13e
2 changed files with 34 additions and 20 deletions

View file

@ -10,6 +10,27 @@ class Post extends Postable
protected $tableName = "posts"; protected $tableName = "posts";
protected $upperNodeReferenceColumnName = "wall"; protected $upperNodeReferenceColumnName = "wall";
private function setLikeRecursively(bool $liked, User $user, int $depth): void
{
$searchData = [
"origin" => $user->getId(),
"model" => static::class,
"target" => $this->getRecord()->id,
];
if((sizeof(DB::i()->getContext()->table("likes")->where($searchData)) > 0) !== $liked) {
if($this->getOwner(false)->getId() !== $user->getId() && !($this->getOwner() instanceof Club))
(new LikeNotification($this->getOwner(false), $this, $user))->emit();
parent::setLike($liked, $user);
}
if($depth < ovkGetQuirk("wall.repost-liking-recursion-limit"))
foreach($this->getChildren() as $attachment)
if($attachment instanceof Post)
$attachment->setLikeRecursively($liked, $user, $depth + 1);
}
/** /**
* May return fake owner (group), if flags are [1, (*)] * May return fake owner (group), if flags are [1, (*)]
* *
@ -130,33 +151,16 @@ class Post extends Postable
if($this->getOwner(false)->getId() !== $user->getId() && !($this->getOwner() instanceof Club)) if($this->getOwner(false)->getId() !== $user->getId() && !($this->getOwner() instanceof Club))
(new LikeNotification($this->getOwner(false), $this, $user))->emit(); (new LikeNotification($this->getOwner(false), $this, $user))->emit();
foreach($this->getChildren() as $attachment) { foreach($this->getChildren() as $attachment)
if($attachment instanceof Post) if($attachment instanceof Post)
$attachment->setLike($liked, $user); $attachment->setLikeRecursively($liked, $user, 2);
}
return $liked; return $liked;
} }
function setLike(bool $liked, User $user): void function setLike(bool $liked, User $user): void
{ {
$searchData = [ $this->setLikeRecursively($liked, $user, 1);
"origin" => $user->getId(),
"model" => static::class,
"target" => $this->getRecord()->id,
];
if((sizeof(DB::i()->getContext()->table("likes")->where($searchData)) > 0) !== $liked) {
if($this->getOwner(false)->getId() !== $user->getId() && !($this->getOwner() instanceof Club))
(new LikeNotification($this->getOwner(false), $this, $user))->emit();
parent::setLike($liked, $user);
}
foreach($this->getChildren() as $attachment) {
if($attachment instanceof Post)
$attachment->setLike($liked, $user);
}
} }
function deletePost(): void function deletePost(): void

View file

@ -34,3 +34,13 @@ blobs.erase-upon-deletion: 0
# + Set this option to 1 if you want to use quirky VK Mobile behaviour (yes graffiti in comments) # + Set this option to 1 if you want to use quirky VK Mobile behaviour (yes graffiti in comments)
# + Set this option to 0 if you want to use VK Desktop behaviour (no graffiti in comments) # + Set this option to 0 if you want to use VK Desktop behaviour (no graffiti in comments)
comments.allow-graffiti: 0 comments.allow-graffiti: 0
# Maximum recursion depth of likes on reposts
# Restriction on the recursion depth of repost likes.
# For example, if the value is 5, likes will be set for a maximum of 5 posts, even if there are more posts in the repost hierarchy.
# Needed to protect against attacks
#
# Possible values:
# + Set this option to -1 if you want to disable the limit
# + Set this option to any non-negative number to be this limit
wall.repost-liking-recursion-limit: 10