From c93fb477d5774e830de30d99db105c5d9faca6e1 Mon Sep 17 00:00:00 2001 From: n1rwana Date: Tue, 8 Aug 2023 23:49:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=20etc.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DBEntity.updated.php | 5 + Web/Models/Repositories/Logs.php | 6 +- Web/Presenters/AuthPresenter.php | 2 +- Web/Presenters/NoSpamPresenter.php | 70 +++++++-- Web/Presenters/templates/NoSpam/Index.xml | 133 ++++++++++++------ Web/Presenters/templates/NoSpam/Tabs.xml | 2 +- Web/Presenters/templates/NoSpam/Templates.xml | 4 +- Web/static/css/main.css | 1 + 8 files changed, 163 insertions(+), 60 deletions(-) diff --git a/DBEntity.updated.php b/DBEntity.updated.php index 5414a2e9..4c039b54 100644 --- a/DBEntity.updated.php +++ b/DBEntity.updated.php @@ -131,5 +131,10 @@ abstract class DBEntity $this->changes = []; } + function getTableName(): string + { + return $this->getTable()->getName(); + } + use \Nette\SmartObject; } diff --git a/Web/Models/Repositories/Logs.php b/Web/Models/Repositories/Logs.php index 6f7d3937..13d2f592 100644 --- a/Web/Models/Repositories/Logs.php +++ b/Web/Models/Repositories/Logs.php @@ -28,7 +28,7 @@ class Logs return $this->toLog($this->logs->get($id)); } - function create(int $user, string $table, string $model, int $type, $object, $changes): void + function create(int $user, string $table, string $model, int $type, $object, $changes, ?string $ip = NULL, ?string $useragent = NULL): void { if (OPENVK_ROOT_CONF["openvk"]["preferences"]["logs"] === true) { $fobject = (is_array($object) ? $object : $object->unwrap()); @@ -65,8 +65,8 @@ class Logs $log->setXdiff_Old(json_encode($nobject)); $log->setXdiff_New(json_encode($_changes)); $log->setTs(time()); - $log->setIp(CurrentUser::i()->getIP()); - $log->setUserAgent(CurrentUser::i()->getUserAgent()); + $log->setIp($ip ?? CurrentUser::i()->getIP()); + $log->setUserAgent($useragent ?? CurrentUser::i()->getUserAgent()); $log->save(); } } diff --git a/Web/Presenters/AuthPresenter.php b/Web/Presenters/AuthPresenter.php index 52113bcf..23b55dc9 100644 --- a/Web/Presenters/AuthPresenter.php +++ b/Web/Presenters/AuthPresenter.php @@ -130,7 +130,7 @@ final class AuthPresenter extends OpenVKPresenter } $this->authenticator->authenticate($chUser->getId()); - (new Logs)->create($user->getId(), "profiles", "openvk\\Web\\Models\\Entities\\User", 0, $user, $user); + (new Logs)->create($user->getId(), "profiles", "openvk\\Web\\Models\\Entities\\User", 0, $user, $user, $_SERVER["REMOTE_ADDR"], $_SERVER["HTTP_USER_AGENT"]); $this->redirect("/id" . $user->getId()); $user->save(); } diff --git a/Web/Presenters/NoSpamPresenter.php b/Web/Presenters/NoSpamPresenter.php index 2f3f3602..4912a24e 100644 --- a/Web/Presenters/NoSpamPresenter.php +++ b/Web/Presenters/NoSpamPresenter.php @@ -1,12 +1,16 @@ template->_template = "NoSpam/Templates.xml"; $filter = []; if ($this->queryParam("id")) { - $filter["id"] = (int) $this->queryParam("id"); + $filter["id"] = (int)$this->queryParam("id"); } $this->template->templates = iterator_to_array((new NoSpamLogs)->getList($filter)); } else { - $template = (new NoSpamLogs)->get((int) $this->postParam("id")); + $template = (new NoSpamLogs)->get((int)$this->postParam("id")); if (!$template || $template->isRollbacked()) $this->returnJson(["success" => false, "error" => "Шаблон не найден"]); @@ -81,7 +85,7 @@ final class NoSpamPresenter extends OpenVKPresenter try { $item = new $model; $table_name = $item->getTableName(); - $item = $db->table($table_name)->get((int) $_item); + $item = $db->table($table_name)->get((int)$_item); if (!$item) continue; $item = new $model($item); @@ -135,15 +139,53 @@ final class NoSpamPresenter extends OpenVKPresenter $this->assertNoCSRF(); $this->willExecuteWriteAction(); + function searchByAdditionalParams(?string $table = NULL, ?string $where = NULL, ?string $ip = NULL, ?string $useragent = NULL, ?int $ts = NULL, ?int $te = NULL, ?int $user = NULL) + { + $db = DatabaseConnection::i()->getContext(); + if ($table && ($ip || $useragent || $ts || $te || $user)) { + $conditions = []; + + if ($ip) $conditions[] = "`ip` REGEXP '$ip'"; + if ($useragent) $conditions[] = "`useragent` REGEXP '$useragent'"; + if ($ts) $conditions[] = "`ts` < $ts"; + if ($te) $conditions[] = "`ts` > $te"; + if ($user) $conditions[] = "`user` = $user"; + $logs = $db->query("SELECT * FROM `logs` WHERE (`object_table` = '$table') AND (" . implode(" AND ", $conditions) . ") GROUP BY `object_id`"); + $response = []; + + if (!$where) { + foreach ($logs as $log) { + $log = (new Logs)->get($log->id); + $response[] = $log->getObject()->unwrap(); + } + } else { + foreach ($logs as $log) { + $log = (new Logs)->get($log->id); + $object = $log->getObject()->unwrap(); + + if (!$object) continue; + foreach ($db->query("SELECT * FROM `$table` WHERE $where")->fetchAll() as $o) { + if ($object->id === $o["id"]) { + $response[] = $object; + } + } + } + } + + return $response; + } + } + try { $where = $this->postParam("where"); $ip = $this->postParam("ip"); $useragent = $this->postParam("useragent"); $searchTerm = $this->postParam("q"); - $ts = $this->postParam("ts"); - $te = $this->postParam("te"); + $ts = (int)$this->postParam("ts"); + $te = (int)$this->postParam("te"); + $user = (int)$this->postParam("user"); - if (!$ip && !$useragent && !$searchTerm && !$ts && !$te && !$where && !$searchTerm) + if (!$ip && !$useragent && !$searchTerm && !$ts && !$te && !$where && !$searchTerm && !$user) $this->returnJson(["success" => false, "error" => "Нет запроса. Заполните поле \"подстрока\" или введите запрос \"WHERE\" в поле под ним."]); $model_name = NoSpamPresenter::ENTITIES_NAMESPACE . "\\" . $this->postParam("model"); @@ -160,8 +202,7 @@ final class NoSpamPresenter extends OpenVKPresenter $table = $model->getTableName(); $columns = $db->getStructure()->getColumns($table); - $rows = []; - if (!$where) { + if ($searchTerm) { $conditions = []; $need_deleted = false; foreach ($columns as $column) { @@ -171,13 +212,20 @@ final class NoSpamPresenter extends OpenVKPresenter $conditions[] = "`$column[name]` REGEXP '$searchTerm'"; } } + $conditions = implode(" OR ", $conditions); - $where = "(" . implode(" OR ", $conditions) . ")"; + $where = ($where ? " AND ($conditions)" : $conditions); if ($need_deleted) $where .= " AND `deleted` = 0"; } + $rows = []; + if ($ip || $useragent || $ts || $te || $user) { + $rows = searchByAdditionalParams($table, $where, $ip, $useragent, $ts, $te, $user); + } + $result = $db->query("SELECT * FROM `$table` WHERE $where"); - $rows = $result->fetchAll(); + if (count($rows) === 0) + $rows = $result->fetchAll(); if (!in_array((int)$this->postParam("ban"), [1, 2, 3])) { $response = []; @@ -215,7 +263,7 @@ final class NoSpamPresenter extends OpenVKPresenter } else { $log->setRequest($where); } - $log->setBan_Type((int) $this->postParam("ban")); + $log->setBan_Type((int)$this->postParam("ban")); $log->setCount(count($rows)); $log->setTime(time()); $log->setItems(implode(",", $ids)); diff --git a/Web/Presenters/templates/NoSpam/Index.xml b/Web/Presenters/templates/NoSpam/Index.xml index e58ce54b..16dcef3c 100644 --- a/Web/Presenters/templates/NoSpam/Index.xml +++ b/Web/Presenters/templates/NoSpam/Index.xml @@ -5,27 +5,26 @@ {block content} {include "Tabs.xml", mode => "form"} -
+
-
- - - - - - - -
- Раздел: - - -
-
+
+ + + + + + + +
+ Раздел: + + +
+
+