[ticket/15883] Add error for invalid usernames being added to a group

Update the ACP and the UCP so that when bulk adding users to a group,
if invalid usernames are submitted alongside valid usernames then a
message will be displayed to inform the user what the invalid usernames
are.

PHPBB3-15883
This commit is contained in:
battye 2018-11-26 13:08:57 +00:00
parent b8bdccbc44
commit 101829b4dc
4 changed files with 43 additions and 4 deletions

View file

@ -293,7 +293,19 @@ class acp_groups
// Add user/s to group // Add user/s to group
if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row)) if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row))
{ {
trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&action=list&g=' . $group_id), E_USER_WARNING); $display_message = $user->lang[$error];
if ($error == 'GROUP_USERS_INVALID')
{
// Find which users don't exist
$actual_name_ary = $name_ary;
$actual_user_id_ary = false;
user_get_id_name($actual_user_id_ary, $actual_name_ary, false, true);
$display_message = sprintf($user->lang['GROUP_USERS_INVALID'], implode($user->lang['COMMA_SEPARATOR'], array_diff($name_ary, $actual_name_ary)));
}
trigger_error($display_message . adm_back_link($this->u_action . '&action=list&g=' . $group_id), E_USER_WARNING);
} }
$message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED'; $message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED';

View file

@ -26,8 +26,9 @@ if (!defined('IN_PHPBB'))
* @param array &$user_id_ary The user ids to check or empty if usernames used * @param array &$user_id_ary The user ids to check or empty if usernames used
* @param array &$username_ary The usernames to check or empty if user ids used * @param array &$username_ary The usernames to check or empty if user ids used
* @param mixed $user_type Array of user types to check, false if not restricting by user type * @param mixed $user_type Array of user types to check, false if not restricting by user type
* @param bool $update_references If false, the supplied array is unset and appears unchanged from where it was called
*/ */
function user_get_id_name(&$user_id_ary, &$username_ary, $user_type = false) function user_get_id_name(&$user_id_ary, &$username_ary, $user_type = false, $update_references = false)
{ {
global $db; global $db;
@ -50,7 +51,13 @@ function user_get_id_name(&$user_id_ary, &$username_ary, $user_type = false)
} }
$sql_in = ($which_ary == 'user_id_ary') ? array_map('intval', ${$which_ary}) : array_map('utf8_clean_string', ${$which_ary}); $sql_in = ($which_ary == 'user_id_ary') ? array_map('intval', ${$which_ary}) : array_map('utf8_clean_string', ${$which_ary});
unset(${$which_ary});
// By unsetting the array here, the values passed in at the point user_get_id_name() was called will be retained.
// Otherwise, if we don't unset (as the array was passed by reference) the original array will be updated below.
if ($update_references === false)
{
unset(${$which_ary});
}
$user_id_ary = $username_ary = array(); $user_id_ary = $username_ary = array();
@ -2676,6 +2683,13 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
return 'NO_USER'; return 'NO_USER';
} }
// Because the item that gets passed into the previous function is unset, the reference is lost and our original
// array is retained - so we know there's a problem if there's a different number of ids to usernames now.
if (count($user_id_ary) != count($username_ary))
{
return 'GROUP_USERS_INVALID';
}
// Remove users who are already members of this group // Remove users who are already members of this group
$sql = 'SELECT user_id, group_leader $sql = 'SELECT user_id, group_leader
FROM ' . USER_GROUP_TABLE . ' FROM ' . USER_GROUP_TABLE . '

View file

@ -1057,7 +1057,19 @@ class ucp_groups
// Add user/s to group // Add user/s to group
if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, 0, 0, $group_row)) if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, 0, 0, $group_row))
{ {
trigger_error($user->lang[$error] . $return_page); $display_message = $user->lang[$error];
if ($error == 'GROUP_USERS_INVALID')
{
// Find which users don't exist
$actual_name_ary = $name_ary;
$actual_user_id_ary = false;
user_get_id_name($actual_user_id_ary, $actual_name_ary, false, true);
$display_message = sprintf($user->lang['GROUP_USERS_INVALID'], implode($user->lang['COMMA_SEPARATOR'], array_diff($name_ary, $actual_name_ary)));
}
trigger_error($display_message . $return_page);
} }
trigger_error($user->lang['GROUP_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&amp;action=list&amp;g=' . $group_id . '">', '</a>')); trigger_error($user->lang['GROUP_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&amp;action=list&amp;g=' . $group_id . '">', '</a>'));

View file

@ -111,6 +111,7 @@ $lang = array_merge($lang, array(
'GROUP_USERS_ADDED' => 'New users added to group successfully.', 'GROUP_USERS_ADDED' => 'New users added to group successfully.',
'GROUP_USERS_EXIST' => 'The selected users are already members.', 'GROUP_USERS_EXIST' => 'The selected users are already members.',
'GROUP_USERS_REMOVE' => 'Users removed from group and new defaults set successfully.', 'GROUP_USERS_REMOVE' => 'Users removed from group and new defaults set successfully.',
'GROUP_USERS_INVALID' => 'No users were added to the group as the following usernames do not exist: %s',
'LEGEND_EXPLAIN' => 'These are the groups which are displayed in the group legend:', 'LEGEND_EXPLAIN' => 'These are the groups which are displayed in the group legend:',
'LEGEND_SETTINGS' => 'Legend settings', 'LEGEND_SETTINGS' => 'Legend settings',