Browse Source

feat: edit pre-existing bans (#528)

* feat: edit pre-existing bans

* change default permission

* theres no need for elseif here. related: d34f083a6b33185927c6b79a38477f4ea4ce49b5

* quote href param

* changes made
perdedora 1 year ago
committed by discomrade
parent
commit
c67fbc0690
  1. 11
      inc/bans.php
  2. 2
      inc/config.php
  3. 58
      inc/mod/pages.php
  4. 9
      js/mod/ban-list.js
  5. 1
      mod.php
  6. 17
      templates/mod/ban_form.html
  7. 70
      templates/mod/ban_history.html
  8. 14
      templates/mod/edit_ban.html
  9. 72
      templates/mod/view_ip.html

11
inc/bans.php

@ -113,20 +113,22 @@ class Bans {
return array($ipstart, $ipend);
}
static public function find($ip, $board = false, $get_mod_info = false) {
static public function find($ip, $board = false, $get_mod_info = false, $banid = null) {
global $config;
$query = prepare('SELECT ``bans``.*' . ($get_mod_info ? ', `username`' : '') . ' FROM ``bans``
' . ($get_mod_info ? 'LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`' : '') . '
WHERE
(' . ($board !== false ? '(`board` IS NULL OR `board` = :board) AND' : '') . '
(`ipstart` = :ip OR (:ip >= `ipstart` AND :ip <= `ipend`)))
(`ipstart` = :ip OR (:ip >= `ipstart` AND :ip <= `ipend`)) OR (``bans``.id = :id))
ORDER BY `expires` IS NULL, `expires` DESC');
if ($board !== false)
$query->bindValue(':board', $board, PDO::PARAM_STR);
$query->bindValue(':id', $banid);
$query->bindValue(':ip', inet_pton($ip));
$query->execute() or error(db_error($query));
$ban_list = array();
@ -318,6 +320,9 @@ class Bans {
$query->bindValue(':board', null, PDO::PARAM_NULL);
if ($post) {
if (!isset($board['uri']))
openBoard($post['board']);
$post['board'] = $board['uri'];
$query->bindValue(':post', json_encode($post));
} else

2
inc/config.php

@ -1782,6 +1782,8 @@
$config['mod']['unban'] = MOD;
// Spoiler image
$config['mod']['spoilerimage'] = JANITOR;
// Edit bans
$config['mod']['edit_ban'] = &$config['mod']['ban'];
// Delete file (and keep post)
$config['mod']['deletefile'] = JANITOR;
// Delete all posts by IP

58
inc/mod/pages.php

@ -883,6 +883,14 @@ function mod_page_ip($cip) {
header('Location: ?/IP/' . $cip . '#bans', true, $config['redirect_http']);
return;
}
if (isset($_POST['ban_id'], $_POST['edit_ban'])) {
if (!hasPermission($config['mod']['edit_ban']))
error($config['error']['noaccess']);
header('Location: ?/edit_ban/' . $_POST['ban_id'], true, $config['redirect_http']);
return;
}
if (isset($_POST['note'])) {
if (!hasPermission($config['mod']['create_notes']))
@ -1090,6 +1098,56 @@ function mod_bans_json() {
Bans::stream_json(false, false, !hasPermission($config['mod']['view_banstaff']), $mod['boards']);
}
function mod_edit_ban($ban_id) {
global $mod, $config;
if (!hasPermission($config['mod']['edit_ban']))
error($config['error']['noaccess']);
$args['bans'] = Bans::find(null, false, true, $ban_id);
$args['ban_id'] = $ban_id;
$args['boards'] = listBoards();
$args['current_board'] = isset($args['bans'][0]['board']) ? $args['bans'][0]['board'] : false;
if (!$args['bans'])
error($config['error']['404']);
if (isset($_POST['new_ban'])) {
$new_ban['mask'] = $args['bans'][0]['mask'];
$new_ban['post'] = isset($args['bans'][0]['post']) ? $args['bans'][0]['post'] : false;
$new_ban['board'] = $args['current_board'];
if (isset($_POST['reason']))
$new_ban['reason'] = $_POST['reason'];
else
$new_ban['reason'] = $args['bans'][0]['reason'];
if (isset($_POST['length']) && !empty($_POST['length']))
$new_ban['length'] = $_POST['length'];
else
$new_ban['length'] = false;
if (isset($_POST['board'])) {
if ($_POST['board'] == '*')
$new_ban['board'] = false;
else
$new_ban['board'] = $_POST['board'];
}
Bans::new_ban($new_ban['mask'], $new_ban['reason'], $new_ban['length'], $new_ban['board'], false, $new_ban['post']);
Bans::delete($ban_id);
header('Location: ?/', true, $config['redirect_http']);
}
$args['token'] = make_secure_link_token('edit_ban/' . $ban_id);
mod_page(_('Edit ban'), 'mod/edit_ban.html', $args);
}
function mod_ban_appeals() {
global $config, $board;

9
js/mod/ban-list.js

@ -37,7 +37,7 @@ var banlist_init = function(token, my_boards, inMod) {
}
return pre+f.mask;
} },
reason: {name: _("Reason"), width: "calc(100% - 715px - 6 * 4px)", fmt: function(f) {
reason: {name: _("Reason"), width: "calc(100% - 770px - 6 * 4px)", fmt: function(f) {
var add = "", suf = '';
if (f.seen == 1) add += "<i class='fa fa-check' title='"+_("Seen")+"'></i>";
if (f.message) {
@ -73,7 +73,12 @@ var banlist_init = function(token, my_boards, inMod) {
un = "<em>"+_("system")+"</em>";
}
return pre + un + suf;
} }
} },
id: {
name: (inMod)?_("Edit"):"&nbsp;", width: (inMod)?"35px":"0px", fmt: function(f) {
if (!inMod) return '';
return "<a href='?/edit_ban/"+f.id+"'>Edit</a>";
} }
}, {}, t);
$("#select-all").click(function(e) {

1
mod.php

@ -66,6 +66,7 @@ $pages = array(
'/ban' => 'secure_POST ban', // new ban
'/bans' => 'secure_POST bans', // ban list
'/bans.json' => 'secure bans_json', // ban list JSON
'/edit_ban/(\d+)' => 'secure_POST edit_ban',
'/ban-appeals' => 'secure_POST ban_appeals', // view ban appeals
'/recent/(\d+)' => 'recent_posts', // view recent posts

17
templates/mod/ban_form.html

@ -1,5 +1,7 @@
{% if post and board %}
{% set action = '?/' ~ board ~ '/ban/' ~ post %}
{% elseif edit_ban %}
{% set action = '' %}
{% else %}
{% set action = '?/ban' %}
{% endif %}
@ -24,7 +26,7 @@ $(document).ready(function(){
{% endif %}
<table>
{% if not edit_ban %}
<tr>
<th>
<label for="ip">{% trans 'IP' %} <span class="unimportant">{% trans '(or subnet)' %}</span></label>
@ -37,6 +39,7 @@ $(document).ready(function(){
{% endif %}
</td>
</tr>
{% endif %}
<tr>
<th>
<label for="reason">{% trans 'Reason' %}</label>
@ -76,17 +79,17 @@ $(document).ready(function(){
<td>
<ul style="list-style:none;padding:2px 5px">
<li>
<input type="radio" name="board" value="*" id="ban-allboards"{% if not board %} checked{% endif %}>
<input type="radio" name="board" value="*" id="ban-allboards" {% if (edit_ban and not current_board) or not edit_ban %}checked{% endif %}>
<label style="display:inline" for="ban-allboards">
<em>{% trans 'all boards' %}</em>
</label>
</li>
{% for b in boards %}
{% for board in boards %}
<li>
<input type="radio" name="board" value="{{ b.uri }}" id="ban-board-{{ b.uri }}"{% if board == b.uri %} checked{% endif %}>
<label style="display:inline" for="ban-board-{{ b.uri }}">
{{ config.board_abbreviation|sprintf(b.uri) }} - {{ b.title|e }}
<input type="radio" name="board" value="{{ board.uri }}" id="ban-board-{{ board.uri }}" {% if edit_ban and current_board == board.uri %}checked{% endif %}>
<label style="display:inline" for="ban-board-{{ board.uri }}">
{{ config.board_abbreviation|sprintf(board.uri) }} - {{ board.title|e }}
</label>
</li>
{% endfor %}
@ -95,7 +98,7 @@ $(document).ready(function(){
</tr>
<tr>
<td></td>
<td><input name="new_ban" type="submit" value="{% trans 'New Ban' %}"></td>
<td><input name="new_ban" type="submit" value="{% if edit_ban %}{% trans 'Edit Ban' %}{% else %}{% trans 'New Ban' %}{% endif %}"></td>
</tr>
</table>
</form>

70
templates/mod/ban_history.html

@ -0,0 +1,70 @@
<table style="width:400px;margin-bottom:10px;border-bottom:1px solid #ddd;padding:5px">
<tr>
<th>{% trans 'Status' %}</th>
<td>
{% if config.mod.view_banexpired and ban.expires != 0 and ban.expires < time() %}
{% trans 'Expired' %}
{% else %}
{% trans 'Active' %}
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'IP' %}</th>
<td>{{ ban.cmask }}</td>
</tr>
<tr>
<th>{% trans 'Reason' %}</th>
<td>
{% if ban.reason %}
{{ ban.reason }}
{% else %}
<em>{% trans 'no reason' %}</em>
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'Board' %}</th>
<td>
{% if ban.board %}
{{ config.board_abbreviation|sprintf(ban.board) }}
{% else %}
<em>{% trans 'all boards' %}</em>
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'Set' %}</th>
<td>{{ ban.created|date(config.post_date) }}</td>
</tr>
<tr>
<th>{% trans 'Expires' %}</th>
<td>
{% if ban.expires %}
{{ ban.expires|date(config.post_date) }}
{% else %}
<em>{% trans 'never' %}</em>
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'Seen' %}</th>
<td>
{% if ban.seen %}
{% trans 'Yes' %}
{% else %}
{% trans 'No' %}
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'Staff' %}</th>
<td>
{% if ban.username %}
{{ ban.username|e }}
{% else %}
<em>{% trans 'deleted?' %}</em>
{% endif %}
</td>
</tr>
</table>

14
templates/mod/edit_ban.html

@ -0,0 +1,14 @@
<p style="text-align: center">
{% trans %}The previous ban will be replaced by the edited ban and the ban duration will start from the time of the edit.<br/>
The ban public message will <strong>not</strong> be changed.{% endtrans %}
</p>
<hr>
{% for ban in bans %}
<h2 style="text-align:center">{% trans %}Current ban{% endtrans %}</h2>
<form style="text-align:center; margin-bottom: unset"> {# dummy form to trigger css rules #}
{% include 'mod/ban_history.html' %}
</form>
<hr>
<h2 style="text-align:center">{% trans %}New ban{% endtrans %}</h2>
{% include 'mod/ban_form.html' with {'edit_ban': true} %}
{% endfor %}

72
templates/mod/view_ip.html

@ -154,78 +154,10 @@
{% for ban in bans %}
<form action="" method="post" style="text-align:center">
<input type="hidden" name="token" value="{{ security_token }}">
<table style="width:400px;margin-bottom:10px;border-bottom:1px solid #ddd;padding:5px">
<tr>
<th>{% trans 'Status' %}</th>
<td>
{% if config.mod.view_banexpired and ban.expires != 0 and ban.expires < time() %}
{% trans 'Expired' %}
{% else %}
{% trans 'Active' %}
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'IP' %}</th>
<td>{{ ban.cmask }}</td>
</tr>
<tr>
<th>{% trans 'Reason' %}</th>
<td>
{% if ban.reason %}
{{ ban.reason }}
{% else %}
<em>{% trans 'no reason' %}</em>
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'Board' %}</th>
<td>
{% if ban.board %}
{{ config.board_abbreviation|sprintf(ban.board) }}
{% else %}
<em>{% trans 'all boards' %}</em>
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'Set' %}</th>
<td>{{ ban.created|date(config.post_date) }}</td>
</tr>
<tr>
<th>{% trans 'Expires' %}</th>
<td>
{% if ban.expires %}
{{ ban.expires|date(config.post_date) }}
{% else %}
<em>{% trans 'never' %}</em>
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'Seen' %}</th>
<td>
{% if ban.seen %}
{% trans 'Yes' %}
{% else %}
{% trans 'No' %}
{% endif %}
</td>
</tr>
<tr>
<th>{% trans 'Staff' %}</th>
<td>
{% if ban.username %}
{{ ban.username|e }}
{% else %}
<em>{% trans 'deleted?' %}</em>
{% endif %}
</td>
</tr>
</table>
{% include 'mod/ban_history.html' %}
<input type="hidden" name="ban_id" value="{{ ban.id }}">
<input type="submit" name="unban" value="{% trans 'Remove ban' %}">
<input type="submit" name="edit_ban" value="{% trans 'Edit ban' %}">
</form>
{% endfor %}
</fieldset>

Loading…
Cancel
Save