From a754155d5bee8946bb4bdae3ee075e9f595b5e00 Mon Sep 17 00:00:00 2001
From: 8chan
Date: Tue, 28 Oct 2014 23:23:17 -0700
Subject: [PATCH] Multiple board volunteers patch
---
faq.php | 6 +-
inc/8chan-mod-pages.php | 406 +++++++++++++++++++++++++++++++++++
inc/bans.php | 7 +-
inc/instance-config.php | 325 +---------------------------
inc/mod/pages.php | 14 +-
templates/mod/dashboard.html | 2 +-
templates/mod/settings.html | 1 +
7 files changed, 435 insertions(+), 326 deletions(-)
create mode 100644 inc/8chan-mod-pages.php
diff --git a/faq.php b/faq.php
index f612ec5e..6c039741 100644
--- a/faq.php
+++ b/faq.php
@@ -27,7 +27,7 @@ $body = <<
Other than that, you are free to institute whatever rules you want on your board.
How do I add more volunteers?
-Give them your password. If you don't trust them enough for that, you probably shouldn't be making them a volunteer.
+You may do this in your board settings, click on "Edit board volunteers".
How do I manage my board?
Go to the volunteer panel and click on the board link for your board.
How do I contact the admin?
@@ -39,7 +39,9 @@ $body = <<If either of those is true, the board was deleted automatically. You are free to recreate it. I cannot restore it, so don't bother emailing me about it.
How do I post as a volunteer on my board?
-Make sure you are using the volunteer interface to view your board. The URL of your browser should be https://8chan.co/mod.php?/yourboard. Then, put "## Board Volunteer" in the name field. Write your post and click "Reply". It will appear with your volunteer capcode.
+Make sure you are using the volunteer interface to view your board. The URL of your browser should be https://8chan.co/mod.php?/yourboard.
+
+If you are the owner of the board, put "## Board Owner" in the name field. If someone else is the owner and you are just assisting them, put "## Board Volunteer" in the name field. Write your post and click "Reply". It will appear with your capcode.
Help! The owner of X board is doing something I don't like!
If they aren't doing anything illegal, I can't help you. I don't dictate how board owners should manage their boards.
If they are doing something illegal, email me.
diff --git a/inc/8chan-mod-pages.php b/inc/8chan-mod-pages.php
new file mode 100644
index 00000000..2e570b8a
--- /dev/null
+++ b/inc/8chan-mod-pages.php
@@ -0,0 +1,406 @@
+purify($s);
+ return $clean_html;
+ }
+ }
+
+ $config['mod']['show_ip'] = GLOBALVOLUNTEER;
+ $config['mod']['show_ip_less'] = BOARDVOLUNTEER;
+ $config['mod']['manageusers'] = GLOBALVOLUNTEER;
+ $config['mod']['noticeboard_post'] = GLOBALVOLUNTEER;
+ $config['mod']['search'] = GLOBALVOLUNTEER;
+ $config['mod']['clean_global'] = GLOBALVOLUNTEER;
+ $config['mod']['debug_recent'] = ADMIN;
+ $config['mod']['debug_antispam'] = ADMIN;
+ $config['mod']['noticeboard_post'] = ADMIN;
+ $config['mod']['modlog'] = GLOBALVOLUNTEER;
+ $config['mod']['editpost'] = BOARDVOLUNTEER;
+ $config['mod']['edit_banners'] = MOD;
+ $config['mod']['edit_flags'] = MOD;
+ $config['mod']['edit_settings'] = MOD;
+ $config['mod']['edit_volunteers'] = MOD;
+ $config['mod']['clean'] = BOARDVOLUNTEER;
+ // new perms
+
+ $config['mod']['ban'] = BOARDVOLUNTEER;
+ $config['mod']['unban'] = BOARDVOLUNTEER;
+ $config['mod']['deletebyip'] = BOARDVOLUNTEER;
+ $config['mod']['sticky'] = BOARDVOLUNTEER;
+ $config['mod']['lock'] = BOARDVOLUNTEER;
+ $config['mod']['postinlocked'] = BOARDVOLUNTEER;
+ $config['mod']['bumplock'] = BOARDVOLUNTEER;
+ $config['mod']['view_bumplock'] = BOARDVOLUNTEER;
+ $config['mod']['bypass_field_disable'] = BOARDVOLUNTEER;
+ $config['mod']['view_banlist'] = BOARDVOLUNTEER;
+ $config['mod']['view_banstaff'] = BOARDVOLUNTEER;
+ $config['mod']['public_ban'] = BOARDVOLUNTEER;
+ $config['mod']['recent'] = BOARDVOLUNTEER;
+ $config['mod']['ban_appeals'] = BOARDVOLUNTEER;
+ $config['mod']['view_ban_appeals'] = BOARDVOLUNTEER;
+
+ $config['mod']['custom_pages']['/volunteers/(\%b)'] = function($b) {
+ global $board, $config, $pdo;
+ if (!hasPermission($config['mod']['edit_volunteers'], $b))
+ error($config['error']['noaccess']);
+
+ if (!openBoard($b))
+ error("Could not open board!");
+
+ if (isset($_POST['username'], $_POST['password'])) {
+ $query = prepare('SELECT * FROM ``mods`` WHERE type = 19 AND boards = :board');
+ $query->bindValue(':board', $b);
+ $query->execute() or error(db_error($query));
+ $count = $query->rowCount();
+ $query = prepare('SELECT `username` FROM ``mods``');
+ $query->execute() or error(db_error($query));
+ $volunteers = $query->fetchAll(PDO::FETCH_ASSOC);
+
+ if ($_POST['username'] == '')
+ error(sprintf($config['error']['required'], 'username'));
+ if ($_POST['password'] == '')
+ error(sprintf($config['error']['required'], 'password'));
+
+ if ($count > 10) {
+ error(_('Too many board volunteers!'));
+ }
+
+ foreach ($volunteers as $i => $v) {
+ if ($_POST['username'] == $v['username']) {
+ error(_('Refusing to create a volunteer with the same username as an existing one.'));
+ }
+ }
+
+ $salt = generate_salt();
+ $password = hash('sha256', $salt . sha1($_POST['password']));
+
+ $query = prepare('INSERT INTO ``mods`` VALUES (NULL, :username, :password, :salt, 19, :board)');
+ $query->bindValue(':username', $_POST['username']);
+ $query->bindValue(':password', $password);
+ $query->bindValue(':salt', $salt);
+ $query->bindValue(':board', $b);
+ $query->execute() or error(db_error($query));
+
+ $userID = $pdo->lastInsertId();
+
+
+ modLog('Created a new volunteer: ' . utf8tohtml($_POST['username']) . ' (#' . $userID . ')');
+ }
+
+ if (isset($_POST['delete'])){
+ foreach ($_POST['delete'] as $i => $d){
+ $query = prepare('SELECT * FROM ``mods`` WHERE id = :id');
+ $query->bindValue(':id', $d);
+ $query->execute() or error(db_error($query));
+
+ $result = $query->fetch(PDO::FETCH_ASSOC);
+
+ if (!$result) {
+ error(_('Volunteer does not exist!'));
+ }
+
+ if ($result['boards'] != $b || $result['type'] != BOARDVOLUNTEER) {
+ error($config['error']['noaccess']);
+ }
+
+ $query = prepare('DELETE FROM ``mods`` WHERE id = :id');
+ $query->bindValue(':id', $d);
+ $query->execute() or error(db_error($query));
+ }
+ }
+
+ $query = prepare('SELECT * FROM ``mods`` WHERE type = 19 AND boards = :board');
+ $query->bindValue(':board', $b);
+ $query->execute() or error(db_error($query));
+ $volunteers = $query->fetchAll(PDO::FETCH_ASSOC);
+
+ mod_page(_('Edit volunteers'), 'mod/volunteers.html', array('board'=>$board,'token'=>make_secure_link_token('volunteers/'.$board['uri']),'volunteers'=>$volunteers));
+
+ };
+
+ $config['mod']['custom_pages']['/flags/(\%b)'] = function($b) {
+ global $config, $mod, $board;
+ require_once 'inc/image.php';
+
+ if (!hasPermission($config['mod']['edit_flags'], $b))
+ error($config['error']['noaccess']);
+
+ if (!openBoard($b))
+ error("Could not open board!");
+
+ $dir = 'static/custom-flags/'.$b;
+
+ if (!is_dir($dir)){
+ mkdir($dir, 0777, true);
+ }
+
+ if (isset($_FILES['file'])){
+ $upload = $_FILES['file']['tmp_name'];
+ $banners = array_diff(scandir($dir), array('..', '.'));
+
+ if (!is_readable($upload))
+ error($config['error']['nomove']);
+
+ $id = time() . substr(microtime(), 2, 3);
+ $extension = strtolower(mb_substr($_FILES['file']['name'], mb_strrpos($_FILES['file']['name'], '.') + 1));
+
+ if ($extension != 'png') {
+ error(_('Flags must be in PNG format.'));
+ }
+
+ if (filesize($upload) > 48000){
+ error(_('File too large!'));
+ }
+
+ if (!$size = @getimagesize($upload)) {
+ error($config['error']['invalidimg']);
+ }
+
+ if ($size[0] != 16 or $size[1] != 11){
+ error(_('Image wrong size!'));
+ }
+ if (sizeof($banners) >= 100) {
+ error(_('Too many flags.'));
+ }
+
+ copy($upload, "$dir/$id.$extension");
+ }
+
+ if (isset($_POST['delete'])){
+ foreach ($_POST['delete'] as $i => $d){
+ if (!preg_match('/[0-9+]\.(png|jpeg|jpg|gif)/', $d)){
+ error('Nice try.');
+ }
+ unlink("$dir/$d");
+ }
+ }
+
+ $banners = array_diff(scandir($dir), array('..', '.'));
+ mod_page(_('Edit banners'), 'mod/banners.html', array('board'=>$board,'banners'=>$banners,'token'=>make_secure_link_token('banners/'.$board['uri'])));
+ };
+
+ $config['mod']['custom_pages']['/banners/(\%b)'] = function($b) {
+ global $config, $mod, $board;
+ require_once 'inc/image.php';
+
+ if (!hasPermission($config['mod']['edit_banners'], $b))
+ error($config['error']['noaccess']);
+
+ if (!openBoard($b))
+ error("Could not open board!");
+
+ $dir = 'static/banners/'.$b;
+
+ if (!is_dir($dir)){
+ mkdir($dir, 0777, true);
+ }
+
+
+ if (isset($_FILES['file'])){
+ $upload = $_FILES['file']['tmp_name'];
+ $banners = array_diff(scandir($dir), array('..', '.'));
+
+ if (!is_readable($upload))
+ error($config['error']['nomove']);
+
+ $id = time() . substr(microtime(), 2, 3);
+ $extension = strtolower(mb_substr($_FILES['file']['name'], mb_strrpos($_FILES['file']['name'], '.') + 1));
+
+ if (!in_array($extension, array('jpg','jpeg','png','gif'))){
+ error('Not an image extension.');
+ }
+
+ if (filesize($upload) > 512000){
+ error('File too large!');
+ }
+
+ if (!$size = @getimagesize($upload)) {
+ error($config['error']['invalidimg']);
+ }
+
+ if ($size[0] != 300 or $size[1] != 100){
+ error('Image wrong size!');
+ }
+ if (sizeof($banners) >= 50) {
+ error('Too many banners.');
+ }
+
+ copy($upload, "$dir/$id.$extension");
+ }
+
+ if (isset($_POST['delete'])){
+ foreach ($_POST['delete'] as $i => $d){
+ if (!preg_match('/[0-9+]\.(png|jpeg|jpg|gif)/', $d)){
+ error('Nice try.');
+ }
+ unlink("$dir/$d");
+ }
+ }
+
+ $banners = array_diff(scandir($dir), array('..', '.'));
+ mod_page(_('Edit banners'), 'mod/banners.html', array('board'=>$board,'banners'=>$banners,'token'=>make_secure_link_token('banners/'.$board['uri'])));
+
+ };
+
+ $config['mod']['custom_pages']['/settings/(\%b)'] = function($b) {
+ global $config, $mod;
+
+ if (!in_array($b, $mod['boards']) and $mod['boards'][0] != '*')
+ error($config['error']['noaccess']);
+
+ if (!openBoard($b))
+ error("Could not open board!");
+
+ $possible_languages = array_diff(scandir('inc/locale/'), array('..', '.', '.tx', 'README.md'));
+
+ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+ $title = $_POST['title'];
+ $subtitle = $_POST['subtitle'];
+ $country_flags = isset($_POST['country_flags']) ? 'true' : 'false';
+ $field_disable_name = isset($_POST['field_disable_name']) ? 'true' : 'false';
+ $enable_embedding = isset($_POST['enable_embedding']) ? 'true' : 'false';
+ $force_image_op = isset($_POST['force_image_op']) ? 'true' : 'false';
+ $disable_images = isset($_POST['disable_images']) ? 'true' : 'false';
+ $poster_ids = isset($_POST['poster_ids']) ? 'true' : 'false';
+ $show_sages = isset($_POST['show_sages']) ? 'true' : 'false';
+ $auto_unicode = isset($_POST['auto_unicode']) ? 'true' : 'false';
+ $allow_roll = isset($_POST['allow_roll']) ? 'true' : 'false';
+ $image_reject_repost = isset($_POST['image_reject_repost']) ? 'true' : 'false';
+ $allow_delete = isset($_POST['allow_delete']) ? 'true' : 'false';
+ $allow_flash = isset($_POST['allow_flash']) ? '$config[\'allowed_ext_files\'][] = \'swf\';' : '';
+ $code_tags = isset($_POST['code_tags']) ? '$config[\'additional_javascript\'][] = \'js/code_tags/run_prettify.js\';$config[\'markup\'][] = array("/\[code\](.+?)\[\/code\]/ms", "\$1
");' : '';
+ $katex = isset($_POST['katex']) ? '$config[\'katex\'] = true;$config[\'additional_javascript\'][] = \'js/katex/katex.min.js\'; $config[\'markup\'][] = array("/\[tex\](.+?)\[\/tex\]/ms", "\$1"); $config[\'additional_javascript\'][] = \'js/katex-enable.js\';' : '';
+$oekaki_js = << $r ) {
+ if ($r !== '') {
+ $w = $_POST['with'][$i];
+ $replace .= '$config[\'wordfilters\'][] = array(base64_decode(\'' . base64_encode($r) . '\'), base64_decode(\'' . base64_encode($w) . '\'));';
+ }
+ }
+ }
+ }
+
+ if (!(strlen($title) < 40))
+ error('Invalid title');
+ if (!(strlen($subtitle) < 200))
+ error('Invalid subtitle');
+
+ $query = prepare('UPDATE ``boards`` SET `title` = :title, `subtitle` = :subtitle, `indexed` = :indexed, `public_bans` = :public_bans, `8archive` = :8archive WHERE `uri` = :uri');
+ $query->bindValue(':title', $title);
+ $query->bindValue(':subtitle', $subtitle);
+ $query->bindValue(':uri', $b);
+ $query->bindValue(':indexed', !isset($_POST['meta_noindex']));
+ $query->bindValue(':public_bans', isset($_POST['public_bans']));
+ $query->bindValue(':8archive', isset($_POST['8archive']));
+ $query->execute() or error(db_error($query));
+
+ $config_file = <<fetchAll(PDO::FETCH_ASSOC)));
+ file_write($b.'/config.php', $config_file);
+ file_write('stylesheets/board/'.$b.'.css', $_POST['css']);
+ file_write($b.'/rules.html', Element('page.html', array('title'=>'Rules', 'subtitle'=>'', 'config'=>$config, 'body'=>''.purify($_POST['rules']).'
')));
+ file_write($b.'/rules.txt', $_POST['rules']);
+
+ $_config = $config;
+
+ openBoard($b);
+
+ // be smarter about rebuilds...only some changes really require us to rebuild all threads
+ if ($_config['blotter'] != $config['blotter'] || $_config['field_disable_name'] != $config['field_disable_name'] || $_config['show_sages'] != $config['show_sages']) {
+ buildIndex();
+ $query = query(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL", $b)) or error(db_error());
+ while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
+ buildThread($post['id']);
+ }
+ }
+
+ buildJavascript();
+
+ modLog('Edited board settings', $b);
+ }
+
+ $query = prepare('SELECT * FROM boards WHERE uri = :board');
+ $query->bindValue(':board', $b);
+ $query->execute() or error(db_error($query));
+ $board = $query->fetchAll()[0];
+
+ $rules = @file_get_contents($board['uri'] . '/rules.txt');
+ $css = @file_get_contents('stylesheets/board/' . $board['uri'] . '.css');
+
+ openBoard($b);
+
+ rebuildThemes('bans');
+
+ if ($config['cache']['enabled'])
+ cache::delete('board_' . $board['uri']);
+ cache::delete('all_boards');
+
+ mod_page(_('Board configuration'), 'mod/settings.html', array('board'=>$board, 'rules'=>prettify_textarea($rules), 'css'=>prettify_textarea($css), 'token'=>make_secure_link_token('settings/'.$board['uri']), 'languages'=>$possible_languages));
+ };
diff --git a/inc/bans.php b/inc/bans.php
index df4c21b2..14b7f939 100644
--- a/inc/bans.php
+++ b/inc/bans.php
@@ -202,11 +202,14 @@ class Bans {
case ADMIN:
$ban['username'] = 'Admin';
break;
- case SUPERMOD:
+ case GLOBALVOLUNTEER:
$ban['username'] = 'Global Volunteer';
break;
case MOD:
- $ban['username'] = 'Local Volunteer';
+ $ban['username'] = 'Board Owner';
+ break;
+ case BOARDVOLUNTEER:
+ $ban['username'] = 'Board Volunteer';
break;
default:
$ban['username'] = '?';
diff --git a/inc/instance-config.php b/inc/instance-config.php
index 079629f1..da71d072 100644
--- a/inc/instance-config.php
+++ b/inc/instance-config.php
@@ -49,7 +49,7 @@
// Load database credentials
require "secrets.php";
-
+
// Image shit
$config['thumb_method'] = 'gm+gifsicle';
$config['thumb_ext'] = '';
@@ -66,31 +66,16 @@
$config['webm']['max_length'] = 60 * 15;
// Mod shit
- $config['mod']['groups'][25] = 'Supermod';
+ $config['mod']['groups'][25] = 'GlobalVolunteer';
+ $config['mod']['groups'][19] = 'BoardVolunteer';
define_groups();
- $config['mod']['capcode'][MOD] = array('Board Volunteer');
- $config['mod']['capcode'][SUPERMOD] = array('Global Volunteer');
+ $config['mod']['capcode'][BOARDVOLUNTEER] = array('Board Volunteer');
+ $config['mod']['capcode'][MOD] = array('Board Owner');
+ $config['mod']['capcode'][GLOBALVOLUNTEER] = array('Global Volunteer');
$config['custom_capcode']['Admin'] = array(
' %s',
);
- $config['custom_capcode']['Bear'] = array(
- '
%s',
- );
- //$config['mod']['view_banlist'] = SUPERMOD;
- $config['mod']['show_ip'] = SUPERMOD;
- $config['mod']['show_ip_less'] = MOD;
- $config['mod']['manageusers'] = SUPERMOD;
- $config['mod']['noticeboard_post'] = SUPERMOD;
- $config['mod']['search'] = SUPERMOD;
- $config['mod']['clean_global'] = SUPERMOD;
- $config['mod']['debug_recent'] = ADMIN;
- $config['mod']['debug_antispam'] = ADMIN;
- $config['mod']['modlog'] = SUPERMOD;
- $config['mod']['editpost'] = MOD;
- $config['mod']['edit_banners'] = MOD;
- $config['mod']['edit_flags'] = MOD;
- $config['mod']['edit_settings'] = MOD;
- $config['mod']['clean'] = MOD;
+ //$config['mod']['view_banlist'] = GLOBALVOLUNTEER;
$config['mod']['recent_reports'] = 65535;
$config['mod']['ip_less_recentposts'] = 75;
$config['ban_show_post'] = true;
@@ -159,7 +144,7 @@
$config['markup'][] = array("/~~(.+?)~~/", "\$1");
$config['markup'][] = array("/__(.+?)__/", "\$1");
- $config['boards'] = array(array('' => '/', '' => '/boards.html', '' => '/faq.html', '' => '/random.php', '' => '/create.php', '' => '/bans.html', '' => '/search.php', '' => '/mod.php', '' => 'https://qchat.rizon.net/?channels=#8chan'), array('b', 'meta', 'int'), array(''=>'https://twitter.com/infinitechan'));
+ $config['boards'] = array(array('' => '/', '' => '/boards.html', '' => '/faq.html', '' => '/random.php', '' => '/create.php', '' => '/bans.html', '' => '/search.php', '' => '/mod.php', '' => 'https://qchat.rizon.net/?channels=#8chan'), array('b', 'meta'), array(''=>'https://twitter.com/infinitechan'));
//$config['boards'] = array(array('' => '/', '' => '/boards.html', '' => '/faq.html', '' => '/random.php', '' => '/create.php', '' => '/search.php', '' => '/mod.php', '' => 'https://qchat.rizon.net/?channels=#8chan'), array('b', 'meta', 'int'), array('v', 'a', 'tg', 'fit', 'pol', 'tech', 'mu', 'co', 'sp', 'boards'), array(''=>'https://twitter.com/infinitechan'));
$config['footer'][] = 'Contribute to 8chan.co development at github';
@@ -172,298 +157,7 @@
$config['wordfilters'][] = array('\rule', ''); // 'true' means it's a regular expression
- if (!function_exists('prettify_textarea')){
- function prettify_textarea($s){
- return str_replace("\t", ' ', str_replace("\n", '
', htmlentities($s)));
- }
- }
- if (!function_exists('purify')){
- function purify($s){
- $config = HTMLPurifier_Config::createDefault();
- $purifier = new HTMLPurifier($config);
- $clean_html = $purifier->purify($s);
- return $clean_html;
- }
- }
-
- $config['mod']['custom_pages']['/flags/(\%b)'] = function($b) {
- global $config, $mod, $board;
- require_once 'inc/image.php';
-
- if (!hasPermission($config['mod']['edit_flags'], $b))
- error($config['mod']['noaccess']);
-
- if (!openBoard($b))
- error("Could not open board!");
-
- $dir = 'static/custom-flags/'.$b;
-
- if (!is_dir($dir)){
- mkdir($dir, 0777, true);
- }
-
- if (isset($_FILES['file'])){
- $upload = $_FILES['file']['tmp_name'];
- $banners = array_diff(scandir($dir), array('..', '.'));
-
- if (!is_readable($upload))
- error($config['error']['nomove']);
-
- $id = time() . substr(microtime(), 2, 3);
- $extension = strtolower(mb_substr($_FILES['file']['name'], mb_strrpos($_FILES['file']['name'], '.') + 1));
-
- if ($extension != 'png') {
- error(_('Flags must be in PNG format.'));
- }
-
- if (filesize($upload) > 48000){
- error(_('File too large!'));
- }
-
- if (!$size = @getimagesize($upload)) {
- error($config['error']['invalidimg']);
- }
-
- if ($size[0] != 16 or $size[1] != 11){
- error(_('Image wrong size!'));
- }
- if (sizeof($banners) >= 100) {
- error(_('Too many flags.'));
- }
-
- copy($upload, "$dir/$id.$extension");
- }
-
- if (isset($_POST['delete'])){
- foreach ($_POST['delete'] as $i => $d){
- if (!preg_match('/[0-9+]\.(png|jpeg|jpg|gif)/', $d)){
- error('Nice try.');
- }
- unlink("$dir/$d");
- }
- }
-
- $banners = array_diff(scandir($dir), array('..', '.'));
- mod_page(_('Edit banners'), 'mod/banners.html', array('board'=>$board,'banners'=>$banners,'token'=>make_secure_link_token('banners/'.$board['uri'])));
- };
-
- $config['mod']['custom_pages']['/banners/(\%b)'] = function($b) {
- global $config, $mod, $board;
- require_once 'inc/image.php';
-
- if (!hasPermission($config['mod']['edit_banners'], $b))
- error($config['error']['noaccess']);
-
- if (!openBoard($b))
- error("Could not open board!");
-
- $dir = 'static/banners/'.$b;
-
- if (!is_dir($dir)){
- mkdir($dir, 0777, true);
- }
-
-
- if (isset($_FILES['file'])){
- $upload = $_FILES['file']['tmp_name'];
- $banners = array_diff(scandir($dir), array('..', '.'));
-
- if (!is_readable($upload))
- error($config['error']['nomove']);
-
- $id = time() . substr(microtime(), 2, 3);
- $extension = strtolower(mb_substr($_FILES['file']['name'], mb_strrpos($_FILES['file']['name'], '.') + 1));
-
- if (!in_array($extension, array('jpg','jpeg','png','gif'))){
- error('Not an image extension.');
- }
-
- if (filesize($upload) > 512000){
- error('File too large!');
- }
-
- if (!$size = @getimagesize($upload)) {
- error($config['error']['invalidimg']);
- }
-
- if ($size[0] != 300 or $size[1] != 100){
- error('Image wrong size!');
- }
- if (sizeof($banners) >= 50) {
- error('Too many banners.');
- }
-
- copy($upload, "$dir/$id.$extension");
- }
-
- if (isset($_POST['delete'])){
- foreach ($_POST['delete'] as $i => $d){
- if (!preg_match('/[0-9+]\.(png|jpeg|jpg|gif)/', $d)){
- error('Nice try.');
- }
- unlink("$dir/$d");
- }
- }
-
- $banners = array_diff(scandir($dir), array('..', '.'));
- mod_page(_('Edit banners'), 'mod/banners.html', array('board'=>$board,'banners'=>$banners,'token'=>make_secure_link_token('banners/'.$board['uri'])));
-
- };
-
- $config['mod']['custom_pages']['/settings/(\%b)'] = function($b) {
- global $config, $mod;
-
- if (!in_array($b, $mod['boards']) and $mod['boards'][0] != '*')
- error($config['error']['noaccess']);
-
- if (!openBoard($b))
- error("Could not open board!");
-
- $possible_languages = array_diff(scandir('inc/locale/'), array('..', '.', '.tx', 'README.md'));
-
- if ($_SERVER['REQUEST_METHOD'] == 'POST') {
- $title = $_POST['title'];
- $subtitle = $_POST['subtitle'];
- $country_flags = isset($_POST['country_flags']) ? 'true' : 'false';
- $field_disable_name = isset($_POST['field_disable_name']) ? 'true' : 'false';
- $enable_embedding = isset($_POST['enable_embedding']) ? 'true' : 'false';
- $force_image_op = isset($_POST['force_image_op']) ? 'true' : 'false';
- $disable_images = isset($_POST['disable_images']) ? 'true' : 'false';
- $poster_ids = isset($_POST['poster_ids']) ? 'true' : 'false';
- $show_sages = isset($_POST['show_sages']) ? 'true' : 'false';
- $auto_unicode = isset($_POST['auto_unicode']) ? 'true' : 'false';
- $allow_roll = isset($_POST['allow_roll']) ? 'true' : 'false';
- $image_reject_repost = isset($_POST['image_reject_repost']) ? 'true' : 'false';
- $allow_delete = isset($_POST['allow_delete']) ? 'true' : 'false';
- $allow_flash = isset($_POST['allow_flash']) ? '$config[\'allowed_ext_files\'][] = \'swf\';' : '';
- $code_tags = isset($_POST['code_tags']) ? '$config[\'additional_javascript\'][] = \'js/code_tags/run_prettify.js\';$config[\'markup\'][] = array("/\[code\](.+?)\[\/code\]/ms", "\$1
");' : '';
- $katex = isset($_POST['katex']) ? '$config[\'katex\'] = true;$config[\'additional_javascript\'][] = \'js/katex/katex.min.js\'; $config[\'markup\'][] = array("/\[tex\](.+?)\[\/tex\]/ms", "\$1"); $config[\'additional_javascript\'][] = \'js/katex-enable.js\';' : '';
-$oekaki_js = << $r ) {
- if ($r !== '') {
- $w = $_POST['with'][$i];
- $replace .= '$config[\'wordfilters\'][] = array(base64_decode(\'' . base64_encode($r) . '\'), base64_decode(\'' . base64_encode($w) . '\'));';
- }
- }
- }
- }
-
- if (!(strlen($title) < 40))
- error('Invalid title');
- if (!(strlen($subtitle) < 200))
- error('Invalid subtitle');
-
- $query = prepare('UPDATE ``boards`` SET `title` = :title, `subtitle` = :subtitle, `indexed` = :indexed, `public_bans` = :public_bans, `8archive` = :8archive WHERE `uri` = :uri');
- $query->bindValue(':title', $title);
- $query->bindValue(':subtitle', $subtitle);
- $query->bindValue(':uri', $b);
- $query->bindValue(':indexed', !isset($_POST['meta_noindex']));
- $query->bindValue(':public_bans', isset($_POST['public_bans']));
- $query->bindValue(':8archive', isset($_POST['8archive']));
- $query->execute() or error(db_error($query));
-
- $config_file = <<fetchAll(PDO::FETCH_ASSOC)));
- file_write($b.'/config.php', $config_file);
- file_write('stylesheets/board/'.$b.'.css', $_POST['css']);
- file_write($b.'/rules.html', Element('page.html', array('title'=>'Rules', 'subtitle'=>'', 'config'=>$config, 'body'=>''.purify($_POST['rules']).'
')));
- file_write($b.'/rules.txt', $_POST['rules']);
-
- $_config = $config;
-
- openBoard($b);
-
- // be smarter about rebuilds...only some changes really require us to rebuild all threads
- if ($_config['blotter'] != $config['blotter'] || $_config['field_disable_name'] != $config['field_disable_name'] || $_config['show_sages'] != $config['show_sages']) {
- buildIndex();
- $query = query(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL", $b)) or error(db_error());
- while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
- buildThread($post['id']);
- }
- }
-
- buildJavascript();
-
- modLog('Edited board settings', $b);
- }
-
- $query = prepare('SELECT * FROM boards WHERE uri = :board');
- $query->bindValue(':board', $b);
- $query->execute() or error(db_error($query));
- $board = $query->fetchAll()[0];
-
- $rules = @file_get_contents($board['uri'] . '/rules.txt');
- $css = @file_get_contents('stylesheets/board/' . $board['uri'] . '.css');
-
- openBoard($b);
-
- rebuildThemes('bans');
-
- if ($config['cache']['enabled'])
- cache::delete('board_' . $board['uri']);
- cache::delete('all_boards');
-
- mod_page(_('Board configuration'), 'mod/settings.html', array('board'=>$board, 'rules'=>prettify_textarea($rules), 'css'=>prettify_textarea($css), 'token'=>make_secure_link_token('settings/'.$board['uri']), 'languages'=>$possible_languages));
- };
$config['embedding'] = array(
array(
'/^https?:\/\/(\w+\.)?youtube\.com\/watch\?v=([a-zA-Z0-9\-_]{10,11})(&.+)?$/i',
@@ -492,3 +186,6 @@ EOT;
);
$config['gzip_static'] = false;
+// 8chan specific mod pages
+require '8chan-mod-pages.php';
+
diff --git a/inc/mod/pages.php b/inc/mod/pages.php
index 76734641..1a56c99c 100644
--- a/inc/mod/pages.php
+++ b/inc/mod/pages.php
@@ -100,9 +100,9 @@ function mod_dashboard() {
cache::set('pm_unreadcount_' . $mod['id'], $args['unread_pms']);
}
- $query = prepare('SELECT COUNT(*) AS `total_reports` FROM ``reports``' . ($mod["type"] == "20" ? " WHERE board = :board" : ""));
+ $query = prepare('SELECT COUNT(*) AS `total_reports` FROM ``reports``' . (($mod["type"] == MOD || $mod["type"] == BOARDVOLUNTEER) ? " WHERE board = :board" : ""));
- if ($mod['type'] == MOD) {
+ if ($mod['type'] == MOD || $mod["type"] == BOARDVOLUNTEER) {
$query->bindValue(':board', $mod['boards'][0]);
} else {
$query = prepare('SELECT (SELECT COUNT(id) FROM reports WHERE global = 0) AS total_reports, (SELECT COUNT(id) FROM reports WHERE global = 1) AS global_reports');
@@ -2298,7 +2298,7 @@ function mod_reports() {
error($config['error']['noaccess']);
}
- if( $mod['type'] == MOD and $global) {
+ if( ($mod['type'] == MOD || $mod["type"] == BOARDVOLUNTEER) and $global) {
error($config['error']['noaccess']);
}
@@ -2306,10 +2306,10 @@ function mod_reports() {
$report_scope = $global ? "global" : "local";
// Get REPORTS.
- $query = prepare("SELECT * FROM ``reports`` WHERE " . ($mod["type"] == MOD ? "board = :board AND" : "") . " ``".($global ? "global" : "local")."`` = TRUE LIMIT :limit");
+ $query = prepare("SELECT * FROM ``reports`` WHERE " . (($mod["type"] == MOD || $mod["type"] == BOARDVOLUNTEER) ? "board = :board AND" : "") . " ``".($global ? "global" : "local")."`` = TRUE LIMIT :limit");
// Limit reports by board if the moderator is local.
- if( $mod['type'] == MOD ) {
+ if( $mod['type'] == MOD || $mod["type"] == BOARDVOLUNTEER ) {
$query->bindValue(':board', $mod['boards'][0]);
}
@@ -2527,7 +2527,7 @@ function mod_report_dismiss() {
$global = in_array( "global", $arguments );
$content = in_array( "content", $arguments );
- if( $mod['type'] == MOD and $global ) {
+ if( ($mod['type'] == MOD || $mod["type"] == BOARDVOLUNTEER) and $global ) {
error($config['error']['noaccess']);
}
@@ -2649,7 +2649,7 @@ function mod_report_dismiss() {
function mod_report_demote() {
global $config, $mod;
- if( $mod['type'] == MOD ) {
+ if( $mod['type'] == MOD || $mod["type"] == BOARDVOLUNTEER ) {
error($config['error']['noaccess']);
}
diff --git a/templates/mod/dashboard.html b/templates/mod/dashboard.html
index 03cfbb14..fe6c6a3e 100644
--- a/templates/mod/dashboard.html
+++ b/templates/mod/dashboard.html
@@ -54,7 +54,7 @@
{% trans 'Report queue' %} ({{ reports }})
{% if reports > 0 %}{% endif %}
{% if global_reports > 0 %}{% endif %}
- {% if mod.type != 20 %}Global reports ({{global_reports}}){% endif %}
+ {% if mod.type != constant('MOD') and mod.type != constant('BOARDVOLUNTEER') %}Global reports ({{global_reports}}){% endif %}
{% if reports > 0 %}{% endif %}
{% endif %}
diff --git a/templates/mod/settings.html b/templates/mod/settings.html
index d9a94594..305c650b 100644
--- a/templates/mod/settings.html
+++ b/templates/mod/settings.html
@@ -55,6 +55,7 @@
{% trans %}Edit board banners{% endtrans %}
+ {% trans %}Edit board volunteers{% endtrans %}