settings->allowRemoteHosts()) { $ctx->renderFatal('Zarządzanie hostami zdalnymi jest wyłączone (`allow_remote_hosts=0`).', 403); return; } $ok = []; $errors = []; $daUser = $ctx->daUser->username(); $prefix = $ctx->daUser->prefix(); $fixedHosts = array_flip($ctx->mysql->requiredAccessHosts()); if (!$ctx->isPost()) { $sync = $ctx->mysql->syncHostRules(); if (!$sync['ok']) { $errors[] = 'Synchronizacja zdalnych hostów MySQL nie powiodła się: ' . $sync['output']; } } $roleNames = array_map(static fn(array $r): string => $r['name'], $ctx->mysql->listRolesForUser($daUser)); $selectedRole = $ctx->queryString('role'); if ($ctx->isPost()) { $selectedRole = $ctx->postString('role_name'); try { $ctx->requireCsrf('manage_hosts_submit'); $selectedRole = NamePolicy::normalizeRoleName($selectedRole, $prefix); if (!in_array($selectedRole, $roleNames, true)) { throw new RuntimeException('Użytkownik MySQL nie należy do konta DA: ' . $selectedRole); } $currentEntries = $ctx->mysql->getRoleHostEntries($daUser, $selectedRole); $hostMap = []; foreach ($currentEntries as $entry) { $hostMap[$entry['host']] = $entry['note']; } $removeHosts = $ctx->postArray('remove_hosts'); $removeHosts = array_values(array_unique($removeHosts)); foreach ($removeHosts as $rawHost) { $host = trim($rawHost); if ($host === '' || isset($fixedHosts[$host])) { continue; } if (array_key_exists($host, $hostMap)) { unset($hostMap[$host]); } } $addHostRaw = trim($ctx->postString('add_host')); if ($addHostRaw !== '') { $addHost = NamePolicy::normalizeRemoteIpv4Host($addHostRaw); $addComment = NamePolicy::normalizeHostComment($ctx->postString('add_comment')); $hostMap[$addHost] = $addComment; } $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[] = 'Hosty zapisane, ale synchronizacja hostów MySQL nie powiodła się: ' . $sync['output']; } $ok[] = 'Zaktualizowano hosty dostępu dla użytkownika ' . $selectedRole . '.'; } catch (Throwable $e) { $errors[] = $e->getMessage(); } } if ($selectedRole !== '') { try { $selectedRole = NamePolicy::normalizeRoleName($selectedRole, $prefix); } catch (Throwable $e) { $selectedRole = ''; } } if ($selectedRole === '' && !empty($roleNames)) { $selectedRole = $roleNames[0]; } $currentEntries = []; if ($selectedRole !== '') { $currentEntries = $ctx->mysql->getRoleHostEntries($daUser, $selectedRole); } $roleOptions = ''; foreach ($roleNames as $roleName) { $sel = ($roleName === $selectedRole) ? ' selected' : ''; $roleOptions .= ''; } $hostRows = ''; if (empty($currentEntries)) { $hostRows = 'Brak zapisanych hostów.'; } else { foreach ($currentEntries as $entry) { $host = $entry['host']; $note = $entry['note']; $canRemove = !isset($fixedHosts[$host]); $hostRows .= ''; $hostRows .= '' . AppContext::e($host) . ''; $hostRows .= '' . AppContext::e($note) . ''; if ($canRemove) { $hostRows .= ''; } else { $hostRows .= 'host stały'; } $hostRows .= ''; } } $body = ''; $body .= '
'; $body .= $ctx->csrfField('manage_hosts_submit'); $body .= '
'; $body .= '
'; $body .= '
'; $body .= '
'; $infoText = 'Dozwolone są wyłącznie pojedyncze adresy IPv4, bez CIDR i bez nazw hostów.'; if (count($fixedHosts) > 1) { $infoText .= ' `localhost` oraz adres IP serwera DirectAdmin sa hostami stalymi i nie mozna ich usunac.'; } else { $infoText .= ' `localhost` jest hostem stalym i nie mozna go usunac.'; } $body .= '
'; $body .= '
'; $body .= '

' . $infoText . '

'; $body .= '
'; $body .= '

Aktualne hosty

'; $body .= '' . $hostRows . '
HostKomentarzAkcja
'; $body .= '
'; $body .= '
'; $body .= '
'; $ctx->renderPage('Hosty Zdalne Użytkownika', $body, $ok, $errors); };