| Server IP : 188.114.96.3 / Your IP : 216.73.216.143 Web Server : Apache System : Linux sv058.home.net.pl 6.8.2 husak_dirty_pages_fix #1 SMP PREEMPT_DYNAMIC Tue Apr 2 22:06:51 CEST 2024 x86_64 User : ( 3194769) PHP Version : 8.5.12 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /polana/admin/ |
Upload File : |
<?php
declare(strict_types=1);
/** POLANA V18.3 — secure manual path bootstrap; no DB schema changes. */
require_once dirname(__DIR__) . '/includes/polana_backup_v182.php';
require_admin_role();
header('Cache-Control: private, no-store');
header('X-Robots-Tag: noindex, nofollow');
function pbk183_e($value): string { return htmlspecialchars((string)$value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
$notice = ''; $error = ''; $current = '';
try {
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {
verify_csrf();
if (($_POST['action'] ?? '') !== 'save_path') throw new RuntimeException('Nieznana operacja.');
$proposed = pbk_safe_private_target(trim((string)($_POST['private_path'] ?? '')));
$configFile = pbk_location_file();
if (is_file($configFile)) {
$already = require $configFile;
if (!is_string($already) || $already !== $proposed) {
throw new RuntimeException('Lokalizacja została już ustawiona. Aby nie rozdzielić kluczy i kopii, zmiana wymaga świadomej migracji. Niczego nie nadpisano.');
}
}
// If current backup is in an existing directory, do not silently switch key/storage.
if (!is_file($configFile)) {
try {
$old = pbk_private();
if ($old !== $proposed &&
(is_file($old . '/backup.key') || is_file($old . '/settings.json') || (glob($old . '/daily/*.pbackup') ?: []))) {
throw new RuntimeException('Znaleziono istniejącą konfigurację lub kopie w innej lokalizacji. Zmiana jest zablokowana, aby nie utracić dostępu do klucza.');
}
} catch (RuntimeException $e) {
if (str_contains($e->getMessage(), 'Znaleziono istniejącą konfigurację')) throw $e;
// Original automatic directory discovery may fail; user-selected path is validated below.
}
}
$proposed = pbk_prepare_private($proposed);
if (!is_file($configFile)) {
$php = "<?php\n/** POLANA V18.3 private storage location; do not put backups in WWW. */\nreturn " . var_export($proposed, true) . ";\n";
// Exclusive create: concurrent first installs never overwrite each other.
$handle = @fopen($configFile, 'x+b');
if ($handle === false) throw new RuntimeException('Nie można utworzyć pliku lokalizacji w includes/. Sprawdź prawa PHP do tego folderu.');
try {
@chmod($configFile, 0600);
if (fwrite($handle, $php) !== strlen($php)) throw new RuntimeException('Niepełny zapis lokalizacji.');
fflush($handle);
} catch (Throwable $e) { fclose($handle); @unlink($configFile); throw $e; }
fclose($handle);
}
$notice = 'Katalog prywatny działa. Można teraz zainstalować link V18.2 oraz włączyć backupy.';
}
$current = pbk_private();
} catch (Throwable $e) { $error = $e->getMessage(); }
$suggestions = [];
$root = realpath(dirname(__DIR__));
$doc = realpath((string)($_SERVER['DOCUMENT_ROOT'] ?? ''));
foreach (array_unique(array_filter([$doc !== false ? dirname($doc) : null, $root !== false ? dirname($root) : null, $root !== false ? dirname(dirname($root)) : null])) as $base) {
try { $suggestions[] = pbk_safe_private_target($base . '/polana-private-backups'); }
catch (Throwable $ignored) { }
}
render_admin_header('POLANA V18.3 — naprawa backupów');
?>
<style>
.p183{max-width:950px;margin:24px auto 60px;padding:0 16px;color:#21372a}.p183 *{box-sizing:border-box}.p183 article{background:#fff;border:1px solid #d6e1d6;border-radius:15px;padding:22px;margin:15px 0}.p183 input[type=text]{width:100%;padding:12px;border:1px solid #b6c7ba;border-radius:8px;font:inherit}.p183 button{background:#16422b;color:white;border:0;border-radius:10px;padding:12px 18px;font-weight:700;cursor:pointer}.p183 code{overflow-wrap:anywhere}.p183 .err{background:#ffebe7;padding:15px;border-radius:10px}.p183 .ok{background:#e9f5eb;padding:15px;border-radius:10px}.p183 li{margin:7px 0}
</style>
<div class="p183">
<h1>POLANA V18.3 — naprawa kopii zapasowych</h1>
<p>Bez zmian w bazie danych, rezerwacjach, menu, ustawieniach SMTP i istniejących archiwach. Ta poprawka wybiera bezpieczne miejsce przechowywania kopii <b>poza WWW</b>.</p>
<?php if ($notice): ?><div class="ok"><?=pbk183_e($notice)?></div><?php endif; ?>
<?php if ($error): ?><div class="err"><b>Diagnostyka:</b> <?=pbk183_e($error)?></div><?php endif; ?>
<article><h2>1. Lokalizacja kopii</h2>
<p><b>Stan:</b> <?= $current !== '' ? 'Gotowa — katalog prywatny jest dostępny' : 'Wymaga konfiguracji' ?></p>
<?php if ($current): ?><p><code><?=pbk183_e($current)?></code></p><?php endif; ?>
<p>Jeśli hosting nie pozwala PHP tworzyć folderów automatycznie, utwórz katalog <code>polana-private-backups</code> w menedżerze plików <b>poza public_html, htdocs, www i poza DocumentRoot</b>. Nadaj użytkownikowi PHP prawa zapisu. Nie ustawiaj 777.</p>
<?php if ($suggestions): ?><p>Możliwe ścieżki (niepotwierdzone, sprawdzane przy zapisie):</p><ul><?php foreach ($suggestions as $path): ?><li><code><?=pbk183_e($path)?></code></li><?php endforeach; ?></ul><?php endif; ?>
<form method="post"><?=csrf_field()?><input type="hidden" name="action" value="save_path">
<label for="private_path"><b>Bezwzględna ścieżka na hostingu:</b></label>
<input id="private_path" type="text" name="private_path" value="<?=pbk183_e($current ?: ($suggestions[0] ?? ''))?>" required spellcheck="false" autocomplete="off">
<p><button type="submit">Sprawdź i zapisz bezpieczną ścieżkę</button></p>
</form><small>Ponowny zapis tej samej ścieżki niczego nie usuwa. Zmiana już zapisanej lokalizacji jest blokowana, by nie rozdzielić klucza od istniejących kopii.</small></article>
<article><h2>2. Dokończ instalację</h2>
<ol><li><a href="/admin/polana-v182-instalator.php">Dodaj link do Centrum zarządzania</a>.</li>
<li><a href="/admin/polana-backup-automat.php">Otwórz automatyczne kopie</a>, pobierz klucz odzyskiwania, ustaw e-mail/Drive i wykonaj SQL test.</li>
<li>Po udanym teście ustaw CRON na hostingu — bez CRON harmonogram nie ruszy sam.</li></ol>
<p><a href="/admin/polana-v183-audyt.php">Przejdź do audytu ostrzeżeń V18.0 →</a></p></article>
</div>
<?php render_admin_footer(); ?>