paged ip bans

This commit is contained in:
Shish 2019-11-11 12:52:11 +00:00
parent 418f5484ed
commit bde49c4f5e
4 changed files with 91 additions and 47 deletions

View File

@ -732,7 +732,7 @@ class Image
);
$database->execute(
$database->scoreql_to_sql(
"INSERT INTO image_tags(image_id, tag_id)
"INSERT INTO image_tags(image_id, tag_id)
VALUES(:id, (SELECT id FROM tags WHERE SCORE_STRNORM(tag) = SCORE_STRNORM(:tag)))"
),
["id"=>$this->id, "tag"=>$tag]

View File

@ -60,7 +60,7 @@ class IPBan extends Extension
flash_message("Ban for {$_POST['ip']} added");
$page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("ip_ban/list"));
$page->set_redirect(make_link("ip_ban/list/1"));
}
} elseif ($event->get_arg(0) == "remove" && $user->check_auth_token()) {
if (isset($_POST['id'])) {
@ -68,10 +68,11 @@ class IPBan extends Extension
flash_message("Ban removed");
$page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("ip_ban/list"));
$page->set_redirect(make_link("ip_ban/list/1"));
}
} elseif ($event->get_arg(0) == "list") {
$bans = (isset($_GET["all"])) ? $this->get_bans() : $this->get_active_bans();
$pageNum = $event->try_page_num(1);
$bans = (isset($_GET["all"])) ? $this->get_bans(true, $pageNum) : $this->get_bans(false, $pageNum);
$this->theme->display_bans($page, $bans);
}
} else {
@ -92,7 +93,7 @@ class IPBan extends Extension
global $user;
if ($event->parent==="system") {
if ($user->can(Permissions::BAN_IP)) {
$event->add_nav_link("ip_bans", new Link('ip_ban/list'), "IP Bans", NavLink::is_active(["ip_ban"]));
$event->add_nav_link("ip_bans", new Link('ip_ban/list/1'), "IP Bans", NavLink::is_active(["ip_ban"]));
}
}
}
@ -101,7 +102,7 @@ class IPBan extends Extension
{
global $user;
if ($user->can(Permissions::BAN_IP)) {
$event->add_link("IP Bans", make_link("ip_ban/list"));
$event->add_link("IP Bans", make_link("ip_ban/list/1"));
}
}
@ -240,7 +241,7 @@ class IPBan extends Extension
$prefix = ($database->get_driver_name() == DatabaseDriver::SQLITE ? "bans." : "");
$bans = $this->get_active_bans();
$bans = $this->get_bans(false, null);
foreach ($bans as $row) {
$ip = $row[$prefix."ip"];
@ -272,39 +273,62 @@ class IPBan extends Extension
exit;
}
private function get_bans()
private function get_bans(bool $all, ?int $page)
{
global $database;
$bans = $database->get_all("
SELECT bans.*, users.name as banner_name
FROM bans
JOIN users ON banner_id = users.id
ORDER BY added, expires, bans.id
");
if ($bans) {
return $bans;
} else {
return [];
$size = 100;
if (@$_GET['limit']) {
$size = int_escape($_GET['limit']);
}
}
$filters = ["1=1"];
$args = [];
private function get_active_bans()
{
global $database;
if (!$all) {
$filters[] = "((expires > CURRENT_TIMESTAMP) OR (expires IS NULL))";
}
if (@$_GET['s_ip']) {
$filters[] = "(ip = :ip)";
$args['ip'] = $_GET['s_ip'];
}
if (@$_GET['s_reason']) {
$filters[] = "(reason LIKE :reason)";
$args['reason'] = '%' . $_GET['s_reason'] . "%";
}
if (@$_GET['s_banner']) {
$filters[] = "(banner_id = :banner_id)";
$args['banner_id'] = User::by_name($_GET['s_banner'])->id;
}
if (@$_GET['s_added']) {
$filters[] = "(added LIKE :added)";
$args['added'] = '%' . $_GET['s_added'] . "%";
}
if (@$_GET['s_expires']) {
$filters[] = "(expires LIKE :expires)";
$args['expires'] = '%' . $_GET['s_expires'] . "%";
}
if (@$_GET['s_mode']) {
$filters[] = "(mode = :mode)";
$args['mode'] = $_GET['s_mode'];
}
$filter = implode(" AND ", $filters);
$bans = $database->get_all("
if (is_null($page)) {
$pager = "";
} else {
$pager = "OFFSET :offset LIMIT :limit";
$args["offset"] = ($page-1)*$size;
$args['limit'] = $size;
}
return $database->get_all("
SELECT bans.*, users.name as banner_name
FROM bans
JOIN users ON banner_id = users.id
WHERE (expires > CURRENT_TIMESTAMP) OR (expires IS NULL)
WHERE $filter
ORDER BY expires, bans.id
");
if ($bans) {
return $bans;
} else {
return [];
}
$pager
", $args);
}
// returns [ips, nets]
@ -317,7 +341,7 @@ class IPBan extends Extension
return $cached;
}
$bans = $this->get_active_bans();
$bans = $this->get_bans(false, null);
$ips = []; # "0.0.0.0" => false);
$nets = []; # "0.0.0.0/32" => false);
foreach ($bans as $row) {

View File

@ -35,22 +35,39 @@ class IPBanTheme extends Themelet
</tr>
";
}
$today = date('Y-m-d');
$html = "
<a href='".make_link("ip_ban/list", "all=on")."'>Show All</a>
<a href='".make_link("ip_ban/list", "limit=1000000")."'>Show All Active</a> /
<a href='".make_link("ip_ban/list", "all=on&limit=1000000")."'>Show EVERYTHING</a>
<p><table id='bans' class='sortable zebra'>
<thead><tr><th>IP</th><th>Reason</th><th>By</th><th>From</th><th>Until</th><th>Type</th><th>Action</th></tr></thead>
<thead>
<tr><th>IP</th><th>Reason</th><th>By</th><th>From</th><th>Until</th><th>Type</th><th>Action</th></tr>
<tr>
".make_form(make_link("ip_ban/list/1"), "GET")."
<td><input type='text' name='s_ip' value='".html_escape(@$_GET['s_ip'])."'></td>
<td><input type='text' name='s_reason' value='".html_escape(@$_GET['s_reason'])."'></td>
<td><input type='text' name='s_banner' value='".html_escape(@$_GET['s_banner'])."'></td>
<td><input type='text' name='s_added' value='".html_escape(@$_GET['s_added'])."'></td>
<td><input type='text' name='s_expires' value='".html_escape(@$_GET['s_expires'])."'></td>
<td><input type='text' name='s_mode' value='".html_escape(@$_GET['s_mode'])."'></td>
<td><input type='submit' value='Search'></td>
</form>
</tr>
</thead>
$h_bans
<tfoot><tr id='add'>
".make_form(make_link("ip_ban/add"))."
<td><input type='text' name='ip' value='".html_escape(@$_GET['ip'])."'></td>
<td><input type='text' name='reason' value='".html_escape(@$_GET['reason'])."'></td>
<td>{$user->name}</td>
<td></td>
<td><input type='text' name='end' value='".html_escape(@$_GET['end'])."'></td>
<td></td>
<td><input type='submit' value='Ban'></td>
</form>
</tr></tfoot>
<tfoot>
<tr id='add'>
".make_form(make_link("ip_ban/add"))."
<td><input type='text' name='ip' value='".html_escape(@$_GET['ip'])."'></td>
<td><input type='text' name='reason' value='".html_escape(@$_GET['reason'])."'></td>
<td>{$user->name}</td>
<td>{$today}</td>
<td><input type='text' name='end' value='".html_escape(@$_GET['end'])."'></td>
<td>block</td>
<td><input type='submit' value='Ban'></td>
</form>
</tr>
</tfoot>
</table>
";
$page->set_title("IP Bans");

View File

@ -24,8 +24,11 @@ class TagList extends Extension
if ($event->page_matches("tags")) {
$this->theme->set_navigation($this->build_navigation());
if($event->count_args() == 0) $sub = "map";
else $sub = $event->get_arg(0);
if ($event->count_args() == 0) {
$sub = "map";
} else {
$sub = $event->get_arg(0);
}
switch ($sub) {
default:
case 'map':