microcrud for image hash bans

This commit is contained in:
Shish 2019-11-29 01:52:24 +00:00
parent 26e24c8988
commit 920bdd1884
4 changed files with 62 additions and 121 deletions

View file

@ -1,5 +1,38 @@
<?php <?php
use MicroCRUD\StringColumn;
use MicroCRUD\DateColumn;
use MicroCRUD\TextColumn;
use MicroCRUD\Table;
class HashBanTable extends Table
{
public function __construct(\FFSPHP\PDO $db, $token=null)
{
parent::__construct($db, $token);
$this->table = "bans";
$this->base_query = "
SELECT * FROM (
SELECT bans.*, users.name AS banner
FROM bans JOIN users ON banner_id=users.id
) AS tbl1
";
$this->size = 10;
$this->columns = [
new StringColumn("hash", "Hash"),
new TextColumn("reason", "Reason"),
new DateColumn("date", "Date"),
];
$this->order_by = ["date DESC", "id"];
$this->create_url = make_link("image_hash_ban/add");
$this->delete_url = make_link("image_hash_ban/remove");
$this->table_attrs = ["class" => "zebra"];
}
}
class RemoveImageHashBanEvent extends Event class RemoveImageHashBanEvent extends Event
{ {
public $hash; public $hash;
@ -55,9 +88,11 @@ class ImageBan extends Extension
if ($event->page_matches("image_hash_ban")) { if ($event->page_matches("image_hash_ban")) {
if ($user->can(Permissions::BAN_IMAGE)) { if ($user->can(Permissions::BAN_IMAGE)) {
if ($event->get_arg(0) == "add") { if ($event->get_arg(0) == "add") {
$image = isset($_POST['image_id']) ? Image::by_id(int_escape($_POST['image_id'])) : null; $user->ensure_authed();
$hash = isset($_POST["hash"]) ? $_POST["hash"] : $image->hash; $input = validate_input(["c_hash"=>"optional,string", "c_reason"=>"string", "c_image_id"=>"optional,int"]);
$reason = isset($_POST['reason']) ? $_POST['reason'] : "DNP"; $image = isset($input['c_image_id']) ? Image::by_id($input['c_image_id']) : null;
$hash = isset($input["c_hash"]) ? $input["c_hash"] : $image->hash;
$reason = isset($input['c_reason']) ? $input['c_reason'] : "DNP";
if ($hash) { if ($hash) {
send_event(new AddImageHashBanEvent($hash, $reason)); send_event(new AddImageHashBanEvent($hash, $reason));
@ -72,21 +107,21 @@ class ImageBan extends Extension
$page->set_redirect($_SERVER['HTTP_REFERER']); $page->set_redirect($_SERVER['HTTP_REFERER']);
} }
} elseif ($event->get_arg(0) == "remove") { } elseif ($event->get_arg(0) == "remove") {
if (isset($_POST['hash'])) { $user->ensure_authed();
send_event(new RemoveImageHashBanEvent($_POST['hash'])); $input = validate_input(["d_id"=>"int"]);
$hash = $database->get_one(
flash_message("Image ban removed"); "SELECT hash FROM image_hash_bans WHERE id=:id",
$page->set_mode(PageMode::REDIRECT); ["id"=>$input['d_id']]
$page->set_redirect($_SERVER['HTTP_REFERER']); );
} send_event(new RemoveImageHashBanEvent($hash));
flash_message("Image ban removed");
$page->set_mode(PageMode::REDIRECT);
$page->set_redirect($_SERVER['HTTP_REFERER']);
} elseif ($event->get_arg(0) == "list") { } elseif ($event->get_arg(0) == "list") {
$page_num = 0; $t = new HashBanTable($database->raw_db());
if ($event->count_args() == 2) { $t->token = $user->get_auth_token();
$page_num = int_escape($event->get_arg(1)); $t->inputs = $_GET;
} $this->theme->display_bans($page, $t->table($t->query()), $t->paginator());
$page_size = 100;
$page_count = ceil($database->get_one("SELECT COUNT(id) FROM image_bans")/$page_size);
$this->theme->display_Image_hash_Bans($page, $page_num, $page_count, $this->get_image_hash_bans($page_num, $page_size));
} }
} }
} }
@ -102,7 +137,6 @@ class ImageBan extends Extension
} }
} }
public function onUserBlockBuilding(UserBlockBuildingEvent $event) public function onUserBlockBuilding(UserBlockBuildingEvent $event)
{ {
global $user; global $user;
@ -114,7 +148,7 @@ class ImageBan extends Extension
public function onAddImageHashBan(AddImageHashBanEvent $event) public function onAddImageHashBan(AddImageHashBanEvent $event)
{ {
global $database; global $database;
$database->Execute( $database->execute(
"INSERT INTO image_bans (hash, reason, date) VALUES (:hash, :reason, now())", "INSERT INTO image_bans (hash, reason, date) VALUES (:hash, :reason, now())",
["hash"=>$event->hash, "reason"=>$event->reason] ["hash"=>$event->hash, "reason"=>$event->reason]
); );
@ -124,7 +158,7 @@ class ImageBan extends Extension
public function onRemoveImageHashBan(RemoveImageHashBanEvent $event) public function onRemoveImageHashBan(RemoveImageHashBanEvent $event)
{ {
global $database; global $database;
$database->Execute("DELETE FROM image_bans WHERE hash = :hash", ["hash"=>$event->hash]); $database->execute("DELETE FROM image_bans WHERE hash = :hash", ["hash"=>$event->hash]);
} }
public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event)
@ -135,41 +169,6 @@ class ImageBan extends Extension
} }
} }
// DB funness
public function get_image_hash_bans(int $page, int $size=100): array
{
global $database;
// FIXME: many
$size_i = int_escape($size);
$offset_i = int_escape($page-1)*$size_i;
$where = ["(1=1)"];
$args = [];
if (!empty($_GET['hash'])) {
$where[] = 'hash = :hash';
$args['hash'] = $_GET['hash'];
}
if (!empty($_GET['reason'])) {
$where[] = 'reason SCORE_ILIKE :reason';
$args['reason'] = "%".$_GET['reason']."%";
}
$where = implode(" AND ", $where);
$bans = $database->get_all($database->scoreql_to_sql("
SELECT *
FROM image_bans
WHERE $where
ORDER BY id DESC
LIMIT $size_i
OFFSET $offset_i
"), $args);
if ($bans) {
return $bans;
} else {
return [];
}
}
// in before resolution limit plugin // in before resolution limit plugin
public function get_priority(): int public function get_priority(): int
{ {

View file

@ -4,81 +4,25 @@ class ImageBanTheme extends Themelet
{ {
/* /*
* Show all the bans * Show all the bans
*
* $bans = an array of (
* 'hash' => the banned hash
* 'reason' => why the hash was banned
* 'date' => when the ban started
* )
*/ */
public function display_image_hash_bans(Page $page, $page_number, $page_count, $bans) public function display_bans(Page $page, $table, $paginator)
{ {
$h_bans = "";
foreach ($bans as $ban) {
$h_bans .= "
<tr>
".make_form(make_link("image_hash_ban/remove"))."
<td width='30%'>{$ban['hash']}</td>
<td>{$ban['reason']}</td>
<td width='10%'>
<input type='hidden' name='hash' value='{$ban['hash']}'>
<input type='submit' value='Remove'>
</td>
</form>
</tr>
";
}
$html = "
<table id='image_bans' class='zebra sortable'>
<thead>
<th>Hash</th><th>Reason</th><th>Action</th>
<tr>
<form action='".make_link("image_hash_ban/list/1")."' method='GET'>
<td><input type='text' name='hash'></td>
<td><input type='text' name='reason'></td>
<td><input type='submit' value='Search'></td>
</form>
</tr>
</thead>
$h_bans
<tfoot><tr>
".make_form(make_link("image_hash_ban/add"))."
<td><input type='text' name='hash'></td>
<td><input type='text' name='reason'></td>
<td><input type='submit' value='Ban'></td>
</form>
</tr></tfoot>
</table>
";
$prev = $page_number - 1;
$next = $page_number + 1;
$h_prev = ($page_number <= 1) ? "Prev" : "<a href='".make_link("image_hash_ban/list/$prev")."'>Prev</a>";
$h_index = "<a href='".make_link()."'>Index</a>";
$h_next = ($page_number >= $page_count) ? "Next" : "<a href='".make_link("image_hash_ban/list/$next")."'>Next</a>";
$nav = "$h_prev | $h_index | $h_next";
$page->set_title("Image Bans"); $page->set_title("Image Bans");
$page->set_heading("Image Bans"); $page->set_heading("Image Bans");
$page->add_block(new Block("Edit Image Bans", $html)); $page->add_block(new NavBlock());
$page->add_block(new Block("Navigation", $nav, "left", 0)); $page->add_block(new Block("Edit Image Bans", $table . $paginator));
$this->display_paginator($page, "image_hash_ban/list", null, $page_number, $page_count);
} }
/* /*
* Display a link to delete an image * Display a link to delete an image
*
* $image_id = the image to delete
*/ */
public function get_buttons_html(Image $image) public function get_buttons_html(Image $image)
{ {
$html = " $html = "
".make_form(make_link("image_hash_ban/add"))." ".make_form(make_link("image_hash_ban/add"))."
<input type='hidden' name='hash' value='{$image->hash}'> <input type='hidden' name='c_hash' value='{$image->hash}'>
<input type='hidden' name='image_id' value='{$image->id}'> <input type='hidden' name='c_image_id' value='{$image->id}'>
<input type='text' name='reason'> <input type='text' name='c_reason'>
<input type='submit' value='Ban Hash and Delete Image'> <input type='submit' value='Ban Hash and Delete Image'>
</form> </form>
"; ";

View file

@ -9,7 +9,7 @@ use MicroCRUD\Table;
class IPBanTable extends Table class IPBanTable extends Table
{ {
public function __construct(\PDO $db, $token=null) public function __construct(\FFSPHP\PDO $db, $token=null)
{ {
parent::__construct($db, $token); parent::__construct($db, $token);
@ -182,8 +182,7 @@ class IPBan extends Extension
$t = new IPBanTable($database->raw_db()); $t = new IPBanTable($database->raw_db());
$t->token = $user->get_auth_token(); $t->token = $user->get_auth_token();
$t->inputs = $_GET; $t->inputs = $_GET;
$table = $t->table($t->query()); $this->theme->display_bans($page, $t->table($t->query()), $t->paginator());
$this->theme->display_bans($page, $table, $t->paginator());
} }
} else { } else {
$this->theme->display_permission_denied(); $this->theme->display_permission_denied();

View file

@ -4,7 +4,6 @@ class IPBanTheme extends Themelet
{ {
public function display_bans(Page $page, $table, $paginator) public function display_bans(Page $page, $table, $paginator)
{ {
$today = date('Y-m-d');
$html = " $html = "
<a href='".make_link("ip_ban/list", "r__size=1000000")."'>Show All Active</a> / <a href='".make_link("ip_ban/list", "r__size=1000000")."'>Show All Active</a> /
<a href='".make_link("ip_ban/list", "r_all=on&r__size=1000000")."'>Show EVERYTHING</a> <a href='".make_link("ip_ban/list", "r_all=on&r__size=1000000")."'>Show EVERYTHING</a>