From 9842327d3bb363cfc90760fd1cdbc31aa10e6791 Mon Sep 17 00:00:00 2001 From: n1rwana <93197434+n1rwana@users.noreply.github.com> Date: Sun, 28 Aug 2022 14:01:31 +0300 Subject: [PATCH 01/16] RSS: Get rid of 500 error a.k.a. Update WallPresenter.php (#688) --- Web/Presenters/WallPresenter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Web/Presenters/WallPresenter.php b/Web/Presenters/WallPresenter.php index f8997cd7..55c90518 100644 --- a/Web/Presenters/WallPresenter.php +++ b/Web/Presenters/WallPresenter.php @@ -113,14 +113,14 @@ final class WallPresenter extends OpenVKPresenter $feed = new Feed(); $channel = new Channel(); - $channel->title($post->getOwner()->getCanonicalName() . " — " . OPENVK_ROOT_CONF['openvk']['appearance']['name'])->url(ovk_scheme(true) . $_SERVER["SERVER_NAME"])->appendTo($feed); + $channel->title($owner->getCanonicalName() . " — " . OPENVK_ROOT_CONF['openvk']['appearance']['name'])->url(ovk_scheme(true) . $_SERVER["HTTP_HOST"])->appendTo($feed); foreach($posts as $post) { $item = new Item(); $item ->title($post->getOwner()->getCanonicalName()) ->description($post->getText()) - ->url(ovk_scheme(true).$_SERVER["SERVER_NAME"]."/wall{$post->getPrettyId()}") + ->url(ovk_scheme(true).$_SERVER["HTTP_HOST"]."/wall{$post->getPrettyId()}") ->pubDate($post->getPublicationTime()->timestamp()) ->appendTo($channel); } From a43f5dac39f57d5a2fcddfc2351ff190da57fd2a Mon Sep 17 00:00:00 2001 From: Dark-Killer228 <62882591+cheburashka777@users.noreply.github.com> Date: Sun, 28 Aug 2022 16:05:15 +0500 Subject: [PATCH 02/16] locales: Soviet: Add new strings --- locales/su.strings | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/locales/su.strings b/locales/su.strings index 4f757812..d8edf5a9 100644 --- a/locales/su.strings +++ b/locales/su.strings @@ -872,4 +872,17 @@ "email_error" = "Непредвиденная ошибка при отправке письма."; "email_rate_limit_error" = "Нельзя делать это так часто, извините."; -"email_verify_success" = "Ваша регистрация была подтверждена. Приятного времяпрепровождения!"; \ No newline at end of file +"email_verify_success" = "Ваша регистрация была подтверждена. Приятного времяпрепровождения!"; + +"you_still_have_x_points" = "У Вас $1 неиспользованных совестких рублей."; +"top_up_your_account" = "Пополнить баланс"; + +"transfer_trough_ton" = "Пополнить с помощью ТОН"; +"transfer_ton_contents" = "Вы можете пополнить ваш баланс с помощью криптовалюты ТОН. Достаточно отсканировать КуАр-код приложением Tonkeeper, или вручную отправить ТОН по реквизитам. В течении нескольких минут вам придут определенное количество рублей."; +"transfer_ton_address" = "Адрес кошелька: $1
Содержание телеграммы: $2"; +"transfer_ton_currency_per_ton" = "$1 TON"; + +"about_links" = "Ссылки"; +"instance_links" = "Ссылки страны:"; + +"my_apps" = "Досуг и отдых"; From d9ec6a169273ba744bd113ff9b4b7d4688a486b1 Mon Sep 17 00:00:00 2001 From: El psy congroo desu <94683384+el-psy-congroo-desu@users.noreply.github.com> Date: Mon, 29 Aug 2022 01:49:01 +0500 Subject: [PATCH 03/16] VKAPI: Messages.getHistory return profile of message owners (#700) --- VKAPI/Handlers/Messages.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/VKAPI/Handlers/Messages.php b/VKAPI/Handlers/Messages.php index 5767acc4..5ecbe740 100644 --- a/VKAPI/Handlers/Messages.php +++ b/VKAPI/Handlers/Messages.php @@ -316,10 +316,18 @@ final class Messages extends VKAPIRequestHandler $results[] = $rMsg; } - return (object) [ + $output = [ "count" => sizeof($results), "items" => $results, ]; + + if ($extended == 1) { + $users[] = $this->getUser()->getId(); + $users[] = $user_id; + $output["profiles"] = (!empty($users) ? (new APIUsers($this->getUser()))->get(implode(',', $users), $fields) : []); + } + + return (object) $output; } function getLongPollHistory(int $ts = -1, int $preview_length = 0, int $events_limit = 1000, int $msgs_limit = 1000): object From 5769d4060fd03d4c7fde2f971add34e518aa644c Mon Sep 17 00:00:00 2001 From: El psy congroo desu <94683384+el-psy-congroo-desu@users.noreply.github.com> Date: Mon, 29 Aug 2022 22:29:55 +0500 Subject: [PATCH 04/16] VKAPI: Messages.getHistory fixed error code 500 due missing parameter (#702) --- VKAPI/Handlers/Messages.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VKAPI/Handlers/Messages.php b/VKAPI/Handlers/Messages.php index 5ecbe740..c1a85a0a 100644 --- a/VKAPI/Handlers/Messages.php +++ b/VKAPI/Handlers/Messages.php @@ -284,7 +284,7 @@ final class Messages extends VKAPIRequestHandler return (object) $output; } - function getHistory(int $offset = 0, int $count = 20, int $user_id = -1, int $peer_id = -1, int $start_message_id = 0, int $rev = 0, int $extended = 0): object + function getHistory(int $offset = 0, int $count = 20, int $user_id = -1, int $peer_id = -1, int $start_message_id = 0, int $rev = 0, int $extended = 0, string $fields = ""): object { $this->requireUser(); From 343acabff2424adfe64ae5f1e88b57585943b9a1 Mon Sep 17 00:00:00 2001 From: ayaao <58212796+ayaaop@users.noreply.github.com> Date: Sun, 4 Sep 2022 02:08:47 +0600 Subject: [PATCH 05/16] OpenVK Modern: Hide floating sidebar (#706) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Он нам и нафиг не нужон сидебар ваш))))))))))))))))))))))) --- themepacks/openvk_modern/stylesheet.css | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/themepacks/openvk_modern/stylesheet.css b/themepacks/openvk_modern/stylesheet.css index 590710e4..0c11c672 100644 --- a/themepacks/openvk_modern/stylesheet.css +++ b/themepacks/openvk_modern/stylesheet.css @@ -223,7 +223,7 @@ input[type=checkbox] { } .ovk-diag-action { - border-bottom-left-radius: 2px; + border-bottom-left-radius: 2px; border-bottom-right-radius: 2px; } @@ -231,20 +231,6 @@ input[type=checkbox] { border-bottom: none; } -.floating_sidebar { - position: fixed; - top: 50px; - right: 0; - align-items: start; - width: 21%; -} -.minilink .counter { - background-color: #2B587A; - margin: 0; - padding: 0.5px 2px; - left: 10px; - font-size: 7px; - color: #fff; - position: absolute; - margin-top: -6px; +.floating_sidebar,.floating_sidebar.show { + display:none } From 863fb232e022b1fe81a49861b2009f6700dbadd9 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sat, 27 Aug 2022 01:36:54 +0300 Subject: [PATCH 06/16] VKAPI: Change behaviour of start_from and next_from params. Timestamp can cause issues, so i just changed it to 'internal' id --- VKAPI/Handlers/Newsfeed.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VKAPI/Handlers/Newsfeed.php b/VKAPI/Handlers/Newsfeed.php index 19cbfa48..0ff1a33a 100644 --- a/VKAPI/Handlers/Newsfeed.php +++ b/VKAPI/Handlers/Newsfeed.php @@ -26,7 +26,7 @@ final class Newsfeed extends VKAPIRequestHandler ->select("id") ->where("wall IN (?)", $ids) ->where("deleted", 0) - ->where("created < (?)", empty($start_from) ? time()+1 : $start_from) + ->where("id < (?)", empty($start_from) ? time()+1 : $start_from) ->order("created DESC"); $rposts = []; @@ -34,7 +34,7 @@ final class Newsfeed extends VKAPIRequestHandler $rposts[] = (new PostsRepo)->get($post->id)->getPrettyId(); $response = (new Wall)->getById(implode(',', $rposts), $extended, $fields, $this->getUser()); - $response->next_from = end($response->items)->date; + $response->next_from = end($response->items)->id; return $response; } } From 83be7eed1096ace1b85e924d46d6921ac57be044 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sat, 3 Sep 2022 23:11:08 +0300 Subject: [PATCH 07/16] Security: Add magic button name End all sessions It's FUCKING USEFUL bc uknow ur pc or phone can be stolen xd --- Web/Presenters/AuthPresenter.php | 18 +++++++++++++++ Web/Presenters/UserPresenter.php | 2 +- Web/Presenters/templates/User/Settings.xml | 26 ++++++++++++++++++++++ Web/routes.yml | 2 ++ locales/en.strings | 7 ++++++ locales/ru.strings | 7 ++++++ 6 files changed, 61 insertions(+), 1 deletion(-) diff --git a/Web/Presenters/AuthPresenter.php b/Web/Presenters/AuthPresenter.php index ac5a30c2..3fe6e66c 100644 --- a/Web/Presenters/AuthPresenter.php +++ b/Web/Presenters/AuthPresenter.php @@ -322,4 +322,22 @@ final class AuthPresenter extends OpenVKPresenter $this->redirect("/"); } + + /* + * This function will revoke all tokens, including API and Web tokens and except active one + * + * OF COURSE it requires CSRF + */ + function renderRevokeAllTokens(): void + { + $this->assertUserLoggedIn(); + $this->willExecuteWriteAction(); + $this->assertNoCSRF(); + + // API tokens + $this->db->table("api_tokens")->where("user", $this->user->identity->getId())->delete(); + // Web tokens + $this->db->table("ChandlerTokens")->where("user", $this->user->identity->getChandlerGUID())->where("token != ?", Session::i()->get("tok"))->delete(); + $this->flashFail("succ", tr("information_-1"), tr("end_all_sessions_done")); + } } diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php index 6871b90e..3832607f 100644 --- a/Web/Presenters/UserPresenter.php +++ b/Web/Presenters/UserPresenter.php @@ -454,7 +454,7 @@ final class UserPresenter extends OpenVKPresenter $this->flash("succ", tr("changes_saved"), tr("changes_saved_comment")); } $this->template->mode = in_array($this->queryParam("act"), [ - "main", "privacy", "finance", "finance.top-up", "interface" + "main", "security", "privacy", "finance", "finance.top-up", "interface" ]) ? $this->queryParam("act") : "main"; diff --git a/Web/Presenters/templates/User/Settings.xml b/Web/Presenters/templates/User/Settings.xml index f5125d8c..f5ed8d7e 100644 --- a/Web/Presenters/templates/User/Settings.xml +++ b/Web/Presenters/templates/User/Settings.xml @@ -8,6 +8,7 @@ {block content} {var $isMain = $mode === 'main'} +{var $isSecurity = $mode === 'security'} {var $isPrivacy = $mode === 'privacy'} {var $isFinance = $mode === 'finance'} {var $isFinanceTU = $mode === 'finance.top-up'} @@ -17,6 +18,9 @@ + @@ -226,6 +230,28 @@ {_you_can_also} {_delete_your_page}. + {elseif $isSecurity} +

{_ui_settings_sessions}

+
+ + + + + + + + + +
+
+ {tr("end_all_sessions_description", OPENVK_ROOT_CONF['openvk']['appearance']['name'])} +
+
+ + +
+
+ {elseif $isPrivacy}
diff --git a/Web/routes.yml b/Web/routes.yml index 2b346610..99c918c2 100644 --- a/Web/routes.yml +++ b/Web/routes.yml @@ -65,6 +65,8 @@ routes: handler: "Auth->verifyEmail" - url: "/setSID/{slug}" handler: "Auth->su" + - url: "/revokeAllTokens" + handler: "Auth->revokeAllTokens" - url: "/settings" handler: "User->settings" - url: "/settings/2fa" diff --git a/locales/en.strings b/locales/en.strings index a0825392..88fa02a7 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -418,6 +418,7 @@ "avatar" = "Avatar"; "privacy" = "Privacy"; "interface" = "Interface"; +"security" = "Security"; "profile_picture" = "Profile picture"; @@ -490,6 +491,7 @@ "ui_settings_view_of_posts_old" = "Old"; "ui_settings_view_of_posts_microblog" = "Microblog"; "ui_settings_main_page" = "Main page"; +"ui_settings_sessions" = "Sessions"; "additional_links" = "Additional links"; "ad_poster" = "Ad poster"; @@ -518,6 +520,11 @@ "share_with_friends" = "Share with friends"; +"end_all_sessions" = "End all sessions"; +"end_all_sessions_description" = "If you wanna logout from $1 on all devices, click on button below"; + +"end_all_sessions_done" = "All sessions was ended, including mobile apps"; + /* Two-factor authentication */ "two_factor_authentication" = "Two-factor authentication"; diff --git a/locales/ru.strings b/locales/ru.strings index 0e7b7806..a5500a0f 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -452,6 +452,7 @@ "avatar" = "Аватар"; "privacy" = "Приватность"; "interface" = "Внешний вид"; +"security" = "Безопасность"; "profile_picture" = "Изображение страницы"; @@ -526,6 +527,7 @@ "ui_settings_view_of_posts_old" = "Старый"; "ui_settings_view_of_posts_microblog" = "Микроблог"; "ui_settings_main_page" = "Главная страница"; +"ui_settings_sessions" = "Сессии"; "additional_links" = "Дополнительные ссылки"; "ad_poster" = "Рекламный плакат"; @@ -554,6 +556,11 @@ "share_with_friends" = "Рассказать друзьям"; +"end_all_sessions" = "Сбросить все сессии"; +"end_all_sessions_description" = "Если вы хотите выйти из $1 со всех устройств, нажмите на кнопку ниже"; + +"end_all_sessions_done" = "Все сессии сброшены, включая мобильные приложения"; + /* Two-factor authentication */ "two_factor_authentication" = "Двухфакторная аутентификация"; From d2c186dce24acb4622c05e9846e89ee69b6d4928 Mon Sep 17 00:00:00 2001 From: Jaroslaw <92401420+AlesAlte@users.noreply.github.com> Date: Sun, 4 Sep 2022 12:46:34 +0300 Subject: [PATCH 08/16] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=B2=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8F=20=D0=A3=D0=BA=D1=80.=20=D0=9B=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=D0=BB=D1=96=D0=B7=D0=B0=D1=86=D1=96=D1=97:=20?= =?UTF-8?q?=D0=91=D0=B5=D0=B7=D0=BF=D0=B5=D0=BA=D0=B0.=20(#708)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ua.strings | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/locales/ua.strings b/locales/ua.strings index c0dcf8a2..8e017226 100644 --- a/locales/ua.strings +++ b/locales/ua.strings @@ -1,5 +1,3 @@ -#include - "__locale" = "uk_UA.utf8;Ukr"; "__WinEncoding" = "Windows-1251"; @@ -453,6 +451,7 @@ "avatar" = "Аватар"; "privacy" = "Приватність"; "interface" = "Зовнішній вид"; +"security" = "Безпека"; "profile_picture" = "Зображення сторінки"; @@ -527,6 +526,7 @@ "ui_settings_view_of_posts_old" = "Старий"; "ui_settings_view_of_posts_microblog" = "Мікроблог"; "ui_settings_main_page" = "Головна сторінка"; +"ui_settings_sessions" = "Сеанси"; "additional_links" = "Додаткові посилання"; "ad_poster" = "Рекламний плакат"; @@ -555,6 +555,11 @@ "share_with_friends" = "Розповісти друзям"; +"end_all_sessions" = "Завершити всі сеанси"; +"end_all_sessions_description" = "Якщо ви хочете вийти з $1 на всіх пристроях, натисніть кнопку нижче"; + +"end_all_sessions_done" = "Усі сеанси було завершено"; + /* Two-factor authentication */ "two_factor_authentication" = "Двофакторна автентифікація"; From 324297db7e6038472ad243cf0e96d5929773d3cb Mon Sep 17 00:00:00 2001 From: n1rwana <93197434+n1rwana@users.noreply.github.com> Date: Sun, 4 Sep 2022 22:14:38 +0300 Subject: [PATCH 09/16] 2FA is moved to Security tab (#709) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update Settings.xml * Смена пароля тоже --- Web/Presenters/templates/User/Settings.xml | 296 +++++++++++---------- 1 file changed, 149 insertions(+), 147 deletions(-) diff --git a/Web/Presenters/templates/User/Settings.xml b/Web/Presenters/templates/User/Settings.xml index f5ed8d7e..e61f900d 100644 --- a/Web/Presenters/templates/User/Settings.xml +++ b/Web/Presenters/templates/User/Settings.xml @@ -34,7 +34,92 @@
{if $isMain} - + + +

{_your_email_address}

+ + + + + + + + + + + + + + + + + + + + + + + +
+ {_current_email_address} + + {$user->getEmail()} +
+ {_new_email_address} + + +
+ {_password} + + +
+ {_"2fa_code"} + + +
+ + + +
+
+

{_your_page_address}

+ + + + + + + + + + + + + + + +
+ {_page_id} + + {$user->getId()} +
+ {_page_address} + + +
+ + + + +
+ + +
+
+ {_you_can_also} {_delete_your_page}. +
+ + {elseif $isSecurity}

{_change_password}

@@ -73,7 +158,7 @@
- + @@ -83,154 +168,71 @@

-

{_two_factor_authentication}

- - - {if $user->is2faEnabled()} - - - - - - - - - {else} - - - - - - - {/if} - -
-
- {_two_factor_authentication_enabled} -
-
- {_view_backup_codes} - {_disable} -
-
- {_two_factor_authentication_disabled} -
-
- {_connect} -
-
-

{_your_email_address}

- - - - - - - - - - - - - - - - - - - - - - - -
- {_current_email_address} - - {$user->getEmail()} -
- {_new_email_address} - - -
- {_password} - - -
- {_"2fa_code"} - - -
- - - -
-
-

{_your_page_address}

- - - - - - - - - - - - - - - -
- {_page_id} - - {$user->getId()} -
- {_page_address} - - -
- - - - -
-
-
- {_you_can_also} {_delete_your_page}. -
+

{_two_factor_authentication}

+ + + {if $user->is2faEnabled()} + + + + + + - {elseif $isSecurity} + + {else} + + + + + + + {/if} + +
+
+ {_two_factor_authentication_enabled} +
+
+ {_view_backup_codes} + {_disable} +
+
+ {_two_factor_authentication_disabled} +
+
+ {_connect} +

{_ui_settings_sessions}

From a935b2ca3119d1a0a8eda0b9a59209662dad76c8 Mon Sep 17 00:00:00 2001 From: n1rwana <93197434+n1rwana@users.noreply.github.com> Date: Mon, 5 Sep 2022 11:16:22 +0300 Subject: [PATCH 10/16] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B7=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D1=8B=20(#698)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Заморозка страницы * Bugfixes * ok --- Web/Models/Entities/User.php | 19 ++++++++++++++++++- Web/Presenters/AdminPresenter.php | 9 ++++++--- Web/Presenters/AuthPresenter.php | 17 +++++++++++++++++ Web/Presenters/UserPresenter.php | 1 - Web/Presenters/templates/@banned.xml | 10 ++++++++++ Web/Presenters/templates/User/View.xml | 6 ++++-- Web/Presenters/templates/User/banned.xml | 3 ++- Web/routes.yml | 2 ++ locales/en.strings | 7 ++++++- locales/ru.strings | 7 ++++++- 10 files changed, 71 insertions(+), 10 deletions(-) diff --git a/Web/Models/Entities/User.php b/Web/Models/Entities/User.php index 44db0cd9..115bf8c2 100644 --- a/Web/Models/Entities/User.php +++ b/Web/Models/Entities/User.php @@ -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(); } @@ -1017,6 +1018,22 @@ 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; } diff --git a/Web/Presenters/AdminPresenter.php b/Web/Presenters/AdminPresenter.php index 4a484a4d..27b0bf09 100644 --- a/Web/Presenters/AdminPresenter.php +++ b/Web/Presenters/AdminPresenter.php @@ -339,12 +339,14 @@ final class AdminPresenter extends OpenVKPresenter function renderQuickBan(int $id): void { $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 ])); } diff --git a/Web/Presenters/AuthPresenter.php b/Web/Presenters/AuthPresenter.php index 3fe6e66c..f934f7fe 100644 --- a/Web/Presenters/AuthPresenter.php +++ b/Web/Presenters/AuthPresenter.php @@ -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 * diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php index 3832607f..bfda79e8 100644 --- a/Web/Presenters/UserPresenter.php +++ b/Web/Presenters/UserPresenter.php @@ -17,7 +17,6 @@ final class UserPresenter extends OpenVKPresenter private $users; public $deactivationTolerant = false; - function __construct(Users $users) { $this->users = $users; diff --git a/Web/Presenters/templates/@banned.xml b/Web/Presenters/templates/@banned.xml index c3c894d3..48c29ddb 100644 --- a/Web/Presenters/templates/@banned.xml +++ b/Web/Presenters/templates/@banned.xml @@ -12,6 +12,16 @@

{tr("banned_1", htmlentities($thisUser->getCanonicalName()))|noescape}
{tr("banned_2", htmlentities($thisUser->getBanReason()))|noescape} + + {if !$thisUser->getUnbanTime()} + {_banned_perm} + {else} + {tr("banned_until_time", $thisUser->getUnbanTime())|noescape} + {/if} +

+

+


+
{_banned_unban_myself}


diff --git a/Web/Presenters/templates/User/View.xml b/Web/Presenters/templates/User/View.xml index a2b8cb0d..fb38133d 100644 --- a/Web/Presenters/templates/User/View.xml +++ b/Web/Presenters/templates/User/View.xml @@ -543,12 +543,14 @@ uBanMsgTxt = "Вы собираетесь забанить пользователя " + {$user->getCanonicalName()} + "."; uBanMsgTxt += "
Предупреждение: Это действие удалит все подписки пользователя и отпишет всех от него."; uBanMsgTxt += "

Причина бана: " - + uBanMsgTxt += "

Заблокировать до: "; + 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]); diff --git a/Web/Presenters/templates/User/banned.xml b/Web/Presenters/templates/User/banned.xml index d1d5eef7..a495a59d 100644 --- a/Web/Presenters/templates/User/banned.xml +++ b/Web/Presenters/templates/User/banned.xml @@ -2,7 +2,8 @@ Пользователь заблокирован.

{tr("user_banned", htmlentities($user->getFirstName()))|noescape}
- {_user_banned_comment} {$user->getBanReason()}. + {_user_banned_comment} {$user->getBanReason()}.
+ Пользователь заблокирован до: {$user->getUnbanTime()}

{if isset($thisUser)}

diff --git a/Web/routes.yml b/Web/routes.yml index 99c918c2..0e5398f8 100644 --- a/Web/routes.yml +++ b/Web/routes.yml @@ -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" diff --git a/locales/en.strings b/locales/en.strings index 88fa02a7..ba11c73e 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -842,8 +842,13 @@ "banned_header" = "You are banned"; "banned_alt" = "The user is blocked."; "banned_1" = "Sorry $1, but you have been banned."; -"banned_2" = "And the reason for this is simple: $1. Unfortunately, this time we had to block you forever."; +"banned_2" = "And the reason for this is simple: $1."; +"banned_perm" = "Unfortunately, this time we had to block you forever."; +"banned_until_time" = "This time we had to block you until $1"; "banned_3" = "You can still write to the support if you think there was an error or logout."; +"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 */ diff --git a/locales/ru.strings b/locales/ru.strings index a5500a0f..4e55715e 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -887,8 +887,13 @@ "banned_header" = "Вы были верискокнуты"; "banned_alt" = "Пользователь заблокирован."; "banned_1" = "Извините, $1, но вы были верискокнуты."; -"banned_2" = "А причина этому проста: $1. К сожалению, на этот раз нам пришлось заблокировать вас навсегда."; +"banned_2" = "А причина этому проста: $1."; +"banned_perm" = "К сожалению, на этот раз нам пришлось заблокировать вас навсегда"; +"banned_until_time" = "На этот раз нам пришлось заблокировать вас до $1"; "banned_3" = "Вы всё ещё можете написать в службу поддержки, если считаете что произошла ошибка или выйти."; +"banned_unban_myself" = "Разморозить страницу"; +"banned_unban_title" = "Ваш аккаунт разблокирован"; +"banned_unban_description" = "Постарайтесь больше не нарушать правила."; /* Registration confirm */ From ba2981291b73331fe0e6efb821f30cc77da1e4af Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sun, 4 Sep 2022 19:49:21 +0300 Subject: [PATCH 11/16] Ban: Add SQL import file --- install/sqls/00031-ban-page-until.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 install/sqls/00031-ban-page-until.sql diff --git a/install/sqls/00031-ban-page-until.sql b/install/sqls/00031-ban-page-until.sql new file mode 100644 index 00000000..23a5f0e7 --- /dev/null +++ b/install/sqls/00031-ban-page-until.sql @@ -0,0 +1 @@ +ALTER TABLE `profiles` ADD `unblock_time` BIGINT UNSIGNED DEFAULT NULL AFTER `block_reason`; From 1f79dd714332fbcd8728e9f91ab7a5ae6d97d73d Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sun, 4 Sep 2022 20:08:22 +0300 Subject: [PATCH 12/16] VKAPI: Fix Newsfeed once more again --- VKAPI/Handlers/Newsfeed.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VKAPI/Handlers/Newsfeed.php b/VKAPI/Handlers/Newsfeed.php index 0ff1a33a..06474220 100644 --- a/VKAPI/Handlers/Newsfeed.php +++ b/VKAPI/Handlers/Newsfeed.php @@ -34,7 +34,7 @@ final class Newsfeed extends VKAPIRequestHandler $rposts[] = (new PostsRepo)->get($post->id)->getPrettyId(); $response = (new Wall)->getById(implode(',', $rposts), $extended, $fields, $this->getUser()); - $response->next_from = end($response->items)->id; + $response->next_from = end(end($posts->page((int) ($offset + 1), $count))); // ну и костыли пиздец конечно) return $response; } } From 9956a90a99454e07bb03efd8c99efc7a684a48b0 Mon Sep 17 00:00:00 2001 From: Jaroslaw <92401420+AlesAlte@users.noreply.github.com> Date: Mon, 5 Sep 2022 12:32:22 +0300 Subject: [PATCH 13/16] Ukrainian locale: Fixed orthography error and added translation for "Blocking account" (#710) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Блокування сторінки * Small correction of orthography --- locales/ua.strings | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/locales/ua.strings b/locales/ua.strings index 8e017226..ef701a0b 100644 --- a/locales/ua.strings +++ b/locales/ua.strings @@ -832,12 +832,12 @@ "support_opened" = "Відкриті"; "support_answered" = "З відповіддю"; -"support_closed" = "Закриті"; +"support_closed" = "Зачинені"; "support_ticket" = "Звернення"; "support_tickets" = "Звернення"; "support_status_0" = "Питання на розгляді"; "support_status_1" = "Є відповідь"; -"support_status_2" = "Закрито"; +"support_status_2" = "Зачинено"; "support_greeting_hi" = "Вітаємо, $1!"; "support_greeting_regards" = "З повагою,
команда підтримки $1."; @@ -885,9 +885,14 @@ "banned_title" = "Обліковий запис заблоковано"; "banned_header" = "Ваш обліковий запис заблоковано."; "banned_alt" = "Користувача заблоковано."; -"banned_1" = "$1, ваш акаунт заблоковано за порушення правил користування сайту."; -"banned_2" = "Підстава: $1. На цей раз, нам довелося заблокувати вас назавжди."; +"banned_1" = "$1, ваш обліковий запис заблоковано за порушення правил користування сайту."; +"banned_2" = "Привід: $1."; +"banned_perm" = "На цей раз, Ви заблоковані назавжди."; +"banned_until_time" = "На цей раз, Ви заблоковані до $1"; "banned_3" = "Ви все ще можете написати в службу підтримки, якщо вважаєте, що сталася помилка або вийти."; +"banned_unban_myself" = "Розблокувати сторінку"; +"banned_unban_title" = "Ваш обліковий запис розблокований"; +"banned_unban_description" = "Намагайтеся, більше не порушувати правила."; /* Registration confirm */ From 8c8eef1329dd4b212bd1b3eb633b42ddfa6787ed Mon Sep 17 00:00:00 2001 From: Ilya Prokopenko Date: Mon, 5 Sep 2022 17:28:55 +0700 Subject: [PATCH 14/16] Slight change in the team members (#711) --- Web/Presenters/templates/About/Version.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Web/Presenters/templates/About/Version.xml b/Web/Presenters/templates/About/Version.xml index bf0cb5f0..160e2181 100644 --- a/Web/Presenters/templates/About/Version.xml +++ b/Web/Presenters/templates/About/Version.xml @@ -396,8 +396,8 @@

From 125c6b1b63c1c2198e00f77db1d5627fe3f5ceba Mon Sep 17 00:00:00 2001 From: n1rwana <93197434+n1rwana@users.noreply.github.com> Date: Mon, 5 Sep 2022 18:57:41 +0300 Subject: [PATCH 15/16] Ability to block URL (#693) --- Web/Models/Entities/BannedLink.php | 49 ++++++++++++ Web/Models/Entities/Traits/TRichText.php | 4 +- Web/Models/Repositories/BannedLinks.php | 73 +++++++++++++++++ Web/Presenters/AdminPresenter.php | 78 ++++++++++++++++++- Web/Presenters/AwayPresenter.php | 16 ++++ Web/Presenters/BannedLinkPresenter.php | 13 ++++ Web/Presenters/templates/Admin/@layout.xml | 3 + Web/Presenters/templates/Admin/BannedLink.xml | 48 ++++++++++++ .../templates/Admin/BannedLinks.xml | 46 +++++++++++ Web/Presenters/templates/Away/View.xml | 22 ++++++ Web/di.yml | 2 + Web/routes.yml | 8 ++ install/sqls/00031-banned-urls.sql | 14 ++++ locales/en.strings | 20 +++++ locales/ru.strings | 20 +++++ openvk-example.yml | 3 + 16 files changed, 414 insertions(+), 5 deletions(-) create mode 100644 Web/Models/Entities/BannedLink.php create mode 100644 Web/Models/Repositories/BannedLinks.php create mode 100644 Web/Presenters/BannedLinkPresenter.php create mode 100644 Web/Presenters/templates/Admin/BannedLink.xml create mode 100644 Web/Presenters/templates/Admin/BannedLinks.xml create mode 100644 Web/Presenters/templates/Away/View.xml create mode 100644 install/sqls/00031-banned-urls.sql diff --git a/Web/Models/Entities/BannedLink.php b/Web/Models/Entities/BannedLink.php new file mode 100644 index 00000000..09c42e39 --- /dev/null +++ b/Web/Models/Entities/BannedLink.php @@ -0,0 +1,49 @@ +getRecord()->id; + } + + function getDomain(): string + { + return $this->getRecord()->domain; + } + + function getReason(): string + { + return $this->getRecord()->reason ?? tr("url_is_banned_default_reason"); + } + + function getInitiator(): ?User + { + return (new Users)->get($this->getRecord()->initiator); + } + + function getComment(): string + { + return OPENVK_ROOT_CONF["openvk"]["preferences"]["susLinks"]["showReason"] + ? tr("url_is_banned_comment_r", OPENVK_ROOT_CONF["openvk"]["appearance"]["name"], $this->getReason()) + : tr("url_is_banned_comment", OPENVK_ROOT_CONF["openvk"]["appearance"]["name"]); + } + + function getRegexpRule(): string + { + return addslashes("/" . $this->getDomain() . $this->getRawRegexp() . "/"); + } + + function getRawRegexp(): string + { + return $this->getRecord()->regexp_rule; + } +} diff --git a/Web/Models/Entities/Traits/TRichText.php b/Web/Models/Entities/Traits/TRichText.php index edde140b..f2229250 100644 --- a/Web/Models/Entities/Traits/TRichText.php +++ b/Web/Models/Entities/Traits/TRichText.php @@ -35,12 +35,12 @@ trait TRichText "%(([A-z]++):\/\/(\S*?\.\S*?))([\s)\[\]{},\"\'<]|\.\s|$)%", (function (array $matches): string { $href = str_replace("#", "#", $matches[1]); - $href = str_replace(";", ";", $matches[1]); + $href = rawurlencode(str_replace(";", ";", $matches[1])); $link = str_replace("#", "#", $matches[3]); $link = str_replace(";", ";", $matches[3]); $rel = $this->isAd() ? "sponsored" : "ugc"; - return "$link" . htmlentities($matches[4]); + return "$link" . htmlentities($matches[4]); }), $text ); diff --git a/Web/Models/Repositories/BannedLinks.php b/Web/Models/Repositories/BannedLinks.php new file mode 100644 index 00000000..8f93e6fd --- /dev/null +++ b/Web/Models/Repositories/BannedLinks.php @@ -0,0 +1,73 @@ +context = DB::i()->getContext(); + $this->bannedLinks = $this->context->table("links_banned"); + } + + function toBannedLink(?ActiveRow $ar): ?BannedLink + { + return is_null($ar) ? NULL : new BannedLink($ar); + } + + function get(int $id): ?BannedLink + { + return $this->toBannedLink($this->bannedLinks->get($id)); + } + + function getList(?int $page = 1): \Traversable + { + foreach($this->bannedLinks->order("id DESC")->page($page, OPENVK_DEFAULT_PER_PAGE) as $link) + yield new BannedLink($link); + } + + function getCount(int $page = 1): int + { + return sizeof($this->bannedLinks->fetch()); + } + + function getByDomain(string $domain): ?Selection + { + return $this->bannedLinks->where("domain", $domain); + } + + function isDomainBanned(string $domain): bool + { + return sizeof($this->bannedLinks->where(["link" => $domain, "regexp_rule" => ""])) > 0; + } + + function genLinks($rules): \Traversable + { + foreach ($rules as $rule) + yield $this->get($rule->id); + } + + function genEntries($links, $uri): \Traversable + { + foreach($links as $link) + if (preg_match($link->getRegexpRule(), $uri)) + yield $link->getId(); + } + + function check(string $url): ?array + { + $uri = strstr(str_replace(["https://", "http://"], "", $url), "/", true); + $domain = str_replace("www.", "", $uri); + $rules = $this->getByDomain($domain); + + if (is_null($rules)) + return NULL; + + return iterator_to_array($this->genEntries($this->genLinks($rules), $uri)); + } +} \ No newline at end of file diff --git a/Web/Presenters/AdminPresenter.php b/Web/Presenters/AdminPresenter.php index 27b0bf09..ceda6f6b 100644 --- a/Web/Presenters/AdminPresenter.php +++ b/Web/Presenters/AdminPresenter.php @@ -1,7 +1,8 @@ users = $users; $this->clubs = $clubs; $this->vouchers = $vouchers; $this->gifts = $gifts; + $this->bannedLinks = $bannedLinks; parent::__construct(); } @@ -375,4 +378,73 @@ final class AdminPresenter extends OpenVKPresenter $user->adminNotify("⚠️ " . $this->queryParam("message")); exit(json_encode([ "message" => $this->queryParam("message") ])); } + + function renderBannedLinks(): void + { + $this->template->links = $this->bannedLinks->getList((int) $this->queryParam("p") ?: 1); + $this->template->users = new Users; + } + + function renderBannedLink(int $id): void + { + $this->template->form = (object) []; + + if($id === 0) { + $this->template->form->id = 0; + $this->template->form->link = NULL; + $this->template->form->reason = NULL; + } else { + $link = (new BannedLinks)->get($id); + if(!$link) + $this->notFound(); + + $this->template->form->id = $link->getId(); + $this->template->form->link = $link->getDomain(); + $this->template->form->reason = $link->getReason(); + $this->template->form->regexp = $link->getRawRegexp(); + } + + if($_SERVER["REQUEST_METHOD"] !== "POST") + return; + + $link = (new BannedLinks)->get($id); + + $new_domain = parse_url($this->postParam("link"))["host"]; + $new_reason = $this->postParam("reason") ?: NULL; + + $lid = $id; + + if ($link) { + $link->setDomain($new_domain ?? $this->postParam("link")); + $link->setReason($new_reason); + $link->setRegexp_rule($this->postParam("regexp")); + $link->save(); + } else { + if (!$new_domain) + $this->flashFail("err", tr("error"), tr("admin_banned_link_not_specified")); + + $link = new BannedLink; + $link->setDomain($new_domain); + $link->setReason($new_reason); + $link->setRegexp_rule($this->postParam("regexp")); + $link->setInitiator($this->user->identity->getId()); + $link->save(); + + $lid = $link->getId(); + } + + $this->redirect("/admin/bannedLink/id" . $lid); + } + + function renderUnbanLink(int $id): void + { + $link = (new BannedLinks)->get($id); + + if (!$link) + $this->flashFail("err", tr("error"), tr("admin_banned_link_not_found")); + + $link->delete(false); + + $this->redirect("/admin/bannedLinks"); + } } diff --git a/Web/Presenters/AwayPresenter.php b/Web/Presenters/AwayPresenter.php index a65ba7af..18c7cca7 100644 --- a/Web/Presenters/AwayPresenter.php +++ b/Web/Presenters/AwayPresenter.php @@ -1,13 +1,29 @@ check($this->queryParam("to") . "/"); + if (OPENVK_ROOT_CONF["openvk"]["preferences"]["susLinks"]["warnings"]) + if (sizeof($checkBanEntries) > 0) + $this->pass("openvk!Away->view", $checkBanEntries[0]); + header("HTTP/1.0 302 Found"); header("X-Robots-Tag: noindex, nofollow, noarchive"); header("Location: " . $this->queryParam("to")); exit; } + + function renderView(int $lid) { + $this->template->link = (new BannedLinks)->get($lid); + + if (!$this->template->link) + $this->notFound(); + + $this->template->to = $this->queryParam("to"); + } } diff --git a/Web/Presenters/BannedLinkPresenter.php b/Web/Presenters/BannedLinkPresenter.php new file mode 100644 index 00000000..6a11b3fc --- /dev/null +++ b/Web/Presenters/BannedLinkPresenter.php @@ -0,0 +1,13 @@ +template->link = (new BannedLinks)->get($lid); + $this->template->to = $this->queryParam("to"); + } +} diff --git a/Web/Presenters/templates/Admin/@layout.xml b/Web/Presenters/templates/Admin/@layout.xml index 8f1b29e3..8367e709 100644 --- a/Web/Presenters/templates/Admin/@layout.xml +++ b/Web/Presenters/templates/Admin/@layout.xml @@ -56,6 +56,9 @@
  • {_groups}
  • +
  • + {_admin_banned_links} +
  • {_admin_services} diff --git a/Web/Presenters/templates/Admin/BannedLink.xml b/Web/Presenters/templates/Admin/BannedLink.xml new file mode 100644 index 00000000..6068329e --- /dev/null +++ b/Web/Presenters/templates/Admin/BannedLink.xml @@ -0,0 +1,48 @@ +{extends "@layout.xml"} + +{block title} + {_edit} +{/block} + +{block heading} + {_edit} #{$form->id ?? "undefined"} +{/block} + +{block content} +
    + +
    + +
    + + +
    +
    + + +
    {_admin_banned_link_description}
    +
    +
    + + +
    {_admin_banned_link_regexp_description}
    +
    +
    + + +
    +
    +
    + + + {_delete} +
    +
    + +
    +
    +{/block} diff --git a/Web/Presenters/templates/Admin/BannedLinks.xml b/Web/Presenters/templates/Admin/BannedLinks.xml new file mode 100644 index 00000000..84925c23 --- /dev/null +++ b/Web/Presenters/templates/Admin/BannedLinks.xml @@ -0,0 +1,46 @@ +{extends "@layout.xml"} + +{block title} + {_admin_banned_links} +{/block} + +{block heading} + + {_create} + + + {_admin_banned_links} +{/block} + +{block content} +
    Vladimir Barinov (veselcraft), Celestora, Konstantin Kichulkin (kosfurler), - Nikita Volkov (sup_ban), Daniel Myslivets, Alexander Kotov (l-lacker), - Alexey Assemblerov (BiosNod), Ilya Prokopenko (dsrev) and Maxim Leshchenko (maksales / maksalees) + Nikita Volkov (sup_ban), Daniel Myslivets, Maxim Leshchenko (maksales / maksalees) + and n1rwana
    + + + + + + + + + + + + + + + + + + + + +
    ID{_admin_banned_domain}REGEXP{_admin_banned_link_reason}{_admin_banned_link_initiator}{_admin_actions}
    {$link->getId()}{$link->getDomain()}{$link->getRegexpRule()}{$link->getReason() ?? "-"}{$link->getInitiator()->getCanonicalName()} + + {_edit} + +
    +
    + « + » +
    +{/block} \ No newline at end of file diff --git a/Web/Presenters/templates/Away/View.xml b/Web/Presenters/templates/Away/View.xml new file mode 100644 index 00000000..f6d05a2c --- /dev/null +++ b/Web/Presenters/templates/Away/View.xml @@ -0,0 +1,22 @@ +{extends "../@layout.xml"} + +{block title}Переход по ссылке заблокирован{/block} + +{block header} +Предупреждение +{/block} + +{block content} +
    + + +
    +

    {_url_is_banned_title}

    + + {$link->getComment()|noescape} + +

    + {_url_is_banned_proceed} +
    +
    +{/block} diff --git a/Web/di.yml b/Web/di.yml index daa2e753..f18654b4 100644 --- a/Web/di.yml +++ b/Web/di.yml @@ -23,6 +23,7 @@ services: - openvk\Web\Presenters\AppsPresenter - openvk\Web\Presenters\ThemepacksPresenter - openvk\Web\Presenters\VKAPIPresenter + - openvk\Web\Presenters\BannedLinkPresenter - openvk\Web\Models\Repositories\Users - openvk\Web\Models\Repositories\Posts - openvk\Web\Models\Repositories\Photos @@ -42,3 +43,4 @@ services: - openvk\Web\Models\Repositories\Topics - openvk\Web\Models\Repositories\Applications - openvk\Web\Models\Repositories\ContentSearchRepository + - openvk\Web\Models\Repositories\BannedLinks diff --git a/Web/routes.yml b/Web/routes.yml index 0e5398f8..0ee44444 100644 --- a/Web/routes.yml +++ b/Web/routes.yml @@ -257,6 +257,8 @@ routes: handler: "About->invite" - url: "/away.php" handler: "Away->away" + - url: "/away.php/{num}" + handler: "Away->view" - url: "/gift{num}_{num}.png" handler: "Gifts->giftImage" - url: "/gifts{num}" @@ -303,6 +305,12 @@ routes: handler: "Support->quickBanInSupport" - url: "/admin/support/unban/{num}" handler: "Support->quickUnbanInSupport" + - url: "/admin/bannedLinks" + handler: "Admin->bannedLinks" + - url: "/admin/bannedLink/id{num}" + handler: "Admin->bannedLink" + - url: "/admin/bannedLink/id{num}/unban" + handler: "Admin->unbanLink" - url: "/upload/photo/{text}" handler: "VKAPI->photoUpload" - url: "/method/{text}.{text}" diff --git a/install/sqls/00031-banned-urls.sql b/install/sqls/00031-banned-urls.sql new file mode 100644 index 00000000..c208eb37 --- /dev/null +++ b/install/sqls/00031-banned-urls.sql @@ -0,0 +1,14 @@ +CREATE TABLE `links_banned` ( + `id` bigint UNSIGNED NOT NULL, + `domain` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `regexp_rule` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `reason` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `initiator` bigint UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +ALTER TABLE `links_banned` + ADD PRIMARY KEY (`id`); + +ALTER TABLE `links_banned` + MODIFY `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT; +COMMIT; \ No newline at end of file diff --git a/locales/en.strings b/locales/en.strings index ba11c73e..2e3461b7 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -1074,6 +1074,17 @@ "admin_commerce_disabled" = "Commerce has been disabled by the system administrator"; "admin_commerce_disabled_desc" = "The voucher and gift settings will be saved, but will have no effect."; +"admin_banned_links" = "Blocked links"; +"admin_banned_link" = "Link"; +"admin_banned_domain" = "Domain"; +"admin_banned_link_description" = "With the protocol (https://example.com/)"; +"admin_banned_link_regexp" = "Regular expression"; +"admin_banned_link_regexp_description" = "It is substituted after the domain specified above. Don't fill it out if you want to block the entire domain"; +"admin_banned_link_reason" = "Reason"; +"admin_banned_link_initiator" = "Initiator"; +"admin_banned_link_not_specified" = "The link is not specified"; +"admin_banned_link_not_found" = "Link not found"; + /* Paginator (deprecated) */ "paginator_back" = "Back"; @@ -1127,3 +1138,12 @@ "cookies_popup_content" = "All kids love cookie, so this website uses Cookies to identify your session and nothing more. Check our privacy policy for more information."; "cookies_popup_agree" = "Accept"; + +/* Away */ + +"url_is_banned" = "Link is not allowed"; +"url_is_banned_comment" = "The $1 administration recommends not to follow this link."; +"url_is_banned_comment_r" = "The $1 administration recommends not to follow this link.

    The reason is: $2"; +"url_is_banned_default_reason" = "The link you are trying to open may lead you to a site that was created for the purpose of deceiving users with the intention of gaining profit."; +"url_is_banned_title" = "Link to a suspicious site"; +"url_is_banned_proceed" = "Follow the link"; diff --git a/locales/ru.strings b/locales/ru.strings index 4e55715e..abdee6ff 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -1123,6 +1123,17 @@ "admin_commerce_disabled" = "Коммерция отключена системным администратором"; "admin_commerce_disabled_desc" = "Настройки ваучеров и подарков будут сохранены, но не будут оказывать никакого влияния."; +"admin_banned_links" = "Заблокированные ссылки"; +"admin_banned_link" = "Ссылка"; +"admin_banned_domain" = "Домен"; +"admin_banned_link_description" = "С протоколом (https://example.com/)"; +"admin_banned_link_regexp" = "Регулярное выражение"; +"admin_banned_link_regexp_description" = "Подставляется после домена, указанного выше. Не заполняйте, если хотите заблокировать весь домен"; +"admin_banned_link_reason" = "Причина"; +"admin_banned_link_initiator" = "Инициатор"; +"admin_banned_link_not_specified" = "Ссылка не указана"; +"admin_banned_link_not_found" = "Ссылка не найдена"; + /* Paginator (deprecated) */ "paginator_back" = "Назад"; @@ -1186,3 +1197,12 @@ "cookies_popup_content" = "Все дети любят печенье, поэтому этот веб-сайт использует Cookies для того, чтобы идентифицировать вашу сессию и ничего более. Ознакомьтесь с нашей политикой конфиденциальности для получения дополнительной информации."; "cookies_popup_agree" = "Согласен"; + +/* Away */ + +"url_is_banned" = "Переход невозможен"; +"url_is_banned_comment" = "Администрация $1 не рекомендует переходить по этой ссылке."; +"url_is_banned_comment_r" = "Администрация $1 не рекомендует переходить по этой ссылке.

    Причина: $2"; +"url_is_banned_default_reason" = "Ссылка, по которой вы попытались перейти, может вести на сайт, который был создан с целью обмана пользователей и получения за счёт этого прибыли."; +"url_is_banned_title" = "Ссылка на подозрительный сайт"; +"url_is_banned_proceed" = "Перейти по ссылке"; diff --git a/openvk-example.yml b/openvk-example.yml index 32f03edd..64b7b38c 100644 --- a/openvk-example.yml +++ b/openvk-example.yml @@ -55,6 +55,9 @@ openvk: processingLimit: 3000 emojiProcessingLimit: 1000 commerce: false + susLinks: + warnings: true + showReason: true ton: enabled: false address: "🅿" From 607312dc1c08b928b866eb127885a3cc1c0d1001 Mon Sep 17 00:00:00 2001 From: n1rwana <93197434+n1rwana@users.noreply.github.com> Date: Mon, 5 Sep 2022 21:59:36 +0300 Subject: [PATCH 16/16] Soviet localization updated (#713) --- locales/su.strings | 89 +++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/locales/su.strings b/locales/su.strings index d8edf5a9..e95476e7 100644 --- a/locales/su.strings +++ b/locales/su.strings @@ -11,17 +11,17 @@ /* Login */ "log_in" = "Вход"; -"password" = "Пароль"; +"password" = "Проходное слово"; "registration" = "Регистрация"; -"forgot_password" = "Забыли пароль?"; +"forgot_password" = "Забыли проходное слово?"; "login_failed" = "Не удалось войти"; "invalid_username_or_password" = "Неверное имя пользователя или пароль. Забыли пароль?"; "failed_to_register" = "Не удалось зарегистрироваться"; "referral_link_invalid" = "Пригласительная ссылка недействительна."; -"registration_disabled" = "Регистрация отключена системным администратором."; -"user_already_exists" = "Пользователь с таким email уже существует."; +"registration_disabled" = "Товарищ, регистрация отключена Имперской Канцелярией."; +"user_already_exists" = "Гражданин с таким почтовым ящиком уже существует."; "access_recovery" = "Восстановление доступа"; "page_access_recovery" = "Восстановить доступ к странице"; @@ -30,25 +30,25 @@ "reset_password" = "Сбросить пароль"; "2fa_code_2" = "Код двухфакторной аутентификации"; -"password_successfully_reset" = "Ваш пароль был успешно сброшен."; -"password_reset_email_sent" = "Если вы зарегистрированы, вы получите инструкции на email."; -"password_reset_error" = "Непредвиденная ошибка при сбросе пароля."; +"password_successfully_reset" = "Ваше проходное слово было успешно сброшено."; +"password_reset_email_sent" = "Если вы зарегистрированы, вы получите инструкции на почтовый ящик."; +"password_reset_error" = "Непредвиденная ошибка при сбросе проходного слова."; "password_reset_rate_limit_error" = "Нельзя делать это так часто, извините."; -"registration_disabled_info" = "Регистрация отключена системным администратором. При возможности попросите приглашение у вашего знакомого, если он зарегистрирован на этом сайте."; +"registration_disabled_info" = "Товарищ, регистрация отключена Имперской Канцелярией. При возможности попросите приглашение у вашего знакомого, если он зарегистрирован на этом сайте."; "registration_closed" = "Регистрация закрыта."; "invites_you_to" = "$1 приглашает вас в $2"; "register_meta_desc" = "Зарегистрируйтесь в $1 прямо сейчас!"; "register_referer_meta_title" = "$1 приглашает вас в $2!"; -"register_referer_meta_desc" = "Присоединяйтесь к $1 и множеству других пользователей в $2!"; +"register_referer_meta_desc" = "Присоединяйтесь к $1 и множеству других граждан в $2!"; -"users" = "Пользователи"; +"users" = "Граждане"; /* Profile information */ -"select_language" = "Выбрать язык"; -"edit" = "Изменить"; +"select_language" = "Выбрать менталитет"; +"edit" = "Корректировать"; "birth_date" = "День рождения"; "registration_date" = "Дата регистрации"; "hometown" = "Родной город"; @@ -90,7 +90,7 @@ "relationship_2" = "Встречаюсь"; "relationship_3" = "Помолвлен"; "relationship_4" = "Женат"; -"relationship_5" = "В гражданском браке"; +"relationship_5" = "Сожительствую"; "relationship_6" = "Влюблен"; "relationship_7" = "Всё сложно"; "relationship_8" = "В активном поиске"; @@ -98,29 +98,29 @@ "politViews" = "Полит. взгляды"; "politViews_0" = "Не выбраны"; -"politViews_1" = "Индифферентные"; +"politViews_1" = "Не в партии"; "politViews_2" = "Коммунистические"; "politViews_3" = "Социалистические"; -"politViews_4" = "Умеренные"; -"politViews_5" = "Либеральные"; +"politViews_4" = "Центристские"; +"politViews_5" = "Антисоветские"; "politViews_6" = "Консервативные"; -"politViews_7" = "Монархические"; +"politViews_7" = "Контрреволюционные"; "politViews_8" = "Ультраконсервативные"; "politViews_9" = "Либертарианские"; "contact_information" = "Контактная информация"; "email" = "Почтовый ящик"; -"phone" = "Телефон"; +"phone" = "Стационарный телефон"; "telegram" = "Telegram"; "personal_website" = "Личная визитка"; "city" = "Город"; "address" = "Адрес"; -"personal_information" = "Личная информация"; +"personal_information" = "Личность"; "interests" = "Интересы"; -"favorite_music" = "Любимые аудиозаписи"; +"favorite_music" = "Любимые звукозаписи"; "favorite_films" = "Любимые киноленты"; "favorite_shows" = "Любимые программы"; "favorite_books" = "Любимые книги"; @@ -189,8 +189,8 @@ "friends" = "Товарищи"; "followers" = "Подписчики"; "follower" = "Подписчик"; -"friends_add" = "Добавить в товарищи"; -"friends_delete" = "Удалить из товарищей"; +"friends_add" = "Взять в товарищи"; +"friends_delete" = "Отвергнуть товарища"; "friends_reject" = "Порвать приглашение в товарищи"; "friends_accept" = "Прочитать приглашение в товарищи"; "send_message" = "Отправить телеграмму"; @@ -222,13 +222,13 @@ "subscribe" = "Подписаться"; "unsubscribe" = "Отписаться"; "subscriptions" = "Подписки"; -"join_community" = "Вступить в группу"; -"leave_community" = "Выйти из группы"; +"join_community" = "Вступить в клуб"; +"leave_community" = "Выйти из клуба"; "min_6_community" = "Название должно быть не менее 6 символов"; "participants" = "Участники"; -"groups" = "Группы"; +"groups" = "Клубы"; "meetings" = "Встречи"; -"create_group" = "Создать группу"; +"create_group" = "Создать клуб"; "group_managers" = "Руководство"; "group_type" = "Тип группы"; "group_type_open" = "Это открытая группа. В неё может вступить любой желающий."; @@ -263,7 +263,7 @@ "group_dont_display_administrators_list" = "Ничего не отображать"; "group_changeowner_modal_title" = "Передача прав владельца"; -"group_changeowner_modal_text" = "Внимание! Вы передаёте права владельца пользователю $1. Это действие необратимо. После передави вы останетесь адмиинстратором, но сможете легко перестать им быть."; +"group_changeowner_modal_text" = "Внимание! Вы передаёте права владельца пользователю $1. Это действие необратимо. После передачи вы останетесь адмиинстратором, но сможете легко перестать им быть."; "group_owner_setted" = "Новый владелец ($1) успешно назначен в сообщество $2. Вам выданы права администратора в сообществе. Если Вы хотите вернуть роль владельца, обратитесь в техническую поддержку сайта."; "participants_zero" = "Ни одного участника"; @@ -340,8 +340,8 @@ "menu_registration" = "Регистрация"; "menu_help" = "Справка"; -"menu_logout" = "Выйти"; -"menu_support" = "Поддержка"; +"menu_logout" = "Эмигрировать"; +"menu_support" = "Справочная"; "header_home" = "главная"; "header_groups" = "клубы"; @@ -646,12 +646,12 @@ "support_new_title" = "Введите тему вашего обращения"; "support_new_content" = "Опишите проблему или предложение"; -"support_rate_good_answer" = "Это хороший ответ"; -"support_rate_bad_answer" = "Это плохой ответ"; -"support_good_answer_user" = "Вы оставили положительный отзыв."; -"support_bad_answer_user" = "Вы оставили негативный отзыв."; -"support_good_answer_agent" = "Гражданин оставил положительный отзыв"; -"support_bad_answer_agent" = "Гражданин оставил негативный отзыв"; +"support_rate_good_answer" = "Подарить конфеты"; +"support_rate_bad_answer" = "Закатить скандал"; +"support_good_answer_user" = "Вы подарили конфеты сотруднику справочной."; +"support_bad_answer_user" = "Вы закатили скандал сотруднику справочной."; +"support_good_answer_agent" = "Гражданин подарил конфеты сотруднику справочной"; +"support_bad_answer_agent" = "Гражданин закатил скандал сотруднику справочной"; "support_rated_good" = "Вы оставили положительный отзыв об ответе."; "support_rated_bad" = "Вы оставили негативный отзыв об ответе."; "wrong_parameters" = "Неверные параметры запроса."; @@ -683,7 +683,7 @@ "banned_alt" = "Гражданин был отправлен в тюрьму."; "banned_1" = "Извините, $1, но вы были отправлены в тюрьму."; "banned_2" = "А причина этому проста: $1. Органу в этот раз пришлось отправить вас под стражу навсегда."; -"banned_3" = "Вы всё ещё можете написать в службу поддержки, если считаете что произошла ошибка или выйти."; +"banned_3" = "Вы всё ещё можете написать в Справочную, если считаете что произошла ошибка или эмигрировать."; /* Discussions */ @@ -822,15 +822,15 @@ "about_users_many" = "$1 гражданинов"; "about_users_other" = "$1 гражданинов"; -"about_online_users_one" = "1 пользователь в сети"; -"about_online_users_few" = "$1 пользователя в сети"; -"about_online_users_many" = "$1 гражданинов в сети"; -"about_online_users_other" = "$1 гражданинов в сети"; +"about_online_users_one" = "1 гражданин в сети"; +"about_online_users_few" = "$1 гражданина в сети"; +"about_online_users_many" = "$1 граждан в сети"; +"about_online_users_other" = "$1 граждан в сети"; -"about_active_users_one" = "1 активный пользователь"; -"about_active_users_few" = "$1 активных пользователя"; -"about_active_users_many" = "$1 активных гражданинов"; -"about_active_users_other" = "$1 активных гражданинов"; +"about_active_users_one" = "1 активный гражданин"; +"about_active_users_few" = "$1 активных граждан"; +"about_active_users_many" = "$1 активных граждан"; +"about_active_users_other" = "$1 активных граждан"; "about_groups_one" = "1 клуб"; "about_groups_few" = "$1 клубы"; @@ -860,7 +860,6 @@ "user_alert_scam" = "Органу управления было дозволено, что данный гражданин обманывает товарищей на денежные средства. Будьте осторожны при разговоре с ним."; - "ec_header" = "Подтверждение регистрации прописки"; "ec_title" = "Спасибо!"; "ec_1" = "$1, на ваш почтовый ящик должно придти письмо с подтверждением регистрации.";