From 2ca72c6a7c9e3d171e5ed0e8004623fe8af174bb Mon Sep 17 00:00:00 2001 From: Pietro Carrara Date: Mon, 11 Jan 2021 20:21:50 -0300 Subject: [PATCH 01/19] Build overboard json --- inc/api.php | 4 +++- templates/themes/catalog/theme.php | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/inc/api.php b/inc/api.php index 8e35b511..ae68d00e 100644 --- a/inc/api.php +++ b/inc/api.php @@ -35,11 +35,13 @@ class Api { 'cycle' => 'cyclical', 'bump' => 'last_modified', 'embed' => 'embed', + 'board' => 'board', ); $this->threadsPageFields = array( 'id' => 'no', - 'bump' => 'last_modified' + 'bump' => 'last_modified', + 'board' => 'board', ); $this->fileFields = array( diff --git a/templates/themes/catalog/theme.php b/templates/themes/catalog/theme.php index 561df2b1..15e38edb 100644 --- a/templates/themes/catalog/theme.php +++ b/templates/themes/catalog/theme.php @@ -458,5 +458,21 @@ 'recent_posts' => $recent_posts, 'board' => $board ))); + + if ($config['api']['enabled']) { + $api = new Api(); + + $threads = array(); + + foreach ($recent_posts as $post) { + $threads[] = new Thread($post); + } + + $json = json_encode($api->translateCatalogPage($threads)); + file_write($config['dir']['home'] . $board_name . '/catalog.json', $json); + + $json = json_encode($api->translateCatalogPage($threads, true)); + file_write($config['dir']['home'] . $board_name . '/threads.json', $json); + } } } From e57b760de86eb4b5c7b6d46443630463c63b35ce Mon Sep 17 00:00:00 2001 From: Pietro Carrara Date: Mon, 11 Jan 2021 20:48:22 -0300 Subject: [PATCH 02/19] Wrap overboard api threads inside a page --- templates/themes/catalog/theme.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/templates/themes/catalog/theme.php b/templates/themes/catalog/theme.php index 15e38edb..b5d04ed2 100644 --- a/templates/themes/catalog/theme.php +++ b/templates/themes/catalog/theme.php @@ -468,10 +468,13 @@ $threads[] = new Thread($post); } - $json = json_encode($api->translateCatalogPage($threads)); + // Page 0, the only page + $threads = array($threads); + + $json = json_encode($api->translateCatalog($threads)); file_write($config['dir']['home'] . $board_name . '/catalog.json', $json); - $json = json_encode($api->translateCatalogPage($threads, true)); + $json = json_encode($api->translateCatalog($threads, true)); file_write($config['dir']['home'] . $board_name . '/threads.json', $json); } } From 0d80e600b584bfd7ab4984b636572c4cf13aab84 Mon Sep 17 00:00:00 2001 From: Pietro Carrara Date: Tue, 12 Jan 2021 09:16:43 -0300 Subject: [PATCH 03/19] Only rebuild the catalog for the overboard --- templates/themes/catalog/theme.php | 43 ++++++++++++++++-------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/templates/themes/catalog/theme.php b/templates/themes/catalog/theme.php index b5d04ed2..0785dc5a 100644 --- a/templates/themes/catalog/theme.php +++ b/templates/themes/catalog/theme.php @@ -348,6 +348,8 @@ * Build and save the HTML of the catalog for the overboard */ public function buildOverboardCatalog($settings, $boards) { + global $config; + $board_name = $settings['overboard_location']; if (array_key_exists($board_name, $this->threadsCache)) { @@ -371,6 +373,26 @@ $recent_posts = $this->generateRecentPosts($threads); $this->saveForBoard($board_name, $recent_posts, '/' . $settings['overboard_location']); + + // Build the overboard JSON outputs + if ($config['api']['enabled']) { + $api = new Api(); + + $threads = array(); + + foreach ($recent_posts as $post) { + $threads[] = new Thread($post); + } + + // Page 0, the only page + $threads = array($threads); + + $json = json_encode($api->translateCatalog($threads)); + file_write($config['dir']['home'] . $board_name . '/catalog.json', $json); + + $json = json_encode($api->translateCatalog($threads, true)); + file_write($config['dir']['home'] . $board_name . '/threads.json', $json); + } } private function generateRecentPosts($threads) { @@ -457,25 +479,6 @@ 'config' => $config, 'recent_posts' => $recent_posts, 'board' => $board - ))); - - if ($config['api']['enabled']) { - $api = new Api(); - - $threads = array(); - - foreach ($recent_posts as $post) { - $threads[] = new Thread($post); - } - - // Page 0, the only page - $threads = array($threads); - - $json = json_encode($api->translateCatalog($threads)); - file_write($config['dir']['home'] . $board_name . '/catalog.json', $json); - - $json = json_encode($api->translateCatalog($threads, true)); - file_write($config['dir']['home'] . $board_name . '/threads.json', $json); - } + ))); } } From dc63ff61ee96b083121b9ca57ed3a3854974f56b Mon Sep 17 00:00:00 2001 From: Pietro Carrara Date: Tue, 12 Jan 2021 09:55:08 -0300 Subject: [PATCH 04/19] Correctly page the overboard json --- templates/themes/catalog/theme.php | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/templates/themes/catalog/theme.php b/templates/themes/catalog/theme.php index 0785dc5a..c986aeb5 100644 --- a/templates/themes/catalog/theme.php +++ b/templates/themes/catalog/theme.php @@ -378,19 +378,26 @@ if ($config['api']['enabled']) { $api = new Api(); - $threads = array(); - - foreach ($recent_posts as $post) { - $threads[] = new Thread($post); + // Separate the threads into pages + $pages = array(array()); + $totalThreads = count($recent_posts); + $page = 0; + for ($i = 1; $i <= $totalThreads; $i++) { + $pages[$page][] = new Thread($recent_posts[$i-1]); + + // If we have not yet visited all threads, + // and we hit the limit on the current page, + // skip to the next page + if ($i < $totalThreads && ($i % $config['threads_per_page'] == 0)) { + $page++; + $pages[$page] = array(); + } } - - // Page 0, the only page - $threads = array($threads); - - $json = json_encode($api->translateCatalog($threads)); + + $json = json_encode($api->translateCatalog($pages)); file_write($config['dir']['home'] . $board_name . '/catalog.json', $json); - $json = json_encode($api->translateCatalog($threads, true)); + $json = json_encode($api->translateCatalog($pages, true)); file_write($config['dir']['home'] . $board_name . '/threads.json', $json); } } From 3a5081e73d20178f17d43be3cc18a50c79d310d7 Mon Sep 17 00:00:00 2001 From: Pietro Carrara Date: Tue, 12 Jan 2021 15:32:08 -0300 Subject: [PATCH 05/19] Add board data on all catalogs, rename overboard 'replies' and 'images' fields to keep consistency --- inc/functions.php | 4 ++-- templates/themes/catalog/catalog.html | 4 ++-- templates/themes/catalog/theme.php | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/inc/functions.php b/inc/functions.php index 3a624ff1..3e9fffd0 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -1322,7 +1322,7 @@ function index($page, $mod=false, $brief = false) { $body = ''; $offset = round($page*$config['threads_per_page']-$config['threads_per_page']); - $query = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC LIMIT :offset,:threads_per_page", $board['uri'])); + $query = prepare(sprintf("SELECT *,'%s' as board FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC LIMIT :offset,:threads_per_page", $board['uri'], $board['uri'])); $query->bindValue(':offset', $offset, PDO::PARAM_INT); $query->bindValue(':threads_per_page', $config['threads_per_page'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); @@ -2292,7 +2292,7 @@ function buildThread($id, $return = false, $mod = false) { $action = generation_strategy('sb_thread', array($board['uri'], $id)); if ($action == 'rebuild' || $return || $mod) { - $query = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id`", $board['uri'])); + $query = prepare(sprintf("SELECT *,'%s' as board FROM ``posts_%s`` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id`", $board['uri'],$board['uri'])); $query->bindValue(':id', $id, PDO::PARAM_INT); $query->execute() or error(db_error($query)); diff --git a/templates/themes/catalog/catalog.html b/templates/themes/catalog/catalog.html index a932278d..e39debee 100644 --- a/templates/themes/catalog/catalog.html +++ b/templates/themes/catalog/catalog.html @@ -48,7 +48,7 @@
{% for post in recent_posts %}
- R: {{ post.reply_count }} / I: {{ post.image_count }}{% if post.sticky %} (sticky){% endif %}{% if post.locked %}  {% endif %} + R: {{ post.replies }} / I: {{ post.images }}{% if post.sticky %} (sticky){% endif %}{% if post.locked %}  {% endif %} {% if post.subject %}

diff --git a/templates/themes/catalog/theme.php b/templates/themes/catalog/theme.php index c986aeb5..e2275338 100644 --- a/templates/themes/catalog/theme.php +++ b/templates/themes/catalog/theme.php @@ -337,8 +337,8 @@ private function buildThreadsQuery($board) { $sql = "SELECT *, `id` AS `thread_id`, " . - "(SELECT COUNT(`id`) FROM ``posts_$board`` WHERE `thread` = `thread_id`) AS `reply_count`, " . - "(SELECT SUM(`num_files`) FROM ``posts_$board`` WHERE `thread` = `thread_id` AND `num_files` IS NOT NULL) AS `image_count`, " . + "(SELECT COUNT(`id`) FROM ``posts_$board`` WHERE `thread` = `thread_id`) AS `replies`, " . + "(SELECT SUM(`num_files`) FROM ``posts_$board`` WHERE `thread` = `thread_id` AND `num_files` IS NOT NULL) AS `images`, " . "'$board' AS `board` FROM ``posts_$board`` WHERE `thread` IS NULL"; return $sql; @@ -445,8 +445,8 @@ $post['file'] = $config['root'] . $config['image_deleted']; } - if (empty($post['image_count'])) - $post['image_count'] = 0; + if (empty($post['images'])) + $post['images'] = 0; $post['pubdate'] = date('r', $post['time']); $posts[] = $post; From f030ce8215e30b88784258f6242f2c9dc2e5f366 Mon Sep 17 00:00:00 2001 From: Dedushka Date: Sun, 17 Jan 2021 13:01:22 -0500 Subject: [PATCH 06/19] Don't ignore files in inc/mod directory. The original pathspec matches any path with "mod" in it. We modified it here to only match directories at the top level. --- .gitignore | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 73da9936..493d4027 100644 --- a/.gitignore +++ b/.gitignore @@ -61,9 +61,9 @@ tf/ [._]s[a-w][a-z] # special boards -all/ -mod/ -random/ +/all/ +/mod/ +/random/ # Banners banners/* From a037d8b5e0f7477a35d3455795bd6c4d805f8b12 Mon Sep 17 00:00:00 2001 From: Dedushka Date: Sun, 17 Jan 2021 13:03:17 -0500 Subject: [PATCH 07/19] Protect IPs in public moderation logs. As reported, IPv6 addresses were not properly hidden in the public facing moderation logs. This commit filters both IPv4 and IPv6 addresses. We broke out into a separate function so that it can be tested with the test suite. A rudimentary test has been added to test the newly added protect_ip($entry) function. --- inc/mod/pages.php | 1182 ++++++++++++++++++++------------------- tests/ProtectIPTest.php | 32 ++ 2 files changed, 626 insertions(+), 588 deletions(-) create mode 100644 tests/ProtectIPTest.php diff --git a/inc/mod/pages.php b/inc/mod/pages.php index e8b43a62..0ea5328d 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -10,7 +10,7 @@ require_once 'inc/anti-bot.php'; // DELETE ME THIS IS FOR print_err function onl function mod_page($title, $template, $args, $subtitle = false) { global $config, $mod; - + echo Element('page.html', array( 'config' => $config, 'mod' => $mod, @@ -20,7 +20,7 @@ function mod_page($title, $template, $args, $subtitle = false) { 'boardlist' => createBoardlist($mod), 'body' => Element($template, array_merge( - array('config' => $config, 'mod' => $mod), + array('config' => $config, 'mod' => $mod), $args ) ) @@ -30,9 +30,9 @@ function mod_page($title, $template, $args, $subtitle = false) { function mod_login($redirect = false) { global $config; - + $args = array(); - + if (isset($_POST['login'])) { // Check if inputs are set and not empty if (!isset($_POST['username'], $_POST['password']) || $_POST['username'] == '' || $_POST['password'] == '') { @@ -40,22 +40,22 @@ function mod_login($redirect = false) { } elseif (!login($_POST['username'], $_POST['password'])) { if ($config['syslog']) _syslog(LOG_WARNING, 'Unauthorized login attempt!'); - + $args['error'] = $config['error']['invalid']; } else { modLog('Logged in'); - + // Login successful // Set cookies setCookies(); - + if ($redirect) header('Location: ?' . $redirect, true, $config['redirect_http']); else header('Location: ?/', true, $config['redirect_http']); } } - + if (isset($_POST['username'])) $args['username'] = $_POST['username']; @@ -73,53 +73,53 @@ function mod_confirm($request) { function mod_logout() { global $config; destroyCookies(); - + header('Location: ?/', true, $config['redirect_http']); } function mod_dashboard() { global $config, $mod; - + $args = array(); - + $args['boards'] = listBoards(); - + if (hasPermission($config['mod']['noticeboard'])) { if (!$config['cache']['enabled'] || !$args['noticeboard'] = cache::get('noticeboard_preview')) { $query = prepare("SELECT ``noticeboard``.*, `username` FROM ``noticeboard`` LEFT JOIN ``mods`` ON ``mods``.`id` = `mod` ORDER BY `id` DESC LIMIT :limit"); $query->bindValue(':limit', $config['mod']['noticeboard_dashboard'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); $args['noticeboard'] = $query->fetchAll(PDO::FETCH_ASSOC); - + if ($config['cache']['enabled']) cache::set('noticeboard_preview', $args['noticeboard']); } } - + if (!$config['cache']['enabled'] || ($args['unread_pms'] = cache::get('pm_unreadcount_' . $mod['id'])) === false) { $query = prepare('SELECT COUNT(*) FROM ``pms`` WHERE `to` = :id AND `unread` = 1'); $query->bindValue(':id', $mod['id']); $query->execute() or error(db_error($query)); $args['unread_pms'] = $query->fetchColumn(); - + if ($config['cache']['enabled']) cache::set('pm_unreadcount_' . $mod['id'], $args['unread_pms']); } - + $query = query('SELECT COUNT(*) FROM ``reports``') or error(db_error($query)); $args['reports'] = $query->fetchColumn(); - + if ($mod['type'] >= ADMIN && $config['check_updates']) { if (!$config['version']) error(_('Could not find current version! (Check .installed)')); - + if (isset($_COOKIE['update'])) { $latest = unserialize($_COOKIE['update']); } else { $ctx = stream_context_create(array('http' => array('timeout' => 5))); if ($code = @file_get_contents('http://engine.vichan.net/version.txt', 0, $ctx)) { $ver = strtok($code, "\n"); - + if (preg_match('@^// v(\d+)\.(\d+)\.(\d+)\s*?$@', $ver, $matches)) { $latest = array( 'massive' => $matches[1], @@ -132,7 +132,7 @@ function mod_dashboard() { 'major' => (int) $matches[2], 'minor' => (int) $matches[3] ); - if (isset($m[4])) { + if (isset($m[4])) { // Development versions are always ahead in the versioning numbers $current['minor'] --; } @@ -155,36 +155,36 @@ function mod_dashboard() { // Couldn't get latest version $latest = false; } - + setcookie('update', serialize($latest), time() + $config['check_updates_time'], $config['cookies']['jail'] ? $config['cookies']['path'] : '/', null, !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off', true); } - + if ($latest) $args['newer_release'] = $latest; } - + $args['logout_token'] = make_secure_link_token('logout'); - + mod_page(_('Dashboard'), 'mod/dashboard.html', $args); } function mod_search_redirect() { global $config; - + if (!hasPermission($config['mod']['search'])) error($config['error']['noaccess']); - + if (isset($_POST['query'], $_POST['type']) && in_array($_POST['type'], array('posts', 'IP_notes', 'bans', 'log'))) { $query = $_POST['query']; $query = urlencode($query); $query = str_replace('_', '%5F', $query); $query = str_replace('+', '_', $query); - + if ($query === '') { header('Location: ?/', true, $config['redirect_http']); return; } - + header('Location: ?/search/' . $_POST['type'] . '/' . $query, true, $config['redirect_http']); } else { header('Location: ?/', true, $config['redirect_http']); @@ -193,29 +193,29 @@ function mod_search_redirect() { function mod_search($type, $search_query_escaped, $page_no = 1) { global $pdo, $config; - + if (!hasPermission($config['mod']['search'])) error($config['error']['noaccess']); - + // Unescape query $query = str_replace('_', ' ', $search_query_escaped); $query = urldecode($query); $search_query = $query; - + // Form a series of LIKE clauses for the query. // This gets a little complicated. - + // Escape "escape" character $query = str_replace('!', '!!', $query); - + // Escape SQL wildcard $query = str_replace('%', '!%', $query); - + // Use asterisk as wildcard instead $query = str_replace('*', '%', $query); - + $query = str_replace('`', '!`', $query); - + // Array of phrases to match $match = array(); @@ -227,7 +227,7 @@ function mod_search($type, $search_query_escaped, $page_no = 1) { $match[] = $pdo->quote($phrase); } } - + // Non-exact phrases (ie. plain keywords) $keywords = explode(' ', $query); foreach ($keywords as $word) { @@ -235,7 +235,7 @@ function mod_search($type, $search_query_escaped, $page_no = 1) { continue; $match[] = $pdo->quote($word); } - + // Which `field` to search? if ($type == 'posts') $sql_field = array('body_nomarkup', 'files', 'subject', 'filehash', 'ip', 'name', 'trip'); @@ -261,57 +261,57 @@ function mod_search($type, $search_query_escaped, $page_no = 1) { $sql_like .= '`' . $sql_field . '` LIKE ' . $phrase . ' ESCAPE \'!\''; } } - + // Compile SQL query - + if ($type == 'posts') { $query = ''; $boards = listBoards(); if (empty($boards)) error(_('There are no boards to search!')); - + foreach ($boards as $board) { openBoard($board['uri']); if (!hasPermission($config['mod']['search_posts'], $board['uri'])) continue; - + if (!empty($query)) $query .= ' UNION ALL '; $query .= sprintf("SELECT *, '%s' AS `board` FROM ``posts_%s`` WHERE %s", $board['uri'], $board['uri'], $sql_like); } - + // You weren't allowed to search any boards if (empty($query)) error($config['error']['noaccess']); - + $query .= ' ORDER BY `sticky` DESC, `id` DESC'; } - + if ($type == 'IP_notes') { $query = 'SELECT * FROM ``ip_notes`` LEFT JOIN ``mods`` ON `mod` = ``mods``.`id` WHERE ' . $sql_like . ' ORDER BY `time` DESC'; $sql_table = 'ip_notes'; if (!hasPermission($config['mod']['view_notes']) || !hasPermission($config['mod']['show_ip'])) error($config['error']['noaccess']); } - + if ($type == 'bans') { $query = 'SELECT ``bans``.*, `username` FROM ``bans`` LEFT JOIN ``mods`` ON `creator` = ``mods``.`id` WHERE ' . $sql_like . ' ORDER BY (`expires` IS NOT NULL AND `expires` < UNIX_TIMESTAMP()), `created` DESC'; $sql_table = 'bans'; if (!hasPermission($config['mod']['view_banlist'])) error($config['error']['noaccess']); } - + if ($type == 'log') { $query = 'SELECT `username`, `mod`, `ip`, `board`, `time`, `text` FROM ``modlogs`` LEFT JOIN ``mods`` ON `mod` = ``mods``.`id` WHERE ' . $sql_like . ' ORDER BY `time` DESC'; $sql_table = 'modlogs'; if (!hasPermission($config['mod']['modlog'])) error($config['error']['noaccess']); } - + // Execute SQL query (with pages) $q = query($query . ' LIMIT ' . (($page_no - 1) * $config['mod']['search_page']) . ', ' . $config['mod']['search_page']) or error(db_error()); $results = $q->fetchAll(PDO::FETCH_ASSOC); - + // Get total result count if ($type == 'posts') { $q = query("SELECT COUNT(*) FROM ($query) AS `tmp_table`") or error(db_error()); @@ -320,7 +320,7 @@ function mod_search($type, $search_query_escaped, $page_no = 1) { $q = query('SELECT COUNT(*) FROM `' . $sql_table . '` WHERE ' . $sql_like) or error(db_error()); $result_count = $q->fetchColumn(); } - + if ($type == 'bans') { foreach ($results as &$ban) { $ban['mask'] = Bans::range_to_string(array($ban['ipstart'], $ban['ipend'])); @@ -328,15 +328,15 @@ function mod_search($type, $search_query_escaped, $page_no = 1) { $ban['single_addr'] = true; } } - + if ($type == 'posts') { foreach ($results as &$post) { $post['snippet'] = pm_snippet($post['body']); } } - + // $results now contains the search results - + mod_page(_('Search results'), 'mod/search_results.html', array( 'search_type' => $type, 'search_query' => $search_query, @@ -348,42 +348,42 @@ function mod_search($type, $search_query_escaped, $page_no = 1) { function mod_edit_board($boardName) { global $board, $config; - + if (!openBoard($boardName)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['manageboards'], $board['uri'])) error($config['error']['noaccess']); - + if (isset($_POST['title'], $_POST['subtitle'])) { if (isset($_POST['delete'])) { if (!hasPermission($config['mod']['manageboards'], $board['uri'])) error($config['error']['deleteboard']); - + $query = prepare('DELETE FROM ``boards`` WHERE `uri` = :uri'); $query->bindValue(':uri', $board['uri']); $query->execute() or error(db_error($query)); - + if ($config['cache']['enabled']) { cache::delete('board_' . $board['uri']); cache::delete('all_boards'); } - + modLog('Deleted board: ' . sprintf($config['board_abbreviation'], $board['uri']), false); - + // Delete posting table $query = query(sprintf('DROP TABLE IF EXISTS ``posts_%s``', $board['uri'])) or error(db_error()); - + // Clear reports $query = prepare('DELETE FROM ``reports`` WHERE `board` = :id'); $query->bindValue(':id', $board['uri'], PDO::PARAM_STR); $query->execute() or error(db_error($query)); - + // Delete from table $query = prepare('DELETE FROM ``boards`` WHERE `uri` = :uri'); $query->bindValue(':uri', $board['uri'], PDO::PARAM_STR); $query->execute() or error(db_error($query)); - + $query = prepare("SELECT `board`, `post` FROM ``cites`` WHERE `target_board` = :board ORDER BY `board`"); $query->bindValue(':board', $board['uri']); $query->execute() or error(db_error($query)); @@ -395,18 +395,18 @@ function mod_edit_board($boardName) { rebuildPost($cite['post']); } } - + if (isset($tmp_board)) $board = $tmp_board; - + $query = prepare('DELETE FROM ``cites`` WHERE `board` = :board OR `target_board` = :board'); $query->bindValue(':board', $board['uri']); $query->execute() or error(db_error($query)); - + $query = prepare('DELETE FROM ``antispam`` WHERE `board` = :board'); $query->bindValue(':board', $board['uri']); $query->execute() or error(db_error($query)); - + // Remove board from users/permissions table $query = query('SELECT `id`,`boards` FROM ``mods``') or error(db_error()); while ($user = $query->fetch(PDO::FETCH_ASSOC)) { @@ -419,7 +419,7 @@ function mod_edit_board($boardName) { $_query->execute() or error(db_error($_query)); } } - + // Delete entire board directory rrmdir($board['uri'] . '/'); } else { @@ -428,17 +428,17 @@ function mod_edit_board($boardName) { $query->bindValue(':title', $_POST['title']); $query->bindValue(':subtitle', $_POST['subtitle']); $query->execute() or error(db_error($query)); - + modLog('Edited board information for ' . sprintf($config['board_abbreviation'], $board['uri']), false); } - + if ($config['cache']['enabled']) { cache::delete('board_' . $board['uri']); cache::delete('all_boards'); } - + rebuildThemes('boards'); - + header('Location: ?/', true, $config['redirect_http']); } else { mod_page(sprintf('%s: ' . $config['board_abbreviation'], _('Edit board'), $board['uri']), 'mod/board.html', array( @@ -450,20 +450,20 @@ function mod_edit_board($boardName) { function mod_new_board() { global $config, $board; - + if (!hasPermission($config['mod']['newboard'])) error($config['error']['noaccess']); - + if (isset($_POST['uri'], $_POST['title'], $_POST['subtitle'])) { if ($_POST['uri'] == '') error(sprintf($config['error']['required'], 'URI')); - + if ($_POST['title'] == '') error(sprintf($config['error']['required'], 'title')); - + if (!preg_match('/^' . $config['board_regex'] . '$/u', $_POST['uri'])) error(sprintf($config['error']['invalidfield'], 'URI')); - + $bytes = 0; $chars = preg_split('//u', $_POST['uri'], -1, PREG_SPLIT_NO_EMPTY); foreach ($chars as $char) { @@ -475,96 +475,96 @@ function mod_new_board() { $bytes ++; } $bytes + strlen('posts_.frm'); - + if ($bytes > 255) { error('Your filesystem cannot handle a board URI of that length (' . $bytes . '/255 bytes)'); exit; } - + if (openBoard($_POST['uri'])) { error(sprintf($config['error']['boardexists'], $board['url'])); } - + $query = prepare('INSERT INTO ``boards`` VALUES (:uri, :title, :subtitle)'); $query->bindValue(':uri', $_POST['uri']); $query->bindValue(':title', $_POST['title']); $query->bindValue(':subtitle', $_POST['subtitle']); $query->execute() or error(db_error($query)); - + modLog('Created a new board: ' . sprintf($config['board_abbreviation'], $_POST['uri'])); - + if (!openBoard($_POST['uri'])) error(_("Couldn't open board after creation.")); - + $query = Element('posts.sql', array('board' => $board['uri'])); - + if (mysql_version() < 50503) $query = preg_replace('/(CHARSET=|CHARACTER SET )utf8mb4/', '$1utf8', $query); - + query($query) or error(db_error()); - + if ($config['cache']['enabled']) cache::delete('all_boards'); - + // Build the board buildIndex(); - + rebuildThemes('boards'); - + header('Location: ?/' . $board['uri'] . '/' . $config['file_index'], true, $config['redirect_http']); } - + mod_page(_('New board'), 'mod/board.html', array('new' => true, 'token' => make_secure_link_token('new-board'))); } function mod_noticeboard($page_no = 1) { global $config, $pdo, $mod; - + if ($page_no < 1) error($config['error']['404']); - + if (!hasPermission($config['mod']['noticeboard'])) error($config['error']['noaccess']); - + if (isset($_POST['subject'], $_POST['body'])) { if (!hasPermission($config['mod']['noticeboard_post'])) error($config['error']['noaccess']); - + $_POST['body'] = escape_markup_modifiers($_POST['body']); markup($_POST['body']); - + $query = prepare('INSERT INTO ``noticeboard`` VALUES (NULL, :mod, :time, :subject, :body)'); $query->bindValue(':mod', $mod['id']); $query->bindvalue(':time', time()); $query->bindValue(':subject', $_POST['subject']); $query->bindValue(':body', $_POST['body']); $query->execute() or error(db_error($query)); - + if ($config['cache']['enabled']) cache::delete('noticeboard_preview'); - + modLog('Posted a noticeboard entry'); - + header('Location: ?/noticeboard#' . $pdo->lastInsertId(), true, $config['redirect_http']); } - + $query = prepare("SELECT ``noticeboard``.*, `username` FROM ``noticeboard`` LEFT JOIN ``mods`` ON ``mods``.`id` = `mod` ORDER BY `id` DESC LIMIT :offset, :limit"); $query->bindValue(':limit', $config['mod']['noticeboard_page'], PDO::PARAM_INT); $query->bindValue(':offset', ($page_no - 1) * $config['mod']['noticeboard_page'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); $noticeboard = $query->fetchAll(PDO::FETCH_ASSOC); - + if (empty($noticeboard) && $page_no > 1) error($config['error']['404']); - + foreach ($noticeboard as &$entry) { $entry['delete_token'] = make_secure_link_token('noticeboard/delete/' . $entry['id']); } - + $query = prepare("SELECT COUNT(*) FROM ``noticeboard``"); $query->execute() or error(db_error($query)); $count = $query->fetchColumn(); - + mod_page(_('Noticeboard'), 'mod/noticeboard.html', array( 'noticeboard' => $noticeboard, 'count' => $count, @@ -574,175 +574,182 @@ function mod_noticeboard($page_no = 1) { function mod_noticeboard_delete($id) { global $config; - + if (!hasPermission($config['mod']['noticeboard_delete'])) error($config['error']['noaccess']); - + $query = prepare('DELETE FROM ``noticeboard`` WHERE `id` = :id'); $query->bindValue(':id', $id); $query->execute() or error(db_error($query)); - + modLog('Deleted a noticeboard entry'); - + if ($config['cache']['enabled']) cache::delete('noticeboard_preview'); - + header('Location: ?/noticeboard', true, $config['redirect_http']); } function mod_news($page_no = 1) { global $config, $pdo, $mod; - + if ($page_no < 1) error($config['error']['404']); - + if (isset($_POST['subject'], $_POST['body'])) { if (!hasPermission($config['mod']['news'])) error($config['error']['noaccess']); - + $_POST['body'] = escape_markup_modifiers($_POST['body']); markup($_POST['body']); - + $query = prepare('INSERT INTO ``news`` VALUES (NULL, :name, :time, :subject, :body)'); $query->bindValue(':name', isset($_POST['name']) && hasPermission($config['mod']['news_custom']) ? $_POST['name'] : $mod['username']); $query->bindvalue(':time', time()); $query->bindValue(':subject', $_POST['subject']); $query->bindValue(':body', $_POST['body']); $query->execute() or error(db_error($query)); - + modLog('Posted a news entry'); - + rebuildThemes('news'); - + header('Location: ?/edit_news#' . $pdo->lastInsertId(), true, $config['redirect_http']); } - + $query = prepare("SELECT * FROM ``news`` ORDER BY `id` DESC LIMIT :offset, :limit"); $query->bindValue(':limit', $config['mod']['news_page'], PDO::PARAM_INT); $query->bindValue(':offset', ($page_no - 1) * $config['mod']['news_page'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); $news = $query->fetchAll(PDO::FETCH_ASSOC); - + if (empty($news) && $page_no > 1) error($config['error']['404']); - + foreach ($news as &$entry) { $entry['delete_token'] = make_secure_link_token('edit_news/delete/' . $entry['id']); } - + $query = prepare("SELECT COUNT(*) FROM ``news``"); $query->execute() or error(db_error($query)); $count = $query->fetchColumn(); - + mod_page(_('News'), 'mod/news.html', array('news' => $news, 'count' => $count, 'token' => make_secure_link_token('edit_news'))); } function mod_news_delete($id) { global $config; - + if (!hasPermission($config['mod']['news_delete'])) error($config['error']['noaccess']); - + $query = prepare('DELETE FROM ``news`` WHERE `id` = :id'); $query->bindValue(':id', $id); $query->execute() or error(db_error($query)); - + modLog('Deleted a news entry'); - + header('Location: ?/edit_news', true, $config['redirect_http']); } function mod_log($page_no = 1) { global $config; - + if ($page_no < 1) error($config['error']['404']); - + if (!hasPermission($config['mod']['modlog'])) error($config['error']['noaccess']); - + $query = prepare("SELECT `username`, `mod`, `ip`, `board`, `time`, `text` FROM ``modlogs`` LEFT JOIN ``mods`` ON `mod` = ``mods``.`id` ORDER BY `time` DESC LIMIT :offset, :limit"); $query->bindValue(':limit', $config['mod']['modlog_page'], PDO::PARAM_INT); $query->bindValue(':offset', ($page_no - 1) * $config['mod']['modlog_page'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); $logs = $query->fetchAll(PDO::FETCH_ASSOC); - + if (empty($logs) && $page_no > 1) error($config['error']['404']); - + $query = prepare("SELECT COUNT(*) FROM ``modlogs``"); $query->execute() or error(db_error($query)); $count = $query->fetchColumn(); - + mod_page(_('Moderation log'), 'mod/log.html', array('logs' => $logs, 'count' => $count)); } function mod_user_log($username, $page_no = 1) { global $config; - + if ($page_no < 1) error($config['error']['404']); - + if (!hasPermission($config['mod']['modlog'])) error($config['error']['noaccess']); - + $query = prepare("SELECT `username`, `mod`, `ip`, `board`, `time`, `text` FROM ``modlogs`` LEFT JOIN ``mods`` ON `mod` = ``mods``.`id` WHERE `username` = :username ORDER BY `time` DESC LIMIT :offset, :limit"); $query->bindValue(':username', $username); $query->bindValue(':limit', $config['mod']['modlog_page'], PDO::PARAM_INT); $query->bindValue(':offset', ($page_no - 1) * $config['mod']['modlog_page'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); $logs = $query->fetchAll(PDO::FETCH_ASSOC); - + if (empty($logs) && $page_no > 1) error($config['error']['404']); - + $query = prepare("SELECT COUNT(*) FROM ``modlogs`` LEFT JOIN ``mods`` ON `mod` = ``mods``.`id` WHERE `username` = :username"); $query->bindValue(':username', $username); $query->execute() or error(db_error($query)); $count = $query->fetchColumn(); - + mod_page(_('Moderation log'), 'mod/log.html', array('logs' => $logs, 'count' => $count, 'username' => $username)); } +function protect_ip($entry) { + $ipv4_regex = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'; + $ipv6_regex = '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))'; + + $ipv4_link_regex = '/(?:)?(' . $ipv4_regex . ')(?:<\/a>)?/'; + $ipv6_link_regex = '/(?:)?(' . $ipv6_regex . ')(?:<\/a>)?/'; + + return preg_replace(array($ipv4_link_regex, $ipv6_link_regex), "xxxx", $entry); +} + function mod_board_log($board, $page_no = 1, $hide_names = false, $public = false) { global $config; - + if ($page_no < 1) error($config['error']['404']); - + if (!hasPermission($config['mod']['mod_board_log'], $board) && !$public) error($config['error']['noaccess']); - + $query = prepare("SELECT `username`, `mod`, `ip`, `board`, `time`, `text` FROM ``modlogs`` LEFT JOIN ``mods`` ON `mod` = ``mods``.`id` WHERE `board` = :board ORDER BY `time` DESC LIMIT :offset, :limit"); $query->bindValue(':board', $board); $query->bindValue(':limit', $config['mod']['modlog_page'], PDO::PARAM_INT); $query->bindValue(':offset', ($page_no - 1) * $config['mod']['modlog_page'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); $logs = $query->fetchAll(PDO::FETCH_ASSOC); - + if (empty($logs) && $page_no > 1) error($config['error']['404']); if (!hasPermission($config['mod']['show_ip'])) { - // Supports ipv4 only! foreach ($logs as $i => &$log) { - $log['text'] = preg_replace_callback('/(?:)?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:<\/a>)?/', function($matches) { - return "xxxx";//less_ip($matches[1]); - }, $log['text']); + $log['text'] = protect_ip($log['text']); } } - + $query = prepare("SELECT COUNT(*) FROM ``modlogs`` LEFT JOIN ``mods`` ON `mod` = ``mods``.`id` WHERE `board` = :board"); $query->bindValue(':board', $board); $query->execute() or error(db_error($query)); $count = $query->fetchColumn(); - + mod_page(_('Board log'), 'mod/log.html', array('logs' => $logs, 'count' => $count, 'board' => $board, 'hide_names' => $hide_names, 'public' => $public)); } function mod_view_board($boardName, $page_no = 1) { global $config, $mod; - + if (!openBoard($boardName)){ if (in_array($boardName,array_keys($config['overboards']))){ $type = $config['overboards'][$boardName]['type']; @@ -773,79 +780,79 @@ function mod_view_board($boardName, $page_no = 1) { error($config['error']['noboard']); } } - + if (!$page = index($page_no, $mod)) { error($config['error']['404']); } - + $page['pages'] = getPages(true); $page['pages'][$page_no-1]['selected'] = true; $page['btn'] = getPageButtons($page['pages'], true); $page['mod'] = true; $page['config'] = $config; - + echo Element('index.html', $page); } function mod_view_thread($boardName, $thread) { global $config, $mod; - + if (!openBoard($boardName)) error($config['error']['noboard']); - + $page = buildThread($thread, true, $mod); echo $page; } function mod_view_thread50($boardName, $thread) { global $config, $mod; - + if (!openBoard($boardName)) error($config['error']['noboard']); - + $page = buildThread50($thread, true, $mod); echo $page; } function mod_ip_remove_note($ip, $id) { global $config, $mod; - + if (!hasPermission($config['mod']['remove_notes'])) error($config['error']['noaccess']); - + if (filter_var($ip, FILTER_VALIDATE_IP) === false) error("Invalid IP address."); - + $query = prepare('DELETE FROM ``ip_notes`` WHERE `ip` = :ip AND `id` = :id'); $query->bindValue(':ip', $ip); $query->bindValue(':id', $id); $query->execute() or error(db_error($query)); - + modLog("Removed a note for {$ip}"); - + header('Location: ?/IP/' . $ip . '#notes', true, $config['redirect_http']); } function mod_page_ip($ip) { global $config, $mod; - + if (filter_var($ip, FILTER_VALIDATE_IP) === false) error("Invalid IP address."); - + if (isset($_POST['ban_id'], $_POST['unban'])) { if (!hasPermission($config['mod']['unban'])) error($config['error']['noaccess']); - + Bans::delete($_POST['ban_id'], true, $mod['boards']); - + header('Location: ?/IP/' . $ip . '#bans', true, $config['redirect_http']); return; } - + if (isset($_POST['note'])) { if (!hasPermission($config['mod']['create_notes'])) error($config['error']['noaccess']); - + $_POST['note'] = escape_markup_modifiers($_POST['note']); markup($_POST['note']); $query = prepare('INSERT INTO ``ip_notes`` VALUES (NULL, :ip, :mod, :time, :body)'); @@ -854,20 +861,20 @@ function mod_page_ip($ip) { $query->bindValue(':time', time()); $query->bindValue(':body', $_POST['note']); $query->execute() or error(db_error($query)); - + modLog("Added a note for {$ip}"); - + header('Location: ?/IP/' . $ip . '#notes', true, $config['redirect_http']); return; } - + $args = array(); $args['ip'] = $ip; $args['posts'] = array(); - + if ($config['mod']['dns_lookup']) $args['hostname'] = rDNS($ip); - + $boards = listBoards(); foreach ($boards as $board) { openBoard($board['uri']); @@ -877,34 +884,34 @@ function mod_page_ip($ip) { $query->bindValue(':ip', $ip); $query->bindValue(':limit', $config['mod']['ip_recentposts'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); - + while ($post = $query->fetch(PDO::FETCH_ASSOC)) { if (!$post['thread']) { $po = new Thread($post, '?/', $mod, false); } else { $po = new Post($post, '?/', $mod); } - + if (!isset($args['posts'][$board['uri']])) $args['posts'][$board['uri']] = array('board' => $board, 'posts' => array()); $args['posts'][$board['uri']]['posts'][] = $po->build(true); } } - + $args['boards'] = $boards; $args['token'] = make_secure_link_token('ban'); - + if (hasPermission($config['mod']['view_ban'])) { $args['bans'] = Bans::find($ip, false, true); } - + if (hasPermission($config['mod']['view_notes'])) { $query = prepare("SELECT ``ip_notes``.*, `username` FROM ``ip_notes`` LEFT JOIN ``mods`` ON `mod` = ``mods``.`id` WHERE `ip` = :ip ORDER BY `time` DESC"); $query->bindValue(':ip', $ip); $query->execute() or error(db_error($query)); $args['notes'] = $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', '%' . $ip . '%'); @@ -913,25 +920,25 @@ function mod_page_ip($ip) { } else { $args['logs'] = array(); } - + $args['security_token'] = make_secure_link_token('IP/' . $ip); - + mod_page(sprintf('%s: %s', _('IP'), htmlspecialchars($ip)), 'mod/view_ip.html', $args, $args['hostname']); } function mod_ban() { global $config; - + if (!hasPermission($config['mod']['ban'])) error($config['error']['noaccess']); - + if (!isset($_POST['ip'], $_POST['reason'], $_POST['length'], $_POST['board'])) { mod_page(_('New ban'), 'mod/ban_form.html', array('token' => make_secure_link_token('ban'))); return; } - + require_once 'inc/mod/ban.php'; - + Bans::new_ban($_POST['ip'], $_POST['reason'], $_POST['length'], $_POST['board'] == '*' ? false : $_POST['board']); if (isset($_POST['redirect'])) @@ -942,15 +949,15 @@ function mod_ban() { function mod_warning() { global $config; - + if (!hasPermission($config['mod']['warning'])) error($config['error']['noaccess']); - + if (!isset( $_POST['board'])) { mod_page(_('New warning'), 'mod/warning_form.html', array('token' => make_secure_link_token('ban'))); return; } - + if (isset($_POST['redirect'])) header('Location: ' . $_POST['redirect'], true, $config['redirect_http']); else @@ -960,14 +967,14 @@ function mod_warning() { function mod_bans() { global $config; global $mod; - + if (!hasPermission($config['mod']['view_banlist'])) error($config['error']['noaccess']); - + if (isset($_POST['unban'])) { if (!hasPermission($config['mod']['unban'])) error($config['error']['noaccess']); - + $unban = array(); foreach ($_POST as $name => $unused) { if (preg_match('/^ban_(\d+)$/', $name, $match)) @@ -975,7 +982,7 @@ function mod_bans() { } if (isset($config['mod']['unban_limit']) && $config['mod']['unban_limit'] && count($unban) > $config['mod']['unban_limit']) error(sprintf($config['error']['toomanyunban'], $config['mod']['unban_limit'], count($unban))); - + foreach ($unban as $id) { Bans::delete($id, true, $mod['boards'], true); } @@ -983,7 +990,7 @@ function mod_bans() { header('Location: ?/bans', true, $config['redirect_http']); return; } - + mod_page(_('Ban list'), 'mod/ban_list.html', array( 'mod' => $mod, 'boards' => json_encode($mod['boards']), @@ -1006,27 +1013,27 @@ function mod_bans_json() { function mod_ban_appeals() { global $config, $board; - + if (!hasPermission($config['mod']['view_ban_appeals'])) error($config['error']['noaccess']); - + // Remove stale ban appeals query("DELETE FROM ``ban_appeals`` WHERE NOT EXISTS (SELECT 1 FROM ``bans`` WHERE `ban_id` = ``bans``.`id`)") or error(db_error()); - + if (isset($_POST['appeal_id']) && (isset($_POST['unban']) || isset($_POST['deny']))) { if (!hasPermission($config['mod']['ban_appeals'])) error($config['error']['noaccess']); - + $query = query("SELECT *, ``ban_appeals``.`id` AS `id` FROM ``ban_appeals`` LEFT JOIN ``bans`` ON `ban_id` = ``bans``.`id` WHERE ``ban_appeals``.`id` = " . (int)$_POST['appeal_id']) or error(db_error()); if (!$ban = $query->fetch(PDO::FETCH_ASSOC)) { error(_('Ban appeal not found!')); } - + $ban['mask'] = Bans::range_to_string(array($ban['ipstart'], $ban['ipend'])); - + if (isset($_POST['unban'])) { modLog('Accepted ban appeal #' . $ban['id'] . ' for ' . $ban['mask']); Bans::delete($ban['ban_id'], true); @@ -1035,11 +1042,11 @@ function mod_ban_appeals() { modLog('Denied ban appeal #' . $ban['id'] . ' for ' . $ban['mask']); query("UPDATE ``ban_appeals`` SET `denied` = 1 WHERE `id` = " . $ban['id']) or error(db_error()); } - + header('Location: ?/ban-appeals', true, $config['redirect_http']); return; } - + $query = query("SELECT *, ``ban_appeals``.`id` AS `id` FROM ``ban_appeals`` LEFT JOIN ``bans`` ON `ban_id` = ``bans``.`id` LEFT JOIN ``mods`` ON ``bans``.`creator` = ``mods``.`id` @@ -1049,7 +1056,7 @@ function mod_ban_appeals() { if ($ban['post']) $ban['post'] = json_decode($ban['post'], true); $ban['mask'] = Bans::range_to_string(array($ban['ipstart'], $ban['ipend'])); - + if ($ban['post'] && isset($ban['post']['board'], $ban['post']['id'])) { if (openBoard($ban['post']['board'])) { $query = query(sprintf("SELECT `num_files`, `files` FROM ``posts_%s`` WHERE `id` = " . @@ -1069,7 +1076,7 @@ function mod_ban_appeals() { $ban['post']['files'][0]['thumb'] = false; $ban['post']['num_files'] = 1; } - + if ($ban['post']['thread']) { $ban['post'] = new Post($ban['post']); } else { @@ -1086,13 +1093,13 @@ function mod_ban_appeals() { function mod_lock($board, $unlock, $post) { global $config; - + if (!openBoard($board)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['lock'], $board)) error($config['error']['noaccess']); - + $query = prepare(sprintf('UPDATE ``posts_%s`` SET `locked` = :locked WHERE `id` = :id AND `thread` IS NULL', $board)); $query->bindValue(':id', $post); $query->bindValue(':locked', $unlock ? 0 : 1); @@ -1104,16 +1111,16 @@ function mod_lock($board, $unlock, $post) { // trigger themes rebuildThemes('lock', $board); } - + if ($config['mod']['dismiss_reports_on_lock']) { $query = prepare('DELETE FROM ``reports`` WHERE `board` = :board AND `post` = :id'); $query->bindValue(':board', $board); $query->bindValue(':id', $post); $query->execute() or error(db_error($query)); } - + header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); - + if ($unlock) event('unlock', $post); else @@ -1122,13 +1129,13 @@ function mod_lock($board, $unlock, $post) { function mod_sticky($board, $unsticky, $post) { global $config; - + if (!openBoard($board)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['sticky'], $board)) error($config['error']['noaccess']); - + $query = prepare(sprintf('UPDATE ``posts_%s`` SET `sticky` = :sticky WHERE `id` = :id AND `thread` IS NULL', $board)); $query->bindValue(':id', $post); $query->bindValue(':sticky', $unsticky ? 0 : 1); @@ -1140,19 +1147,19 @@ function mod_sticky($board, $unsticky, $post) { // trigger themes rebuildThemes('sticky', $board); } - + header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); } function mod_cycle($board, $uncycle, $post) { global $config; - + if (!openBoard($board)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['cycle'], $board)) error($config['error']['noaccess']); - + $query = prepare(sprintf('UPDATE ``posts_%s`` SET `cycle` = :cycle WHERE `id` = :id AND `thread` IS NULL', $board)); $query->bindValue(':id', $post); $query->bindValue(':cycle', $uncycle ? 0 : 1); @@ -1162,19 +1169,19 @@ function mod_cycle($board, $uncycle, $post) { buildThread($post); buildIndex(); } - + header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); } function mod_bumplock($board, $unbumplock, $post) { global $config; - + if (!openBoard($board)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['bumplock'], $board)) error($config['error']['noaccess']); - + $query = prepare(sprintf('UPDATE ``posts_%s`` SET `sage` = :bumplock WHERE `id` = :id AND `thread` IS NULL', $board)); $query->bindValue(':id', $post); $query->bindValue(':bumplock', $unbumplock ? 0 : 1); @@ -1184,16 +1191,16 @@ function mod_bumplock($board, $unbumplock, $post) { buildThread($post); buildIndex(); } - + header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); } -function mod_move_reply($originBoard, $postID) { +function mod_move_reply($originBoard, $postID) { global $board, $config, $mod; if (!openBoard($originBoard)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['move'], $originBoard)) error($config['error']['noaccess']); @@ -1216,7 +1223,7 @@ function mod_move_reply($originBoard, $postID) { else { $post['op'] = true; } - + if ($post['files']) { $post['files'] = json_decode($post['files'], TRUE); $post['has_file'] = true; @@ -1227,16 +1234,16 @@ function mod_move_reply($originBoard, $postID) { } else { $post['has_file'] = false; } - + // allow thread to keep its same traits (stickied, locked, etc.) $post['mod'] = true; - + if (!openBoard($targetBoard)) error($config['error']['noboard']); - - // create the new post + + // create the new post $newID = post($post); - + if ($post['has_file']) { foreach ($post['files'] as $i => &$file) { // move the image @@ -1252,12 +1259,12 @@ function mod_move_reply($originBoard, $postID) { // build new thread buildThread($post['op'] ? $newID : $post['thread']); - + // trigger themes rebuildThemes('post', $targetBoard); // mod log modLog("Moved post #${postID} to " . sprintf($config['board_abbreviation'], $targetBoard) . " (#${newID})", $originBoard); - + // return to original board openBoard($originBoard); @@ -1280,9 +1287,9 @@ function mod_move_reply($originBoard, $postID) { else { $boards = listBoards(); - + $security_token = make_secure_link_token($originBoard . '/move_reply/' . $postID); - + mod_page(_('Move reply'), 'mod/move_reply.html', array('post' => $postID, 'board' => $originBoard, 'boards' => $boards, 'token' => $security_token)); } @@ -1291,37 +1298,37 @@ function mod_move_reply($originBoard, $postID) { function mod_move($originBoard, $postID) { global $board, $config, $mod, $pdo; - + if (!openBoard($originBoard)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['move'], $originBoard)) error($config['error']['noaccess']); - + $query = prepare(sprintf('SELECT * FROM ``posts_%s`` WHERE `id` = :id AND `thread` IS NULL', $originBoard)); $query->bindValue(':id', $postID); $query->execute() or error(db_error($query)); if (!$post = $query->fetch(PDO::FETCH_ASSOC)) error($config['error']['404']); - + if (isset($_POST['board'])) { $targetBoard = $_POST['board']; $shadow = isset($_POST['shadow']); - + if ($targetBoard === $originBoard) error(_('Target and source board are the same.')); - + // copy() if leaving a shadow thread behind; else, rename(). $clone = $shadow ? 'copy' : 'rename'; - + // indicate that the post is a thread $post['op'] = true; - + if ($post['files']) { $post['files'] = json_decode($post['files'], TRUE); $post['has_file'] = true; foreach ($post['files'] as $i => &$file) { - if ($file['file'] === 'deleted') + if ($file['file'] === 'deleted') continue; $file['file_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file']; $file['thumb_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb']; @@ -1329,42 +1336,42 @@ function mod_move($originBoard, $postID) { } else { $post['has_file'] = false; } - + // allow thread to keep its same traits (stickied, locked, etc.) $post['mod'] = true; - + if (!openBoard($targetBoard)) error($config['error']['noboard']); - + // create the new thread $newID = post($post); - + $op = $post; $op['id'] = $newID; - + if ($post['has_file']) { // copy image foreach ($post['files'] as $i => &$file) { - if ($file['file'] !== 'deleted') + if ($file['file'] !== 'deleted') $clone($file['file_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file']); if (isset($file['thumb']) && !in_array($file['thumb'], array('spoiler', 'deleted', 'file'))) $clone($file['thumb_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb']); } } - + // go back to the original board to fetch replies openBoard($originBoard); - + $query = prepare(sprintf('SELECT * FROM ``posts_%s`` WHERE `thread` = :id ORDER BY `id`', $originBoard)); $query->bindValue(':id', $postID, PDO::PARAM_INT); $query->execute() or error(db_error($query)); - + $replies = array(); - + while ($post = $query->fetch(PDO::FETCH_ASSOC)) { $post['mod'] = true; $post['thread'] = $newID; - + if ($post['files']) { $post['files'] = json_decode($post['files'], TRUE); $post['has_file'] = true; @@ -1375,20 +1382,20 @@ function mod_move($originBoard, $postID) { } else { $post['has_file'] = false; } - + $replies[] = $post; } - + $newIDs = array($postID => $newID); - + openBoard($targetBoard); - + foreach ($replies as &$post) { $query = prepare('SELECT `target` FROM ``cites`` WHERE `target_board` = :board AND `board` = :board AND `post` = :post'); $query->bindValue(':board', $originBoard); $query->bindValue(':post', $post['id'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); - + // correct >>X links while ($cite = $query->fetch(PDO::FETCH_ASSOC)) { if (isset($newIDs[$cite['target']])) { @@ -1396,16 +1403,16 @@ function mod_move($originBoard, $postID) { '/(>>(>\/' . preg_quote($originBoard, '/') . '\/)?)' . preg_quote($cite['target'], '/') . '/', '>>' . $newIDs[$cite['target']], $post['body_nomarkup']); - + $post['body'] = $post['body_nomarkup']; } } - + $post['body'] = $post['body_nomarkup']; - + $post['op'] = false; $post['tracked_cites'] = markup($post['body'], true); - + if ($post['has_file']) { // copy image foreach ($post['files'] as $i => &$file) { @@ -1415,8 +1422,8 @@ function mod_move($originBoard, $postID) { } // insert reply $newIDs[$post['id']] = $newPostID = post($post); - - + + if (!empty($post['tracked_cites'])) { $insert_rows = array(); foreach ($post['tracked_cites'] as $cite) { @@ -1427,29 +1434,29 @@ function mod_move($originBoard, $postID) { query('INSERT INTO ``cites`` VALUES ' . implode(', ', $insert_rows)) or error(db_error()); } } - + modLog("Moved thread #${postID} to " . sprintf($config['board_abbreviation'], $targetBoard) . " (#${newID})", $originBoard); - + // build new thread buildThread($newID); - + clean(); buildIndex(); - + // trigger themes rebuildThemes('post', $targetBoard); - + $newboard = $board; // return to original board openBoard($originBoard); - + if ($shadow) { // lock old thread $query = prepare(sprintf('UPDATE ``posts_%s`` SET `locked` = 1 WHERE `id` = :id', $originBoard)); $query->bindValue(':id', $postID, PDO::PARAM_INT); $query->execute() or error(db_error($query)); - + // leave a reply, linking to the new thread $spost = array( 'mod' => true, @@ -1466,62 +1473,62 @@ function mod_move($originBoard, $postID) { ); $spost['body'] = $spost['body_nomarkup'] = sprintf($config['mod']['shadow_mesage'], '>>>/' . $targetBoard . '/' . $newID); - + markup($spost['body']); - + $botID = post($spost); buildThread($postID); - + buildIndex(); - + header('Location: ?/' . sprintf($config['board_path'], $newboard['uri']) . $config['dir']['res'] . link_for($op, false, $newboard) . '#' . $botID, true, $config['redirect_http']); } else { deletePost($postID); buildIndex(); - + openBoard($targetBoard); header('Location: ?/' . sprintf($config['board_path'], $newboard['uri']) . $config['dir']['res'] . link_for($op, false, $newboard), true, $config['redirect_http']); } } - + $boards = listBoards(); if (count($boards) <= 1) error(_('Impossible to move thread; there is only one board.')); - + $security_token = make_secure_link_token($originBoard . '/move/' . $postID); - + mod_page(_('Move thread'), 'mod/move.html', array('post' => $postID, 'board' => $originBoard, 'boards' => $boards, 'token' => $security_token)); } function mod_merge($originBoard, $postID) { global $board, $config, $mod, $pdo; - + if (!openBoard($originBoard)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['merge'], $originBoard)) error($config['error']['noaccess']); - + $query = prepare(sprintf('SELECT * FROM ``posts_%s`` WHERE `id` = :id AND `thread` IS NULL', $originBoard)); $query->bindValue(':id', $postID); $query->execute() or error(db_error($query)); if (!$post = $query->fetch(PDO::FETCH_ASSOC)) error($config['error']['404']); - $sourceOp = ""; + $sourceOp = ""; if ($post['thread']){ - $sourceOp = $post['thread']; + $sourceOp = $post['thread']; } else{ - $sourceOp = $post['id']; - } - $newpost = ""; + $sourceOp = $post['id']; + } + $newpost = ""; $boards = listBoards(); - + if (isset($_POST['board'])) { $targetBoard = $_POST['board']; $shadow = isset($_POST['shadow']); - $targetOp = ""; + $targetOp = ""; if ($_POST['target_thread']) { $query = prepare(sprintf('SELECT * FROM ``posts_%s`` WHERE `id` = :id', $targetBoard)); $query->bindValue(':id', $_POST['target_thread']); @@ -1532,14 +1539,14 @@ function mod_merge($originBoard, $postID) { else { if ($newpost['thread']){ - $targetOp = $newpost['thread']; + $targetOp = $newpost['thread']; } else{ - $targetOp = $newpost['id']; - } + $targetOp = $newpost['id']; + } } } - + if ($targetBoard === $originBoard){ // Just update the thread id for all posts in the original thread to new op $query = prepare(sprintf('UPDATE ``posts_%s`` SET `thread` = :newthread WHERE `id` = :oldthread OR `thread` = :oldthread', $originBoard)); @@ -1557,7 +1564,7 @@ function mod_merge($originBoard, $postID) { // build new thread buildThread($targetOp); - + // trigger themes rebuildThemes('post', $targetBoard); modLog("Merged thread with #${sourceOp} to " . sprintf($config['board_abbreviation'], $targetBoard) . " (#${targetOp})", $originBoard); @@ -1566,17 +1573,17 @@ function mod_merge($originBoard, $postID) { header('Location: ?/' . sprintf($config['board_path'], $board['uri']) . $config['dir']['res'] . link_for($newpost) . '#' . $targetOp, true, $config['redirect_http']); } else { - // Move thread to new board without shadow thread and then update the thread id for all posts in that thread to new op + // Move thread to new board without shadow thread and then update the thread id for all posts in that thread to new op // indicate that the post is a thread if (count($boards) <= 1) error(_('Impossible to merge thread to different board; there is only one board.')); $post['op'] = true; - + if ($post['files']) { $post['files'] = json_decode($post['files'], TRUE); $post['has_file'] = true; foreach ($post['files'] as $i => &$file) { - if ($file['file'] === 'deleted') + if ($file['file'] === 'deleted') continue; $file['file_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file']; $file['thumb_path'] = sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb']; @@ -1584,44 +1591,44 @@ function mod_merge($originBoard, $postID) { } else { $post['has_file'] = false; } - + // allow thread to keep its same traits (stickied, locked, etc.) $post['mod'] = true; - + if (!openBoard($targetBoard)) error($config['error']['noboard']); - + // create the new thread $newID = post($post); - + $op = $post; $op['id'] = $newID; - + $clone = $shadow ? 'copy' : 'rename'; - + if ($post['has_file']) { // copy image foreach ($post['files'] as $i => &$file) { - if ($file['file'] !== 'deleted') + if ($file['file'] !== 'deleted') $clone($file['file_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['img'] . $file['file']); if (isset($file['thumb']) && !in_array($file['thumb'], array('spoiler', 'deleted', 'file'))) $clone($file['thumb_path'], sprintf($config['board_path'], $board['uri']) . $config['dir']['thumb'] . $file['thumb']); } } - + // go back to the original board to fetch replies openBoard($originBoard); - + $query = prepare(sprintf('SELECT * FROM ``posts_%s`` WHERE `thread` = :id ORDER BY `id`', $originBoard)); $query->bindValue(':id', $postID, PDO::PARAM_INT); $query->execute() or error(db_error($query)); - + $replies = array(); - + while ($post = $query->fetch(PDO::FETCH_ASSOC)) { $post['mod'] = true; $post['thread'] = $newID; - + if ($post['files']) { $post['files'] = json_decode($post['files'], TRUE); $post['has_file'] = true; @@ -1632,20 +1639,20 @@ function mod_merge($originBoard, $postID) { } else { $post['has_file'] = false; } - + $replies[] = $post; } - + $newIDs = array($postID => $newID); - + openBoard($targetBoard); - + foreach ($replies as &$post) { $query = prepare('SELECT `target` FROM ``cites`` WHERE `target_board` = :board AND `board` = :board AND `post` = :post'); $query->bindValue(':board', $originBoard); $query->bindValue(':post', $post['id'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); - + // correct >>X links while ($cite = $query->fetch(PDO::FETCH_ASSOC)) { if (isset($newIDs[$cite['target']])) { @@ -1653,16 +1660,16 @@ function mod_merge($originBoard, $postID) { '/(>>(>\/' . preg_quote($originBoard, '/') . '\/)?)' . preg_quote($cite['target'], '/') . '/', '>>' . $newIDs[$cite['target']], $post['body_nomarkup']); - + $post['body'] = $post['body_nomarkup']; } } - + $post['body'] = $post['body_nomarkup']; - + $post['op'] = false; $post['tracked_cites'] = markup($post['body'], true); - + if ($post['has_file']) { // copy image foreach ($post['files'] as $i => &$file) { @@ -1672,8 +1679,8 @@ function mod_merge($originBoard, $postID) { } // insert reply $newIDs[$post['id']] = $newPostID = post($post); - - + + if (!empty($post['tracked_cites'])) { $insert_rows = array(); foreach ($post['tracked_cites'] as $cite) { @@ -1684,27 +1691,27 @@ function mod_merge($originBoard, $postID) { query('INSERT INTO ``cites`` VALUES ' . implode(', ', $insert_rows)) or error(db_error()); } } - + modLog("Moved thread #${postID} to " . sprintf($config['board_abbreviation'], $targetBoard) . " (#${newID})", $originBoard); - + // build new thread buildThread($newID); - + clean(); buildIndex(); - + // trigger themes rebuildThemes('post', $targetBoard); - + $newboard = $board; // return to original board openBoard($originBoard); - + deletePost($postID); modLog("Deleted post #{$postID}"); buildIndex(); - + openBoard($targetBoard); // Just update the thread id for all posts in the original thread to new op $query = prepare(sprintf('UPDATE ``posts_%s`` SET `thread` = :newthread WHERE `id` = :oldthread OR `thread` = :oldthread', $targetBoard)); @@ -1716,51 +1723,51 @@ function mod_merge($originBoard, $postID) { // build new thread buildThread($targetOp); - + // trigger themes rebuildThemes('post', $targetBoard); modLog("Merged thread with #${newID} to " . sprintf($config['board_abbreviation'], $targetBoard) . " (#${targetOp})", $targetBoard); // redirect header('Location: ?/' . sprintf($config['board_path'], $board['uri']) . $config['dir']['res'] . link_for($newpost) . '#' . $targetOp, true, $config['redirect_http']); - } + } } - + $security_token = make_secure_link_token($originBoard . '/merge/' . $postID); - + mod_page(_('Merge thread'), 'mod/merge.html', array('post' => $postID, 'board' => $originBoard, 'boards' => $boards, 'token' => $security_token)); } function mod_ban_post($board, $delete, $post, $token = false) { global $config, $mod; - + if (!openBoard($board)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['delete'], $board)) error($config['error']['noaccess']); - + $security_token = make_secure_link_token($board . '/ban/' . $post); - + $query = prepare(sprintf('SELECT ' . ($config['ban_show_post'] ? '*' : '`ip`, `thread`') . ' FROM ``posts_%s`` WHERE `id` = :id', $board)); $query->bindValue(':id', $post); $query->execute() or error(db_error($query)); if (!$_post = $query->fetch(PDO::FETCH_ASSOC)) error($config['error']['404']); - + $thread = $_post['thread']; $ip = $_post['ip']; if (isset($_POST['new_ban'], $_POST['reason'], $_POST['length'], $_POST['board'])) { require_once 'inc/mod/ban.php'; - + if (isset($_POST['ip'])) $ip = $_POST['ip']; - + Bans::new_ban($_POST['ip'], $_POST['reason'], $_POST['length'], $_POST['board'] == '*' ? false : $_POST['board'], false, $config['ban_show_post'] ? $_post : false); - + if (isset($_POST['public_message'], $_POST['message'])) { // public ban message $length_english = Bans::parse_time($_POST['length']) ? 'for ' . until(Bans::parse_time($_POST['length'])) : 'permanently'; @@ -1772,7 +1779,7 @@ function mod_ban_post($board, $delete, $post, $token = false) { $query->bindValue(':body_nomarkup', sprintf("\n%s", utf8tohtml($_POST['message']))); $query->execute() or error(db_error($query)); rebuildPost($post); - + modLog("Attached a public ban message to post #{$post}: " . utf8tohtml($_POST['message'])); buildThread($thread ? $thread : $post); buildIndex(); @@ -1801,11 +1808,11 @@ function mod_ban_post($board, $delete, $post, $token = false) { for ($file_count = 0; $file_count < $mypost["num_files"];$file_count++){ $filename .= $mypost['files'][$file_count]->name . "\r\n"; } - } - if ($time !== ''){ - $dt = new DateTime("@$time"); + } + if ($time !== ''){ + $dt = new DateTime("@$time"); $autotag = ""; - $autotag .= $name . " " . $subject . " " . $dt->format('Y-m-d H:i:s') . " No.". $post . "\r\n"; + $autotag .= $name . " " . $subject . " " . $dt->format('Y-m-d H:i:s') . " No.". $post . "\r\n"; $autotag .= "/${board}/" . " " . $filehash . " " . $filename ."\r\n"; $autotag .= $body . "\r\n"; $autotag = escape_markup_modifiers($autotag); @@ -1818,7 +1825,7 @@ function mod_ban_post($board, $delete, $post, $token = false) { $query->execute() or error(db_error($query)); modLog("Added a note for {$ip}"); } - } + } deletePost($post); modLog("Deleted post #{$post}"); // Rebuild board @@ -1835,7 +1842,7 @@ function mod_ban_post($board, $delete, $post, $token = false) { header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); } } - + $args = array( 'ip' => $ip, 'hide_ip' => !hasPermission($config['mod']['show_ip'], $board), @@ -1849,32 +1856,32 @@ function mod_ban_post($board, $delete, $post, $token = false) { if(isset($_GET['thread']) && $_GET['thread']) { $args['thread'] = $_GET['thread']; } - + mod_page(_('New ban'), 'mod/ban_form.html', $args); } function mod_warning_post($board,$post, $token = false) { global $config, $mod; - + if (!openBoard($board)) error($config['error']['noboard']); - + $security_token = make_secure_link_token($board . '/warning/' . $post); - + $query = prepare(sprintf('SELECT ' . ('`ip`, `thread`') . ' FROM ``posts_%s`` WHERE `id` = :id', $board)); $query->bindValue(':id', $post); $query->execute() or error(db_error($query)); if (!$_post = $query->fetch(PDO::FETCH_ASSOC)) error($config['error']['404']); - + $thread = $_post['thread']; $ip = $_post['ip']; if (isset($_POST['new_warning'])) { if (isset($_POST['ip'])) $ip = $_POST['ip']; - + if (isset($_POST['public_message'], $_POST['message'])) { // public warning message $_POST['message'] = preg_replace('/[\r\n]/', '', $_POST['message']); @@ -1883,7 +1890,7 @@ function mod_warning_post($board,$post, $token = false) { $query->bindValue(':body_nomarkup', sprintf("\n%s", utf8tohtml($_POST['message']))); $query->execute() or error(db_error($query)); rebuildPost($post); - + modLog("Attached a public warning message to post #{$post}: " . utf8tohtml($_POST['message'])); buildThread($thread ? $thread : $post); buildIndex(); @@ -1911,11 +1918,11 @@ function mod_warning_post($board,$post, $token = false) { for ($file_count = 0; $file_count < $mypost["num_files"];$file_count++){ $filename .= $mypost['files'][$file_count]->name . "\r\n"; } - } - if ($time !== ''){ - $dt = new DateTime("@$time"); + } + if ($time !== ''){ + $dt = new DateTime("@$time"); $autotag = "Post warned\r\n"; - $autotag .= $name . " " . $subject . " " . $dt->format('Y-m-d H:i:s') . " No.". $post . "\r\n"; + $autotag .= $name . " " . $subject . " " . $dt->format('Y-m-d H:i:s') . " No.". $post . "\r\n"; $autotag .= "/${board}/" . " " . $filehash . " " . $filename ."\r\n"; $autotag .= $body . "\r\n"; $autotag = escape_markup_modifiers($autotag); @@ -1928,7 +1935,7 @@ function mod_warning_post($board,$post, $token = false) { $query->execute() or error(db_error($query)); modLog("Added a note for {$ip}"); } - } + } } if(isset($_POST['thread'])) { // Redirect to thread @@ -1937,7 +1944,7 @@ function mod_warning_post($board,$post, $token = false) { // Redirect to board index. header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); } - } + } $args = array( 'ip' => $ip, 'hide_ip' => !hasPermission($config['mod']['show_ip'], $board), @@ -1949,7 +1956,7 @@ function mod_warning_post($board,$post, $token = false) { if(isset($_GET['thread'])) { $args['thread'] = $_GET['thread']; } - + mod_page(_('New warning'), 'mod/warning_form.html', $args); } @@ -1961,19 +1968,19 @@ function mod_edit_post($board, $edit_raw_html, $postID) { if (!hasPermission($config['mod']['editpost'], $board)) error($config['error']['noaccess']); - + if ($edit_raw_html && !hasPermission($config['mod']['rawhtml'], $board)) error($config['error']['noaccess']); $security_token = make_secure_link_token($board . '/edit' . ($edit_raw_html ? '_raw' : '') . '/' . $postID); - + $query = prepare(sprintf('SELECT * FROM ``posts_%s`` WHERE `id` = :id', $board)); $query->bindValue(':id', $postID); $query->execute() or error(db_error($query)); if (!$post = $query->fetch(PDO::FETCH_ASSOC)) error($config['error']['404']); - + if (isset($_POST['name'], $_POST['email'], $_POST['subject'], $_POST['body'])) { // Remove any modifiers they may have put in $_POST['body'] = remove_modifiers($_POST['body']); @@ -1998,33 +2005,33 @@ function mod_edit_post($board, $edit_raw_html, $postID) { $query->bindValue(':body_nomarkup', $body_nomarkup); } $query->execute() or error(db_error($query)); - + if ($edit_raw_html) { modLog("Edited raw HTML of post #{$postID}"); } else { modLog("Edited post #{$postID}"); rebuildPost($postID); } - + buildIndex(); rebuildThemes('post', $board); - + header('Location: ?/' . sprintf($config['board_path'], $board) . $config['dir']['res'] . link_for($post) . '#' . $postID, true, $config['redirect_http']); } else { // Remove modifiers - $post['body_nomarkup'] = remove_modifiers($post['body_nomarkup']); - - $post['body_nomarkup'] = utf8tohtml($post['body_nomarkup']); - $post['body'] = utf8tohtml($post['body']); - if ($config['minify_html']) { + //$post['body_nomarkup'] = remove_modifiers($post['body_nomarkup']); + + //$post['body_nomarkup'] = utf8tohtml($post['body_nomarkup']); + //$post['body'] = utf8tohtml($post['body']); + /*if ($config['minify_html']) { $post['body_nomarkup'] = str_replace("\n", ' ', $post['body_nomarkup']); $post['body'] = str_replace("\n", ' ', $post['body']); $post['body_nomarkup'] = str_replace("\r", '', $post['body_nomarkup']); $post['body'] = str_replace("\r", '', $post['body']); $post['body_nomarkup'] = str_replace("\t", ' ', $post['body_nomarkup']); $post['body'] = str_replace("\t", ' ', $post['body']); - } + }*/ mod_page(_('Edit post'), 'mod/edit_post_form.html', array('token' => $security_token, 'board' => $board, 'raw' => $edit_raw_html, 'post' => $post)); } @@ -2032,13 +2039,13 @@ function mod_edit_post($board, $edit_raw_html, $postID) { function mod_delete($board, $post) { global $config, $mod; - + if (!openBoard($board)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['delete'], $board)) error($config['error']['noaccess']); - + // Delete post if ($config['autotagging']){ $query = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE id = :id", $board)); @@ -2064,10 +2071,10 @@ function mod_delete($board, $post) { $filename .= $mypost['files'][$file_count]->name . "\r\n"; } } - if ($time !== ''){ - $dt = new DateTime("@$time"); + if ($time !== ''){ + $dt = new DateTime("@$time"); $autotag = ""; - $autotag .= $name . " " . $subject . " " . $dt->format('Y-m-d H:i:s') . " No.". $post . "\r\n"; + $autotag .= $name . " " . $subject . " " . $dt->format('Y-m-d H:i:s') . " No.". $post . "\r\n"; $autotag .= "/${board}/" . " " . $filehash . " " . $filename ."\r\n"; $autotag .= $body . "\r\n"; $autotag = escape_markup_modifiers($autotag); @@ -2080,7 +2087,7 @@ function mod_delete($board, $post) { $query->execute() or error(db_error($query)); modLog("Added a note for {$ip}"); } - } + } deletePost($post); // Record the action modLog("Deleted post #{$post}"); @@ -2098,33 +2105,33 @@ function mod_delete($board, $post) { function mod_deletefile($board, $post, $file) { global $config, $mod; - + if (!openBoard($board)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['deletefile'], $board)) error($config['error']['noaccess']); - + // Delete file deleteFile($post, TRUE, $file); // Record the action modLog("Deleted file from post #{$post}"); - + // Rebuild board buildIndex(); // Rebuild themes rebuildThemes('post-delete', $board); - + // Redirect header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); } function mod_spoiler_image($board, $post, $file) { global $config, $mod; - + if (!openBoard($board)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['spoilerimage'], $board)) error($config['error']['noaccess']); @@ -2141,7 +2148,7 @@ function mod_spoiler_image($board, $post, $file) { $files[$file]->thumb = 'spoiler'; $files[$file]->thumbwidth = $size_spoiler_image[0]; $files[$file]->thumbheight = $size_spoiler_image[1]; - + // Make thumbnail spoiler $query = prepare(sprintf("UPDATE ``posts_%s`` SET `files` = :files WHERE `id` = :id", $board)); $query->bindValue(':files', json_encode($files)); @@ -2159,49 +2166,49 @@ function mod_spoiler_image($board, $post, $file) { // Rebuild themes rebuildThemes('post-delete', $board); - + // Redirect header('Location: ?/' . sprintf($config['board_path'], $board) . $config['file_index'], true, $config['redirect_http']); } function mod_deletebyip($boardName, $post, $global = false) { global $config, $mod, $board; - + $global = (bool)$global; - + if (!openBoard($boardName)) error($config['error']['noboard']); - + if (!$global && !hasPermission($config['mod']['deletebyip'], $boardName)) error($config['error']['noaccess']); - + if ($global && !hasPermission($config['mod']['deletebyip_global'], $boardName)) error($config['error']['noaccess']); - + // Find IP address $query = prepare(sprintf('SELECT `ip` FROM ``posts_%s`` WHERE `id` = :id', $boardName)); $query->bindValue(':id', $post); $query->execute() or error(db_error($query)); if (!$ip = $query->fetchColumn()) error($config['error']['invalidpost']); - + $boards = $global ? listBoards() : array(array('uri' => $boardName)); - + $query = ''; foreach ($boards as $_board) { $query .= sprintf("SELECT `thread`, `id`, '%s' AS `board` FROM ``posts_%s`` WHERE `ip` = :ip UNION ALL ", $_board['uri'], $_board['uri']); } $query = preg_replace('/UNION ALL $/', '', $query); - + $query = prepare($query); $query->bindValue(':ip', $ip); $query->execute() or error(db_error($query)); - + if ($query->rowCount() < 1) error($config['error']['invalidpost']); - + @set_time_limit($config['mod']['rebuild_timelimit']); - + $threads_to_rebuild = array(); $threads_deleted = array(); while ($post = $query->fetch(PDO::FETCH_ASSOC)) { @@ -2229,11 +2236,11 @@ function mod_deletebyip($boardName, $post, $global = false) { for ($file_count = 0; $file_count < $mypost["num_files"];$file_count++){ $filename .= $mypost['files'][$file_count]->name . "\r\n"; } - } - if ($time !== ''){ - $dt = new DateTime("@$time"); + } + if ($time !== ''){ + $dt = new DateTime("@$time"); $autotag = ""; - $autotag .= $name . " " . $subject . " " . $dt->format('Y-m-d H:i:s') . " No.". $post['id'] . "\r\n"; + $autotag .= $name . " " . $subject . " " . $dt->format('Y-m-d H:i:s') . " No.". $post['id'] . "\r\n"; $autotag .= "/${post['board']}/" . " " . $filehash . " " . $filename ."\r\n"; $autotag .= $body . "\r\n"; $autotag = escape_markup_modifiers($autotag); @@ -2246,12 +2253,12 @@ function mod_deletebyip($boardName, $post, $global = false) { $query2->execute() or error(db_error($query2)); modLog("Added a note for {$ip}"); } - } - + } + deletePost($post['id'], false, false); rebuildThemes('post-delete', $board['uri']); - + buildIndex(); if ($post['thread']) @@ -2259,7 +2266,7 @@ function mod_deletebyip($boardName, $post, $global = false) { else $threads_deleted[$post['board']][$post['id']] = true; } - + foreach ($threads_to_rebuild as $_board => $_threads) { openBoard($_board); foreach ($_threads as $_thread => $_dummy) { @@ -2268,30 +2275,30 @@ function mod_deletebyip($boardName, $post, $global = false) { } buildIndex(); } - + if ($global) { $board = false; } - + // Record the action modLog("Deleted all posts by IP address: $ip"); - + // Redirect header('Location: ?/' . sprintf($config['board_path'], $boardName) . $config['file_index'], true, $config['redirect_http']); } function mod_user($uid) { global $config, $mod; - + if (!hasPermission($config['mod']['editusers']) && !(hasPermission($config['mod']['change_password']) && $uid == $mod['id'])) error($config['error']['noaccess']); - + $query = prepare('SELECT * FROM ``mods`` WHERE `id` = :id'); $query->bindValue(':id', $uid); $query->execute() or error(db_error($query)); if (!$user = $query->fetch(PDO::FETCH_ASSOC)) error($config['error']['404']); - + if (hasPermission($config['mod']['editusers']) && isset($_POST['username'], $_POST['password'])) { if (isset($_POST['allboards'])) { $boards = array('*'); @@ -2300,43 +2307,43 @@ function mod_user($uid) { foreach ($_boards as &$board) { $board = $board['uri']; } - + $boards = array(); foreach ($_POST as $name => $value) { if (preg_match('/^board_(' . $config['board_regex'] . ')$/u', $name, $matches) && in_array($matches[1], $_boards)) $boards[] = $matches[1]; } } - + if (isset($_POST['delete'])) { if (!hasPermission($config['mod']['deleteusers'])) error($config['error']['noaccess']); - + $query = prepare('DELETE FROM ``mods`` WHERE `id` = :id'); $query->bindValue(':id', $uid); $query->execute() or error(db_error($query)); - + modLog('Deleted user ' . utf8tohtml($user['username']) . ' (#' . $user['id'] . ')'); - + header('Location: ?/users', true, $config['redirect_http']); - + return; } - + if ($_POST['username'] == '') error(sprintf($config['error']['required'], 'username')); - + $query = prepare('UPDATE ``mods`` SET `username` = :username, `boards` = :boards WHERE `id` = :id'); $query->bindValue(':id', $uid); $query->bindValue(':username', $_POST['username']); $query->bindValue(':boards', implode(',', $boards)); $query->execute() or error(db_error($query)); - + if ($user['username'] !== $_POST['username']) { // account was renamed modLog('Renamed user "' . utf8tohtml($user['username']) . '" (#' . $user['id'] . ') to "' . utf8tohtml($_POST['username']) . '"'); } - + if ($_POST['password'] != '') { list($version, $password) = crypt_password($_POST['password']); @@ -2345,23 +2352,23 @@ function mod_user($uid) { $query->bindValue(':password', $password); $query->bindValue(':version', $version); $query->execute() or error(db_error($query)); - + modLog('Changed password for ' . utf8tohtml($_POST['username']) . ' (#' . $user['id'] . ')'); - + if ($uid == $mod['id']) { login($_POST['username'], $_POST['password']); setCookies(); } } - + if (hasPermission($config['mod']['manageusers'])) header('Location: ?/users', true, $config['redirect_http']); else header('Location: ?/', true, $config['redirect_http']); - + return; } - + if (hasPermission($config['mod']['change_password']) && $uid == $mod['id'] && isset($_POST['password'])) { if ($_POST['password'] != '') { list($version, $password) = crypt_password($_POST['password']); @@ -2371,21 +2378,21 @@ function mod_user($uid) { $query->bindValue(':password', $password); $query->bindValue(':version', $version); $query->execute() or error(db_error($query)); - + modLog('Changed own password'); - + login($user['username'], $_POST['password']); setCookies(); } - + if (hasPermission($config['mod']['manageusers'])) header('Location: ?/users', true, $config['redirect_http']); else header('Location: ?/', true, $config['redirect_http']); - + return; } - + if (hasPermission($config['mod']['modlog'])) { $query = prepare('SELECT * FROM ``modlogs`` WHERE `mod` = :id ORDER BY `time` DESC LIMIT 5'); $query->bindValue(':id', $uid); @@ -2394,9 +2401,9 @@ function mod_user($uid) { } else { $log = array(); } - + $user['boards'] = explode(',', $user['boards']); - + mod_page(_('Edit user'), 'mod/user.html', array( 'user' => $user, 'logs' => $log, @@ -2407,16 +2414,16 @@ function mod_user($uid) { function mod_user_new() { global $pdo, $config; - + if (!hasPermission($config['mod']['createusers'])) error($config['error']['noaccess']); - + if (isset($_POST['username'], $_POST['password'], $_POST['type'])) { if ($_POST['username'] == '') error(sprintf($config['error']['required'], 'username')); if ($_POST['password'] == '') error(sprintf($config['error']['required'], 'password')); - + if (isset($_POST['allboards'])) { $boards = array('*'); } else { @@ -2424,20 +2431,20 @@ function mod_user_new() { foreach ($_boards as &$board) { $board = $board['uri']; } - + $boards = array(); foreach ($_POST as $name => $value) { if (preg_match('/^board_(' . $config['board_regex'] . ')$/u', $name, $matches) && in_array($matches[1], $_boards)) $boards[] = $matches[1]; } } - + $type = (int)$_POST['type']; if (!isset($config['mod']['groups'][$type]) || $type == DISABLED) error(sprintf($config['error']['invalidfield'], 'type')); - + list($version, $password) = crypt_password($_POST['password']); - + $query = prepare('INSERT INTO ``mods`` VALUES (NULL, :username, :password, :version, :type, :boards)'); $query->bindValue(':username', $_POST['username']); $query->bindValue(':password', $password); @@ -2445,59 +2452,59 @@ function mod_user_new() { $query->bindValue(':type', $type); $query->bindValue(':boards', implode(',', $boards)); $query->execute() or error(db_error($query)); - + $userID = $pdo->lastInsertId(); - + modLog('Created a new user: ' . utf8tohtml($_POST['username']) . ' (#' . $userID . ')'); - + header('Location: ?/users', true, $config['redirect_http']); return; } - + mod_page(_('New user'), 'mod/user.html', array('new' => true, 'boards' => listBoards(), 'token' => make_secure_link_token('users/new'))); } function mod_users() { global $config; - + if (!hasPermission($config['mod']['manageusers'])) error($config['error']['noaccess']); - + $query = query("SELECT *, (SELECT `time` FROM ``modlogs`` WHERE `mod` = `id` ORDER BY `time` DESC LIMIT 1) AS `last`, (SELECT `text` FROM ``modlogs`` WHERE `mod` = `id` ORDER BY `time` DESC LIMIT 1) AS `action` FROM ``mods`` ORDER BY `type` DESC,`id`") or error(db_error()); $users = $query->fetchAll(PDO::FETCH_ASSOC); - + foreach ($users as &$user) { $user['promote_token'] = make_secure_link_token("users/{$user['id']}/promote"); $user['demote_token'] = make_secure_link_token("users/{$user['id']}/demote"); } - + mod_page(sprintf('%s (%d)', _('Manage users'), count($users)), 'mod/users.html', array('users' => $users)); } function mod_user_promote($uid, $action) { global $config; - + if (!hasPermission($config['mod']['promoteusers'])) error($config['error']['noaccess']); - + $query = prepare("SELECT `type`, `username` FROM ``mods`` WHERE `id` = :id"); $query->bindValue(':id', $uid); $query->execute() or error(db_error($query)); - + if (!$mod = $query->fetch(PDO::FETCH_ASSOC)) error($config['error']['404']); - + $new_group = false; - + $groups = $config['mod']['groups']; if ($action == 'demote') $groups = array_reverse($groups, true); - + foreach ($groups as $group_value => $group_name) { if ($action == 'promote' && $group_value > $mod['type']) { $new_group = $group_value; @@ -2507,65 +2514,65 @@ function mod_user_promote($uid, $action) { break; } } - + if ($new_group === false || $new_group == DISABLED) error(_('Impossible to promote/demote user.')); - + $query = prepare("UPDATE ``mods`` SET `type` = :group_value WHERE `id` = :id"); $query->bindValue(':id', $uid); $query->bindValue(':group_value', $new_group); $query->execute() or error(db_error($query)); - + modLog(($action == 'promote' ? 'Promoted' : 'Demoted') . ' user "' . utf8tohtml($mod['username']) . '" to ' . $config['mod']['groups'][$new_group]); - + header('Location: ?/users', true, $config['redirect_http']); } function mod_pm($id, $reply = false) { global $mod, $config; - + if ($reply && !hasPermission($config['mod']['create_pm'])) error($config['error']['noaccess']); - + $query = prepare("SELECT ``mods``.`username`, `mods_to`.`username` AS `to_username`, ``pms``.* FROM ``pms`` LEFT JOIN ``mods`` ON ``mods``.`id` = `sender` LEFT JOIN ``mods`` AS `mods_to` ON `mods_to`.`id` = `to` WHERE ``pms``.`id` = :id"); $query->bindValue(':id', $id); $query->execute() or error(db_error($query)); - + if ((!$pm = $query->fetch(PDO::FETCH_ASSOC)) || ($pm['to'] != $mod['id'] && !hasPermission($config['mod']['master_pm']))) error($config['error']['404']); - + if (isset($_POST['delete'])) { $query = prepare("DELETE FROM ``pms`` WHERE `id` = :id"); $query->bindValue(':id', $id); $query->execute() or error(db_error($query)); - + if ($config['cache']['enabled']) { cache::delete('pm_unread_' . $mod['id']); cache::delete('pm_unreadcount_' . $mod['id']); } - + header('Location: ?/', true, $config['redirect_http']); return; } - + if ($pm['unread'] && $pm['to'] == $mod['id']) { $query = prepare("UPDATE ``pms`` SET `unread` = 0 WHERE `id` = :id"); $query->bindValue(':id', $id); $query->execute() or error(db_error($query)); - + if ($config['cache']['enabled']) { cache::delete('pm_unread_' . $mod['id']); cache::delete('pm_unreadcount_' . $mod['id']); } - + modLog('Read a PM'); } - + if ($reply) { if (!$pm['to_username']) error($config['error']['404']); // deleted? - + mod_page(sprintf('%s %s', _('New PM for'), $pm['to_username']), 'mod/new_pm.html', array( 'username' => $pm['username'], 'id' => $pm['sender'], @@ -2579,21 +2586,21 @@ function mod_pm($id, $reply = false) { function mod_inbox() { global $config, $mod; - + $query = prepare('SELECT `unread`,``pms``.`id`, `time`, `sender`, `to`, `message`, `username` FROM ``pms`` LEFT JOIN ``mods`` ON ``mods``.`id` = `sender` WHERE `to` = :mod ORDER BY `unread` DESC, `time` DESC'); $query->bindValue(':mod', $mod['id']); $query->execute() or error(db_error($query)); $messages = $query->fetchAll(PDO::FETCH_ASSOC); - + $query = prepare('SELECT COUNT(*) FROM ``pms`` WHERE `to` = :mod AND `unread` = 1'); $query->bindValue(':mod', $mod['id']); $query->execute() or error(db_error($query)); $unread = $query->fetchColumn(); - + foreach ($messages as &$message) { $message['snippet'] = pm_snippet($message['message']); } - + mod_page(sprintf('%s (%s)', _('PM inbox'), count($messages) > 0 ? $unread . ' unread' : 'empty'), 'mod/inbox.html', array( 'messages' => $messages, 'unread' => $unread @@ -2603,10 +2610,10 @@ function mod_inbox() { function mod_new_pm($username) { global $config, $mod; - + if (!hasPermission($config['mod']['create_pm'])) error($config['error']['noaccess']); - + $query = prepare("SELECT `id` FROM ``mods`` WHERE `username` = :username"); $query->bindValue(':username', $username); $query->execute() or error(db_error($query)); @@ -2620,28 +2627,28 @@ function mod_new_pm($username) { else error($config['error']['404']); } - + if (isset($_POST['message'])) { $_POST['message'] = escape_markup_modifiers($_POST['message']); markup($_POST['message']); - + $query = prepare("INSERT INTO ``pms`` VALUES (NULL, :me, :id, :message, :time, 1)"); $query->bindValue(':me', $mod['id']); $query->bindValue(':id', $id); $query->bindValue(':message', $_POST['message']); $query->bindValue(':time', time()); $query->execute() or error(db_error($query)); - + if ($config['cache']['enabled']) { cache::delete('pm_unread_' . $id); cache::delete('pm_unreadcount_' . $id); } - + modLog('Sent a PM to ' . utf8tohtml($username)); - + header('Location: ?/', true, $config['redirect_http']); } - + mod_page(sprintf('%s %s', _('New PM for'), $username), 'mod/new_pm.html', array( 'username' => $username, 'id' => $id, @@ -2652,59 +2659,59 @@ function mod_new_pm($username) { function mod_rebuild() { global $config, $twig; print_err("mod_rebuild"); - + if (!hasPermission($config['mod']['rebuild'])) error($config['error']['noaccess']); - + if (isset($_POST['rebuild'])) { @set_time_limit($config['mod']['rebuild_timelimit']); - + $log = array(); $boards = listBoards(); $rebuilt_scripts = array(); - + if (isset($_POST['rebuild_cache'])) { if ($config['cache']['enabled']) { $log[] = 'Flushing cache'; Cache::flush(); } - + $log[] = 'Clearing template cache'; load_twig(); $twig->clearCacheFiles(); } - + if (isset($_POST['rebuild_themes'])) { $log[] = 'Regenerating theme files'; print_err("mod_rebuild calling rebuildThemes"); rebuildThemes('all'); print_err("mod_rebuild calling rebuildThemes ok"); } - + if (isset($_POST['rebuild_javascript'])) { $log[] = 'Rebuilding ' . $config['file_script'] . ''; buildJavascript(); $rebuilt_scripts[] = $config['file_script']; } - + foreach ($boards as $board) { if (!(isset($_POST['boards_all']) || isset($_POST['board_' . $board['uri']]))) continue; - + openBoard($board['uri']); $config['try_smarter'] = false; - + if (isset($_POST['rebuild_index'])) { buildIndex(); $log[] = '' . sprintf($config['board_abbreviation'], $board['uri']) . ': Creating index pages'; } - + if (isset($_POST['rebuild_javascript']) && !in_array($config['file_script'], $rebuilt_scripts)) { $log[] = '' . sprintf($config['board_abbreviation'], $board['uri']) . ': Rebuilding ' . $config['file_script'] . ''; buildJavascript(); $rebuilt_scripts[] = $config['file_script']; } - + if (isset($_POST['rebuild_thread'])) { $query = query(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL", $board['uri'])) or error(db_error()); while ($post = $query->fetch(PDO::FETCH_ASSOC)) { @@ -2713,11 +2720,11 @@ function mod_rebuild() { } } } - + mod_page(_('Rebuild'), 'mod/rebuilt.html', array('logs' => $log)); return; } - + mod_page(_('Rebuild'), 'mod/rebuild.html', array( 'boards' => listBoards(), 'token' => make_secure_link_token('rebuild') @@ -2726,32 +2733,32 @@ function mod_rebuild() { function mod_reports() { global $config, $mod; - + if (!hasPermission($config['mod']['reports'])) error($config['error']['noaccess']); - + $query = prepare("SELECT * FROM ``reports`` ORDER BY `time` DESC LIMIT :limit"); $query->bindValue(':limit', $config['mod']['recent_reports'], PDO::PARAM_INT); $query->execute() or error(db_error($query)); $reports = $query->fetchAll(PDO::FETCH_ASSOC); - + $report_queries = array(); foreach ($reports as $report) { if (!isset($report_queries[$report['board']])) $report_queries[$report['board']] = array(); $report_queries[$report['board']][] = $report['post']; } - + $report_posts = array(); foreach ($report_queries as $board => $posts) { $report_posts[$board] = array(); - + $query = query(sprintf('SELECT * FROM ``posts_%s`` WHERE `id` = ' . implode(' OR `id` = ', $posts), $board)) or error(db_error()); while ($post = $query->fetch(PDO::FETCH_ASSOC)) { $report_posts[$board][$post['id']] = $post; } } - + $count = 0; $body = ''; foreach ($reports as $report) { @@ -2763,18 +2770,18 @@ function mod_reports() { $query->execute() or error(db_error($query)); continue; } - + openBoard($report['board']); - + $post = &$report_posts[$report['board']][$report['post']]; - + if (!$post['thread']) { // Still need to fix this: $po = new Thread($post, '?/', $mod, false); } else { $po = new Post($post, '?/', $mod); } - + // a little messy and inefficient $append_html = Element('mod/report.html', array( 'report' => $report, @@ -2783,32 +2790,32 @@ function mod_reports() { 'token' => make_secure_link_token('reports/' . $report['id'] . '/dismiss'), 'token_all' => make_secure_link_token('reports/' . $report['id'] . '/dismissall') )); - + // Bug fix for https://github.com/savetheinternet/Tinyboard/issues/21 $po->body = truncate($po->body, $po->link(), $config['body_truncate'] - substr_count($append_html, '
')); - + if (mb_strlen($po->body) + mb_strlen($append_html) > $config['body_truncate_char']) { // still too long; temporarily increase limit in the config $__old_body_truncate_char = $config['body_truncate_char']; $config['body_truncate_char'] = mb_strlen($po->body) + mb_strlen($append_html); } - + $po->body .= $append_html; - + $body .= $po->build(true) . '


'; - + if (isset($__old_body_truncate_char)) $config['body_truncate_char'] = $__old_body_truncate_char; - + $count++; } - + mod_page(sprintf('%s (%d)', _('Report queue'), $count), 'mod/reports.html', array('reports' => $body, 'count' => $count)); } function mod_report_dismiss($id, $all = false) { global $config; - + $query = prepare("SELECT `post`, `board`, `ip` FROM ``reports`` WHERE `id` = :id"); $query->bindValue(':id', $id); $query->execute() or error(db_error($query)); @@ -2818,13 +2825,13 @@ function mod_report_dismiss($id, $all = false) { $post = $report['post']; } else error($config['error']['404']); - + if (!$all && !hasPermission($config['mod']['report_dismiss'], $board)) error($config['error']['noaccess']); - + if ($all && !hasPermission($config['mod']['report_dismiss_ip'], $board)) error($config['error']['noaccess']); - + if ($all) { $query = prepare("DELETE FROM ``reports`` WHERE `ip` = :ip"); $query->bindValue(':ip', $ip); @@ -2833,19 +2840,19 @@ function mod_report_dismiss($id, $all = false) { $query->bindValue(':id', $id); } $query->execute() or error(db_error($query)); - - + + if ($all) modLog("Dismissed all reports by $ip"); else modLog("Dismissed a report for post #{$id}", $board); - + header('Location: ?/reports', true, $config['redirect_http']); } function mod_recent_posts($lim,$board_list = false,$json=false) { global $config, $mod, $pdo; - + if (!hasPermission($config['mod']['recent'])) error($config['error']['noaccess']); @@ -2882,7 +2889,7 @@ function mod_recent_posts($lim,$board_list = false,$json=false) { $mod_boards[] = $board; } } - } + } // Manually build an SQL query $query = 'SELECT * FROM ('; @@ -2895,7 +2902,7 @@ function mod_recent_posts($lim,$board_list = false,$json=false) { $query->bindValue(':last_time', $last_time); $query->execute() or error(db_error($query)); $posts = $query->fetchAll(PDO::FETCH_ASSOC); - + if ($config['api']['enabled']) { $apithreads = array(); } @@ -2909,13 +2916,13 @@ function mod_recent_posts($lim,$board_list = false,$json=false) { if ($config['api']['enabled']) { $apithreads[] = $po; } - + } else { $po = new Post($post, '?/', $mod); $post['built'] = $po->build(true); if ($config['api']['enabled']) { $pot = new Thread($post, '?/', $mod, false); - $pot->add($po); + $pot->add($po); $apithreads[] = $pot; } } @@ -2927,11 +2934,11 @@ function mod_recent_posts($lim,$board_list = false,$json=false) { $jsonFilename = 'mod/' . 'recent.json'; $jsondata = json_encode($api->translatePage($apithreads)); } - + if ($json){ echo $jsondata; } - else { + else { echo mod_page(_('Recent posts'), 'mod/recent_posts.html', array( 'posts' => $posts, 'limit' => $limit, @@ -2943,18 +2950,18 @@ function mod_recent_posts($lim,$board_list = false,$json=false) { function mod_config($board_config = false) { global $config, $mod, $board; - + if ($board_config && !openBoard($board_config)) error($config['error']['noboard']); - + if (!hasPermission($config['mod']['edit_config'], $board_config)) error($config['error']['noaccess']); - + $config_file = $board_config ? $board['dir'] . 'config.php' : 'inc/instance-config.php'; - + if ($config['mod']['config_editor_php']) { $readonly = !(is_file($config_file) ? is_writable($config_file) : is_writable(dirname($config_file))); - + if (!$readonly && isset($_POST['code'])) { $code = $_POST['code']; // Save previous instance_config if php_check_syntax fails @@ -2968,15 +2975,15 @@ function mod_config($board_config = false) { else { file_put_contents($config_file, $old_code); error($config['error']['badsyntax'] . $resp); - } + } } - + $instance_config = @file_get_contents($config_file); if ($instance_config === false) { $instance_config = " $instance_config, 'readonly' => $readonly, @@ -2987,11 +2994,11 @@ function mod_config($board_config = false) { )); return; } - + require_once 'inc/mod/config-editor.php'; - + $conf = config_vars(); - + foreach ($conf as &$var) { if (is_array($var['name'])) { $c = &$config; @@ -3000,40 +3007,40 @@ function mod_config($board_config = false) { } else { $c = @$config[$var['name']]; } - + $var['value'] = $c; } unset($var); - + if (isset($_POST['save'])) { $config_append = ''; - + foreach ($conf as $var) { $field_name = 'cf_' . (is_array($var['name']) ? implode('/', $var['name']) : $var['name']); - + if ($var['type'] == 'boolean') $value = isset($_POST[$field_name]); elseif (isset($_POST[$field_name])) $value = $_POST[$field_name]; else continue; // ??? - + if (!settype($value, $var['type'])) continue; // invalid - + if ($value != $var['value']) { // This value has been changed. - + $config_append .= '$config'; - + if (is_array($var['name'])) { foreach ($var['name'] as $name) $config_append .= '[' . var_export($name, true) . ']'; } else { $config_append .= '[' . var_export($var['name'], true) . ']'; } - - + + $config_append .= ' = '; if (@$var['permissions'] && isset($config['mod']['groups'][$value])) { $config_append .= $config['mod']['groups'][$value]; @@ -3043,14 +3050,14 @@ function mod_config($board_config = false) { $config_append .= ";\n"; } } - + if (!empty($config_append)) { $config_append = "\n// Changes made via web editor by \"" . $mod['username'] . "\" @ " . date('r') . ":\n" . $config_append . "\n"; if (!is_file($config_file)) $config_append = " &$theme) { $theme['rebuild_token'] = make_secure_link_token('themes/' . $theme_name . '/rebuild'); $theme['uninstall_token'] = make_secure_link_token('themes/' . $theme_name . '/uninstall'); @@ -3131,12 +3138,12 @@ function mod_theme_configure($theme_name) { if (!isset($_POST[$conf['name']]) && $conf['type'] != 'checkbox') error(sprintf($config['error']['required'], $c['title'])); } - + // Clear previous settings $query = prepare("DELETE FROM ``theme_settings`` WHERE `theme` = :theme"); $query->bindValue(':theme', $theme_name); $query->execute() or error(db_error($query)); - + foreach ($theme['config'] as &$conf) { $query = prepare("INSERT INTO ``theme_settings`` VALUES(:theme, :name, :value)"); $query->bindValue(':theme', $theme_name); @@ -3155,7 +3162,7 @@ function mod_theme_configure($theme_name) { // Clean cache Cache::delete("themes"); Cache::delete("theme_settings_".$theme_name); - + $result = true; $message = false; if (isset($theme['install_callback'])) { @@ -3167,17 +3174,17 @@ function mod_theme_configure($theme_name) { } } } - + if (!$result) { // Install failed $query = prepare("DELETE FROM ``theme_settings`` WHERE `theme` = :theme"); $query->bindValue(':theme', $theme_name); $query->execute() or error(db_error($query)); } - + // Build themes rebuildThemes('all'); - + mod_page(sprintf(_($result ? 'Installed theme: %s' : 'Installation failed: %s'), $theme['name']), 'mod/theme_installed.html', array( 'theme_name' => $theme_name, 'theme' => $theme, @@ -3219,7 +3226,7 @@ function mod_theme_rebuild($theme_name) { if (!hasPermission($config['mod']['themes'])) error($config['error']['noaccess']); - + rebuildTheme($theme_name, 'all'); mod_page(sprintf(_('Rebuilt theme: %s'), $theme_name), 'mod/theme_rebuilt.html', array( @@ -3270,7 +3277,7 @@ function mod_edit_page($id) { $query->bindValue(':id', $id); $query->execute() or error(db_error($query)); $page = $query->fetch(); - + if (!$page) error(_('Could not find the page you are trying to edit.')); @@ -3287,12 +3294,12 @@ function mod_edit_page($id) { $content = $_POST['content']; $method = $_POST['method']; $page['type'] = $method; - + if (!in_array($method, array('markdown', 'html', 'infinity'))) error(_('Unrecognized page markup method.')); - + switch ($method) { - case 'markdown': + case 'markdown': $write = markdown($content); break; case 'html': @@ -3330,7 +3337,7 @@ function mod_edit_page($id) { $query->execute() or error(db_error($query)); $content = $query->fetchColumn(); } - + mod_page(sprintf(_('Editing static page: %s'), $page['name']), 'mod/edit_page.html', array('page' => $page, 'token' => make_secure_link_token("edit_page/$id"), 'content' => prettify_textarea($content), 'board' => $board)); } @@ -3390,48 +3397,48 @@ function mod_pages($board = false) { function mod_debug_antispam() { global $pdo, $config; - + $args = array(); - + if (isset($_POST['board'], $_POST['thread'])) { $where = '`board` = ' . $pdo->quote($_POST['board']); if ($_POST['thread'] != '') $where .= ' AND `thread` = ' . $pdo->quote($_POST['thread']); - + if (isset($_POST['purge'])) { $query = prepare(', DATE ``antispam`` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE' . $where); $query->bindValue(':expires', $config['spam']['hidden_inputs_expire']); $query->execute() or error(db_error()); } - + $args['board'] = $_POST['board']; $args['thread'] = $_POST['thread']; } else { $where = ''; } - + $query = query('SELECT COUNT(*) FROM ``antispam``' . ($where ? " WHERE $where" : '')) or error(db_error()); $args['total'] = number_format($query->fetchColumn()); - + $query = query('SELECT COUNT(*) FROM ``antispam`` WHERE `expires` IS NOT NULL' . ($where ? " AND $where" : '')) or error(db_error()); $args['expiring'] = number_format($query->fetchColumn()); - + $query = query('SELECT * FROM ``antispam`` ' . ($where ? "WHERE $where" : '') . ' ORDER BY `passed` DESC LIMIT 40') or error(db_error()); $args['top'] = $query->fetchAll(PDO::FETCH_ASSOC); - + $query = query('SELECT * FROM ``antispam`` ' . ($where ? "WHERE $where" : '') . ' ORDER BY `created` DESC LIMIT 20') or error(db_error()); $args['recent'] = $query->fetchAll(PDO::FETCH_ASSOC); - + mod_page(_('Debug: Anti-spam'), 'mod/debug/antispam.html', $args); } function mod_debug_recent_posts() { global $pdo, $config; - + $limit = 500; - + $boards = listBoards(); - + // Manually build an SQL query $query = 'SELECT * FROM ('; foreach ($boards as $board) { @@ -3441,11 +3448,11 @@ function mod_debug_recent_posts() { $query = preg_replace('/UNION ALL $/', ') AS `all_posts` ORDER BY `time` DESC LIMIT ' . $limit, $query); $query = query($query) or error(db_error()); $posts = $query->fetchAll(PDO::FETCH_ASSOC); - + // Fetch recent posts from flood prevention cache $query = query("SELECT * FROM ``flood`` ORDER BY `time` DESC") or error(db_error()); $flood_posts = $query->fetchAll(PDO::FETCH_ASSOC); - + foreach ($posts as &$post) { $post['snippet'] = pm_snippet($post['body']); foreach ($flood_posts as $flood_post) { @@ -3455,18 +3462,18 @@ function mod_debug_recent_posts() { $post['in_flood_table'] = true; } } - + mod_page(_('Debug: Recent posts'), 'mod/debug/recent_posts.html', array('posts' => $posts, 'flood_posts' => $flood_posts)); } function mod_debug_sql() { global $config; - + if (!hasPermission($config['mod']['debug_sql'])) error($config['error']['noaccess']); - + $args['security_token'] = make_secure_link_token('debug/sql'); - + if (isset($_POST['query'])) { $args['query'] = $_POST['query']; if ($query = query($_POST['query'])) { @@ -3479,21 +3486,21 @@ function mod_debug_sql() { $args['error'] = db_error(); } } - + mod_page(_('Debug: SQL'), 'mod/debug/sql.html', $args); } function mod_debug_apc() { global $config; - + if (!hasPermission($config['mod']['debug_apc'])) error($config['error']['noaccess']); - + if ($config['cache']['enabled'] != 'apc') error('APC is not enabled.'); - + $cache_info = apc_cache_info('user'); - + // $cached_vars = new APCIterator('user', '/^' . $config['cache']['prefix'] . '/'); $cached_vars = array(); foreach ($cache_info['cache_list'] as $var) { @@ -3501,7 +3508,6 @@ function mod_debug_apc() { continue; $cached_vars[] = $var; } - + mod_page(_('Debug: APC'), 'mod/debug/apc.html', array('cached_vars' => $cached_vars)); } - diff --git a/tests/ProtectIPTest.php b/tests/ProtectIPTest.php new file mode 100644 index 00000000..878eaa06 --- /dev/null +++ b/tests/ProtectIPTest.php @@ -0,0 +1,32 @@ +33.57.252.246'; + $output = protect_ip($input); + $this->assertEquals($output, $expected); + } + + public function testProtectsIpv6Address(){ + $expected = 'Some ban message: xxxx'; + + // Random IP, hope it's not yours + $input = 'Some ban message: 5e85:f252:9baf:2131:8984:6ab2:3db0:fa48'; + $output = protect_ip($input); + + $this->assertEquals($output, $expected); + } +} From b66ef17262dcda292c8611c98207024ec59bc959 Mon Sep 17 00:00:00 2001 From: towards-a-new-leftypol Date: Sun, 17 Jan 2021 14:34:52 -0500 Subject: [PATCH 08/19] Enable memcached in the config --- inc/instance-config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/inc/instance-config.php b/inc/instance-config.php index 083c499e..76e16155 100644 --- a/inc/instance-config.php +++ b/inc/instance-config.php @@ -77,6 +77,7 @@ $config['db']['prefix'] = ''; $config['db']['user'] = 'lainchan'; $config['db']['password'] = ''; +$config['cache']['enabled'] = 'memcached'; $config['cookies']['mod'] = 'mod'; $config['cookies']['salt'] = 'MGYwNjhlNjU5Y2QxNWU3YjQ3MzQ1Yj'; From 0a404925ea8f4dc1c2756cbb785d9a0811da6948 Mon Sep 17 00:00:00 2001 From: towards-a-new-leftypol Date: Sun, 17 Jan 2021 14:38:09 -0500 Subject: [PATCH 09/19] instance config flood settings --- inc/instance-config.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/instance-config.php b/inc/instance-config.php index 76e16155..af90e981 100644 --- a/inc/instance-config.php +++ b/inc/instance-config.php @@ -82,9 +82,9 @@ $config['cache']['enabled'] = 'memcached'; $config['cookies']['mod'] = 'mod'; $config['cookies']['salt'] = 'MGYwNjhlNjU5Y2QxNWU3YjQ3MzQ1Yj'; -$config['flood_time'] = 0; -$config['flood_time_ip'] = 0; -$config['flood_time_same'] = 0; +$config['flood_time'] = 30; +$config['flood_time_ip'] = 60; +$config['flood_time_same'] = 60; $config['max_body'] = 100000; $config['reply_limit'] = 250; $config['max_links'] = 40; From 6acff64f17c8f654529c9dc5a5f33c130b267080 Mon Sep 17 00:00:00 2001 From: towards-a-new-leftypol Date: Sun, 17 Jan 2021 15:01:33 -0500 Subject: [PATCH 10/19] Revert "Enable memcached in the config" This reverts commit b66ef17262dcda292c8611c98207024ec59bc959. --- inc/instance-config.php | 1 - 1 file changed, 1 deletion(-) diff --git a/inc/instance-config.php b/inc/instance-config.php index af90e981..c70eadee 100644 --- a/inc/instance-config.php +++ b/inc/instance-config.php @@ -77,7 +77,6 @@ $config['db']['prefix'] = ''; $config['db']['user'] = 'lainchan'; $config['db']['password'] = ''; -$config['cache']['enabled'] = 'memcached'; $config['cookies']['mod'] = 'mod'; $config['cookies']['salt'] = 'MGYwNjhlNjU5Y2QxNWU3YjQ3MzQ1Yj'; From 891329946e36f2c550754ac41436c3da4d9bfb06 Mon Sep 17 00:00:00 2001 From: Dedushka Date: Sun, 17 Jan 2021 15:31:48 -0500 Subject: [PATCH 11/19] Put secrets in another file. This commit makes it easier to make changes to the instance config without worrying about overwriting secrets and database configuration. It also mitigates some possibility of leaking secrets. --- inc/instance-config.secret.php.EXAMPLE | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 inc/instance-config.secret.php.EXAMPLE diff --git a/inc/instance-config.secret.php.EXAMPLE b/inc/instance-config.secret.php.EXAMPLE new file mode 100644 index 00000000..1c6e7c23 --- /dev/null +++ b/inc/instance-config.secret.php.EXAMPLE @@ -0,0 +1,24 @@ + Date: Sun, 17 Jan 2021 15:40:30 -0500 Subject: [PATCH 12/19] Remove secrets, require `instance-config.secret.php` --- .gitignore | 3 +++ inc/instance-config.php | 17 ++++------------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 493d4027..635c426b 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,6 @@ stylesheets/fonts #Images from twemoji js/twemoji/16x16/ + +#Secrets +*.secret.php \ No newline at end of file diff --git a/inc/instance-config.php b/inc/instance-config.php index 083c499e..52559ece 100644 --- a/inc/instance-config.php +++ b/inc/instance-config.php @@ -8,6 +8,10 @@ * You can copy values from config.php (defaults) and paste them here. */ +if (file_exists("instance-config.secret.php")) { + require_once "instance-config.secret.php"; +} + /* * Front page configurations. */ @@ -67,19 +71,7 @@ $config['custom_categories'] = array( ), ); -/* - * Database and site wide configurations - */ - -$config['db']['server'] = 'localhost'; -$config['db']['database'] = 'lainchan'; -$config['db']['prefix'] = ''; -$config['db']['user'] = 'lainchan'; -$config['db']['password'] = ''; - - $config['cookies']['mod'] = 'mod'; -$config['cookies']['salt'] = 'MGYwNjhlNjU5Y2QxNWU3YjQ3MzQ1Yj'; $config['flood_time'] = 0; $config['flood_time_ip'] = 0; @@ -96,7 +88,6 @@ $config['threads_per_page'] = 10; $config['max_pages'] = 36; $config['threads_preview'] = 5; $config['root'] = '/'; -$config['secure_trip_salt'] = 'ODQ2NDM0ODlmMmRhNzk2M2EyNjJlOW'; //Banners $config['url_banner'] = '/banners.php'; From d17d35c35d0303f9c90f6736689d7de76fdc665f Mon Sep 17 00:00:00 2001 From: Dedushka Date: Sun, 17 Jan 2021 16:10:56 -0500 Subject: [PATCH 13/19] Add styles, addresses #38 --- inc/instance-config.php | 6 ++ stylesheets/anons_dark_red.css | 150 +++++++++++++++++++++++++++ stylesheets/demain_dark.css | 182 +++++++++++++++++++++++++++++++++ stylesheets/demain_light.css | 182 +++++++++++++++++++++++++++++++++ stylesheets/temp_dark.css | 103 +++++++++++++++++++ stylesheets/temp_dark_red.css | 101 ++++++++++++++++++ stylesheets/tomorrow.css | 115 +++++++++++++++++++++ 7 files changed, 839 insertions(+) create mode 100644 stylesheets/anons_dark_red.css create mode 100644 stylesheets/demain_dark.css create mode 100644 stylesheets/demain_light.css create mode 100644 stylesheets/temp_dark.css create mode 100644 stylesheets/temp_dark_red.css create mode 100644 stylesheets/tomorrow.css diff --git a/inc/instance-config.php b/inc/instance-config.php index 52559ece..2243fae7 100644 --- a/inc/instance-config.php +++ b/inc/instance-config.php @@ -275,6 +275,12 @@ $config['stylesheets']['Notsuba'] = 'notsuba.css'; $config['stylesheets']['Photon'] = 'photon.css'; $config['stylesheets']['Szalet'] = 'szalet.css'; $config['stylesheets']['Tsuki'] = 'tsuki.css'; +$config['stylesheets']['DemainLight'] = 'demain_light.css'; +$config['stylesheets']['DemainDark'] = 'demain_dark.css'; +$config['stylesheets']['TempDark'] = 'temp_dark.css'; +$config['stylesheets']['TempDarkRed'] = 'temp_dark_red.css'; +$config['stylesheets']['Tomorrow'] = 'tomorrow.css'; +$config['stylesheets']['AnonsDarkRed'] = 'anons_dark_red.css'; $config['default_stylesheet'] = array('Dark Red', $config['stylesheets']['Dark Red']); /* diff --git a/stylesheets/anons_dark_red.css b/stylesheets/anons_dark_red.css new file mode 100644 index 00000000..d8681ec4 --- /dev/null +++ b/stylesheets/anons_dark_red.css @@ -0,0 +1,150 @@ +/* General */ +body { + background: #1d1f21 url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #ACACAC; +} +/* Link colors */ +a:link, a:visited, .intro a.email span.name { + color: #81a2be; +} +a:hover, .intro a.post_no:hover { + color: #cc6666; +} +/* Board title and subtitle */ +header div.subtitle, h1 { + color: indianred; +} +/* Post number*/ +a.post_no { + color: #c5c8c6; +} +/* Replies */ +/* Background color and border */ +div.post.reply { + background: #282A2E; + border-color: #373b41; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply.highlighted { + background: #282A2E; + border-color: #5f89ac; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply div.body a { + color: #5f89ac; +} +.intro span.subject { + color: #b294bb; +} +/* Greentext */ +span.quote { + color: #b5bd68 +} +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, .thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, .thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, .thread.grid-li.grid-size-large:hover { + background-color: #282A2E; + border: 1px solid #373b41; +} +/* Posting form */ +/* Field names */ +form table tr th { + background: #282A2E; + color: #ACACAC; + border: 1px solid #373b41; +} +/* Input fields */ +textarea, input:not([type="file"]):not([type="checkbox"]), [type="submit"] { + color: #ACACAC; + background: #282A2E; + border: 1px double #1d1f21; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, input:not([type="file"]):not([type="checkbox"]):focus, [type="submit"]:hover { + border: 1px solid #1d1f21; + -moz-box-shadow: 0 0 10px #1d1f21; + -webkit-box-shadow: 0 0 10px #1d1f21; + box-shadow: 0 0 10px #1d1f21; +} +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #151515; + border-color: #81a2be!important;; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #151515; + border-color: #81a2be; +} +div.pages a.selected { + color: #cc6666; +} +hr { + border-color: #373b41; +} +div.boardlist { + color: #81a2be; + font-size: 14px; +} +div.boardlist a { + color: #cc6666; +} +table.modlog tr th { + background: #1d1f21; +} + +/* options.js */ +#options_div, #alert_div { + background: #151515; +} + +.desktop-style div.boardlist:nth-child(1) { + background-color: #151515; +} +/* Red text */ +span.heading { + color: indianred; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* OP */ +/* Subject */ +.intro span.subject { + color: #b294bb; +} +/* name */ +.intro span.name { + color: #5f89ac; +} +/* tripcode */ +.intro span.trip { + color: #8abeb7; +} +/* Quick reply */ +/* Quick reply banner */ +div.banner {background-color:#9988ee;} +#quick-reply th, #quick-reply td {background-color:#1F1F1F;} +#quick-reply table {border-color:#373b41} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* b5bd68*/ diff --git a/stylesheets/demain_dark.css b/stylesheets/demain_dark.css new file mode 100644 index 00000000..18ccb05d --- /dev/null +++ b/stylesheets/demain_dark.css @@ -0,0 +1,182 @@ +/* Demain_light theme for leftypol.org adapted from Seaweed theme for 4chan*/ +/* Work in progress*/ +/* General */ +/* General */ +body { + background: #e9eced url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #4c4c4c; + font-size: 11pt; + font-family: liberation.sans +} +/* Link colors */ +a:link, +a:visited, +.intro a.email span.name { + color: #477085; +} +a:hover, +.intro a.post_no:hover { + color: #5d6678; +} +/* Board title and subtitle */ +header div.subtitle, +h1 { + color: #d93f42; +} +/* Post number*/ +a.post_no { + color: #477085; +} +/* "Top bar" of the replies*/ +p.intro { + background: #e3e7e8; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Replies */ +/* Background color and border */ +div.post.reply { + background: #e9eced; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply.highlighted { + background: #d5dada; + border-color: #477085; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply div.body a { + color: #477085; +} +.intro span.subject { + color: #6b7a1e; +} +/* Greentext */ +span.quote { + color: #6b7a1e +} +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, +.thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, +.thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, +.thread.grid-li.grid-size-large:hover { + background-color: #e9eced; + border: 1px solid #cccccc; +} +/* Posting form */ +/* Field names */ +form table tr th { + background: #e9eced; + color: #4c4c4c; + border: 1px solid #cccccc; +} +/* Input fields */ +textarea, +input:not([type="file"]):not([type="checkbox"]), +[type="submit"] { + color: #4c4c4c; + background: #e9eced; + border: 1px double #cccccc; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, +input:not([type="file"]):not([type="checkbox"]):focus, +[type="submit"]:hover { + border: 1px solid #d5dada; + -moz-box-shadow: 0 0 10px #d5dada; + -webkit-box-shadow: 0 0 10px #d5dada; + box-shadow: 0 0 10px #d5dada; +} +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #e9eced; + border-color: #cccccc!important; + ; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #e9eced; + border-color: #cccccc; +} +div.pages a.selected { + color: #5d6678; +} +hr { + border-color: #cccccc; +} +div.boardlist { + color: #81a2be; + font-size: 14px; +} +div.boardlist a { + color: #477085; +} +table.modlog tr th { + background: #e9eced; +} + +/* options.js */ +#options_div, +#alert_div { + background: #e9eced; +} + +.desktop-style div.boardlist:nth-child(1) { + background-color: #e9eced; +} +/* Red text */ +span.heading { + color: #d93f42; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* OP */ +/* Subject */ +.intro span.subject { + color: #617d6f; +} +/* name */ +.intro span.name { + color: #4c4c4c; +} +/* tripcode */ +.intro span.trip { + color: #5d6678; +} +/* Quick reply */ +/* Quick reply banner */ +div.banner { + background-color: #477085; +} +#quick-reply th, +#quick-reply td { + background-color: #d5dada; +} +#quick-reply table { + border-color: #cccccc +} +/* Buggy shit */ +div.post.reply div.body a { + color: #477085; + text-decoration: none; +} diff --git a/stylesheets/demain_light.css b/stylesheets/demain_light.css new file mode 100644 index 00000000..18ccb05d --- /dev/null +++ b/stylesheets/demain_light.css @@ -0,0 +1,182 @@ +/* Demain_light theme for leftypol.org adapted from Seaweed theme for 4chan*/ +/* Work in progress*/ +/* General */ +/* General */ +body { + background: #e9eced url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #4c4c4c; + font-size: 11pt; + font-family: liberation.sans +} +/* Link colors */ +a:link, +a:visited, +.intro a.email span.name { + color: #477085; +} +a:hover, +.intro a.post_no:hover { + color: #5d6678; +} +/* Board title and subtitle */ +header div.subtitle, +h1 { + color: #d93f42; +} +/* Post number*/ +a.post_no { + color: #477085; +} +/* "Top bar" of the replies*/ +p.intro { + background: #e3e7e8; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Replies */ +/* Background color and border */ +div.post.reply { + background: #e9eced; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply.highlighted { + background: #d5dada; + border-color: #477085; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply div.body a { + color: #477085; +} +.intro span.subject { + color: #6b7a1e; +} +/* Greentext */ +span.quote { + color: #6b7a1e +} +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, +.thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, +.thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, +.thread.grid-li.grid-size-large:hover { + background-color: #e9eced; + border: 1px solid #cccccc; +} +/* Posting form */ +/* Field names */ +form table tr th { + background: #e9eced; + color: #4c4c4c; + border: 1px solid #cccccc; +} +/* Input fields */ +textarea, +input:not([type="file"]):not([type="checkbox"]), +[type="submit"] { + color: #4c4c4c; + background: #e9eced; + border: 1px double #cccccc; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, +input:not([type="file"]):not([type="checkbox"]):focus, +[type="submit"]:hover { + border: 1px solid #d5dada; + -moz-box-shadow: 0 0 10px #d5dada; + -webkit-box-shadow: 0 0 10px #d5dada; + box-shadow: 0 0 10px #d5dada; +} +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #e9eced; + border-color: #cccccc!important; + ; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #e9eced; + border-color: #cccccc; +} +div.pages a.selected { + color: #5d6678; +} +hr { + border-color: #cccccc; +} +div.boardlist { + color: #81a2be; + font-size: 14px; +} +div.boardlist a { + color: #477085; +} +table.modlog tr th { + background: #e9eced; +} + +/* options.js */ +#options_div, +#alert_div { + background: #e9eced; +} + +.desktop-style div.boardlist:nth-child(1) { + background-color: #e9eced; +} +/* Red text */ +span.heading { + color: #d93f42; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* OP */ +/* Subject */ +.intro span.subject { + color: #617d6f; +} +/* name */ +.intro span.name { + color: #4c4c4c; +} +/* tripcode */ +.intro span.trip { + color: #5d6678; +} +/* Quick reply */ +/* Quick reply banner */ +div.banner { + background-color: #477085; +} +#quick-reply th, +#quick-reply td { + background-color: #d5dada; +} +#quick-reply table { + border-color: #cccccc +} +/* Buggy shit */ +div.post.reply div.body a { + color: #477085; + text-decoration: none; +} diff --git a/stylesheets/temp_dark.css b/stylesheets/temp_dark.css new file mode 100644 index 00000000..c68980d4 --- /dev/null +++ b/stylesheets/temp_dark.css @@ -0,0 +1,103 @@ +@-moz-document domain("leftypol.org") { +/* Bunker Theme for Leftypol.org */ +/* General */ +body { + background: #1d1f21 url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #ACACAC; +} + +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #151515; + border-color: #FFB300!important; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Board links */ +div.boardlist { + color: #acacac; + font-size: 14px; +} + +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #151515; + border-color: #117743; +} +div.pages a.selected { + color: #ff0000; +} +/* Thread separators */ +hr { + border-color: #117743; +} + +/* Link colors, might or might not work */ +a:link, a:visited, .intro a.email span.name { + color: #FFB300; +} +a:link:hover { + color: #d00; +} + +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, .thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, .thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, .thread.grid-li.grid-size-large:hover { + background-color: #282A2E; + border: 1px solid #117743; +} + +/* Posting form */ +/* Field names */ +form table tr th { + background: #282A2E; + color: #ACACAC; + border: 1px solid #117743; +} +/* Input fields */ +textarea, input:not([type="file"]):not([type="checkbox"]), [type="submit"] { + color: #ACACAC; + background: #282A2E; + border: 1px double #07371F; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, input:not([type="file"]):not([type="checkbox"]):focus, [type="submit"]:hover { + border: 1px solid #117743; + -moz-box-shadow: 0 0 10px #117743; + -webkit-box-shadow: 0 0 10px #117743; + box-shadow: 0 0 10px #117743; +} + +/* OP */ +/* Subject */ +.intro span.subject { + color: #34ED3A; +} + +/* Replies */ +/* Background color and green border */ +div.post.reply { + background: #282A2E; + border-color: #117743; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Highlighted replies */ +div.post.reply.highlighted { + background: rgba(59, 22, 43, 0.4); +} +/* Buggy shit */ +div.post.reply div.body a { + color: #ff0000; + text-decoration: none; +} +} diff --git a/stylesheets/temp_dark_red.css b/stylesheets/temp_dark_red.css new file mode 100644 index 00000000..df80a931 --- /dev/null +++ b/stylesheets/temp_dark_red.css @@ -0,0 +1,101 @@ +/* Red Bunker Theme for Leftypol.org */ +/* General */ +body { + background: #1d1f21 url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #ACACAC; +} + +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #151515; + border-color: #ffd700!important; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Board links */ +div.boardlist { + color: #acacac; + font-size: 14px; +} + +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #151515; + border-color: #cd0000; +} +div.pages a.selected { + color: #ff0000; +} +/* Thread separators */ +hr { + border-color: #CD0000; +} + +/* Link colors, might or might not work */ +a:link, a:visited, .intro a.email span.name { + color: #ffd700; +} +a:link:hover { + color: #d00; +} + +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, .thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, .thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, .thread.grid-li.grid-size-large:hover { + background-color: #282A2E; + border: 1px solid #cd0000; +} + +/* Posting form */ +/* Field names */ +form table tr th { + background: #282A2E; + color: #ACACAC; + border: 1px solid #cd0000; +} +/* Input fields */ +textarea, input:not([type="file"]):not([type="checkbox"]), [type="submit"] { + color: #ACACAC; + background: #282A2E; + border: 1px double #07371F; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, input:not([type="file"]):not([type="checkbox"]):focus, [type="submit"]:hover { + border: 1px solid #cd0000; + -moz-box-shadow: 0 0 10px #cd0000; + -webkit-box-shadow: 0 0 10px #cd0000; + box-shadow: 0 0 10px #cd0000; +} + +/* OP */ +/* Subject */ +.intro span.subject { + color: #ffd700; +} + +/* Replies */ +/* Background color and green border */ +div.post.reply { + background: #282A2E; + border-color: #cd0000; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Highlighted replies */ +div.post.reply.highlighted { + background: rgba(59, 22, 43, 0.4); +} +/* Buggy shit */ +div.post.reply div.body a { + color: #ff0000; + text-decoration: none; +} diff --git a/stylesheets/tomorrow.css b/stylesheets/tomorrow.css new file mode 100644 index 00000000..b3f95226 --- /dev/null +++ b/stylesheets/tomorrow.css @@ -0,0 +1,115 @@ +/* Tomorrow Theme for Leftypol.org */ +/* General */ +body { + background: #1d1f21 url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #ACACAC; +} + +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #151515; + border-color: #81a2be!important; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Board links */ +div.boardlist { + color: #81a2be; + font-size: 14px; +} + +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #151515; + border-color: #81a2be; +} +div.pages a.selected { + color: #cc6666; +} +/* Thread separators */ +hr { + border-color: #373b41; +} + +/* Link colors, might or might not work */ +a:link, a:visited, .intro a.email span.name { + color: #81a2be; +} +a:link:hover { + color: #cc6666; +} + +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, .thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, .thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, .thread.grid-li.grid-size-large:hover { + background-color: #282A2E; + border: 1px solid #373b41; +} + +/* Posting form */ +/* Field names */ +form table tr th { + background: #282A2E; + color: #ACACAC; + border: 1px solid #373b41; +} +/* Input fields */ +textarea, input:not([type="file"]):not([type="checkbox"]), [type="submit"] { + color: #ACACAC; + background: #282A2E; + border: 1px double #1d1f21; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, input:not([type="file"]):not([type="checkbox"]):focus, [type="submit"]:hover { + border: 1px solid #1d1f21; + -moz-box-shadow: 0 0 10px #1d1f21; + -webkit-box-shadow: 0 0 10px #1d1f21; + box-shadow: 0 0 10px #1d1f21; +} + +/* OP */ +/* Subject */ +.intro span.subject { + color: #b294bb; +} + +/* name */ +.intro span.name { + color: #5f89ac; +} + +/* tripcode */ +.intro span.trip { + color: #8abeb7; +} + +/* Replies */ +/* Background color and green border */ +div.post.reply { + background: #282A2E; + border-color: #373b41; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Highlighted replies */ +div.post.reply.highlighted { + background: #282A2E; + border-color: #5f89ac; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} From b56670daa078e84cc7a64beaeab09ca67ac8937f Mon Sep 17 00:00:00 2001 From: Dedushka Date: Sun, 17 Jan 2021 16:17:37 -0500 Subject: [PATCH 14/19] Add bunker-like CSS them, adresses #145 --- inc/instance-config.php | 1 + stylesheets/bunker_like.css | 175 ++++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 stylesheets/bunker_like.css diff --git a/inc/instance-config.php b/inc/instance-config.php index 2243fae7..0f74d2a5 100644 --- a/inc/instance-config.php +++ b/inc/instance-config.php @@ -281,6 +281,7 @@ $config['stylesheets']['TempDark'] = 'temp_dark.css'; $config['stylesheets']['TempDarkRed'] = 'temp_dark_red.css'; $config['stylesheets']['Tomorrow'] = 'tomorrow.css'; $config['stylesheets']['AnonsDarkRed'] = 'anons_dark_red.css'; +$config['stylesheets']['BunkerLike'] = 'bunker_like.css'; $config['default_stylesheet'] = array('Dark Red', $config['stylesheets']['Dark Red']); /* diff --git a/stylesheets/bunker_like.css b/stylesheets/bunker_like.css new file mode 100644 index 00000000..65de9e9b --- /dev/null +++ b/stylesheets/bunker_like.css @@ -0,0 +1,175 @@ +body { + background: #1D1F21; + color: #ACACAC; + font-family: Courier, monospace; + font-size: 13px; +} + +/* LINKS */ +a, a:link, a:visited, .intro a.email span.name { + color: #FFB300; + text-decoration: none; +} +a:link:hover, a:visited:hover { + color: #FFB300; + text-shadow: 0px 0px 5px #117743; +} +div.pages a.selected { + color: #FFB300; +} + +/* INTRO */ +h1, div.title, header div.subtitle { + color: #663E11; + font-family: Courier, monospace; +} +h1 { + font-size: 24pt; + font-weight: normal; + letter-spacing: 0px; +} +header div.subtitle { + font-size: 12pt; +} + +/* FORMS AND BUTTONS */ +div.banner { + background-color: inherit; + color: #ACACAC; +} +form table { + border: 1px dashed #117743; + padding-right: 1px; +} +form table tr th { + background: #282A2E; + border: 1px solid #117743; + border-radius: 5px; +} +input[type="text"], input[type="password"], textarea, select { + border: 1px double #07371F; + border-radius: 5px; + background: #282A2E; + color: #ACACAC; + font-family: Courier, monospace; +} +input[type="text"]:focus, input[type="password"]:focus, textarea:focus { + box-shadow: 0px 0px 5px 2px #117743; +} +input[type="submit"] { + border: 3px double #07371F; + border-radius: 5px; + background: #16171A; + color: #ACACAC; + font-family: Courier, monospace; + font-weight: bold; +} +.dropzone { + background: #16171A; + border: 3px double #07371F; + color: #ACACAC; +} +.dropzone .file-hint { + color: #ACACAC; + font-weight: bold; +} +#quick-reply table { + background: #1D1F21 !important; +} +fieldset { + border: 1px dashed #117743; +} + +/* POST IDENTIFIERS */ +.intro span.subject { + color: #34ED3A; +} +.intro span.name { + color: #117743; +} +.intro span.trip { + color: #117743; +} +.intro a.capcode, p.intro a.nametag { + color: #FF0000; + font-weight: bold; +} +.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name { + color: #34ED97; +} +.intro time { + font-weight: bold; +} +.intro a.post_no { + color: #ACACAC; + font-weight: bold; +} + +/* POST BOXES */ +div.post.reply { + background: #282A2E; + border: 1px solid #117743; + border-radius: 5px; +} +div.post.reply.highlighted { + background: rgba(59, 22, 43, 0.4); + border: 1px solid #117743; + border-radius: 5px; +} + +/* POST CONTENT */ +div.post.reply div.body a { + color: #FFB300; +} +.quote { + color: #789922; +} + +/* BARS */ +.bar { + background-color: #151515; +} +.bar.top { + border-bottom: 1px solid #B0790A; +} +.bar.bottom { + border-top: 1px solid #B0790A; +} +div.boardlist { + color: #ACACAC; +} +hr { + border: none; + border-top: 1pt solid #117743; +} + +/* CATALOG */ +.theme-catalog h1 { + color: #ACACAC; + font-size: 18pt; + font-weight: bold; +} +.theme-catalog h1 a { + font-weight: normal; +} +.theme-catalog div.thread, .theme-catalog div.thread:hover { + background: #282A2E; + border: 1px solid #117743; + border-radius: 5px; + font-size: 10pt; +} + +/* OPTIONS */ +#options_div, #alert_div { + background: #1D1F21; + border: 1px dashed #117743; +} +#options_tablist { + border-right: 1px dashed #117743; +} +.options_tab_icon { + color: #ACACAC; +} +.options_tab_icon.active { + color: #FFB300; +} From 6208e76816d66e78ba8eb8e4e0cfd0a00e5d60ea Mon Sep 17 00:00:00 2001 From: Dedushka Date: Sun, 17 Jan 2021 16:50:11 -0500 Subject: [PATCH 15/19] Revert "Put secrets in another file." This reverts commit 891329946e36f2c550754ac41436c3da4d9bfb06. --- inc/instance-config.secret.php.EXAMPLE | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 inc/instance-config.secret.php.EXAMPLE diff --git a/inc/instance-config.secret.php.EXAMPLE b/inc/instance-config.secret.php.EXAMPLE deleted file mode 100644 index 1c6e7c23..00000000 --- a/inc/instance-config.secret.php.EXAMPLE +++ /dev/null @@ -1,24 +0,0 @@ - Date: Sun, 17 Jan 2021 16:50:35 -0500 Subject: [PATCH 16/19] Revert "Remove secrets, require `instance-config.secret.php`" This reverts commit 565b3807bd0df36eb2d1c87e6e82d292b0878c47. --- .gitignore | 3 --- inc/instance-config.php | 17 +++++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 635c426b..493d4027 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,3 @@ stylesheets/fonts #Images from twemoji js/twemoji/16x16/ - -#Secrets -*.secret.php \ No newline at end of file diff --git a/inc/instance-config.php b/inc/instance-config.php index 0f74d2a5..ccf56fba 100644 --- a/inc/instance-config.php +++ b/inc/instance-config.php @@ -8,10 +8,6 @@ * You can copy values from config.php (defaults) and paste them here. */ -if (file_exists("instance-config.secret.php")) { - require_once "instance-config.secret.php"; -} - /* * Front page configurations. */ @@ -71,7 +67,19 @@ $config['custom_categories'] = array( ), ); +/* + * Database and site wide configurations + */ + +$config['db']['server'] = 'localhost'; +$config['db']['database'] = 'lainchan'; +$config['db']['prefix'] = ''; +$config['db']['user'] = 'lainchan'; +$config['db']['password'] = ''; + + $config['cookies']['mod'] = 'mod'; +$config['cookies']['salt'] = 'MGYwNjhlNjU5Y2QxNWU3YjQ3MzQ1Yj'; $config['flood_time'] = 0; $config['flood_time_ip'] = 0; @@ -88,6 +96,7 @@ $config['threads_per_page'] = 10; $config['max_pages'] = 36; $config['threads_preview'] = 5; $config['root'] = '/'; +$config['secure_trip_salt'] = 'ODQ2NDM0ODlmMmRhNzk2M2EyNjJlOW'; //Banners $config['url_banner'] = '/banners.php'; From 91efbfd418a9b3ee39fa36bf1066005acf205bd7 Mon Sep 17 00:00:00 2001 From: Dedushka Date: Sun, 17 Jan 2021 16:10:56 -0500 Subject: [PATCH 17/19] Add styles, addresses #38 --- inc/instance-config.php | 6 ++ stylesheets/anons_dark_red.css | 150 +++++++++++++++++++++++++++ stylesheets/demain_dark.css | 182 +++++++++++++++++++++++++++++++++ stylesheets/demain_light.css | 182 +++++++++++++++++++++++++++++++++ stylesheets/temp_dark.css | 103 +++++++++++++++++++ stylesheets/temp_dark_red.css | 101 ++++++++++++++++++ stylesheets/tomorrow.css | 115 +++++++++++++++++++++ 7 files changed, 839 insertions(+) create mode 100644 stylesheets/anons_dark_red.css create mode 100644 stylesheets/demain_dark.css create mode 100644 stylesheets/demain_light.css create mode 100644 stylesheets/temp_dark.css create mode 100644 stylesheets/temp_dark_red.css create mode 100644 stylesheets/tomorrow.css diff --git a/inc/instance-config.php b/inc/instance-config.php index c70eadee..a95c26cf 100644 --- a/inc/instance-config.php +++ b/inc/instance-config.php @@ -284,6 +284,12 @@ $config['stylesheets']['Notsuba'] = 'notsuba.css'; $config['stylesheets']['Photon'] = 'photon.css'; $config['stylesheets']['Szalet'] = 'szalet.css'; $config['stylesheets']['Tsuki'] = 'tsuki.css'; +$config['stylesheets']['DemainLight'] = 'demain_light.css'; +$config['stylesheets']['DemainDark'] = 'demain_dark.css'; +$config['stylesheets']['TempDark'] = 'temp_dark.css'; +$config['stylesheets']['TempDarkRed'] = 'temp_dark_red.css'; +$config['stylesheets']['Tomorrow'] = 'tomorrow.css'; +$config['stylesheets']['AnonsDarkRed'] = 'anons_dark_red.css'; $config['default_stylesheet'] = array('Dark Red', $config['stylesheets']['Dark Red']); /* diff --git a/stylesheets/anons_dark_red.css b/stylesheets/anons_dark_red.css new file mode 100644 index 00000000..d8681ec4 --- /dev/null +++ b/stylesheets/anons_dark_red.css @@ -0,0 +1,150 @@ +/* General */ +body { + background: #1d1f21 url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #ACACAC; +} +/* Link colors */ +a:link, a:visited, .intro a.email span.name { + color: #81a2be; +} +a:hover, .intro a.post_no:hover { + color: #cc6666; +} +/* Board title and subtitle */ +header div.subtitle, h1 { + color: indianred; +} +/* Post number*/ +a.post_no { + color: #c5c8c6; +} +/* Replies */ +/* Background color and border */ +div.post.reply { + background: #282A2E; + border-color: #373b41; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply.highlighted { + background: #282A2E; + border-color: #5f89ac; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply div.body a { + color: #5f89ac; +} +.intro span.subject { + color: #b294bb; +} +/* Greentext */ +span.quote { + color: #b5bd68 +} +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, .thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, .thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, .thread.grid-li.grid-size-large:hover { + background-color: #282A2E; + border: 1px solid #373b41; +} +/* Posting form */ +/* Field names */ +form table tr th { + background: #282A2E; + color: #ACACAC; + border: 1px solid #373b41; +} +/* Input fields */ +textarea, input:not([type="file"]):not([type="checkbox"]), [type="submit"] { + color: #ACACAC; + background: #282A2E; + border: 1px double #1d1f21; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, input:not([type="file"]):not([type="checkbox"]):focus, [type="submit"]:hover { + border: 1px solid #1d1f21; + -moz-box-shadow: 0 0 10px #1d1f21; + -webkit-box-shadow: 0 0 10px #1d1f21; + box-shadow: 0 0 10px #1d1f21; +} +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #151515; + border-color: #81a2be!important;; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #151515; + border-color: #81a2be; +} +div.pages a.selected { + color: #cc6666; +} +hr { + border-color: #373b41; +} +div.boardlist { + color: #81a2be; + font-size: 14px; +} +div.boardlist a { + color: #cc6666; +} +table.modlog tr th { + background: #1d1f21; +} + +/* options.js */ +#options_div, #alert_div { + background: #151515; +} + +.desktop-style div.boardlist:nth-child(1) { + background-color: #151515; +} +/* Red text */ +span.heading { + color: indianred; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* OP */ +/* Subject */ +.intro span.subject { + color: #b294bb; +} +/* name */ +.intro span.name { + color: #5f89ac; +} +/* tripcode */ +.intro span.trip { + color: #8abeb7; +} +/* Quick reply */ +/* Quick reply banner */ +div.banner {background-color:#9988ee;} +#quick-reply th, #quick-reply td {background-color:#1F1F1F;} +#quick-reply table {border-color:#373b41} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* b5bd68*/ diff --git a/stylesheets/demain_dark.css b/stylesheets/demain_dark.css new file mode 100644 index 00000000..18ccb05d --- /dev/null +++ b/stylesheets/demain_dark.css @@ -0,0 +1,182 @@ +/* Demain_light theme for leftypol.org adapted from Seaweed theme for 4chan*/ +/* Work in progress*/ +/* General */ +/* General */ +body { + background: #e9eced url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #4c4c4c; + font-size: 11pt; + font-family: liberation.sans +} +/* Link colors */ +a:link, +a:visited, +.intro a.email span.name { + color: #477085; +} +a:hover, +.intro a.post_no:hover { + color: #5d6678; +} +/* Board title and subtitle */ +header div.subtitle, +h1 { + color: #d93f42; +} +/* Post number*/ +a.post_no { + color: #477085; +} +/* "Top bar" of the replies*/ +p.intro { + background: #e3e7e8; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Replies */ +/* Background color and border */ +div.post.reply { + background: #e9eced; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply.highlighted { + background: #d5dada; + border-color: #477085; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply div.body a { + color: #477085; +} +.intro span.subject { + color: #6b7a1e; +} +/* Greentext */ +span.quote { + color: #6b7a1e +} +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, +.thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, +.thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, +.thread.grid-li.grid-size-large:hover { + background-color: #e9eced; + border: 1px solid #cccccc; +} +/* Posting form */ +/* Field names */ +form table tr th { + background: #e9eced; + color: #4c4c4c; + border: 1px solid #cccccc; +} +/* Input fields */ +textarea, +input:not([type="file"]):not([type="checkbox"]), +[type="submit"] { + color: #4c4c4c; + background: #e9eced; + border: 1px double #cccccc; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, +input:not([type="file"]):not([type="checkbox"]):focus, +[type="submit"]:hover { + border: 1px solid #d5dada; + -moz-box-shadow: 0 0 10px #d5dada; + -webkit-box-shadow: 0 0 10px #d5dada; + box-shadow: 0 0 10px #d5dada; +} +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #e9eced; + border-color: #cccccc!important; + ; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #e9eced; + border-color: #cccccc; +} +div.pages a.selected { + color: #5d6678; +} +hr { + border-color: #cccccc; +} +div.boardlist { + color: #81a2be; + font-size: 14px; +} +div.boardlist a { + color: #477085; +} +table.modlog tr th { + background: #e9eced; +} + +/* options.js */ +#options_div, +#alert_div { + background: #e9eced; +} + +.desktop-style div.boardlist:nth-child(1) { + background-color: #e9eced; +} +/* Red text */ +span.heading { + color: #d93f42; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* OP */ +/* Subject */ +.intro span.subject { + color: #617d6f; +} +/* name */ +.intro span.name { + color: #4c4c4c; +} +/* tripcode */ +.intro span.trip { + color: #5d6678; +} +/* Quick reply */ +/* Quick reply banner */ +div.banner { + background-color: #477085; +} +#quick-reply th, +#quick-reply td { + background-color: #d5dada; +} +#quick-reply table { + border-color: #cccccc +} +/* Buggy shit */ +div.post.reply div.body a { + color: #477085; + text-decoration: none; +} diff --git a/stylesheets/demain_light.css b/stylesheets/demain_light.css new file mode 100644 index 00000000..18ccb05d --- /dev/null +++ b/stylesheets/demain_light.css @@ -0,0 +1,182 @@ +/* Demain_light theme for leftypol.org adapted from Seaweed theme for 4chan*/ +/* Work in progress*/ +/* General */ +/* General */ +body { + background: #e9eced url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #4c4c4c; + font-size: 11pt; + font-family: liberation.sans +} +/* Link colors */ +a:link, +a:visited, +.intro a.email span.name { + color: #477085; +} +a:hover, +.intro a.post_no:hover { + color: #5d6678; +} +/* Board title and subtitle */ +header div.subtitle, +h1 { + color: #d93f42; +} +/* Post number*/ +a.post_no { + color: #477085; +} +/* "Top bar" of the replies*/ +p.intro { + background: #e3e7e8; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Replies */ +/* Background color and border */ +div.post.reply { + background: #e9eced; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply.highlighted { + background: #d5dada; + border-color: #477085; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply div.body a { + color: #477085; +} +.intro span.subject { + color: #6b7a1e; +} +/* Greentext */ +span.quote { + color: #6b7a1e +} +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, +.thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, +.thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, +.thread.grid-li.grid-size-large:hover { + background-color: #e9eced; + border: 1px solid #cccccc; +} +/* Posting form */ +/* Field names */ +form table tr th { + background: #e9eced; + color: #4c4c4c; + border: 1px solid #cccccc; +} +/* Input fields */ +textarea, +input:not([type="file"]):not([type="checkbox"]), +[type="submit"] { + color: #4c4c4c; + background: #e9eced; + border: 1px double #cccccc; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, +input:not([type="file"]):not([type="checkbox"]):focus, +[type="submit"]:hover { + border: 1px solid #d5dada; + -moz-box-shadow: 0 0 10px #d5dada; + -webkit-box-shadow: 0 0 10px #d5dada; + box-shadow: 0 0 10px #d5dada; +} +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #e9eced; + border-color: #cccccc!important; + ; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #e9eced; + border-color: #cccccc; +} +div.pages a.selected { + color: #5d6678; +} +hr { + border-color: #cccccc; +} +div.boardlist { + color: #81a2be; + font-size: 14px; +} +div.boardlist a { + color: #477085; +} +table.modlog tr th { + background: #e9eced; +} + +/* options.js */ +#options_div, +#alert_div { + background: #e9eced; +} + +.desktop-style div.boardlist:nth-child(1) { + background-color: #e9eced; +} +/* Red text */ +span.heading { + color: #d93f42; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* OP */ +/* Subject */ +.intro span.subject { + color: #617d6f; +} +/* name */ +.intro span.name { + color: #4c4c4c; +} +/* tripcode */ +.intro span.trip { + color: #5d6678; +} +/* Quick reply */ +/* Quick reply banner */ +div.banner { + background-color: #477085; +} +#quick-reply th, +#quick-reply td { + background-color: #d5dada; +} +#quick-reply table { + border-color: #cccccc +} +/* Buggy shit */ +div.post.reply div.body a { + color: #477085; + text-decoration: none; +} diff --git a/stylesheets/temp_dark.css b/stylesheets/temp_dark.css new file mode 100644 index 00000000..c68980d4 --- /dev/null +++ b/stylesheets/temp_dark.css @@ -0,0 +1,103 @@ +@-moz-document domain("leftypol.org") { +/* Bunker Theme for Leftypol.org */ +/* General */ +body { + background: #1d1f21 url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #ACACAC; +} + +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #151515; + border-color: #FFB300!important; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Board links */ +div.boardlist { + color: #acacac; + font-size: 14px; +} + +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #151515; + border-color: #117743; +} +div.pages a.selected { + color: #ff0000; +} +/* Thread separators */ +hr { + border-color: #117743; +} + +/* Link colors, might or might not work */ +a:link, a:visited, .intro a.email span.name { + color: #FFB300; +} +a:link:hover { + color: #d00; +} + +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, .thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, .thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, .thread.grid-li.grid-size-large:hover { + background-color: #282A2E; + border: 1px solid #117743; +} + +/* Posting form */ +/* Field names */ +form table tr th { + background: #282A2E; + color: #ACACAC; + border: 1px solid #117743; +} +/* Input fields */ +textarea, input:not([type="file"]):not([type="checkbox"]), [type="submit"] { + color: #ACACAC; + background: #282A2E; + border: 1px double #07371F; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, input:not([type="file"]):not([type="checkbox"]):focus, [type="submit"]:hover { + border: 1px solid #117743; + -moz-box-shadow: 0 0 10px #117743; + -webkit-box-shadow: 0 0 10px #117743; + box-shadow: 0 0 10px #117743; +} + +/* OP */ +/* Subject */ +.intro span.subject { + color: #34ED3A; +} + +/* Replies */ +/* Background color and green border */ +div.post.reply { + background: #282A2E; + border-color: #117743; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Highlighted replies */ +div.post.reply.highlighted { + background: rgba(59, 22, 43, 0.4); +} +/* Buggy shit */ +div.post.reply div.body a { + color: #ff0000; + text-decoration: none; +} +} diff --git a/stylesheets/temp_dark_red.css b/stylesheets/temp_dark_red.css new file mode 100644 index 00000000..df80a931 --- /dev/null +++ b/stylesheets/temp_dark_red.css @@ -0,0 +1,101 @@ +/* Red Bunker Theme for Leftypol.org */ +/* General */ +body { + background: #1d1f21 url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #ACACAC; +} + +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #151515; + border-color: #ffd700!important; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Board links */ +div.boardlist { + color: #acacac; + font-size: 14px; +} + +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #151515; + border-color: #cd0000; +} +div.pages a.selected { + color: #ff0000; +} +/* Thread separators */ +hr { + border-color: #CD0000; +} + +/* Link colors, might or might not work */ +a:link, a:visited, .intro a.email span.name { + color: #ffd700; +} +a:link:hover { + color: #d00; +} + +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, .thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, .thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, .thread.grid-li.grid-size-large:hover { + background-color: #282A2E; + border: 1px solid #cd0000; +} + +/* Posting form */ +/* Field names */ +form table tr th { + background: #282A2E; + color: #ACACAC; + border: 1px solid #cd0000; +} +/* Input fields */ +textarea, input:not([type="file"]):not([type="checkbox"]), [type="submit"] { + color: #ACACAC; + background: #282A2E; + border: 1px double #07371F; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, input:not([type="file"]):not([type="checkbox"]):focus, [type="submit"]:hover { + border: 1px solid #cd0000; + -moz-box-shadow: 0 0 10px #cd0000; + -webkit-box-shadow: 0 0 10px #cd0000; + box-shadow: 0 0 10px #cd0000; +} + +/* OP */ +/* Subject */ +.intro span.subject { + color: #ffd700; +} + +/* Replies */ +/* Background color and green border */ +div.post.reply { + background: #282A2E; + border-color: #cd0000; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Highlighted replies */ +div.post.reply.highlighted { + background: rgba(59, 22, 43, 0.4); +} +/* Buggy shit */ +div.post.reply div.body a { + color: #ff0000; + text-decoration: none; +} diff --git a/stylesheets/tomorrow.css b/stylesheets/tomorrow.css new file mode 100644 index 00000000..b3f95226 --- /dev/null +++ b/stylesheets/tomorrow.css @@ -0,0 +1,115 @@ +/* Tomorrow Theme for Leftypol.org */ +/* General */ +body { + background: #1d1f21 url('img/fade-yotsuba.png') repeat-x 50% 0%; + color: #ACACAC; +} + +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #151515; + border-color: #81a2be!important; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Board links */ +div.boardlist { + color: #81a2be; + font-size: 14px; +} + +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #151515; + border-color: #81a2be; +} +div.pages a.selected { + color: #cc6666; +} +/* Thread separators */ +hr { + border-color: #373b41; +} + +/* Link colors, might or might not work */ +a:link, a:visited, .intro a.email span.name { + color: #81a2be; +} +a:link:hover { + color: #cc6666; +} + +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, .thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small, .thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large, .thread.grid-li.grid-size-large:hover { + background-color: #282A2E; + border: 1px solid #373b41; +} + +/* Posting form */ +/* Field names */ +form table tr th { + background: #282A2E; + color: #ACACAC; + border: 1px solid #373b41; +} +/* Input fields */ +textarea, input:not([type="file"]):not([type="checkbox"]), [type="submit"] { + color: #ACACAC; + background: #282A2E; + border: 1px double #1d1f21; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, input:not([type="file"]):not([type="checkbox"]):focus, [type="submit"]:hover { + border: 1px solid #1d1f21; + -moz-box-shadow: 0 0 10px #1d1f21; + -webkit-box-shadow: 0 0 10px #1d1f21; + box-shadow: 0 0 10px #1d1f21; +} + +/* OP */ +/* Subject */ +.intro span.subject { + color: #b294bb; +} + +/* name */ +.intro span.name { + color: #5f89ac; +} + +/* tripcode */ +.intro span.trip { + color: #8abeb7; +} + +/* Replies */ +/* Background color and green border */ +div.post.reply { + background: #282A2E; + border-color: #373b41; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Highlighted replies */ +div.post.reply.highlighted { + background: #282A2E; + border-color: #5f89ac; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} From 68080f90bfba1a3fd930ed512f877072cf73d7e1 Mon Sep 17 00:00:00 2001 From: Dedushka Date: Sun, 17 Jan 2021 16:17:37 -0500 Subject: [PATCH 18/19] Add bunker-like CSS them, adresses #145 --- inc/instance-config.php | 1 + stylesheets/bunker_like.css | 175 ++++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 stylesheets/bunker_like.css diff --git a/inc/instance-config.php b/inc/instance-config.php index a95c26cf..c752938f 100644 --- a/inc/instance-config.php +++ b/inc/instance-config.php @@ -290,6 +290,7 @@ $config['stylesheets']['TempDark'] = 'temp_dark.css'; $config['stylesheets']['TempDarkRed'] = 'temp_dark_red.css'; $config['stylesheets']['Tomorrow'] = 'tomorrow.css'; $config['stylesheets']['AnonsDarkRed'] = 'anons_dark_red.css'; +$config['stylesheets']['BunkerLike'] = 'bunker_like.css'; $config['default_stylesheet'] = array('Dark Red', $config['stylesheets']['Dark Red']); /* diff --git a/stylesheets/bunker_like.css b/stylesheets/bunker_like.css new file mode 100644 index 00000000..65de9e9b --- /dev/null +++ b/stylesheets/bunker_like.css @@ -0,0 +1,175 @@ +body { + background: #1D1F21; + color: #ACACAC; + font-family: Courier, monospace; + font-size: 13px; +} + +/* LINKS */ +a, a:link, a:visited, .intro a.email span.name { + color: #FFB300; + text-decoration: none; +} +a:link:hover, a:visited:hover { + color: #FFB300; + text-shadow: 0px 0px 5px #117743; +} +div.pages a.selected { + color: #FFB300; +} + +/* INTRO */ +h1, div.title, header div.subtitle { + color: #663E11; + font-family: Courier, monospace; +} +h1 { + font-size: 24pt; + font-weight: normal; + letter-spacing: 0px; +} +header div.subtitle { + font-size: 12pt; +} + +/* FORMS AND BUTTONS */ +div.banner { + background-color: inherit; + color: #ACACAC; +} +form table { + border: 1px dashed #117743; + padding-right: 1px; +} +form table tr th { + background: #282A2E; + border: 1px solid #117743; + border-radius: 5px; +} +input[type="text"], input[type="password"], textarea, select { + border: 1px double #07371F; + border-radius: 5px; + background: #282A2E; + color: #ACACAC; + font-family: Courier, monospace; +} +input[type="text"]:focus, input[type="password"]:focus, textarea:focus { + box-shadow: 0px 0px 5px 2px #117743; +} +input[type="submit"] { + border: 3px double #07371F; + border-radius: 5px; + background: #16171A; + color: #ACACAC; + font-family: Courier, monospace; + font-weight: bold; +} +.dropzone { + background: #16171A; + border: 3px double #07371F; + color: #ACACAC; +} +.dropzone .file-hint { + color: #ACACAC; + font-weight: bold; +} +#quick-reply table { + background: #1D1F21 !important; +} +fieldset { + border: 1px dashed #117743; +} + +/* POST IDENTIFIERS */ +.intro span.subject { + color: #34ED3A; +} +.intro span.name { + color: #117743; +} +.intro span.trip { + color: #117743; +} +.intro a.capcode, p.intro a.nametag { + color: #FF0000; + font-weight: bold; +} +.intro a.email, p.intro a.email span.name, p.intro a.email:hover, p.intro a.email:hover span.name { + color: #34ED97; +} +.intro time { + font-weight: bold; +} +.intro a.post_no { + color: #ACACAC; + font-weight: bold; +} + +/* POST BOXES */ +div.post.reply { + background: #282A2E; + border: 1px solid #117743; + border-radius: 5px; +} +div.post.reply.highlighted { + background: rgba(59, 22, 43, 0.4); + border: 1px solid #117743; + border-radius: 5px; +} + +/* POST CONTENT */ +div.post.reply div.body a { + color: #FFB300; +} +.quote { + color: #789922; +} + +/* BARS */ +.bar { + background-color: #151515; +} +.bar.top { + border-bottom: 1px solid #B0790A; +} +.bar.bottom { + border-top: 1px solid #B0790A; +} +div.boardlist { + color: #ACACAC; +} +hr { + border: none; + border-top: 1pt solid #117743; +} + +/* CATALOG */ +.theme-catalog h1 { + color: #ACACAC; + font-size: 18pt; + font-weight: bold; +} +.theme-catalog h1 a { + font-weight: normal; +} +.theme-catalog div.thread, .theme-catalog div.thread:hover { + background: #282A2E; + border: 1px solid #117743; + border-radius: 5px; + font-size: 10pt; +} + +/* OPTIONS */ +#options_div, #alert_div { + background: #1D1F21; + border: 1px dashed #117743; +} +#options_tablist { + border-right: 1px dashed #117743; +} +.options_tab_icon { + color: #ACACAC; +} +.options_tab_icon.active { + color: #FFB300; +} From 88c5ecc67ec36b6e52b6440bf2c147f01898cb33 Mon Sep 17 00:00:00 2001 From: Dedushka Date: Sun, 17 Jan 2021 17:01:32 -0500 Subject: [PATCH 19/19] Add updated demain stylesheets --- stylesheets/demain_dark.css | 382 ++++++++++++++++++---------------- stylesheets/demain_light.css | 389 +++++++++++++++++++---------------- 2 files changed, 407 insertions(+), 364 deletions(-) diff --git a/stylesheets/demain_dark.css b/stylesheets/demain_dark.css index 18ccb05d..cfa60f78 100644 --- a/stylesheets/demain_dark.css +++ b/stylesheets/demain_dark.css @@ -1,182 +1,200 @@ -/* Demain_light theme for leftypol.org adapted from Seaweed theme for 4chan*/ -/* Work in progress*/ -/* General */ -/* General */ -body { - background: #e9eced url('img/fade-yotsuba.png') repeat-x 50% 0%; - color: #4c4c4c; - font-size: 11pt; - font-family: liberation.sans -} -/* Link colors */ -a:link, -a:visited, -.intro a.email span.name { - color: #477085; -} -a:hover, -.intro a.post_no:hover { - color: #5d6678; -} -/* Board title and subtitle */ -header div.subtitle, -h1 { - color: #d93f42; -} -/* Post number*/ -a.post_no { - color: #477085; -} -/* "Top bar" of the replies*/ -p.intro { - background: #e3e7e8; - border-color: #cccccc; - border-style: solid; - border-width: 0.8px; - border-radius: 5px; -} -/* Replies */ -/* Background color and border */ -div.post.reply { - background: #e9eced; - border-color: #cccccc; - border-style: solid; - border-width: 0.8px; - border-radius: 5px; -} -div.post.reply.highlighted { - background: #d5dada; - border-color: #477085; - border-style: solid; - border-width: 0.8px; - border-radius: 5px; -} -div.post.reply div.body a { - color: #477085; -} -.intro span.subject { - color: #6b7a1e; -} -/* Greentext */ -span.quote { - color: #6b7a1e -} -/* Catalog grids */ -/* Background color and green border */ -.thread.grid-li.grid-size-vsmall, -.thread.grid-li.grid-size-vsmall:hover, -.thread.grid-li.grid-size-small, -.thread.grid-li.grid-size-small:hover, -.thread.grid-li.grid-size-large, -.thread.grid-li.grid-size-large:hover { - background-color: #e9eced; - border: 1px solid #cccccc; -} -/* Posting form */ -/* Field names */ -form table tr th { - background: #e9eced; - color: #4c4c4c; - border: 1px solid #cccccc; -} -/* Input fields */ -textarea, -input:not([type="file"]):not([type="checkbox"]), -[type="submit"] { - color: #4c4c4c; - background: #e9eced; - border: 1px double #cccccc; - border-radius: 5px; -} -/* Input fields, focused */ -textarea:focus, -input:not([type="file"]):not([type="checkbox"]):focus, -[type="submit"]:hover { - border: 1px solid #d5dada; - -moz-box-shadow: 0 0 10px #d5dada; - -webkit-box-shadow: 0 0 10px #d5dada; - box-shadow: 0 0 10px #d5dada; -} -/* Top bar */ -/* Background, border and fade */ -.bar { - background-color: #e9eced; - border-color: #cccccc!important; - ; - /* comment these out to remove the fade */ - /* - -moz-box-shadow: 0 0 40px #FFB300; - -webkit-box-shadow: 0 0 40px #FFB300; - box-shadow: 0 0 40px #FFB300; - */ -} -/* Bottom bar, not visible in catalog mode */ -div.pages { - background: #e9eced; - border-color: #cccccc; -} -div.pages a.selected { - color: #5d6678; -} -hr { - border-color: #cccccc; -} -div.boardlist { - color: #81a2be; - font-size: 14px; -} -div.boardlist a { - color: #477085; -} -table.modlog tr th { - background: #e9eced; -} - -/* options.js */ -#options_div, -#alert_div { - background: #e9eced; -} - -.desktop-style div.boardlist:nth-child(1) { - background-color: #e9eced; -} -/* Red text */ -span.heading { - color: #d93f42; -} -/* Buggy shit */ -div.post.reply div.body a { - color: #5f89ac; - text-decoration: none; -} -/* OP */ -/* Subject */ -.intro span.subject { - color: #617d6f; -} -/* name */ -.intro span.name { - color: #4c4c4c; -} -/* tripcode */ -.intro span.trip { - color: #5d6678; -} -/* Quick reply */ -/* Quick reply banner */ -div.banner { - background-color: #477085; -} -#quick-reply th, -#quick-reply td { - background-color: #d5dada; -} -#quick-reply table { - border-color: #cccccc -} -/* Buggy shit */ -div.post.reply div.body a { - color: #477085; - text-decoration: none; -} +/* Demain_light theme for leftypol.org adapted from Seaweed theme for 4chan*/ +/* Work in progress*/ +/* General */ +/* Main page */ +legend { + background: indianred +} +div.module, div.ban { + background: #1d1f21;; + border: 1px solid #373b41; + max-width: 700px; + margin: 30px auto; +} +/* Text */ +body { + background: #1d1f21; + color: #ACACAC; + font-size: 14pt; + font-family: "LiberationSansRegular"; +} +/* Link colors */ +a:link, a:visited, .intro a.email span.name { + color: #81a2be; +} +a:hover, +.intro a.post_no:hover { + color: #cc6666; +} +/* Board title and subtitle */ +header div.subtitle, +h1 { + color: indianred; + font-size: 20pt; + font-family: "LiberationSansRegular"; +} +header div.subtitle { + font-size: 10pt; +} +/* Post number*/ +a.post_no { + color: #c5c8c6; +} +/* Replies */ +/* Background color and border */ +div.post.reply { + background: #282A2E; + border-color: #373b41; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply.highlighted { + background: #1b1c21; + border-color: #5f89ac; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply div.body a { + color: #5f89ac; +} +.intro span.subject { + color: #b294bb; +} +/* Greentext */ +span.quote { + color: #b5bd68 +} +/* Orangetext */ +span.orangeQuote { + color: #b294bb +} +/* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, +.thread.grid-li.grid-size-small, +.thread.grid-li.grid-size-large { + background-color: #282A2E; + border: 1px solid #373b41; +} +.thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large:hover { + background: #1b1c21; + border-color: #5f89ac; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Posting form */ +/* Field names */ +form table tr th { + background: #282A2E; + color: #ACACAC; + border: 1px solid #373b41; +} +/* Input fields */ +textarea, input:not([type="file"]):not([type="checkbox"]), [type="submit"] { + color: #ACACAC; + background: #282A2E; + border: 1px double #1d1f21; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, input:not([type="file"]):not([type="checkbox"]):focus, [type="submit"]:hover { + border: 1px solid #1d1f21; + -moz-box-shadow: 0 0 10px #1d1f21; + -webkit-box-shadow: 0 0 10px #1d1f21; + box-shadow: 0 0 10px #1d1f21; +} +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #151515; + border-color: #81a2be!important;; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #151515; + border-color: #81a2be; +} +div.pages a.selected { + color: #cc6666; +} +hr { + border-color: #373b41; +} +div.boardlist { + color: #81a2be; + font-size: 14pt; +} +div.boardlist a { + color: #cc6666; +} +table.modlog tr th { + background: #1d1f21; +} +/* options.js */ +#options_div, #alert_div { + background: #151515; +} +.options_tab_icon { + color: gray; +} +.desktop-style div.boardlist:nth-child(1) { + background-color: #151515; +} +/* Red text */ +span.heading { + color: indianred; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* OP */ +/* Subject */ +.intro span.subject { + color: #b294bb; +} +/* name */ +.intro span.name { + color: #5f89ac; +} +.desktop-style div.boardlist:nth-child(1) { + background-color: #151515; +} +/* Red text */ +span.heading { + color: indianred; +} +/* Upper part of a post */ +div.post p { + display: block; + margin: 0; + line-height: 1.16em; + font-size: 13pt; + min-height: 1.16em; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #5f89ac; + text-decoration: none; +} +/* OP */ +/* Subject */ +.intro span.subject { + color: #b294bb; +} +/* name */ +.intro span.name { + color: #5f89ac; +} diff --git a/stylesheets/demain_light.css b/stylesheets/demain_light.css index 18ccb05d..793fa94b 100644 --- a/stylesheets/demain_light.css +++ b/stylesheets/demain_light.css @@ -1,182 +1,207 @@ -/* Demain_light theme for leftypol.org adapted from Seaweed theme for 4chan*/ -/* Work in progress*/ -/* General */ -/* General */ -body { - background: #e9eced url('img/fade-yotsuba.png') repeat-x 50% 0%; - color: #4c4c4c; - font-size: 11pt; - font-family: liberation.sans -} -/* Link colors */ -a:link, -a:visited, -.intro a.email span.name { - color: #477085; -} -a:hover, -.intro a.post_no:hover { - color: #5d6678; -} -/* Board title and subtitle */ -header div.subtitle, -h1 { - color: #d93f42; -} -/* Post number*/ -a.post_no { - color: #477085; -} -/* "Top bar" of the replies*/ -p.intro { - background: #e3e7e8; - border-color: #cccccc; - border-style: solid; - border-width: 0.8px; - border-radius: 5px; -} -/* Replies */ -/* Background color and border */ -div.post.reply { - background: #e9eced; - border-color: #cccccc; - border-style: solid; - border-width: 0.8px; - border-radius: 5px; -} -div.post.reply.highlighted { - background: #d5dada; - border-color: #477085; - border-style: solid; - border-width: 0.8px; - border-radius: 5px; -} -div.post.reply div.body a { - color: #477085; -} -.intro span.subject { - color: #6b7a1e; -} -/* Greentext */ -span.quote { - color: #6b7a1e -} -/* Catalog grids */ -/* Background color and green border */ -.thread.grid-li.grid-size-vsmall, -.thread.grid-li.grid-size-vsmall:hover, -.thread.grid-li.grid-size-small, -.thread.grid-li.grid-size-small:hover, -.thread.grid-li.grid-size-large, -.thread.grid-li.grid-size-large:hover { - background-color: #e9eced; - border: 1px solid #cccccc; -} -/* Posting form */ -/* Field names */ -form table tr th { - background: #e9eced; - color: #4c4c4c; - border: 1px solid #cccccc; -} -/* Input fields */ -textarea, -input:not([type="file"]):not([type="checkbox"]), -[type="submit"] { - color: #4c4c4c; - background: #e9eced; - border: 1px double #cccccc; - border-radius: 5px; -} -/* Input fields, focused */ -textarea:focus, -input:not([type="file"]):not([type="checkbox"]):focus, -[type="submit"]:hover { - border: 1px solid #d5dada; - -moz-box-shadow: 0 0 10px #d5dada; - -webkit-box-shadow: 0 0 10px #d5dada; - box-shadow: 0 0 10px #d5dada; -} -/* Top bar */ -/* Background, border and fade */ -.bar { - background-color: #e9eced; - border-color: #cccccc!important; - ; - /* comment these out to remove the fade */ - /* - -moz-box-shadow: 0 0 40px #FFB300; - -webkit-box-shadow: 0 0 40px #FFB300; - box-shadow: 0 0 40px #FFB300; - */ -} -/* Bottom bar, not visible in catalog mode */ -div.pages { - background: #e9eced; - border-color: #cccccc; -} -div.pages a.selected { - color: #5d6678; -} -hr { - border-color: #cccccc; -} -div.boardlist { - color: #81a2be; - font-size: 14px; -} -div.boardlist a { - color: #477085; -} -table.modlog tr th { - background: #e9eced; -} - -/* options.js */ -#options_div, -#alert_div { - background: #e9eced; -} - -.desktop-style div.boardlist:nth-child(1) { - background-color: #e9eced; -} -/* Red text */ -span.heading { - color: #d93f42; -} -/* Buggy shit */ -div.post.reply div.body a { - color: #5f89ac; - text-decoration: none; -} -/* OP */ -/* Subject */ -.intro span.subject { - color: #617d6f; -} -/* name */ -.intro span.name { - color: #4c4c4c; -} -/* tripcode */ -.intro span.trip { - color: #5d6678; -} -/* Quick reply */ -/* Quick reply banner */ -div.banner { - background-color: #477085; -} -#quick-reply th, -#quick-reply td { - background-color: #d5dada; -} -#quick-reply table { - border-color: #cccccc -} -/* Buggy shit */ -div.post.reply div.body a { - color: #477085; - text-decoration: none; -} +/* Demain_light theme for leftypol.org adapted from Seaweed theme for 4chan*/ +/* Work in progress*/ +/* General */ +/* Main page */ +legend { + background: #477085 +} +div.module, div.ban { + background: #e9eced; + border: 1px solid #cccccc; + max-width: 700px; + margin: 30px auto; +} +/* Text */ +body { + background: #e9eced; + color: #4c4c4c; + font-size: 13pt; + font-family: "Open Sans", sans-serif; +} +/* Link colors */ +a:link, +a:visited, +.intro a.email span.name { + color: #477085; +} +a:hover, +.intro a.post_no:hover { + color: #5d6678; +} +/* Board title and subtitle */ +header div.subtitle, +h1 { + color: #d93f42; + font-size: 20pt; + font-family: "Open Sans", sans-serif; +} +header div.subtitle { + font-size: 10pt; +} +/* Post number*/ +a.post_no { + color: #477085; +} +/* "Top bar" of the replies*/ +p.intro { + background: #e3e7e8; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Replies */ +/* Background color and border */ +div.post.reply { + background: #e9eced; + border-color: #cccccc; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply.highlighted { + background: #d5dada; + border-color: #477085; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +div.post.reply div.body a { + color: #477085; +} +.intro span.subject { + color: #6b7a1e; +} +/* Upper part of a post */ +div.post p { + display: block; + margin: 0; + line-height: 1.16em; + font-size: 13pt; + min-height: 1.16em; +} +/* Greentext */ +span.quote { + color: #6b7a1e +} +/* Orangetext */ +orangeText { + color: #ffb854 +} +* Catalog grids */ +/* Background color and green border */ +.thread.grid-li.grid-size-vsmall, +.thread.grid-li.grid-size-small, +.thread.grid-li.grid-size-large { + background-color: #e9eced; + border: 1px solid #cccccc; +} +.thread.grid-li.grid-size-vsmall:hover, +.thread.grid-li.grid-size-small:hover, +.thread.grid-li.grid-size-large:hover { + background: #d5dada; + border-color: #477085; + border-style: solid; + border-width: 0.8px; + border-radius: 5px; +} +/* Posting form */ +/* Field names */ +form table tr th { + background: #e9eced; + color: #4c4c4c; + border: 1px solid #cccccc; +} +/* Input fields */ +textarea, +input:not([type="file"]):not([type="checkbox"]), +[type="submit"] { + color: #4c4c4c; + background: #e9eced; + border: 1px double #cccccc; + border-radius: 5px; +} +/* Input fields, focused */ +textarea:focus, +input:not([type="file"]):not([type="checkbox"]):focus, +[type="submit"]:hover { + border: 1px solid #d5dada; + -moz-box-shadow: 0 0 10px #d5dada; + -webkit-box-shadow: 0 0 10px #d5dada; + box-shadow: 0 0 10px #d5dada; +} +/* Top bar */ +/* Background, border and fade */ +.bar { + background-color: #e9eced; + border-color: #cccccc!important; + ; + /* comment these out to remove the fade */ + /* + -moz-box-shadow: 0 0 40px #FFB300; + -webkit-box-shadow: 0 0 40px #FFB300; + box-shadow: 0 0 40px #FFB300; + */ +} +/* Bottom bar, not visible in catalog mode */ +div.pages { + background: #e9eced; + border-color: #cccccc; +} +div.pages a.selected { + color: #5d6678; +} +hr { + border-color: #cccccc; +} +div.boardlist { + color: #81a2be; + font-size: 14pt; +} +div.boardlist a { + color: #477085; +} +table.modlog tr th { + background: #e9eced; +} + +/* options.js */ +#options_div, +#alert_div { + background: #e9eced; +} + +.desktop-style div.boardlist:nth-child(1) { + background-color: #e9eced; +} +/* Red text */ +span.heading { + color: #d93f42; +} +/* OP */ +/* Subject */ +.intro span.subject { + color: #617d6f; +} +/* name */ +.intro span.name { + color: #4c4c4c; +} +/* tripcode */ +.intro span.trip { + color: #5d6678; +} +/* Fix OP file bleeding out of the border*/ +.post-image { + margin: 37px +} +/* Quick reply */ +/* Quick reply banner */ +div.banner { + background-color: #477085; +} +/* Buggy shit */ +div.post.reply div.body a { + color: #477085; + text-decoration: none; +}