diff --git a/inc/config.php b/inc/config.php index 82e596a8..61379574 100644 --- a/inc/config.php +++ b/inc/config.php @@ -1635,6 +1635,12 @@ $config['mod']['create_notes'] = $config['mod']['view_notes']; // Remote notes $config['mod']['remove_notes'] = ADMIN; + // View telegrams + $config['mod']['view_telegrams'] = JANITOR; + // Create telegrams + $config['mod']['create_telegrams'] = $config['mod']['view_telegrams']; + // Remove telegrams + $config['mod']['remove_telegrams'] = ADMIN; // Create a new board $config['mod']['newboard'] = ADMIN; // Manage existing boards (change title, etc) diff --git a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po index 1521958f..50d24b64 100644 --- a/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po +++ b/inc/locale/pl_PL/LC_MESSAGES/tinyboard.po @@ -2287,6 +2287,8 @@ msgstr "usuĊ" msgid "New note" msgstr "Nowa notka" +msgid "New telegram" +msgstr "Nowa depesza" #. line 94 #. line 7 diff --git a/inc/mod/pages.php b/inc/mod/pages.php index 7af70b7b..d3cfba39 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -806,6 +806,25 @@ function mod_ip_remove_note($cloaked_ip, $id) { header('Location: ?/IP/' . $cloaked_ip . '#notes', true, $config['redirect_http']); } +function mod_ip_remove_telegram($cloaked_ip, $id) { + $ip = uncloak_ip($cloaked_ip); + global $config, $mod; + + if (!hasPermission($config['mod']['remove_telegrams'])) + error($config['error']['noaccess']); + + if (filter_var($ip, FILTER_VALIDATE_IP) === false) + error("Invalid IP address."); + + $query = prepare('DELETE FROM ``telegrams`` WHERE `ip` = :ip AND `id` = :id'); + $query->bindValue(':ip', $ip); + $query->bindValue(':id', $id); + $query->execute() or error(db_error($query)); + + modLog("Removed a telegram for {$cloaked_ip}"); + + header('Location: ?/IP/' . $cloaked_ip . '#telegrams', true, $config['redirect_http']); +} function mod_page_ip($cip) { @@ -852,6 +871,24 @@ function mod_page_ip($cip) { return; } + if (isset($_POST['telegram'])) { + if (!hasPermission($config['mod']['create_telegrams'])) + error($config['error']['noaccess']); + + $_POST['telegram'] = escape_markup_modifiers($_POST['telegram']); + markup($_POST['telegram']); + $query = prepare('INSERT INTO ``telegrams`` VALUES (NULL, :mod_id, :ip, :message, 0, :created_at)'); + $query->bindValue(':ip', $ip); + $query->bindValue(':mod_id', $mod['id']); + $query->bindValue(':created_at', time()); + $query->bindValue(':message', $_POST['telegram']); + $query->execute() or error(db_error($query)); + + modLog("Added a telegram for {$cip}"); + + header('Location: ?/IP/' . $cip . '#telegrams', true, $config['redirect_http']); + return; + } $args = array(); $args['ip'] = $ip; @@ -897,6 +934,13 @@ function mod_page_ip($cip) { $args['notes'] = $query->fetchAll(PDO::FETCH_ASSOC); } + if (hasPermission($config['mod']['view_telegrams'])) { + $query = prepare("SELECT ``telegrams``.*, `username` FROM ``telegrams`` LEFT JOIN ``mods`` ON `mod_id` = ``mods``.`id` WHERE `ip` = :ip ORDER BY `created_at` DESC"); + $query->bindValue(':ip', $ip); + $query->execute() or error(db_error($query)); + $args['telegrams'] = $query->fetchAll(PDO::FETCH_ASSOC); + } + if (hasPermission($config['mod']['modlog_ip'])) { $query = prepare("SELECT `username`, `mod`, `ip`, `board`, `time`, `text` FROM ``modlogs`` LEFT JOIN ``mods`` ON `mod` = ``mods``.`id` WHERE `text` LIKE :search ORDER BY `time` DESC LIMIT 50"); $query->bindValue(':search', '%' . $cip . '%'); diff --git a/install.sql b/install.sql index ca60a58a..0c6e44eb 100644 --- a/install.sql +++ b/install.sql @@ -346,6 +346,21 @@ CREATE TABLE IF NOT EXISTS `captchas` ( PRIMARY KEY (`cookie`,`extra`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; +-- -------------------------------------------------------- + +-- +-- Table structure for table `telegrams` +-- + +CREATE TABLE IF NOT EXISTS `telegrams` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `mod_id` int(11) unsigned NOT NULL, + `ip` varchar(39) CHARACTER SET ascii NOT NULL, + `message` text NOT NULL, + `seen` tinyint(1) NOT NULL DEFAULT FALSE, + `created_at` INT(11), + PRIMARY KEY(`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; diff --git a/mod.php b/mod.php index eacbba1a..94e419ef 100644 --- a/mod.php +++ b/mod.php @@ -59,6 +59,7 @@ $pages = array( '/IP/([\w.:]+)' => 'secure_POST ip', // view ip address '/IP/([\w.:]+)/remove_note/(\d+)' => 'secure ip_remove_note', // remove note from ip address + '/IP/([\w.:-]+)/remove_telegram/(\d+)' => 'secure ip_remove_telegram', // remove telegram from ip address '/ban' => 'secure_POST ban', // new ban '/bans' => 'secure_POST bans', // ban list diff --git a/post.php b/post.php index 4b665104..cfea1207 100644 --- a/post.php +++ b/post.php @@ -1216,6 +1216,27 @@ if (isset($_POST['delete'])) { if (!$post['mod']) header('X-Associated-Content: "' . $redirect . '"'); + // Any telegrams to show? + $query = prepare('SELECT * FROM ``telegrams`` WHERE ``ip`` = :ip AND ``seen`` = 0'); + $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']); + $query->execute() or error(db_error($query)); + $telegrams = $query->fetchAll(PDO::FETCH_ASSOC); + + if (count($telegrams) > 0) + goto skip_redirect; + + if (!isset($_POST['json_response'])) { + header('Location: ' . $redirect, true, $config['redirect_http']); + } else { + header('Content-Type: text/json; charset=utf-8'); + echo json_encode(array( + 'redirect' => $redirect, + 'noko' => $noko, + 'id' => $id + )); + } + skip_redirect: + if ($config['try_smarter'] && $post['op']) $build_pages = range(1, $config['max_pages']); @@ -1227,6 +1248,20 @@ if (isset($_POST['delete'])) { buildIndex(); + if (count($telegrams) > 0) { + $ids = implode(', ', array_map(function($x) { return (int)$x['id']; }, $telegrams)); + query("UPDATE ``telegrams`` SET ``seen`` = 1 WHERE ``id`` IN({$ids})") or error(db_error()); + die(Element('page.html', array( + 'title' => _('Important message from Moderation'), + 'config' => $config, + 'body' => Element('important.html', array( + 'config' => $config, + 'redirect' => $redirect, + 'telegrams' => $telegrams, + )) + ))); + } + // We are already done, let's continue our heavy-lifting work in the background (if we run off FastCGI) if (function_exists('fastcgi_finish_request')) @fastcgi_finish_request(); diff --git a/templates/important.html b/templates/important.html new file mode 100644 index 00000000..9ad4460e --- /dev/null +++ b/templates/important.html @@ -0,0 +1,12 @@ +
{{ telegram.message }}
+