bans.php: load database rows in a streaming fashion

This commit is contained in:
Zankaria 2025-07-23 19:52:44 +02:00
parent 68c0b2ae69
commit 3a8588ab7f

View file

@ -285,60 +285,68 @@ class Bans {
} }
} }
static public function stream_json($out = false, $filter_ips = false, $filter_staff = false, $board_access = false, $hide_message = false) { static public function stream_json($filter_ips = false, $filter_staff = false, $board_access = false, $hide_message = false) {
$query = query("SELECT ``bans``.*, `username` FROM ``bans``
LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`
ORDER BY `created` DESC") or error(db_error());
$bans = $query->fetchAll(PDO::FETCH_ASSOC);
if ($board_access && $board_access[0] == '*') { if ($board_access && $board_access[0] == '*') {
$board_access = false; $board_access = false;
} }
$out ? fputs($out, "[") : print("["); $query = query("SELECT ``bans``.*, `username` FROM ``bans``
LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`
ORDER BY `created` DESC") or error(db_error());
$end = end($bans); print('[');
foreach ($bans as &$ban) { $has_previous = false;
$ban['mask'] = self::range_to_string([$ban['ipstart'], $ban['ipend']]);
if ($ban['post'] && !$hide_message) { while (true) {
$post = json_decode($ban['post']); $ban = $query->fetch(PDO::FETCH_ASSOC);
$ban['message'] = isset($post->body) ? $post->body : 0;
}
unset($ban['ipstart'], $ban['ipend'], $ban['post'], $ban['creator']);
if ($board_access === false || in_array ($ban['board'], $board_access)) { if (\is_array($ban)) {
$ban['access'] = true; $ban['mask'] = self::range_to_string([$ban['ipstart'], $ban['ipend']]);
}
if (filter_var($ban['mask'], FILTER_VALIDATE_IP) !== false) { if ($ban['post'] && !$hide_message) {
$ban['single_addr'] = true; $post = \json_decode($ban['post']);
} $ban['message'] = isset($post->body) ? $post->body : 0;
if ($filter_staff || ($board_access !== false && !in_array($ban['board'], $board_access))) {
$ban['username'] = '?';
}
if ($filter_ips || ($board_access !== false && !in_array($ban['board'], $board_access))) {
@list($ban['mask'], $subnet) = explode("/", $ban['mask']);
$ban['mask'] = preg_split("/[\.:]/", $ban['mask']);
$ban['mask'] = array_slice($ban['mask'], 0, 2);
$ban['mask'] = implode(".", $ban['mask']);
$ban['mask'] .= ".x.x";
if (isset ($subnet)) {
$ban['mask'] .= "/$subnet";
} }
$ban['masked'] = true; unset($ban['ipstart'], $ban['ipend'], $ban['post'], $ban['creator']);
}
$json = json_encode($ban); if ($board_access === false || in_array ($ban['board'], $board_access)) {
$out ? fputs($out, $json) : print($json); $ban['access'] = true;
}
if ($ban['id'] != $end['id']) { if (filter_var($ban['mask'], FILTER_VALIDATE_IP) !== false) {
$out ? fputs($out, ",") : print(","); $ban['single_addr'] = true;
}
if ($filter_staff || ($board_access !== false && !\in_array($ban['board'], $board_access))) {
$ban['username'] = '?';
}
if ($filter_ips || ($board_access !== false && !\in_array($ban['board'], $board_access))) {
@list($ban['mask'], $subnet) = explode("/", $ban['mask']);
$ban['mask'] = \preg_split("/[\.:]/", $ban['mask']);
$ban['mask'] = \array_slice($ban['mask'], 0, 2);
$ban['mask'] = \implode(".", $ban['mask']);
$ban['mask'] .= ".x.x";
if (isset($subnet)) {
$ban['mask'] .= "/$subnet";
}
$ban['masked'] = true;
}
$json = \json_encode($ban);
// Add a comma if there's a previous row.
if ($has_previous) {
print(',');
}
$has_previous = true;
print($json);
} else {
break;
} }
} }
$out ? fputs($out, "]") : print("]"); print(']');
} }
static public function seen($ban_id) { static public function seen($ban_id) {