| 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 : /test2.famaresto/admin/ |
Upload File : |
<?php
require_once __DIR__ . '/../inc/auth.php';
cms_require_admin();
$msg = '';
$err = '';
$stats = null;
function cms_detect_hash_fields(string $hash): array {
$hash = trim($hash);
if (preg_match('/^\$2[aby]\$/', $hash) || strpos($hash, '$argon2') === 0) return ['pass_hash' => $hash];
if (strpos($hash, '$apr1$') === 0) return ['pass_apr1' => $hash];
if (preg_match('/^\$1\$|^\$5\$|^\$6\$/', $hash)) return ['pass_crypt' => $hash];
if (strpos($hash, '{SHA}') === 0) return ['pass_sha1' => $hash];
if (preg_match('/^[a-f0-9]{32}$/i', $hash)) return ['pass_md5' => strtolower($hash)];
return [];
}
$defaultPath = dirname(__DIR__) . '/.htpasswd';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!cms_check_csrf($_POST['csrf'] ?? null)) {
$err = 'Błąd CSRF. Odśwież stronę i spróbuj ponownie.';
} else {
$path = trim((string)($_POST['path'] ?? $defaultPath));
$defaultRole = (string)($_POST['role'] ?? 'editor');
$defaultRole = ($defaultRole === 'admin') ? 'admin' : 'editor';
// Lista adminów (opcjonalnie)
$adminsRaw = trim((string)($_POST['admins'] ?? ''));
$admins = [];
if ($adminsRaw !== '') {
foreach (preg_split('/[\s,;]+/', $adminsRaw) as $u) {
$u = trim($u);
if ($u !== '') $admins[$u] = true;
}
}
$real = @realpath($path);
if ($real === false) {
$err = 'Nieprawidłowa ścieżka.';
} elseif (!preg_match('~\.htpasswd~i', basename($real))) {
$err = 'To nie wygląda jak plik .htpasswd: ' . $real;
} elseif (!is_file($real) || !is_readable($real)) {
$err = 'Nie mogę odczytać pliku: ' . $real;
} else {
$lines = file($real, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines === false) {
$err = 'Błąd odczytu pliku.';
} else {
$data = cms_load_users();
if (!isset($data['users']) || !is_array($data['users'])) $data['users'] = [];
$added = 0; $updated = 0; $skipped = 0; $unknown = 0;
foreach ($lines as $ln) {
$ln = trim($ln);
if ($ln === '' || $ln[0] === '#') continue;
if (strpos($ln, ':') === false) { $skipped++; continue; }
[$user, $hash] = explode(':', $ln, 2);
$user = trim($user);
$hash = trim($hash);
if ($user === '' || $hash === '') { $skipped++; continue; }
$fields = cms_detect_hash_fields($hash);
if (!$fields) { $unknown++; continue; }
$role = isset($admins[$user]) ? 'admin' : $defaultRole;
$found = false;
foreach ($data['users'] as $i => $u) {
if (isset($u['username']) && (string)$u['username'] === $user) {
$data['users'][$i]['role'] = $role;
foreach ($fields as $k => $v) $data['users'][$i][$k] = $v;
$found = true;
$updated++;
break;
}
}
if (!$found) {
$rec = ['username' => $user, 'role' => $role, 'created_at' => date('c')];
foreach ($fields as $k => $v) $rec[$k] = $v;
$data['users'][] = $rec;
$added++;
}
}
if (cms_save_json(cms_users_file(), $data)) {
$msg = 'Import z .htpasswd OK ✔';
$stats = ['added'=>$added,'updated'=>$updated,'skipped'=>$skipped,'unknown'=>$unknown,'file'=>$real];
} else {
$err = 'Nie mogę zapisać users.json (sprawdź prawa do /data).';
}
}
}
}
}
cms_layout_header('Import z .htpasswd');
?>
<div class="card">
<h1 style="margin:0 0 10px 0;font-size:20px">Import użytkowników z pliku .htpasswd</h1>
<div class="muted">
To pobiera istniejące loginy/hashe z Apache <code>.htpasswd</code> i pozwala logować się do panelu tym samym hasłem.
Po pierwszym zalogowaniu użytkownika system automatycznie zapisze bezpieczny <code>pass_hash</code>.
</div>
<?php if ($msg): ?><div class="msg"><?= cms_h($msg) ?></div><?php endif; ?>
<?php if ($err): ?><div class="msg" style="background:#fff0f0;border-color:#ffd0d0"><?= cms_h($err) ?></div><?php endif; ?>
<?php if ($stats): ?>
<div class="msg">
Plik: <code><?= cms_h($stats['file']) ?></code><br>
Dodano: <b><?= (int)$stats['added'] ?></b>, Zaktualizowano: <b><?= (int)$stats['updated'] ?></b>, Pominięto: <b><?= (int)$stats['skipped'] ?></b>, Nieznane hashe: <b><?= (int)$stats['unknown'] ?></b>
</div>
<?php endif; ?>
<form method="post">
<input type="hidden" name="csrf" value="<?= cms_h(cms_csrf_token()) ?>">
<table>
<tr>
<th style="width:240px">Ścieżka do .htpasswd</th>
<td><input name="path" value="<?= cms_h($defaultPath) ?>"></td>
</tr>
<tr>
<th>Domyślna rola</th>
<td>
<select name="role">
<option value="editor">editor</option>
<option value="admin">admin</option>
</select>
<div class="muted">Zwykle ustaw <b>editor</b>. Adminów ustaw poniżej.</div>
</td>
</tr>
<tr>
<th>Użytkownicy z rolą admin</th>
<td>
<input name="admins" placeholder="np. jan,kasia">
<div class="muted">Lista loginów oddzielona spacją/przecinkiem.</div>
</td>
</tr>
</table>
<div class="actions">
<button class="btn" type="submit">Importuj z .htpasswd</button>
<a class="btn secondary" href="/admin/import_users.php" style="text-decoration:none;display:inline-block">Import ręczny</a>
<a class="btn secondary" href="/admin/users.php" style="text-decoration:none;display:inline-block">Użytkownicy</a>
</div>
</form>
</div>
<?php cms_layout_footer();