Заморозка страницы (#698)

* Заморозка страницы

* Bugfixes

* ok
This commit is contained in:
n1rwana 2022-09-05 11:16:22 +03:00 committed by GitHub
parent 324297db7e
commit a935b2ca31
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 71 additions and 10 deletions

View file

@ -768,7 +768,7 @@ class User extends RowModel
]);
}
function ban(string $reason, bool $deleteSubscriptions = true): void
function ban(string $reason, bool $deleteSubscriptions = true, ?int $unban_time = NULL): void
{
if($deleteSubscriptions) {
$subs = DatabaseConnection::i()->getContext()->table("subscriptions");
@ -782,6 +782,7 @@ class User extends RowModel
}
$this->setBlock_Reason($reason);
$this->setUnblock_time($unban_time);
$this->save();
}
@ -1018,5 +1019,21 @@ class User extends RowModel
return (bool) $this->getRecord()->activated;
}
function getUnbanTime(): ?string
{
return !is_null($this->getRecord()->unblock_time) ? date('d.m.Y', $this->getRecord()->unblock_time) : NULL;
}
function canUnbanThemself(): bool
{
if (!$this->isBanned())
return false;
if ($this->getRecord()->unblock_time > time() || $this->getRecord()->unblock_time == 0)
return false;
return true;
}
use Traits\TSubscribable;
}

View file

@ -340,11 +340,13 @@ final class AdminPresenter extends OpenVKPresenter
{
$this->assertNoCSRF();
$unban_time = strtotime($this->queryParam("date")) ?: NULL;
$user = $this->users->get($id);
if(!$user)
exit(json_encode([ "error" => "User does not exist" ]));
$user->ban($this->queryParam("reason"));
$user->ban($this->queryParam("reason"), true, $unban_time);
exit(json_encode([ "success" => true, "reason" => $this->queryParam("reason") ]));
}
@ -356,7 +358,8 @@ final class AdminPresenter extends OpenVKPresenter
if(!$user)
exit(json_encode([ "error" => "User does not exist" ]));
$user->setBlock_Reason(null);
$user->setBlock_Reason(NULL);
$user->setUnblock_time(NULL);
$user->save();
exit(json_encode([ "success" => true ]));
}

View file

@ -323,6 +323,23 @@ final class AuthPresenter extends OpenVKPresenter
$this->redirect("/");
}
function renderUnbanThemself(): void
{
$this->assertUserLoggedIn();
$this->willExecuteWriteAction();
if(!$this->user->identity->canUnbanThemself())
$this->flashFail("err", tr("error"), tr("forbidden"));
$user = $this->users->get($this->user->id);
$user->setBlock_Reason(NULL);
$user->setUnblock_Time(NULL);
$user->save();
$this->flashFail("succ", tr("banned_unban_title"), tr("banned_unban_description"));
}
/*
* This function will revoke all tokens, including API and Web tokens and except active one
*

View file

@ -17,7 +17,6 @@ final class UserPresenter extends OpenVKPresenter
private $users;
public $deactivationTolerant = false;
function __construct(Users $users)
{
$this->users = $users;

View file

@ -12,6 +12,16 @@
<p>
{tr("banned_1", htmlentities($thisUser->getCanonicalName()))|noescape}<br/>
{tr("banned_2", htmlentities($thisUser->getBanReason()))|noescape}
{if !$thisUser->getUnbanTime()}
{_banned_perm}
{else}
{tr("banned_until_time", $thisUser->getUnbanTime())|noescape}
{/if}
</p>
<p n:if="$thisUser->canUnbanThemself()">
<hr/>
<center><a class="button" href="/unban.php">{_banned_unban_myself}</a></center>
</p>
<hr/>
<p>

View file

@ -543,12 +543,14 @@
uBanMsgTxt = "Вы собираетесь забанить пользователя " + {$user->getCanonicalName()} + ".";
uBanMsgTxt += "<br/><b>Предупреждение</b>: Это действие удалит все подписки пользователя и отпишет всех от него.";
uBanMsgTxt += "<br/><br/><b>Причина бана</b>: <input type='text' id='uBanMsgInput' placeholder='придумайте что-нибудь крутое' />"
uBanMsgTxt += "<br/><br/><b>Заблокировать до</b>: <input type='date' id='uBanMsgDate' />";
MessageBox("Забанить " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
(function() {
res = document.querySelector("#uBanMsgInput").value;
date = document.querySelector("#uBanMsgDate").value;
xhr = new XMLHttpRequest();
xhr.open("GET", "/admin/ban/" + {$user->getId()} + "?reason=" + res + "&hash=" + {rawurlencode($csrfToken)}, true);
xhr.open("GET", "/admin/ban/" + {$user->getId()} + "?reason=" + res + "&date=" + date + "&hash=" + {rawurlencode($csrfToken)}, true);
xhr.onload = (function() {
if(xhr.responseText.indexOf("success") === -1)
MessageBox("Ошибка", "Не удалось забанить пользователя...", ["OK"], [Function.noop]);

View file

@ -2,7 +2,8 @@
<img src="/assets/packages/static/openvk/img/oof.apng" alt="Пользователь заблокирован." style="width: 20%;" />
<p>
{tr("user_banned", htmlentities($user->getFirstName()))|noescape}<br/>
{_user_banned_comment} <b>{$user->getBanReason()}</b>.
{_user_banned_comment} <b>{$user->getBanReason()}</b>.<br/>
Пользователь заблокирован до: <b>{$user->getUnbanTime()}</b>
</p>
{if isset($thisUser)}
<p n:if="$thisUser->getChandlerUser()->can('access')->model('admin')->whichBelongsTo(NULL) || $thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)">

View file

@ -65,6 +65,8 @@ routes:
handler: "Auth->verifyEmail"
- url: "/setSID/{slug}"
handler: "Auth->su"
- url: "/unban.php"
handler: "Auth->unbanThemself"
- url: "/revokeAllTokens"
handler: "Auth->revokeAllTokens"
- url: "/settings"

View file

@ -842,8 +842,13 @@
"banned_header" = "You are banned";
"banned_alt" = "The user is blocked.";
"banned_1" = "Sorry <b>$1</b>, but you have been banned.";
"banned_2" = "And the reason for this is simple: <b>$1</b>. Unfortunately, this time we had to block you forever.";
"banned_2" = "And the reason for this is simple: <b>$1</b>.";
"banned_perm" = "Unfortunately, this time we had to block you forever.";
"banned_until_time" = "This time we had to block you until <b>$1</b>";
"banned_3" = "You can still <a href=\"/support?act=new\">write to the support</a> if you think there was an error or <a href=\"/logout?hash=$1\">logout</a>.";
"banned_unban_myself" = "Unban myself";
"banned_unban_title" = "Your account has been unbanned";
"banned_unban_description" = "Try not to break the rules anymore.";
/* Registration confirm */

View file

@ -887,8 +887,13 @@
"banned_header" = "Вы были верискокнуты";
"banned_alt" = "Пользователь заблокирован.";
"banned_1" = "Извините, <b>$1</b>, но вы были верискокнуты.";
"banned_2" = "А причина этому проста: <b>$1</b>. К сожалению, на этот раз нам пришлось заблокировать вас навсегда.";
"banned_2" = "А причина этому проста: <b>$1</b>.";
"banned_perm" = "К сожалению, на этот раз нам пришлось заблокировать вас навсегда";
"banned_until_time" = "На этот раз нам пришлось заблокировать вас до <b>$1</b>";
"banned_3" = "Вы всё ещё можете <a href=\"/support?act=new\">написать в службу поддержки</a>, если считаете что произошла ошибка или <a href=\"/logout?hash=$1\">выйти</a>.";
"banned_unban_myself" = "Разморозить страницу";
"banned_unban_title" = "Ваш аккаунт разблокирован";
"banned_unban_description" = "Постарайтесь больше не нарушать правила.";
/* Registration confirm */