[ticket/17332] Fix permission migrator tool to work with copied permissions

PHPBB-17332
This commit is contained in:
rxu 2024-06-05 00:20:49 +07:00
parent cd0e682984
commit ef4db99709
No known key found for this signature in database
GPG key ID: 955F0567380E586A

View file

@ -435,15 +435,14 @@ class permission implements \phpbb\db\migration\tool\tool_interface
} }
$this->db->sql_freeresult($result); $this->db->sql_freeresult($result);
if (empty($new_auth)) $type = (string) $type; // Prevent PHP bug.
if (empty($new_auth) || !in_array($type, ['role','group']))
{ {
return; return;
} }
$current_auth = array(); $current_auth = array();
$type = (string) $type; // Prevent PHP bug.
switch ($type) switch ($type)
{ {
case 'role': case 'role':
@ -525,40 +524,32 @@ class permission implements \phpbb\db\migration\tool\tool_interface
break; break;
} }
$sql_ary = array(); $sql_ary = $auth_update_list = [];
switch ($type) $table = $type == 'role' ? ACL_ROLES_DATA_TABLE : ACL_GROUPS_TABLE;
foreach ($new_auth as $auth_option_id)
{ {
case 'role': if (!isset($current_auth[$auth_option_id]))
foreach ($new_auth as $auth_option_id) {
{ $sql_ary[] = [
if (!isset($current_auth[$auth_option_id])) $type . '_id' => ${$type . '_id'},
{ 'auth_option_id' => $auth_option_id,
$sql_ary[] = array( 'auth_setting' => (int) $has_permission,
'role_id' => $role_id, ];
'auth_option_id' => $auth_option_id, }
'auth_setting' => $has_permission, else
); {
} $auth_update_list[] = $auth_option_id;
} }
}
$this->db->sql_multi_insert($table, $sql_ary);
$this->db->sql_multi_insert(ACL_ROLES_DATA_TABLE, $sql_ary); if (count($auth_update_list))
break; {
$sql = 'UPDATE ' . $table . '
case 'group': SET auth_setting = ' . (int) $has_permission . '
foreach ($new_auth as $auth_option_id) WHERE ' . $this->db->sql_in_set('auth_option_id', $auth_update_list) . '
{ AND ' . $type . '_id = ' . (int) ${$type . '_id'};
if (!isset($current_auth[$auth_option_id])) $this->db->sql_query($sql);
{
$sql_ary[] = array(
'group_id' => $group_id,
'auth_option_id' => $auth_option_id,
'auth_setting' => $has_permission,
);
}
}
$this->db->sql_multi_insert(ACL_GROUPS_TABLE, $sql_ary);
break;
} }
$this->auth->acl_clear_prefetch(); $this->auth->acl_clear_prefetch();