bans.php: split findSingle implementations

This commit is contained in:
Zankaria 2024-06-30 16:15:47 +02:00
parent 81f132dcf9
commit b88abb1c33
2 changed files with 59 additions and 34 deletions

View file

@ -32,6 +32,59 @@ class Bans {
} }
} }
static private function findSingleAutoGc($ip, $ban_id, $require_ban_view) {
// Use OR in the query to also garbage collect bans.
$query = prepare(
'SELECT ``bans``.* FROM ``bans``
WHERE ((`ipstart` = :ip OR (:ip >= `ipstart` AND :ip <= `ipend`)) OR (``bans``.id = :id))
ORDER BY `expires` IS NULL, `expires` DESC'
);
$query->bindValue(':id', $ban_id);
$query->bindValue(':ip', inet_pton($ip));
$query->execute() or error(db_error($query));
$found_ban = null;
$to_delete_list = [];
while ($ban = $query->fetch(PDO::FETCH_ASSOC)) {
if ($ban['expires'] && ($ban['seen'] || !$require_ban_view) && $ban['expires'] < time()) {
$to_delete_list[] = $ban['id'];
} elseif ($ban['id'] === $ban_id) {
if ($ban['post']) {
$ban['post'] = json_decode($ban['post'], true);
}
$ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend']));
$found_ban = $ban;
}
}
self::deleteBans($to_delete_list);
return $found_ban;
}
static private function findSingleNoGc($ban_id) {
$query = prepare(
'SELECT ``bans``.* FROM ``bans``
WHERE ``bans``.id = :id
ORDER BY `expires` IS NULL, `expires` DESC
LIMIT 1'
);
$query->bindValue(':id', $ban_id);
$query->execute() or error(db_error($query));
$ret = $query->fetch(PDO::FETCH_ASSOC);
if ($query->rowCount() == 0) {
return null;
} else {
$ret['post'] = json_decode($ret['post'], true);
return $ret;
}
}
static public function range_to_string($mask) { static public function range_to_string($mask) {
list($ipstart, $ipend) = $mask; list($ipstart, $ipend) = $mask;
@ -144,40 +197,12 @@ class Bans {
return array($ipstart, $ipend); return array($ipstart, $ipend);
} }
static public function findSingle($ip, $ban_id, $require_ban_view) { static public function findSingle($ip, $ban_id, $require_ban_view, $auto_gc) {
/** if ($auto_gc) {
* Use OR in the query to also garbage collect bans. Ideally we should move the whole GC procedure to a separate return self::findSingleAutoGc($ip, $ban_id, $require_ban_view);
* script, but it will require a more important restructuring. } else {
*/ return self::findSingleNoGc($ban_id);
$query = prepare(
'SELECT ``bans``.* FROM ``bans``
WHERE ((`ipstart` = :ip OR (:ip >= `ipstart` AND :ip <= `ipend`)) OR (``bans``.id = :id))
ORDER BY `expires` IS NULL, `expires` DESC'
);
$query->bindValue(':id', $ban_id);
$query->bindValue(':ip', inet_pton($ip));
$query->execute() or error(db_error($query));
$found_ban = null;
$to_delete_list = [];
while ($ban = $query->fetch(PDO::FETCH_ASSOC)) {
if ($ban['expires'] && ($ban['seen'] || !$require_ban_view) && $ban['expires'] < time()) {
$to_delete_list[] = $ban['id'];
} elseif ($ban['id'] === $ban_id) {
if ($ban['post']) {
$ban['post'] = json_decode($ban['post'], true);
}
$ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend']));
$found_ban = $ban;
}
} }
self::deleteBans($to_delete_list);
return $found_ban;
} }
static public function find($ip, $board = false, $get_mod_info = false, $banid = null) { static public function find($ip, $board = false, $get_mod_info = false, $banid = null) {

View file

@ -1673,7 +1673,7 @@ function handle_appeal()
$ban_id = (int) $_POST['ban_id']; $ban_id = (int) $_POST['ban_id'];
$source_ip = $_SERVER['REMOTE_ADDR']; $source_ip = $_SERVER['REMOTE_ADDR'];
$ban = Bans::findSingle($_SERVER['REMOTE_ADDR'], $ban_id, $config['require_ban_view']); $ban = Bans::findSingle($_SERVER['REMOTE_ADDR'], $ban_id, $config['require_ban_view'], true);
if (empty($ban)) { if (empty($ban)) {
error($config['error']['noban']); error($config['error']['noban']);