From 6f9cbdfa847f1debc0d58ce85b2bb97681daf879 Mon Sep 17 00:00:00 2001 From: n1rwana Date: Wed, 9 Aug 2023 12:35:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=B8=D0=BC?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Web/Presenters/NoSpamPresenter.php | 263 ++++++++++++---------- Web/Presenters/templates/NoSpam/Index.xml | 109 +++++++-- Web/static/img/supp_icons.png | Bin 0 -> 1111 bytes 3 files changed, 239 insertions(+), 133 deletions(-) create mode 100644 Web/static/img/supp_icons.png diff --git a/Web/Presenters/NoSpamPresenter.php b/Web/Presenters/NoSpamPresenter.php index fee69cb3..f2c6fad3 100644 --- a/Web/Presenters/NoSpamPresenter.php +++ b/Web/Presenters/NoSpamPresenter.php @@ -152,7 +152,13 @@ final class NoSpamPresenter extends OpenVKPresenter 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`"); + + $whereStart = "WHERE `object_table` = '$table'"; + if ($table === "profiles") { + $whereStart .= "AND `type` = 0"; + } + + $logs = $db->query("SELECT * FROM `logs` $whereStart AND (" . implode(" AND ", $conditions) . ") GROUP BY `object_id`"); $response = []; if (!$where) { @@ -166,6 +172,11 @@ final class NoSpamPresenter extends OpenVKPresenter $object = $log->getObject()->unwrap(); if (!$object) continue; + //exit(var_dump(substr_replace($where, "", 0, strlen(" AND")))); + if (str_starts_with($where, " AND")) { + $where = substr_replace($where, "", 0, strlen(" AND")); + } + foreach ($db->query("SELECT * FROM `$table` WHERE $where")->fetchAll() as $o) { if ($object->id === $o["id"]) { $response[] = $object; @@ -179,6 +190,9 @@ final class NoSpamPresenter extends OpenVKPresenter } try { + $response = []; + $processed = 0; + $where = $this->postParam("where"); $ip = $this->postParam("ip"); $useragent = $this->postParam("useragent"); @@ -190,135 +204,152 @@ final class NoSpamPresenter extends OpenVKPresenter if (!$ip && !$useragent && !$searchTerm && !$ts && !$te && !$where && !$searchTerm && !$user) $this->returnJson(["success" => false, "error" => "Нет запроса. Заполните поле \"подстрока\" или введите запрос \"WHERE\" в поле под ним."]); - $model_name = NoSpamPresenter::ENTITIES_NAMESPACE . "\\" . $this->postParam("model"); - if (!class_exists($model_name)) - $this->returnJson(["success" => false, "error" => "Модель не найдена"]); + $models = explode(",", $this->postParam("models")); - $model = new $model_name; - - $c = new \ReflectionClass($model_name); - if ($c->isAbstract() || $c->getName() == NoSpamPresenter::ENTITIES_NAMESPACE . "\\Correspondence") - $this->returnJson(["success" => false, "error" => "No."]); - - $db = DatabaseConnection::i()->getContext(); - $table = $model->getTableName(); - $columns = $db->getStructure()->getColumns($table); - - if ($searchTerm) { - $conditions = []; - $need_deleted = false; - foreach ($columns as $column) { - if ($column["name"] == "deleted") { - $need_deleted = true; - } else { - $conditions[] = "`$column[name]` REGEXP '$searchTerm'"; - } - } - $conditions = 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"); - if (count($rows) === 0) - $rows = $result->fetchAll(); - - if (!in_array((int)$this->postParam("ban"), [1, 2, 3])) { - $response = []; - foreach ($rows as $key => $object) { - $object = (array)$object; - $_obj = []; - foreach ($object as $key => $value) { - foreach ($columns as $column) { - if ($column["name"] === $key && in_array(strtoupper($column["nativetype"]), ["BLOB", "BINARY", "VARBINARY", "TINYBLOB", "MEDIUMBLOB", "LONGBLOB"])) { - $value = "[BINARY]"; - break; - } - } - - $_obj[$key] = $value; - } - $response[] = $_obj; + foreach ($models as $_model) { + $model_name = NoSpamPresenter::ENTITIES_NAMESPACE . "\\" . $_model; + if (!class_exists($model_name)) { + continue; } - $this->returnJson(["success" => true, "count" => count($response), "list" => $response]); - } else { - $ids = []; + $model = new $model_name; - foreach ($rows as $object) { - $object = new $model_name($db->table($table)->get($object->id)); - if (!$object) continue; - $ids[] = $object->getId(); + $c = new \ReflectionClass($model_name); + if ($c->isAbstract() || $c->getName() == NoSpamPresenter::ENTITIES_NAMESPACE . "\\Correspondence") { + continue; } - $log = new NoSpamLog; - $log->setUser($this->user->id); - $log->setModel($this->postParam("model")); + $db = DatabaseConnection::i()->getContext(); + $table = $model->getTableName(); + $columns = $db->getStructure()->getColumns($table); + if ($searchTerm) { - $log->setRegex($searchTerm); - } else { - $log->setRequest($where); - } - $log->setBan_Type((int)$this->postParam("ban")); - $log->setCount(count($rows)); - $log->setTime(time()); - $log->setItems(implode(",", $ids)); - $log->save(); - - $banned_ids = []; - foreach ($rows as $object) { - $object = new $model_name($db->table($table)->get($object->id)); - if (!$object) continue; - - $owner = NULL; - $methods = ["getOwner", "getUser", "getRecipient", "getInitiator"]; - - if (method_exists($object, "ban")) { - $owner = $object; - } else { - foreach ($methods as $method) { - if (method_exists($object, $method)) { - $owner = $object->$method(); - break; - } - } - } - - if ($owner instanceof User && $owner->getId() === $this->user->id) { - if (count($rows) === 1) { - $this->returnJson(["success" => false, "error" => "\"Производственная травма\" — Вы не можете блокировать или удалять свой же контент"]); + $conditions = []; + $need_deleted = false; + foreach ($columns as $column) { + if ($column["name"] == "deleted") { + $need_deleted = true; } else { - continue; + $conditions[] = "`$column[name]` REGEXP '$searchTerm'"; } } + $conditions = implode(" OR ", $conditions); - if (in_array((int)$this->postParam("ban"), [2, 3])) { - if ($owner) { - $_id = ($owner instanceof Club ? $owner->getId() * -1 : $owner->getId()); - if (!in_array($_id, $banned_ids)) { - if ($owner instanceof User) { - $owner->ban("**content-noSpamTemplate-" . $log->getId() . "**", false, time() + $owner->getNewBanTime(), $this->user->id); - } else { - $owner->ban("Подозрительная активность"); - } - - $banned_ids[] = $_id; - } - } - } - - if (in_array((int)$this->postParam("ban"), [1, 3])) - $object->delete(); + $where = ($this->postParam("where") ? " AND ($conditions)" : "($conditions)"); + if ($need_deleted) $where .= " AND (`deleted` = 0)"; } - $this->returnJson(["success" => true]); + $rows = []; + if ($ip || $useragent || $ts || $te || $user) { + $rows = searchByAdditionalParams($table, $where, $ip, $useragent, $ts, $te, $user); + } + + if (count($rows) === 0) { + if (!$searchTerm) { + if (str_starts_with($where, " AND")) { + if ($searchTerm && !$this->postParam("where")) { + $where = substr_replace($where, "", 0, strlen(" AND")); + } else { + $where = "(" . $this->postParam("where") . ")" . $where; + } + } + + $result = $db->query("SELECT * FROM `$table` WHERE $where"); + $rows = $result->fetchAll(); + } + } + + if (!in_array((int)$this->postParam("ban"), [1, 2, 3])) { + foreach ($rows as $key => $object) { + $object = (array)$object; + $_obj = []; + foreach ($object as $key => $value) { + foreach ($columns as $column) { + if ($column["name"] === $key && in_array(strtoupper($column["nativetype"]), ["BLOB", "BINARY", "VARBINARY", "TINYBLOB", "MEDIUMBLOB", "LONGBLOB"])) { + $value = "[BINARY]"; + break; + } + } + + $_obj[$key] = $value; + $_obj["__model_name"] = $_model; + } + $response[] = $_obj; + } + } else { + $ids = []; + + foreach ($rows as $object) { + $object = new $model_name($db->table($table)->get($object->id)); + if (!$object) continue; + $ids[] = $object->getId(); + } + + $log = new NoSpamLog; + $log->setUser($this->user->id); + $log->setModel($_model); + if ($searchTerm) { + $log->setRegex($searchTerm); + } else { + $log->setRequest($where); + } + $log->setBan_Type((int)$this->postParam("ban")); + $log->setCount(count($rows)); + $log->setTime(time()); + $log->setItems(implode(",", $ids)); + $log->save(); + + $banned_ids = []; + foreach ($rows as $object) { + $object = new $model_name($db->table($table)->get($object->id)); + if (!$object) continue; + + $owner = NULL; + $methods = ["getOwner", "getUser", "getRecipient", "getInitiator"]; + + if (method_exists($object, "ban")) { + $owner = $object; + } else { + foreach ($methods as $method) { + if (method_exists($object, $method)) { + $owner = $object->$method(); + break; + } + } + } + + if ($owner instanceof User && $owner->getId() === $this->user->id) { + if (count($rows) === 1) { + $this->returnJson(["success" => false, "error" => "\"Производственная травма\" — Вы не можете блокировать или удалять свой же контент"]); + } else { + continue; + } + } + + if (in_array((int)$this->postParam("ban"), [2, 3])) { + if ($owner) { + $_id = ($owner instanceof Club ? $owner->getId() * -1 : $owner->getId()); + if (!in_array($_id, $banned_ids)) { + if ($owner instanceof User) { + $owner->ban("**content-noSpamTemplate-" . $log->getId() . "**", false, time() + $owner->getNewBanTime(), $this->user->id); + } else { + $owner->ban("Подозрительная активность"); + } + + $banned_ids[] = $_id; + } + } + } + + if (in_array((int)$this->postParam("ban"), [1, 3])) + $object->delete(); + } + + $processed++; + } } + + $this->returnJson(["success" => true, "processed" => $processed, "count" => count($response), "list" => $response]); } catch (\Throwable $e) { $this->returnJson(["success" => false, "error" => $e->getMessage()]); } diff --git a/Web/Presenters/templates/NoSpam/Index.xml b/Web/Presenters/templates/NoSpam/Index.xml index 1bc73491..f2afe4b4 100644 --- a/Web/Presenters/templates/NoSpam/Index.xml +++ b/Web/Presenters/templates/NoSpam/Index.xml @@ -4,21 +4,39 @@ {block header}{include title}{/block} {block content} +
{include "Tabs.xml", mode => "form"}

- - + + @@ -140,6 +158,18 @@ $("#noSpam-results-loader").show(); $("#noSpam-loader").show(); + + let models = []; + $(".model").each(function (i) { + let name = $(this).val(); + if (!models.includes(name)) { + if (name.length > 0 && name !== "none") { + models.push(name); + } + } + }); + models = models.join(","); + let model = $("#model").val(); let regex = $("#regex").val(); let where = $("#where").val(); @@ -153,6 +183,7 @@ type: "POST", url: "/al_abuse/search", data: { + models: models, model: model, q: regex, where: where, @@ -178,10 +209,10 @@ }); $("#noSpam-results-list").append(`
  • - -

    ${ model} #${ item.id}

    +
    +

    ${ item.__model_name} #${ item.id}

    - +
  • `); }); $("#noSpam-results-block").show(); @@ -215,8 +246,10 @@ } }); $("#apply").on("click", () => { search(Number($("#noSpam-ban-type").val())); }) - $("#model").on("change", async (e) => { - if (e.target.value !== "none") { + + async function selectChange(value) { + console.log(value); + if (value !== "none") { $("#noSpam-fields").hide(); $("#noSpam-model-not-selected").show(); $("#noSpam-model-not-selected-text").hide(); @@ -224,17 +257,59 @@ setTimeout(() => { $("#noSpam-model-not-selected").hide(); $("#noSpam-fields").show(); + $("#add-model").show(); $("#noSpam-model-not-selected-loader").hide(); }, 100) } else { + if ($(".model").not(".initialModel").length === 0) { + $("#noSpam-fields").hide(); + $("#noSpam-model-not-selected").show(); + $("#noSpam-model-not-selected-loader").show(); + setTimeout(() => { + $("#noSpam-model-not-selected-text").show(); + $("#noSpam-model-not-selected-loader").hide(); + }, 100) + } + } + } + + $(".model").change(async (e) => { + selectChange(e.target.value); + }) + + $("#add-model").on("click", () => { + console.log($(".model").length); + $("#models-list").append(` + + + + `); + }); + + function deleteModelSelect(id) { + $(`#${ id}-model`).remove(); + if ($(".model").length === 0) { + console.log("BLYAT", $(".model")); $("#noSpam-fields").hide(); - $("#noSpam-model-not-selected").show(); - $("#noSpam-model-not-selected-loader").show(); - setTimeout(() => { - $("#noSpam-model-not-selected-text").show(); - $("#noSpam-model-not-selected-loader").hide(); + $("#noSpam-model-not-selected").show(); + $("#noSpam-model-not-selected-loader").show(); + setTimeout(() => { + $("#noSpam-model-not-selected-text").show(); + $("#noSpam-model-not-selected-loader").hide(); }, 100) } - }) + } {/block} diff --git a/Web/static/img/supp_icons.png b/Web/static/img/supp_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..b630ba7f1d8b14c96a0a74a29fea9a90c92616d5 GIT binary patch literal 1111 zcmeAS@N?(olHy`uVBq!ia0vp^B0&6(gBeKj#a(w`U|{qO@Ck8sFYqbq-wHt$lXn+S z0I|#aw*$%l|Nj^FZ!Lk!ZZDY#6x;?BumAsl)he*m1Q54)(#~SAI8ZN0{lpzbAnn^q zCT=U62vSfqVQba&Js?@2;S;u&PTF1!65m!iaa-|}y$}VJ6ZU`@K*LvE0h(4mVK-X;maY5E?D+Q7hwpL8r4J1JdCICftm4F=#G#26#h+ZIB*1xL+Wa&1D zzkphbX6^^-0!o2oC+z@@h<#lL4J?_&iw^37`Hz14r$Foc1D$;;ElF{Fa= z&2`r7Hx4o^A5PABcl9m^{ND2J-F^AzPp3WgH)~Ni-!GluRX=g7R$ZXXrAGUb&)gRm zy0|f~ZCUvDNB*qkdlmmXDy68TxE4)z$y+{kg7w&i}tOx+NESJ=(b9n8ey6 zCdYDnvX|(~`KT}pXo)sB_^p!{ZP=r5hW|j5lf9Ve^a*u3x{G_un5IkaP;88zescLt zo#|q00=#Y|q>3)^;SOWgFw%`!Y=8A_l4#w`l3UoAcCZ(Kb~l($zUH-~8! z>(K@-M?;gq3ugSwj@aB#QoC{M&@_?S8*O5j`rpc~omn{RVdjfBO|#dXWAoTmed9L! zm#>?aM{k&4a@BNGd_hB|uQWRgdwYhF35WMlmBY%J(vsh1$vO8wGoRo0>if&@eO!Dm z4cWf3A2f9Df4$0>?PSG0mODOAdXv$%ey+AvG(hRVKO-OVXCIK7Xb;_iw6H-7M~I@6-EYqh20(b!%6z^wR?$)O7FM za=Um=FZT}fg+2L?)mzWU@4IwtTj$Q1`CAJASFaP~Unk3v`XsYWy{e+5L}KgPA1!%) zeXMDI=iAP&EVipDvs(PIDNJucai!?7Aax? literal 0 HcmV?d00001
    Раздел: - +
    +
    + + +
    +
    + +
    +