daUser->username(); $prefix = $ctx->daUser->prefix(); $availableRoles = array_map(static fn(array $r): string => $r['name'], $ctx->mysql->listRolesForUser($daUser)); $selectedRoles = $ctx->postArray('roles'); if (empty($selectedRoles)) { $queryRole = $ctx->queryString('role'); if ($queryRole !== '') { $selectedRoles = [$queryRole]; } } $selectedRoles = array_values(array_unique(array_filter($selectedRoles, static fn(string $v): bool => $v !== ''))); $confirmDelete = $ctx->postString('confirm_delete') === '1'; if ($ctx->isPost() && !$confirmDelete) { try { $ctx->requireCsrf('select_delete_users'); } catch (Throwable $e) { $errors[] = $e->getMessage(); $selectedRoles = []; } } if ($ctx->isPost() && $confirmDelete) { try { $ctx->requireCsrf('delete_users_confirm'); if (empty($selectedRoles)) { throw new RuntimeException('Nie wybrano użytkowników do usunięcia.'); } $deleted = []; $skipped = []; foreach ($selectedRoles as $rawRole) { try { $role = NamePolicy::normalizeRoleName($rawRole, $prefix); if (!in_array($role, $availableRoles, true)) { $skipped[] = $role . ' (nie istnieje)'; continue; } $owned = $ctx->mysql->roleOwnedDatabases($role, $daUser); if (!empty($owned)) { $skipped[] = $role . ' (właściciel baz: ' . implode(', ', $owned) . ')'; continue; } $assigned = $ctx->mysql->roleAssignedDatabases($role, $daUser); foreach ($assigned as $dbName) { $owner = $ctx->mysql->getDatabaseOwner($dbName); if ($owner !== null && $owner !== $role) { $ctx->mysql->reassignOwnedObjects($dbName, $role, $owner); } $ctx->mysql->revokePrivileges($dbName, $role); } $ctx->mysql->deleteRoleHosts($daUser, $role); $ctx->mysql->dropRole($role); $deleted[] = $role; } catch (Throwable $inner) { $skipped[] = $rawRole . ' (' . $inner->getMessage() . ')'; } } $sync = $ctx->mysql->syncHostRules(); if (!$sync['ok']) { $errors[] = 'Usuwanie wykonane, ale synchronizacja hostów MySQL nie powiodła się: ' . $sync['output']; } if (!empty($deleted)) { $ok[] = 'Usunięto użytkowników: ' . implode(', ', $deleted); } if (!empty($skipped)) { $errors[] = 'Nie usunięto: ' . implode('; ', $skipped); } $selectedRoles = []; $availableRoles = array_map(static fn(array $r): string => $r['name'], $ctx->mysql->listRolesForUser($daUser)); } catch (Throwable $e) { $errors[] = $e->getMessage(); } } if (empty($selectedRoles)) { $rows = ''; foreach ($availableRoles as $roleName) { $assigned = $ctx->mysql->roleAssignedDatabases($roleName, $daUser); $owned = $ctx->mysql->roleOwnedDatabases($roleName, $daUser); $rows .= '
Brak poprawnych użytkowników do usunięcia.
', $ok, $errors); return; } $body = ''; $body .= 'Potwierdź usunięcie zaznaczonych użytkowników MySQL. Operacja jest nieodwracalna.
'; $body .= ''; $ctx->renderPage('Potwierdzenie Usuwania Użytkowników', $body, $ok, $errors); };