From 1ef08ae1b76af48658014c83245dd72eae73e1c6 Mon Sep 17 00:00:00 2001 From: n1rwana Date: Tue, 8 Aug 2023 23:52:52 +0300 Subject: [PATCH 1/2] Fixes --- DBEntity.updated.php | 5 +++++ Web/Models/Repositories/Logs.php | 6 +++--- Web/Presenters/AuthPresenter.php | 2 +- 3 files changed, 9 insertions(+), 4 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 4bca557a..f569dd63 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(); } From 34d2e32f3c4837c7edd71afb1f0f2233539b8d93 Mon Sep 17 00:00:00 2001 From: n1rwana Date: Wed, 9 Aug 2023 23:17:14 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A1=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C=20=D1=81=20=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=BC=D0=B8=20=D0=BB=D0=BE=D0=B3=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Web/Models/Entities/Log.php | 190 ------------------------ Web/Models/Repositories/Logs.php | 96 ------------ Web/Presenters/AdminPresenter.php | 19 +-- Web/Presenters/templates/Admin/Logs.xml | 11 +- Web/di.yml | 1 - install/sqls/00038-logs.sql | 21 --- 6 files changed, 10 insertions(+), 328 deletions(-) delete mode 100644 Web/Models/Entities/Log.php delete mode 100644 Web/Models/Repositories/Logs.php delete mode 100644 install/sqls/00038-logs.sql diff --git a/Web/Models/Entities/Log.php b/Web/Models/Entities/Log.php deleted file mode 100644 index eabfd36f..00000000 --- a/Web/Models/Entities/Log.php +++ /dev/null @@ -1,190 +0,0 @@ -getRecord()->id; - } - - function getUser(): ?User - { - return (new Users)->get((int) $this->getRecord()->user); - } - - function getObjectTable(): string - { - return $this->getRecord()->object_table; - } - - function getObjectId(): int - { - return $this->getRecord()->object_id; - } - - function getObject() - { - $model = $this->getRecord()->object_model; - return new $model(DatabaseConnection::i()->getContext()->table($this->getObjectTable())->get($this->getObjectId())); - } - - function getTypeRaw(): int - { - return $this->getRecord()->type; - } - - function getType(): string - { - return ["добавил", "отредактировал", "удалил", "восстановил"][$this->getTypeRaw()]; - } - - function getTypeNom(): string - { - return ["Создание", "Редактирование", "Удаление", "Восстановление"][$this->getTypeRaw()]; - } - - function getObjectType(): string - { - return [ - "albums" => "Альбом", - "groups" => "Сообщество", - "profiles" => "Профиль", - "comments" => "Комментарий", - "ip" => "IP-адрес", - "posts" => "Запись", - "tickets" => "Вопрос", - "tickets_comments" => "Комментарий к тикету", - ][$this->getRecord()->object_table] ?? $this->getRecord()->object_model; - } - - function getObjectName(): string - { - $object = $this->getObject(); - if (method_exists($object, 'getCanonicalName')) - return $object->getCanonicalName(); - else return "[#" . $this->getObjectId() . "] " . $this->getObjectType(); - } - - function getLogsText(): string - { - return $this->getRecord()->logs_text; - } - - function getObjectURL(): string - { - $object = $this->getObject(); - if (method_exists($object, "getURL") && $this->getObjectTable() !== "videos") - return $this->getObject()->getURL(); - else - return "#"; - } - - function getObjectAvatar(): ?string - { - $object = $this->getObject(); - if (method_exists($object, 'getAvatarURL')) - return $object->getAvatarURL("normal"); - else return NULL; - } - - function getOldValue(): ?array - { - return (array) json_decode($this->getRecord()->xdiff_old, true, JSON_UNESCAPED_UNICODE) ?? null; - } - - function getNewValue(): ?array - { - return (array) json_decode($this->getRecord()->xdiff_new, true, JSON_UNESCAPED_UNICODE) ?? null; - } - - function getTime(): DateTime - { - return new DateTime($this->getRecord()->ts); - } - - function diff($old, $new): array - { - $matrix = array(); - $maxlen = 0; - foreach ($old as $oindex => $ovalue) { - $nkeys = array_keys($new, $ovalue); - foreach ($nkeys as $nindex) { - $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ? - $matrix[$oindex - 1][$nindex - 1] + 1 : 1; - if ($matrix[$oindex][$nindex] > $maxlen) { - $maxlen = $matrix[$oindex][$nindex]; - $omax = $oindex + 1 - $maxlen; - $nmax = $nindex + 1 - $maxlen; - } - } - } - if ($maxlen == 0) return array(array('d' => $old, 'i' => $new)); - return array_merge( - $this->diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)), - array_slice($new, $nmax, $maxlen), - $this->diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen))); - } - - function htmlDiff($old, $new): string - { - $ret = ''; - $diff = $this->diff(preg_split("/[\s]+/", $old), preg_split("/[\s]+/", $new)); - foreach ($diff as $k) { - if (is_array($k)) - $ret .= (!empty($k['d']) ? "" . implode(' ', $k['d']) . " " : '') . - (!empty($k['i']) ? "" . implode(' ', $k['i']) . " " : ''); - else $ret .= $k . ' '; - } - return $ret; - } - - function getChanges(): array - { - $result = $this->getOldValue(); - $_changes = []; - - if ($this->getTypeRaw() === 1) { // edit - $changes = $this->getNewValue(); - - foreach ($changes as $field => $value) { - $new_value = xdiff_string_patch((string) $result[$field], (string) $value); - $_changes[$field] = [ - "field" => $field, - "old_value" => $result[$field], - "new_value" => strlen($new_value) > 0 ? $new_value : "(empty)", - "ts" => $this->getTime(), - "diff" => $this->htmlDiff((string) $result[$field], (string) $new_value) - ]; - } - } else if ($this->getTypeRaw() === 0) { // create - foreach ($result as $field => $value) { - $_changes[$field] = [ - "field" => $field, - "old_value" => $value, - "ts" => $this->getTime() - ]; - } - } else if ($this->getTypeRaw() === 2) { // delete - $_changes[] = [ - "field" => "deleted", - "old_value" => 0, - "new_value" => 1, - "ts" => $this->getTime(), - "diff" => $this->htmlDiff("0", "1") - ]; - } - - return $_changes; - } -} diff --git a/Web/Models/Repositories/Logs.php b/Web/Models/Repositories/Logs.php deleted file mode 100644 index 13d2f592..00000000 --- a/Web/Models/Repositories/Logs.php +++ /dev/null @@ -1,96 +0,0 @@ -context = DatabaseConnection::i()->getContext(); - $this->logs = $this->context->table("logs"); - } - - private function toLog(?ActiveRow $ar): ?Log - { - return is_null($ar) ? NULL : new Log($ar); - } - - function get(int $id): ?Log - { - return $this->toLog($this->logs->get($id)); - } - - 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()); - $nobject = []; - $_changes = []; - - if ($type === 1) { - foreach ($changes as $field => $value) { - $nobject[$field] = $fobject[$field]; - } - - foreach (array_diff_assoc($nobject, $changes) as $field => $value) { - if (str_starts_with($field, "rate_limit")) continue; - if ($field === "online") continue; - $_changes[$field] = xdiff_string_diff((string)$nobject[$field], (string)$changes[$field]); - } - - if (count($_changes) === 0) return; - } else if ($type === 0) { // if new - $nobject = $fobject; - foreach ($fobject as $field => $value) { - $_changes[$field] = xdiff_string_diff("", (string)$value); - } - } else if ($type === 2 || $type === 3) { // if deleting or restoring - $_changes["deleted"] = (int)($type === 2); - } - - $log = new Log; - $log->setUser($user); - $log->setType($type); - $log->setObject_Table($table); - $log->setObject_Model($model); - $log->setObject_Id(is_array($object) ? $object["id"] : $object->getId()); - $log->setXdiff_Old(json_encode($nobject)); - $log->setXdiff_New(json_encode($_changes)); - $log->setTs(time()); - $log->setIp($ip ?? CurrentUser::i()->getIP()); - $log->setUserAgent($useragent ?? CurrentUser::i()->getUserAgent()); - $log->save(); - } - } - - function find(string $query, array $pars = [], string $sort = "id DESC", int $page = 1, ?int $perPage = NULL): \Traversable - { - $query = "%$query%"; - $result = $this->logs->where("id LIKE ? OR object_table LIKE ?", $query, $query); - - return new Util\EntityStream("Log", $result->order($sort)); - } - - function search($filter): \Traversable - { - foreach ($this->logs->where($filter)->order("id DESC") as $log) - yield new Log($log); - } - - function getTypes(): array - { - $types = []; - foreach ($this->context->query("SELECT DISTINCT(`object_model`) AS `object_model` FROM `logs`")->fetchAll() as $type) - $types[] = str_replace("openvk\\Web\\Models\\Entities\\", "", $type->object_model); - - return $types; - } -} diff --git a/Web/Presenters/AdminPresenter.php b/Web/Presenters/AdminPresenter.php index a8432bcd..5c5b647f 100644 --- a/Web/Presenters/AdminPresenter.php +++ b/Web/Presenters/AdminPresenter.php @@ -1,7 +1,9 @@ users = $users; $this->clubs = $clubs; @@ -22,7 +24,7 @@ final class AdminPresenter extends OpenVKPresenter $this->gifts = $gifts; $this->bannedLinks = $bannedLinks; $this->chandlerGroups = $chandlerGroups; - $this->logs = $logs; + $this->logs = DatabaseConnection::i()->getContext()->table("ChandlerLogs"); parent::__construct(); } @@ -568,7 +570,7 @@ final class AdminPresenter extends OpenVKPresenter $this->template->type = $type; } if ($this->queryParam("uid")) { - $user = (int) $this->queryParam("uid"); + $user = $this->queryParam("uid"); $filter["user"] = $user; $this->template->user = $user; } @@ -578,17 +580,12 @@ final class AdminPresenter extends OpenVKPresenter $this->template->obj_id = $obj_id; } if ($this->queryParam("obj_type") !== NULL && $this->queryParam("obj_type") !== "any") { - $obj_type = "openvk\\Web\\Models\\Entities\\" . $this->queryParam("obj_type"); + $obj_type = CHANDLER_ROOT_CONF["preferences"]["logs"]["entitiesNamespace"] . $this->queryParam("obj_type"); $filter["object_model"] = $obj_type; $this->template->obj_type = $obj_type; } - if (count($filter) === 0) { - $this->template->logs = $this->searchResults($this->logs, $this->template->count); - } else { - $this->template->logs = $this->logs->search($filter); - } - + $this->template->logs = (new Logs)->search($filter); $this->template->object_types = (new Logs)->getTypes(); } } diff --git a/Web/Presenters/templates/Admin/Logs.xml b/Web/Presenters/templates/Admin/Logs.xml index e30df251..982b790c 100644 --- a/Web/Presenters/templates/Admin/Logs.xml +++ b/Web/Presenters/templates/Admin/Logs.xml @@ -9,7 +9,6 @@ {/block} {block content} - {var $logs = iterator_to_array($logs)} {var $amount = sizeof($logs)}