From ef936d60a9ebdb6e0ebc383ccad5e7a20400cc6f Mon Sep 17 00:00:00 2001 From: Zankaria Date: Thu, 4 Apr 2024 15:49:12 +0200 Subject: [PATCH] bans.php: format --- inc/bans.php | 153 ++++++++++++++++++++++++++++----------------------- 1 file changed, 83 insertions(+), 70 deletions(-) diff --git a/inc/bans.php b/inc/bans.php index 604aacb3..a8c24639 100644 --- a/inc/bans.php +++ b/inc/bans.php @@ -5,42 +5,44 @@ use Lifo\IP\CIDR; class Bans { static public function range_to_string($mask) { list($ipstart, $ipend) = $mask; - + if (!isset($ipend) || $ipend === false) { // Not a range. Single IP address. $ipstr = inet_ntop($ipstart); return $ipstr; } - - if (strlen($ipstart) != strlen($ipend)) + + if (strlen($ipstart) != strlen($ipend)) { return '???'; // What the fuck are you doing, son? - + } + $range = CIDR::range_to_cidr(inet_ntop($ipstart), inet_ntop($ipend)); - if ($range !== false) + if ($range !== false) { return $range; - + } + return '???'; } - + private static function calc_cidr($mask) { $cidr = new CIDR($mask); $range = $cidr->getRange(); - + return array(inet_pton($range[0]), inet_pton($range[1])); } - + public static function parse_time($str) { if (empty($str)) return false; - + if (($time = @strtotime($str)) !== false) return $time; - + if (!preg_match('/^((\d+)\s?ye?a?r?s?)?\s?+((\d+)\s?mon?t?h?s?)?\s?+((\d+)\s?we?e?k?s?)?\s?+((\d+)\s?da?y?s?)?((\d+)\s?ho?u?r?s?)?\s?+((\d+)\s?mi?n?u?t?e?s?)?\s?+((\d+)\s?se?c?o?n?d?s?)?$/', $str, $matches)) return false; - + $expire = 0; - + if (isset($matches[2])) { // Years $expire += (int)$matches[2]*60*60*24*365; @@ -69,14 +71,14 @@ class Bans { // Seconds $expire += (int)$matches[14]; } - + return time() + $expire; } - + static public function parse_range($mask) { $ipstart = false; $ipend = false; - + if (preg_match('@^(\d{1,3}\.){1,3}([\d*]{1,3})?$@', $mask) && substr_count($mask, '*') == 1) { // IPv4 wildcard mask $parts = explode('.', $mask); @@ -97,51 +99,52 @@ class Bans { list($ipv4, $bits) = explode('/', $mask); if ($bits > 32) return false; - + list($ipstart, $ipend) = self::calc_cidr($mask); } elseif (preg_match('@^[:a-z\d]+/\d+$@i', $mask)) { list($ipv6, $bits) = explode('/', $mask); - if ($bits > 128) + if ($bits > 128) { return false; - + } + list($ipstart, $ipend) = self::calc_cidr($mask); - } else { - if (($ipstart = @inet_pton($mask)) === false) - return false; + } elseif (($ipstart = @inet_pton($mask)) === false) { + return false; } - + return array($ipstart, $ipend); } - + static public function find($ip, $board = false, $get_mod_info = false) { global $config; - + $query = prepare('SELECT ``bans``.*' . ($get_mod_info ? ', `username`' : '') . ' FROM ``bans`` ' . ($get_mod_info ? 'LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`' : '') . ' WHERE (' . ($board !== false ? '(`board` IS NULL OR `board` = :board) AND' : '') . ' (`ipstart` = :ip OR (:ip >= `ipstart` AND :ip <= `ipend`))) ORDER BY `expires` IS NULL, `expires` DESC'); - + if ($board !== false) $query->bindValue(':board', $board, PDO::PARAM_STR); - + $query->bindValue(':ip', inet_pton($ip)); $query->execute() or error(db_error($query)); - + $ban_list = array(); - + while ($ban = $query->fetch(PDO::FETCH_ASSOC)) { if ($ban['expires'] && ($ban['seen'] || !$config['require_ban_view']) && $ban['expires'] < time()) { self::delete($ban['id']); } else { - if ($ban['post']) + if ($ban['post']) { $ban['post'] = json_decode($ban['post'], true); + } $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); $ban_list[] = $ban; } } - + return $ban_list; } @@ -149,16 +152,18 @@ class Bans { $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); + $bans = $query->fetchAll(PDO::FETCH_ASSOC); - if ($board_access && $board_access[0] == '*') $board_access = false; + if ($board_access && $board_access[0] == '*') { + $board_access = false; + } $out ? fputs($out, "[") : print("["); $end = end($bans); - foreach ($bans as &$ban) { - $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); + foreach ($bans as &$ban) { + $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); $hide_message = false; foreach ($hide_regexes as $regex) { @@ -182,7 +187,7 @@ class Bans { $ban['single_addr'] = true; } if ($filter_staff || ($board_access !== false && !in_array($ban['board'], $board_access))) { - $ban['username'] = '?'; + $ban['username'] = '?'; } if ($filter_ips || ($board_access !== false && !in_array($ban['board'], $board_access))) { @list($ban['mask'], $subnet) = explode("/", $ban['mask']); @@ -204,24 +209,25 @@ class Bans { } } - $out ? fputs($out, "]") : print("]"); - + $out ? fputs($out, "]") : print("]"); } - + static public function seen($ban_id) { - $query = query("UPDATE ``bans`` SET `seen` = 1 WHERE `id` = " . (int)$ban_id) or error(db_error()); - rebuildThemes('bans'); + query("UPDATE ``bans`` SET `seen` = 1 WHERE `id` = " . (int)$ban_id) or error(db_error()); + rebuildThemes('bans'); } - + static public function purge() { - $query = query("DELETE FROM ``bans`` WHERE `expires` IS NOT NULL AND `expires` < " . time() . " AND `seen` = 1") or error(db_error()); + query("DELETE FROM ``bans`` WHERE `expires` IS NOT NULL AND `expires` < " . time() . " AND `seen` = 1") or error(db_error()); rebuildThemes('bans'); } - + static public function delete($ban_id, $modlog = false, $boards = false, $dont_rebuild = false) { global $config; - if ($boards && $boards[0] == '*') $boards = false; + if ($boards && $boards[0] == '*') { + $boards = false; + } if ($modlog) { $query = query("SELECT `ipstart`, `ipend`, `board` FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error()); @@ -230,50 +236,55 @@ class Bans { return false; } - if ($boards !== false && !in_array($ban['board'], $boards)) - error($config['error']['noaccess']); - + if ($boards !== false && !in_array($ban['board'], $boards)) { + error($config['error']['noaccess']); + } + $mask = self::range_to_string(array($ban['ipstart'], $ban['ipend'])); - + modLog("Removed ban #{$ban_id} for " . (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask" : $mask)); } - + query("DELETE FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error()); - if (!$dont_rebuild) rebuildThemes('bans'); - + if (!$dont_rebuild) { + rebuildThemes('bans'); + } + return true; } - + static public function new_ban($mask, $reason, $length = false, $ban_board = false, $mod_id = false, $post = false) { global $mod, $pdo, $board; - + if ($mod_id === false) { $mod_id = isset($mod['id']) ? $mod['id'] : -1; } - + $range = self::parse_range($mask); $mask = self::range_to_string($range); - + $query = prepare("INSERT INTO ``bans`` VALUES (NULL, :ipstart, :ipend, :time, :expires, :board, :mod, :reason, 0, :post)"); - + $query->bindValue(':ipstart', $range[0]); - if ($range[1] !== false && $range[1] != $range[0]) + if ($range[1] !== false && $range[1] != $range[0]) { $query->bindValue(':ipend', $range[1]); - else + } else { $query->bindValue(':ipend', null, PDO::PARAM_NULL); - + } + $query->bindValue(':mod', $mod_id); $query->bindValue(':time', time()); - + if ($reason !== '') { $reason = escape_markup_modifiers($reason); markup($reason); $query->bindValue(':reason', $reason); - } else + } else { $query->bindValue(':reason', null, PDO::PARAM_NULL); - + } + if ($length) { if (is_int($length) || ctype_digit($length)) { $length = time() + $length; @@ -284,20 +295,22 @@ class Bans { } else { $query->bindValue(':expires', null, PDO::PARAM_NULL); } - - if ($ban_board) + + if ($ban_board) { $query->bindValue(':board', $ban_board); - else + } else { $query->bindValue(':board', null, PDO::PARAM_NULL); - + } + if ($post) { $post['board'] = $board['uri']; $query->bindValue(':post', json_encode($post)); - } else + } else { $query->bindValue(':post', null, PDO::PARAM_NULL); - + } + $query->execute() or error(db_error($query)); - + if (isset($mod['id']) && $mod['id'] == $mod_id) { modLog('Created a new ' . ($length > 0 ? preg_replace('/^(\d+) (\w+?)s?$/', '$1-$2', until($length)) : 'permanent') .