time(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { require_once __DIR__ . '/config/db.php'; require_once __DIR__ . '/config/activity.php'; if ($isLocked) { $sisa = (int)ceil(($lockUntil - time()) / 60); $error = "Terlalu banyak percobaan gagal. Coba lagi dalam {$sisa} menit."; } else { $username = trim($_POST['username'] ?? ''); $password = $_POST['password'] ?? ''; if ($username && $password) { $pdo = Database::getConnection(); $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? LIMIT 1"); $stmt->execute([$username]); $user = $stmt->fetch(); if ($user && (int)$user['is_active'] !== 1) { $error = 'Akun ini dinonaktifkan. Hubungi operator.'; } elseif ($user && password_verify($password, $user['password'])) { // Sukses — reset counter & buat sesi unset($_SESSION['login_attempts'], $_SESSION['login_lock_until']); session_regenerate_id(true); $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; $_SESSION['email'] = $user['email']; $_SESSION['role'] = $user['role']; $_SESSION['wilayah_tugas'] = $user['wilayah_tugas']; $_SESSION['nama_lengkap'] = $user['nama_lengkap']; $pdo->prepare("UPDATE users SET last_login = NOW() WHERE id = ?")->execute([$user['id']]); logActivity($pdo, 'login', null, null, 'Login berhasil'); header('Location: ' . roleHome($user['role'])); exit; } else { // Gagal — naikkan counter $attempts++; $_SESSION['login_attempts'] = $attempts; if ($attempts >= MAX_LOGIN_ATTEMPTS) { $_SESSION['login_lock_until'] = time() + LOCKOUT_SECONDS; $error = 'Terlalu banyak percobaan gagal. Akun dikunci sementara 15 menit.'; } else { $sisa = MAX_LOGIN_ATTEMPTS - $attempts; $error = "Username atau password salah. Sisa percobaan: {$sisa}."; } } } else { $error = 'Username dan password wajib diisi.'; } } } ?> Login - WebGIS Pemetaan Kemiskinan

Selamat Datang

Masuk ke WebGIS Pemetaan Kemiskinan Terpadu.

Hak akses mengikuti akun: Operator, Pimpinan, atau Enumerator. Masyarakat umum dapat lihat peta publik tanpa login.