daUser->username(); $prefix = $ctx->daUser->prefix(); $showRemoteHosts = $ctx->settings->allowRemoteHosts(); $fixedHosts = array_flip($ctx->mysql->requiredAccessHosts()); $dbLimit = $ctx->daUser->maxDatabases(); if ($showRemoteHosts && !$ctx->isPost()) { $sync = $ctx->mysql->syncHostRules(); if (!$sync['ok']) { $errors[] = 'Synchronizacja zdalnych hostów MySQL nie powiodła się: ' . $sync['output']; } } $generatedPassword = ''; $generatedRole = ''; $generatedDb = ''; $advancedPosted = false; $formAction = $ctx->postString('form_action'); $deletePromptDbRaw = ''; $deletePromptSelectedRolesRaw = []; $deleteBackupJobIdRaw = ''; $deleteBackupJobId = ''; $deleteBackupDbName = ''; $backupQueue = new BackupQueueService($ctx->settings, $ctx->daUser); $backupEnabled = $ctx->settings->enableBackup(); $uploadBackupEnabled = $ctx->settings->enableUploadBackup(); $pluginErrorLog = PLUGIN_ROOT . '/error.log'; $logDownload = static function (string $message) use ($pluginErrorLog, $ctx, $daUser): void { $entry = sprintf( "[%s] DOWNLOAD action=%s user=%s remote=%s method=%s uri=%s %s\n", date('c'), $ctx->action(), $daUser, Http::server('REMOTE_ADDR'), Http::method(), Http::server('REQUEST_URI'), $message ); @error_log($entry, 3, $pluginErrorLog); }; $streamBackupDownload = static function (string $downloadJobId) use ($backupQueue, $logDownload): void { $downloadJobId = trim($downloadJobId); if ($downloadJobId === '') { throw new RuntimeException('Brak identyfikatora zadania backupu.'); } $logDownload('start job_id=' . $downloadJobId); $downloadPath = $backupQueue->resolveBackupTargetFileForCurrentUser($downloadJobId); if (!is_file($downloadPath)) { throw new RuntimeException('Plik backupu nie istnieje na serwerze.'); } if (!is_readable($downloadPath)) { throw new RuntimeException('Brak uprawnień odczytu pliku backupu.'); } $downloadName = basename($downloadPath); $downloadName = preg_replace('/[^A-Za-z0-9._-]+/', '_', $downloadName) ?? 'backup.sql'; $contentType = 'application/octet-stream'; if (preg_match('/\.sql$/i', $downloadName)) { $contentType = 'application/sql'; } elseif (preg_match('/\.gz$/i', $downloadName)) { $contentType = 'application/gzip'; } clearstatcache(true, $downloadPath); $contentLength = @filesize($downloadPath); $logDownload( 'prepare job_id=' . $downloadJobId . ' file=' . $downloadPath . ' size=' . (is_int($contentLength) ? (string)$contentLength : 'unknown') . ' ob_level=' . (string)ob_get_level() ); while (ob_get_level() > 0) { @ob_end_clean(); } if (function_exists('apache_setenv')) { @apache_setenv('no-gzip', '1'); } @ini_set('zlib.output_compression', '0'); @ini_set('output_buffering', '0'); if (headers_sent($hsFile, $hsLine)) { $logDownload('headers_sent job_id=' . $downloadJobId . ' file=' . $hsFile . ' line=' . (string)$hsLine); throw new RuntimeException('Nie można pobrać backupu (nagłówki zostały już wysłane).'); } header_remove('Content-Encoding'); header('Content-Type: ' . $contentType); header('Content-Disposition: attachment; filename="' . str_replace('"', '', $downloadName) . '"'); header('X-Content-Type-Options: nosniff'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Pragma: no-cache'); if (is_int($contentLength) && $contentLength > 0) { header('Content-Length: ' . (string)$contentLength); } $bytes = @readfile($downloadPath); if ($bytes === false) { throw new RuntimeException('Nie można odczytać pliku backupu do pobrania.'); } $logDownload('done job_id=' . $downloadJobId . ' bytes=' . (string)$bytes); exit; }; $action = Http::getString($_REQUEST, 'action'); if ($action === 'download_backup') { try { $ctx->requireCsrf('download_backup_file_submit'); $streamBackupDownload(Http::getString($_REQUEST, 'job')); } catch (Throwable $e) { $logDownload('error job_id=' . trim(Http::getString($_REQUEST, 'job')) . ' message=' . $e->getMessage()); http_response_code(400); header('Content-Type: text/plain; charset=UTF-8'); echo 'Nie można pobrać backupu: ' . $e->getMessage(); exit; } } if ($ctx->isPost() && $formAction === 'queue_backup') { try { $ctx->requireCsrf('queue_backup_submit'); if (!$backupEnabled) { throw new RuntimeException('Tworzenie backupu jest wyłączone w konfiguracji pluginu.'); } $dbName = NamePolicy::normalizeDatabaseName($ctx->postString('backup_db'), $prefix); $availableDbs = array_map(static fn(array $db): string => $db['name'], $ctx->mysql->listDatabasesForUser($daUser)); if (!in_array($dbName, $availableDbs, true)) { throw new RuntimeException('Wskazana baza danych nie należy do konta: ' . $dbName); } $backupQueue->queueBackupJob($dbName); $ok[] = 'Kopia zapasowa bazy danych ' . $dbName . ' została dodana do kolejki'; } catch (Throwable $e) { $errors[] = $e->getMessage(); } } if ($ctx->isPost() && $formAction === 'delete_backup_file') { try { $ctx->requireCsrf('delete_backup_file_submit'); $jobId = trim($ctx->postString('backup_job_id')); if ($jobId === '') { throw new RuntimeException('Brak identyfikatora zadania backupu.'); } $deletedPath = $backupQueue->deleteBackupTargetFileForCurrentUser($jobId); try { $backupQueue->deleteBackupLogForCurrentUser($jobId); } catch (Throwable $logErr) { // Ignore log cleanup failure. } $ok[] = 'Usunięto plik backupu: ' . $deletedPath; } catch (Throwable $e) { $errors[] = $e->getMessage(); } } if ($ctx->isPost() && $formAction === 'delete_backup_confirm') { try { $ctx->requireCsrf('delete_backup_confirm_submit'); $jobId = trim($ctx->postString('backup_job_id')); if ($jobId === '') { throw new RuntimeException('Brak identyfikatora zadania backupu.'); } $deletedPath = $backupQueue->deleteBackupTargetFileForCurrentUser($jobId); try { $backupQueue->deleteBackupLogForCurrentUser($jobId); } catch (Throwable $logErr) { // Ignore log cleanup failure. } $ok[] = 'Usunięto plik backupu: ' . $deletedPath; $deleteBackupJobIdRaw = ''; } catch (Throwable $e) { $errors[] = $e->getMessage(); $deleteBackupJobIdRaw = trim($ctx->postString('backup_job_id')); } } if ($ctx->isPost() && $formAction === 'download_backup_file') { try { $ctx->requireCsrf('download_backup_file_submit'); $streamBackupDownload($ctx->postString('backup_job_id')); } catch (Throwable $e) { $logDownload('error job_id=' . trim($ctx->postString('backup_job_id')) . ' message=' . $e->getMessage()); $errors[] = 'Nie można pobrać backupu: ' . $e->getMessage(); } } if ($ctx->isPost() && $formAction === 'create_database') { try { $ctx->requireCsrf('create_database_submit'); $limit = $ctx->daUser->maxDatabases(); $used = $ctx->mysql->countDatabasesForUser($daUser); if ($limit > 0 && $used >= $limit) { throw new RuntimeException('Osiągnięto limit baz danych dla konta (' . $used . '/' . $limit . ').'); } $dbRaw = trim($ctx->postString('db_suffix')); if ($dbRaw === '') { $dbRaw = trim($ctx->postString('db_name')); } $dbName = NamePolicy::normalizeDatabaseName($dbRaw, $prefix); if ($ctx->mysql->databaseExists($dbName)) { throw new RuntimeException('Baza danych już istnieje: ' . $dbName); } $creationMode = strtolower($ctx->postString('creation_mode', 'simple')); $roleModeRaw = strtolower($ctx->postString('role_mode', 'new')); $advancedPosted = ($creationMode === 'advanced'); if (!$advancedPosted) { $advancedPosted = trim($ctx->postString('role_name')) !== '' || trim($ctx->postString('password')) !== '' || trim($ctx->postString('existing_role')) !== '' || $roleModeRaw === 'existing'; } $roleMode = ($advancedPosted && $roleModeRaw === 'existing') ? 'existing' : 'new'; $selectedRole = ''; $createdRole = false; $createdDatabase = false; if ($roleMode === 'existing') { $selectedRole = NamePolicy::normalizeRoleName($ctx->postString('existing_role'), $prefix); if (!$ctx->mysql->roleExists($selectedRole)) { throw new RuntimeException('Wybrany użytkownik MySQL nie istnieje: ' . $selectedRole); } } else { $roleInput = $ctx->postString('role_name'); if ($roleInput === '') { $roleInput = $dbName; } $selectedRole = NamePolicy::normalizeRoleName($roleInput, $prefix); if ($ctx->mysql->roleExists($selectedRole)) { throw new RuntimeException('Użytkownik MySQL już istnieje: ' . $selectedRole); } $password = $ctx->postString('password'); if ($advancedPosted && $password === '') { throw new RuntimeException('Hasło użytkownika jest wymagane w trybie zaawansowanym.'); } if (!$advancedPosted) { $password = rtrim(strtr(base64_encode(random_bytes(18)), '+/', 'AZ'), '='); } if (strlen($password) < 12) { throw new RuntimeException('Hasło użytkownika musi mieć co najmniej 12 znaków.'); } $ctx->mysql->createRole($selectedRole, $password); $createdRole = true; $generatedPassword = $password; } try { $ctx->mysql->createDatabase($dbName, $selectedRole); $createdDatabase = true; $privileges = NamePolicy::sanitizePrivileges($ctx->postArray('privileges')); if (empty($privileges)) { $privileges = NamePolicy::defaultPrivileges(); } $ctx->mysql->grantPrivileges($dbName, $selectedRole, $privileges); $hostEntries = $ctx->mysql->getRoleHostEntries($daUser, $selectedRole); $hostMap = []; foreach ($hostEntries as $entry) { $hostMap[$entry['host']] = $entry['note']; } $needsHostUpdate = $createdRole; if ($showRemoteHosts && $advancedPosted) { $remoteHostRaw = trim($ctx->postString('remote_host')); if ($remoteHostRaw !== '') { $remoteHost = NamePolicy::normalizeRemoteIpv4Host($remoteHostRaw); $remoteComment = NamePolicy::normalizeHostComment($ctx->postString('remote_comment')); if (!array_key_exists($remoteHost, $hostMap) || $hostMap[$remoteHost] !== $remoteComment) { $needsHostUpdate = true; } $hostMap[$remoteHost] = $remoteComment; } } if ($needsHostUpdate) { $customHostsCount = 0; foreach (array_keys($hostMap) as $host) { if (!isset($fixedHosts[$host])) { $customHostsCount++; } } if ($customHostsCount > $ctx->settings->maxHostsPerUser()) { throw new RuntimeException('Przekroczono limit hostów dla użytkownika MySQL.'); } $finalEntries = []; foreach ($hostMap as $host => $note) { $finalEntries[] = ['host' => $host, 'note' => $note]; } $ctx->mysql->replaceRoleHostsWithNotes($daUser, $selectedRole, $finalEntries); } $sync = $ctx->mysql->syncHostRules(); if (!$sync['ok']) { $errors[] = 'Baza i uprawnienia zapisane, ale synchronizacja hostów MySQL nie powiodła się: ' . $sync['output']; } $generatedRole = $selectedRole; $generatedDb = $dbName; $ok[] = 'Baza danych została utworzona.'; } catch (Throwable $inner) { if ($createdDatabase) { try { $ctx->mysql->dropDatabase($dbName); } catch (Throwable $ignored) { } } if ($createdRole) { try { $ctx->mysql->dropRole($selectedRole); } catch (Throwable $ignored) { } } throw $inner; } } catch (Throwable $e) { $errors[] = $e->getMessage(); } } if ($ctx->isPost() && $formAction === 'delete_database_confirm') { try { $ctx->requireCsrf('delete_database_submit'); $deletePromptDbRaw = trim($ctx->postString('delete_db')); if ($deletePromptDbRaw === '') { throw new RuntimeException('Nie wskazano bazy danych do usunięcia.'); } $deletePromptSelectedRolesRaw = $ctx->postArray('delete_roles'); $deleteMode = strtolower(trim($ctx->postString('delete_mode'))); $dbToDelete = NamePolicy::normalizeDatabaseName($deletePromptDbRaw, $prefix); $availableBeforeDelete = array_map(static fn(array $db): string => $db['name'], $ctx->mysql->listDatabasesForUser($daUser)); if (!in_array($dbToDelete, $availableBeforeDelete, true)) { throw new RuntimeException('Wskazana baza danych nie należy do konta: ' . $dbToDelete); } $assignedRoles = array_values(array_unique($ctx->mysql->listDatabaseUsers($daUser, $dbToDelete))); $singleMatchingRole = count($assignedRoles) === 1 && $assignedRoles[0] === $dbToDelete; foreach ($assignedRoles as $roleName) { $ctx->mysql->revokePrivileges($dbToDelete, $roleName); } $ctx->mysql->dropDatabase($dbToDelete); $rolesToDelete = []; if ($deleteMode === 'with_user' && $singleMatchingRole) { $rolesToDelete[] = $assignedRoles[0]; } elseif ($deleteMode !== 'db_only') { foreach ($deletePromptSelectedRolesRaw as $rawRole) { $roleName = NamePolicy::normalizeRoleName($rawRole, $prefix); if (!in_array($roleName, $assignedRoles, true)) { continue; } if (!in_array($roleName, $rolesToDelete, true)) { $rolesToDelete[] = $roleName; } } } $deletedUsers = []; $skippedUsers = []; foreach ($rolesToDelete as $roleName) { $remainingAssigned = array_values(array_unique($ctx->mysql->roleAssignedDatabases($roleName, $daUser))); foreach ($remainingAssigned as $remainingDb) { $ctx->mysql->revokePrivileges($remainingDb, $roleName); } $remainingOwned = array_values(array_unique($ctx->mysql->roleOwnedDatabases($roleName, $daUser))); if (!empty($remainingOwned)) { $skippedUsers[] = $roleName . ' (jest właścicielem baz: ' . implode(', ', $remainingOwned) . ')'; continue; } try { $ctx->mysql->deleteRoleHosts($daUser, $roleName); $ctx->mysql->dropRole($roleName); $deletedUsers[] = $roleName; } catch (Throwable $dropErr) { $skippedUsers[] = $roleName . ' (' . $dropErr->getMessage() . ')'; } } $sync = $ctx->mysql->syncHostRules(); if (!$sync['ok']) { $errors[] = 'Usuwanie wykonane, ale synchronizacja hostów MySQL nie powiodła się: ' . $sync['output']; } if (count($deletedUsers) === 1) { $ok[] = 'Usunięto bazę danych ' . $dbToDelete . ' i użytkownika ' . $deletedUsers[0] . '.'; } elseif (count($deletedUsers) > 1) { $listItems = ''; foreach ($deletedUsers as $deletedUser) { $listItems .= "\n• " . $deletedUser; } $ok[] = 'Usunięto bazę danych ' . $dbToDelete . ' i następujących użytkowników przypisanych do bazy danych ' . $dbToDelete . ':' . $listItems; } else { $ok[] = 'Usunięto bazę danych ' . $dbToDelete . '.'; } if (!empty($skippedUsers)) { $errors[] = 'Nie udało się usunąć części użytkowników: ' . implode('; ', $skippedUsers) . '.'; } $deletePromptDbRaw = ''; $deletePromptSelectedRolesRaw = []; } catch (Throwable $e) { $errors[] = $e->getMessage(); if ($deletePromptDbRaw === '') { $deletePromptDbRaw = trim($ctx->postString('delete_db')); } if (empty($deletePromptSelectedRolesRaw)) { $deletePromptSelectedRolesRaw = $ctx->postArray('delete_roles'); } } } $showTableCount = $ctx->settings->enableTableCount(); $showDbSize = $ctx->settings->countDatabaseSize(); $databases = $ctx->mysql->listDatabasesForUser($daUser, $showDbSize); $dbUsersMap = $ctx->mysql->listDatabaseUsersMap($daUser); $roles = $ctx->mysql->listRolesForUser($daUser); $roleNames = array_map(static fn(array $r): string => $r['name'], $roles); $dbCount = count($databases); $endpoint = $ctx->mysql->connectionEndpoint(); $endpointHost = trim($endpoint['host']) !== '' ? $endpoint['host'] : 'localhost'; $endpointPort = $endpoint['port'] > 0 ? (string)$endpoint['port'] : '3306'; $serverVersion = ''; try { $serverVersion = $ctx->mysql->serverVersion(); } catch (Throwable $e) { $serverVersion = ''; } $advancedOpen = $advancedPosted || (strtolower($ctx->postString('creation_mode', 'simple')) === 'advanced'); if (!$ctx->isPost() && $deletePromptDbRaw === '') { $deletePromptDbRaw = trim($ctx->queryString('delete_db')); } if (!$ctx->isPost() && $deleteBackupJobIdRaw === '') { $deleteBackupJobIdRaw = trim($ctx->queryString('delete_backup')); } /** @var array $overlayHtmlById */ $overlayHtmlById = []; $deletePromptDb = ''; $deletePromptRows = ''; $deletePromptWarnings = []; $deletePromptSelectedRoles = []; $deletePromptSingleRoleMode = false; $deletePromptSingleRoleName = ''; $limitText = $dbLimit === 0 ? 'Bez ograniczeń' : (string)$dbLimit; $usageWarn = ''; $tableCounts = []; if ($showTableCount) { foreach ($databases as $dbRow) { $dbName = $dbRow['name']; try { $stats = $ctx->mysql->getDatabaseObjectStats($dbName); $tableCounts[$dbName] = (int)$stats['tables']; } catch (Throwable $e) { $tableCounts[$dbName] = 0; } } } $dbRows = ''; foreach ($databases as $db) { $name = $db['name']; $size = $db['size']; $users = $dbUsersMap[$name] ?? []; $dbRows .= ''; $dbRows .= '' . AppContext::e($name) . ''; if ($showDbSize) { $dbRows .= '' . AppContext::e($size) . ''; } $dbRows .= '' . AppContext::e((string)count($users)) . ''; if ($showTableCount) { $dbRows .= '' . AppContext::e((string)($tableCounts[$name] ?? 0)) . ''; } $dbRows .= ''; if ($ctx->settings->enableAdminer()) { $dbRows .= '
'; $dbRows .= $ctx->csrfField('open_phpmyadmin_submit'); $dbRows .= ''; $dbRows .= ''; $dbRows .= '
'; } if ($backupEnabled) { $locked = $backupQueue->isDbLocked($name); if (!$locked) { $dbRows .= '
'; $dbRows .= $ctx->csrfField('queue_backup_submit'); $dbRows .= ''; $dbRows .= ''; $dbRows .= ''; $dbRows .= '
'; } else { $dbRows .= ''; } } $dbRows .= 'Zarządzaj'; $dbRows .= 'Usuń bazę'; $dbRows .= ''; $dbRows .= ''; } if ($dbRows === '') { $colspan = 3 + ($showDbSize ? 1 : 0) + ($showTableCount ? 1 : 0); $dbRows = 'Nie znaleziono baz danych...'; } if ($deletePromptDbRaw !== '') { try { $deletePromptDb = NamePolicy::normalizeDatabaseName($deletePromptDbRaw, $prefix); $dbNames = array_map(static fn(array $db): string => $db['name'], $databases); if (!in_array($deletePromptDb, $dbNames, true)) { throw new RuntimeException('Wskazana baza danych nie należy do konta: ' . $deletePromptDb); } foreach ($deletePromptSelectedRolesRaw as $rawRole) { $roleName = NamePolicy::normalizeRoleName($rawRole, $prefix); if (!in_array($roleName, $deletePromptSelectedRoles, true)) { $deletePromptSelectedRoles[] = $roleName; } } $assignedRoles = array_values(array_unique($ctx->mysql->listDatabaseUsers($daUser, $deletePromptDb))); if (count($assignedRoles) === 1 && $assignedRoles[0] === $deletePromptDb) { $deletePromptSingleRoleMode = true; $deletePromptSingleRoleName = $assignedRoles[0]; } else { foreach ($assignedRoles as $roleName) { $assignedDbs = array_values(array_unique($ctx->mysql->roleAssignedDatabases($roleName, $daUser))); $isChecked = in_array($roleName, $deletePromptSelectedRoles, true) ? ' checked' : ''; $deletePromptRows .= ''; $deletePromptRows .= ''; $deletePromptRows .= '' . AppContext::e($roleName) . ''; if (empty($assignedDbs)) { $deletePromptRows .= 'Brak przypisań'; } else { $dbList = ''; foreach ($assignedDbs as $dbName) { $dbList .= '
  • ' . AppContext::e($dbName) . '
  • '; } $deletePromptRows .= ''; } $deletePromptRows .= ''; if (count($assignedDbs) > 1) { $deletePromptWarnings[] = 'Uwaga: wskazany użytkownik jest przypisany do wielu baz danych i jego usunięcie spowoduje brak możliwości dostępu do innych baz danych przy użyciu danych logowania użytkownika ' . $roleName . '.'; } } } } catch (Throwable $e) { $errors[] = $e->getMessage(); $deletePromptDb = ''; $deletePromptRows = ''; $deletePromptWarnings = []; $deletePromptSelectedRoles = []; $deletePromptSingleRoleMode = false; $deletePromptSingleRoleName = ''; } } $roleOptions = ''; $postedExistingRole = $ctx->postString('existing_role'); foreach ($roleNames as $roleName) { $selected = ($postedExistingRole === $roleName) ? ' selected' : ''; $roleOptions .= ''; } $privCheckboxes = ''; foreach (NamePolicy::PRIVILEGE_LABELS as $code => $label) { $checked = ($code === 'ALL') ? ' checked' : ''; $privCheckboxes .= ''; } $successCard = ''; if ($generatedDb !== '' && $generatedRole !== '') { $passwordLine = $generatedPassword !== '' ? '
    Hasło:
    ' . AppContext::e($generatedPassword) . '
    ' : ''; $successCard .= '
    '; $successCard .= '
    '; $successCard .= '
    '; $successCard .= '

    Dane dostępowe do bazy danych

    '; $successCard .= '
    '; $successCard .= '
    Nazwa hosta:
    ' . AppContext::e($endpointHost) . ' (Port: ' . AppContext::e($endpointPort) . ')
    '; $successCard .= '
    Baza danych:
    ' . AppContext::e($generatedDb) . '
    '; $successCard .= '
    Nazwa użytkownika:
    ' . AppContext::e($generatedRole) . '
    '; $successCard .= $passwordLine; $successCard .= '
    '; } $body = ''; $body .= $successCard; $body .= $usageWarn; $phpMyAdminWarning = $ctx->settings->phpMyAdminIntegrationWarning(); if ($phpMyAdminWarning !== '') { $errors[] = $phpMyAdminWarning; } if ($deleteBackupJobIdRaw !== '') { try { $deleteBackupJobId = trim($deleteBackupJobIdRaw); $job = $backupQueue->getJobForCurrentUser($deleteBackupJobId); if (($job['type'] ?? '') !== 'backup') { throw new RuntimeException('Wskazane zadanie nie jest zadaniem backupu.'); } if (($job['status'] ?? '') !== 'done_ok') { throw new RuntimeException('Backup nie został zakończony powodzeniem.'); } $deleteBackupDbName = (string)($job['db_name'] ?? ''); if ($deleteBackupDbName === '') { $deleteBackupDbName = 'nieznana baza'; } $body .= '
    '; $body .= '
    Czy na pewno chcesz usunąć backup bazy danych - ' . AppContext::e($deleteBackupDbName) . '?
    '; $body .= '
    '; $body .= $ctx->csrfField('delete_backup_confirm_submit'); $body .= ''; $body .= ''; $body .= '
    '; $body .= ''; $body .= 'Anuluj'; $body .= '
    '; $body .= '
    '; $body .= '
    '; } catch (Throwable $e) { $errors[] = $e->getMessage(); } } if ($deletePromptDb !== '') { $body .= '
    '; if ($deletePromptSingleRoleMode && $deletePromptSingleRoleName !== '') { $body .= '
    Czy na pewno chcesz usunąć następującą bazę danych - ' . AppContext::e($deletePromptDb) . ' i przypisanego do niej użytkownika ' . AppContext::e($deletePromptSingleRoleName) . '.
    '; } else { $body .= '
    Czy na pewno chcesz usunąć następującą bazę danych - ' . AppContext::e($deletePromptDb) . '.
    '; } $body .= '
    '; $body .= $ctx->csrfField('delete_database_submit'); $body .= ''; $body .= ''; if ($deletePromptSingleRoleMode && $deletePromptSingleRoleName !== '') { $body .= '
    '; $body .= ''; $body .= 'Nie'; $body .= ''; $body .= '
    '; } else { if ($deletePromptRows !== '') { $body .= '

    Do bazy danych ' . AppContext::e($deletePromptDb) . ' przypisani są użytkownicy, z poniższej listy wybierz użytkowników, których chcesz usunąć.

    '; $body .= ''; $body .= ''; $body .= ''; $body .= ''; $body .= '' . $deletePromptRows . '
    WybierzNazwa użytkownikaPrzypisane Bazy danych
    '; } else { $body .= '

    Do wskazanej bazy nie są przypisani użytkownicy MySQL.

    '; } if (!empty($deletePromptWarnings)) { foreach (array_values(array_unique($deletePromptWarnings)) as $warning) { $body .= '
    ' . AppContext::e($warning) . '
    '; } } $body .= '
    '; $body .= ''; $body .= 'Anuluj'; $body .= '
    '; } $body .= '
    '; $body .= '
    '; } $dbSuffixValue = $ctx->postString('db_suffix'); if (strpos($dbSuffixValue, $prefix) === 0) { $dbSuffixValue = substr($dbSuffixValue, strlen($prefix)); } $roleSuffixValue = $ctx->postString('role_name'); if (strpos($roleSuffixValue, $prefix) === 0) { $roleSuffixValue = substr($roleSuffixValue, strlen($prefix)); } $body .= '
    '; $body .= '

    Lista baz danych

    '; $body .= '
    '; if ($serverVersion !== '') { $body .= '' . AppContext::e($ctx->t('Wersja serwera MySQL')) . ': ' . AppContext::e($serverVersion) . ''; } $body .= 'Ilość baz danych ' . AppContext::e((string)$dbCount) . '/' . AppContext::e($limitText) . ''; $body .= '
    '; $header = 'Nazwa bazy danych'; if ($showDbSize) { $header .= 'Rozmiar'; } $header .= 'Użytkownicy'; if ($showTableCount) { $header .= 'Liczba Tabel'; } $header .= 'Akcje'; $body .= '' . $header . '' . $dbRows . '
    '; $body .= '
    '; $body .= '
    '; $body .= '

    Utwórz bazę danych

    '; $body .= '

    Tryb prosty tworzy użytkownika o tej samej nazwie co baza i automatycznie generuje hasło.

    '; $body .= '
    '; $body .= $ctx->csrfField('create_database_submit'); $body .= ''; $body .= ''; $body .= ''; $body .= '
    '; $body .= '
    ' . AppContext::e($prefix) . '
    '; $body .= '
    '; $body .= '

    Użytkownik o tej samej nazwie i bezpiecznym haśle zostanie wygenerowany automatycznie.

    '; $body .= '
    '; $body .= 'Tryb zaawansowany'; $body .= '
    '; $body .= '
    '; $roleModeCurrent = strtolower($ctx->postString('role_mode', 'new')); $body .= ''; $body .= ''; $body .= '
    '; $body .= '
    '; $body .= '
    '; $body .= '
    '; $body .= '
    ' . AppContext::e($prefix) . '
    '; $body .= '
    '; $body .= '
    '; $body .= ''; $body .= ''; $body .= ''; $body .= '
    '; $body .= '

    W trybie zaawansowanym hasło jest wymagane.

    '; $body .= '
    '; if ($showRemoteHosts) { $defaultHostHelp = '`localhost` jest dodawany automatycznie.'; if (count($fixedHosts) > 1) { $defaultHostHelp .= ' Przy zdalnym serwerze MySQL plugin dodaje tez adres IP serwera DirectAdmin.'; } $body .= '
    '; $body .= '
    '; $body .= '
    '; $body .= '
    '; $body .= '

    ' . $defaultHostHelp . '

    '; } $body .= '
    ' . $privCheckboxes . '
    '; $body .= '
    '; $body .= '
    '; $body .= '
    '; $body .= '
    '; if (!empty($overlayHtmlById)) { $body .= implode('', array_values($overlayHtmlById)); } $ctx->renderPage('Zarządzanie bazami danych MySQL', $body, $ok, $errors); };