%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
<?php
/**
* Halaman login panel admin / CMS PPID.
*/
require_once dirname(__DIR__) . '/config/config.php';
require_once dirname(__DIR__) . '/includes/auth.php';
if (admin_logged_in()) {
redirect('admin/index.php');
}
$error = '';
$username = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
csrf_verify();
$username = post_param('username');
$password = (string) ($_POST['password'] ?? '');
if ($username === '' || $password === '') {
$error = 'Username dan password wajib diisi.';
} else {
$stmt = db()->prepare('SELECT * FROM admin_users WHERE username = ? OR email = ? LIMIT 1');
$stmt->execute([$username, $username]);
$admin = $stmt->fetch();
if ($admin && password_verify($password, $admin['password'])) {
// Rehash bila algoritma default berubah.
if (password_needs_rehash($admin['password'], PASSWORD_DEFAULT)) {
$up = db()->prepare('UPDATE admin_users SET password = ? WHERE id = ?');
$up->execute([password_hash($password, PASSWORD_DEFAULT), $admin['id']]);
}
db()->prepare('UPDATE admin_users SET last_login = NOW() WHERE id = ?')->execute([$admin['id']]);
login_admin($admin);
set_flash('success', 'Selamat datang kembali, ' . $admin['nama'] . '!');
redirect('admin/index.php');
} else {
$error = 'Username atau password salah.';
}
}
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Admin — <?= e(APP_NAME) ?></title>
<link rel="icon" href="<?= e(asset('logo-ppid.png')) ?>" type="image/png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
<!-- Tailwind CSS terkompilasi statis (menggantikan CDN Tailwind). -->
<link href="<?= e(asset_ver('css/app.css')) ?>" rel="stylesheet">
<!-- FontAwesome & Google Fonts: dimuat non-blocking agar tidak menahan render. -->
<link rel="preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css" onload="this.onload=null;this.rel='stylesheet'">
<link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap">
</noscript>
</head>
<body class="font-sans bg-slate-900 min-h-screen flex items-center justify-center p-4 antialiased">
<div class="absolute inset-0 bg-gradient-to-br from-slate-900 via-slate-900 to-green-900/40"></div>
<div class="relative w-full max-w-md">
<div class="text-center mb-8">
<div class="w-20 h-20 bg-white rounded-2xl flex items-center justify-center shadow-lg mx-auto mb-4 p-2">
<img src="<?= e(asset('logomateng.webp')) ?>" alt="Logo Kab. Mamuju Tengah" class="max-h-full w-auto">
</div>
<h1 class="text-white text-2xl font-bold">CMS PPID Mamuju Tengah</h1>
<p class="text-slate-400 text-sm mt-1">Panel Administrasi Layanan Informasi</p>
</div>
<div class="bg-white rounded-2xl shadow-2xl p-8">
<h2 class="text-xl font-bold text-slate-900 mb-1">Masuk Akun</h2>
<p class="text-sm text-slate-500 mb-6">Silakan masuk untuk mengelola layanan informasi.</p>
<?php if ($error): ?>
<div class="bg-red-50 border border-red-200 text-red-700 rounded-lg px-4 py-3 mb-5 text-sm flex items-center gap-2">
<i class="fas fa-circle-xmark"></i> <?= e($error) ?>
</div>
<?php endif; ?>
<form method="post" class="space-y-4">
<?= csrf_field() ?>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Username / Email</label>
<div class="relative">
<i class="fas fa-user absolute left-4 top-1/2 -translate-y-1/2 text-slate-400"></i>
<input type="text" name="username" value="<?= e($username) ?>" autofocus class="w-full rounded-lg border border-slate-300 pl-11 pr-4 py-2.5 outline-none focus:border-mateng-green focus:ring-4 focus:ring-green-100">
</div>
</div>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Password</label>
<div class="relative">
<i class="fas fa-lock absolute left-4 top-1/2 -translate-y-1/2 text-slate-400"></i>
<input type="password" name="password" id="password" class="w-full rounded-lg border border-slate-300 pl-11 pr-11 py-2.5 outline-none focus:border-mateng-green focus:ring-4 focus:ring-green-100">
<button type="button" onclick="var p=document.getElementById('password');p.type=p.type==='password'?'text':'password';this.querySelector('i').classList.toggle('fa-eye');this.querySelector('i').classList.toggle('fa-eye-slash')" class="absolute right-4 top-1/2 -translate-y-1/2 text-slate-400 hover:text-slate-600">
<i class="fas fa-eye"></i>
</button>
</div>
</div>
<button type="submit" class="w-full bg-mateng-green hover:bg-green-700 text-white font-bold py-3 rounded-lg transition-colors flex items-center justify-center gap-2">
<i class="fas fa-sign-in-alt"></i> Masuk
</button>
</form>
</div>
<p class="text-center text-slate-500 text-sm mt-6">
<a href="<?= e(url('index.php')) ?>" class="hover:text-white transition-colors"><i class="fas fa-arrow-left mr-1"></i> Kembali ke situs publik</a>
</p>
</div>
</body>
</html>