') && !str_starts_with($lower, 'javascript:') && !str_starts_with($lower, 'vbscript:'); } $portalUrl = app_url('admin-portal.php'); if (isset($_GET['logout'])) { unset($_SESSION['is_admin_logged_in']); set_flash('success', 'Admin berhasil logout.'); header('Location: ' . $portalUrl); exit; } $loginError = ''; $passwordErrors = []; $brandingErrors = []; $brandingForm = [ 'brand_logo_url' => app_setting('brand_logo_url'), 'brand_favicon_url' => app_setting('brand_favicon_url'), ]; if (!is_admin_logged_in() && $_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'login') { $username = trim((string) ($_POST['username'] ?? '')); $password = (string) ($_POST['password'] ?? ''); if (verify_admin_login($username, $password)) { $_SESSION['is_admin_logged_in'] = true; set_flash('success', 'Login admin berhasil. Kamu bisa mengatur iklan, sandi, dan branding sekarang.'); header('Location: ' . $portalUrl); exit; } $loginError = 'Username atau password admin tidak cocok.'; } if (is_admin_logged_in() && $_SERVER['REQUEST_METHOD'] === 'POST') { $action = (string) ($_POST['action'] ?? ''); if ($action === 'save_ads') { save_setting('ads_head', trim((string) ($_POST['ads_head'] ?? ''))); save_setting('ads_body', trim((string) ($_POST['ads_body'] ?? ''))); set_flash('success', 'Kode iklan berhasil disimpan dan akan dimuat di semua halaman.'); header('Location: ' . $portalUrl); exit; } if ($action === 'change_password') { $currentPassword = (string) ($_POST['current_password'] ?? ''); $newPassword = (string) ($_POST['new_password'] ?? ''); $confirmPassword = (string) ($_POST['confirm_password'] ?? ''); if (!verify_admin_login(admin_username(), $currentPassword)) { $passwordErrors['current_password'] = 'Password admin saat ini tidak cocok.'; } if (strlen($newPassword) < 8) { $passwordErrors['new_password'] = 'Password baru minimal 8 karakter.'; } if ($confirmPassword === '' || $newPassword !== $confirmPassword) { $passwordErrors['confirm_password'] = 'Konfirmasi password harus sama dengan password baru.'; } if (!$passwordErrors) { save_admin_password($newPassword); set_flash('success', 'Password admin berhasil diubah. Password default tidak dipakai lagi.'); header('Location: ' . $portalUrl); exit; } } if ($action === 'save_branding') { $brandingForm['brand_logo_url'] = trim((string) ($_POST['brand_logo_url'] ?? '')); $brandingForm['brand_favicon_url'] = trim((string) ($_POST['brand_favicon_url'] ?? '')); foreach ($brandingForm as $field => $value) { if (strlen($value) > 500) { $brandingErrors[$field] = 'URL terlalu panjang. Maksimal 500 karakter.'; continue; } if (!admin_setting_url_looks_safe($value)) { $brandingErrors[$field] = 'Nilai tidak valid. Gunakan URL biasa atau path file publik.'; } } if (!$brandingErrors) { save_setting('brand_logo_url', $brandingForm['brand_logo_url']); save_setting('brand_favicon_url', $brandingForm['brand_favicon_url']); set_flash('success', 'Branding website berhasil disimpan. Logo dan favicon baru langsung dipakai.'); header('Location: ' . $portalUrl); exit; } } } $adsHead = app_setting('ads_head'); $adsBody = app_setting('ads_body'); $logoPreviewUrl = public_asset_url($brandingForm['brand_logo_url']); $faviconPreviewUrl = public_asset_url($brandingForm['brand_favicon_url']); render_page_start([ 'title' => 'Admin portal tersembunyi', 'description' => 'Login admin untuk mengelola script iklan global, password admin, dan branding website.', 'page' => 'admin-portal', 'robots' => 'noindex, nofollow', ]); render_flash(consume_flash()); ?>
Hidden admin

Login panel admin

Panel ini tetap tersembunyi via slug khusus. Setelah login, admin bisa mengelola script iklan global, mengganti sandi admin, dan mengatur logo/favikon website.

Akses awal MVP ini: / . Setelah masuk, segera ganti password admin di panel.
Password admin sudah memakai versi custom yang tersimpan di database, jadi hint default tidak lagi dipakai.
Admin portal

Pengaturan global website

Semua pengaturan di halaman ini berlaku global untuk semua halaman: script iklan, password admin, dan branding website.

Script iklan global

Tempel kode JavaScript/HTML iklan yang akan dirender di semua halaman.

Ads
Cocok untuk loader iklan, verifikasi, atau script yang memang harus masuk ke <head>.
Ideal untuk tag yang harus muncul setelah <body> terbuka.

Keamanan admin

Ganti password admin agar akses slug tersembunyi ini lebih aman.

Security
Username admin tetap . Yang diubah di sini hanya password-nya.

Logo & ikon website

Atur logo yang muncul di navbar/footer dan favicon yang tampil di tab browser.

Branding
Preview logo
Preview logo website
Belum ada logo custom. Saat ini website masih memakai inisial brand.
Preview favicon
Preview favicon website
Belum ada favicon custom. Tab browser masih memakai icon default browser.