diff --git a/phpBB/phpbb/ban/manager.php b/phpBB/phpbb/ban/manager.php index d00b80488e..5a79f2d836 100644 --- a/phpBB/phpbb/ban/manager.php +++ b/phpBB/phpbb/ban/manager.php @@ -95,12 +95,12 @@ class manager // TODO throw exception } - if ($ban_mode->get_log_string() !== false) + if ($ban_mode->get_ban_log_string() !== false) { $ban_items_log = implode(', ', $ban_items); - $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, $ban_mode->get_log_string(), false, [$reason, $ban_items_log]); - $this->log->add('mod', $this->user->data['user_id'], $this->user->ip, $ban_mode->get_log_string(), false, [ + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, $ban_mode->get_ban_log_string(), false, [$reason, $ban_items_log]); + $this->log->add('mod', $this->user->data['user_id'], $this->user->ip, $ban_mode->get_ban_log_string(), false, [ 'forum_id' => 0, 'topic_id' => 0, $reason, @@ -172,9 +172,50 @@ class manager $this->cache->destroy('sql', $this->ban_table); } - public function unban($mode, array $items, $reason, $logging = true) + public function unban($mode, array $items) { + if (!isset($this->types[$mode])) + { + throw new type_not_found_exception(); // TODO + } + /** @var \phpbb\ban\type\type_interface $ban_mode */ + $ban_mode = $this->types[$mode]; + $sql_ids = array_map('intval', $items); + $sql = 'SELECT ban_item + FROM ' . $this->ban_table . ' + WHERE ' . $this->db->sql_in_set('ban_id', $sql_ids); // TODO (what if empty?) + $result = $this->db->sql_query($sql); + + $unbanned_items = []; + while ($row = $this->db->sql_fetchrow($result)) + { + $unbanned_items[] = $row['ban_item']; + } + $this->db->sql_freeresult($result); + + $sql = 'DELETE FROM ' . $this->ban_table . ' + WHERE ' . $this->db->sql_in_set('ban_id', $sql_ids); + $this->db->sql_query($sql); + + if ($ban_mode->get_unban_log_string() !== false) + { + $unban_items_log = implode(', ', $unbanned_items); + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, $ban_mode->get_unban_log_string(), false, [$unban_items_log]); + $this->log->add('mod', $this->user->data['user_id'], $this->user->ip, $ban_mode->get_unban_log_string(), false, [ + 'forum_id' => 0, + 'topic_id' => 0, + $unban_items_log, + ]); + } + + $unban_data = [ + 'items' => $unbanned_items, + ]; + $ban_mode->after_unban($unban_data); + + $this->cache->destroy('sql', $this->ban_table); } public function check(array $user_data = []) @@ -183,5 +224,6 @@ class manager public function tidy() { + // TODO: Delete stale bans } } diff --git a/phpBB/phpbb/ban/type/base.php b/phpBB/phpbb/ban/type/base.php index 23e128bbb6..5989e653b1 100644 --- a/phpBB/phpbb/ban/type/base.php +++ b/phpBB/phpbb/ban/type/base.php @@ -37,12 +37,15 @@ abstract class base implements type_interface /** * {@inheritDoc} */ - public function after_ban($data) + public function after_ban(array $data) { return true; } - public function after_unban() + /** + * {@inheritDoc} + */ + public function after_unban(array $data) { } diff --git a/phpBB/phpbb/ban/type/email.php b/phpBB/phpbb/ban/type/email.php index cf584a87d3..1cc5fedfea 100644 --- a/phpBB/phpbb/ban/type/email.php +++ b/phpBB/phpbb/ban/type/email.php @@ -15,11 +15,16 @@ namespace phpbb\ban\type; class email extends base { - public function get_log_string() + public function get_ban_log_string() { return 'LOG_BAN_EMAIL'; } + public function get_unban_log_string() + { + return 'LOG_UNBAN_EMAIL'; + } + /** * {@inheritDoc} */ diff --git a/phpBB/phpbb/ban/type/type_interface.php b/phpBB/phpbb/ban/type/type_interface.php index 174c5c25bd..0b6b4b4ea9 100644 --- a/phpBB/phpbb/ban/type/type_interface.php +++ b/phpBB/phpbb/ban/type/type_interface.php @@ -19,12 +19,20 @@ namespace phpbb\ban\type; interface type_interface { /** - * Returns the language key that's used for the log entry. + * Returns the language key that's used for the ban log entry. * False, if there is none (and thus no logs are created) * * @return string|bool */ - public function get_log_string(); + public function get_ban_log_string(); + + /** + * Returns the language key that's used for the unban log entry. + * False, if thee is none (and thus no logs are created) + * + * @return string|bool + */ + public function get_unban_log_string(); /** * Returns the type identifier for this ban type @@ -44,7 +52,7 @@ interface type_interface public function get_user_column(); /** - * Gives the possibility to do some clean up after banning + * Gives the possibility to do some clean up after banning. * Returns true if affected users should be logged out and * false otherwise * @@ -54,9 +62,19 @@ interface type_interface * * @return bool */ - public function after_ban($data); + public function after_ban(array $data); - public function after_unban(); // ??? + /** + * Gives the possiblity to do some clean up after unbanning. + * The return value of this method will be ignored and thus + * should be null + * + * @param array $data An array containing information about + * the unbans, e.g. the unbanned items. + * + * @return null + */ + public function after_unban(array $data); /** * In the case that get_user_column() returns null, this method diff --git a/phpBB/phpbb/ban/type/user.php b/phpBB/phpbb/ban/type/user.php index 0fbc5d1a13..85a9064399 100644 --- a/phpBB/phpbb/ban/type/user.php +++ b/phpBB/phpbb/ban/type/user.php @@ -22,17 +22,27 @@ class user extends base protected $log; /** @var string */ - private $log_string = 'LOG_BAN_USER'; + private $ban_log_string = 'LOG_BAN_USER'; + + private $unban_log_string = 'LOG_UNBAN_USER'; /** * {@inheritDoc} */ - public function get_log_string() + public function get_ban_log_string() { // Have to handle logging differently here return false; } + /** + * {@inheritDoc} + */ + public function get_unban_log_string() + { + return false; + } + /** * {@inheritDoc} */ @@ -52,12 +62,12 @@ class user extends base /** * {@inheritDoc} */ - public function after_ban($data) + public function after_ban(array $data) { $usernames_log = implode(', ', $this->banned_users); - $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, $this->log_string, false, [$data['reason'], $usernames_log]); - $this->log->add('mod', $this->user->data['user_id'], $this->user->ip, $this->log_string, false, [ + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, $this->ban_log_string, false, [$data['reason'], $usernames_log]); + $this->log->add('mod', $this->user->data['user_id'], $this->user->ip, $this->ban_log_string, false, [ 'forum_id' => 0, 'topic_id' => 0, $data['reason'], @@ -66,7 +76,7 @@ class user extends base foreach ($this->banned_users as $user_id => $username) { - $this->log->add('user', $this->user->data['user_id'], $this->user->ip, $this->log_string, false, [ + $this->log->add('user', $this->user->data['user_id'], $this->user->ip, $this->ban_log_string, false, [ 'reportee_id' => $user_id, $data['reason'], $usernames_log, @@ -76,6 +86,50 @@ class user extends base return true; } + /** + * {@inheritDoc} + */ + public function after_unban(array $data) + { + $user_ids = array_map('intval', $data['items']); + + $sql = 'SELECT user_id, username + FROM ' . $this->users_table . ' + WHERE ' . $this->db->sql_in_set('user_id', $user_ids); + $result = $this->db->sql_query($sql); + + $real_user_ids = []; + $usernames = []; + while ($row = $this->db->sql_fetchrow($result)) + { + $real_user_ids[] = $row['user_id']; + $usernames[] = $row['username']; + } + $this->db->sql_freeresult($result); + + if (empty($usernames)) + { + return; + } + + $usernames_log = implode(', ', $usernames); + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, $this->unban_log_string, false, [$usernames_log]); + $this->log->add('mod', $this->user->data['user_id'], $this->user->ip, $this->unban_log_string, false, [ + 'forum_id' => 0, + 'topic_id' => 0, + $usernames_log, + ]); + + foreach ($real_user_ids as $user_id) + { + $this->log->add('user', $this->user->data['user_id'], $this->user->ip, $this->unban_log_string, false, [ + 'reportee_id' => $user_id, + $usernames_log, + ]); + } + } + /** * {@inheritDoc} */