'User initiated']);
}
session_destroy();
header("Location: login.php");
exit();
}
// Handle Auto Logout (Timeout)
if (isset($_GET['action']) && $_GET['action'] == 'timeout') {
if (isset($_SESSION['account'])) {
require_once("../core/utils.php");
system_log($conn2, $_SESSION['account'], 'AUTO_LOGOUT', ['reason' => 'Inactivity timeout']);
}
session_destroy();
header("Location: login.php?error=timeout");
exit();
}
// Redirect if already logged in
if (!empty($_SESSION['sess_userid']) && $_SESSION['sess_userid'] === session_id()) {
header("Location: dashboard.php");
exit();
}
$error_msg = "";
if (isset($_GET['error']) && $_GET['error'] === 'timeout') {
$error_msg = "เซสชั่นหมดอายุ
เนื่องจากไม่มีการใช้งานระบบเป็นเวลานาน กรุณาล็อกอินใหม่อีกครั้ง";
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
require_once("../core/utils.php");
require_once("../inc/rfc6238.php");
// CSRF Check
if (!verify_csrf_token($_POST['csrf_token'] ?? '')) {
die("CSRF Token Validation Failed");
}
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
$ip_address = $_SERVER['REMOTE_ADDR'];
$otp_arr = $_POST['otp'] ?? [];
$otp_val = implode('', $otp_arr);
if (empty($username) || empty($password)) {
$error_msg = "ข้อมูลไม่ครบถ้วน
กรุณากรอก Username และ Password ให้ครบถ้วน";
} else if (!check_rate_limit($conn2, $ip_address)) {
$error_msg = "บัญชีถูกระงับชั่วคราว
ท่านพยายามเข้าสู่ระบบผิดพลาดหลายครั้ง กรุณารอ 15 นาที";
system_log($conn2, $username, 'LOGIN_BLOCKED', ['reason' => 'Rate limit exceeded']);
} else {
$stmt = $conn1->prepare("SELECT * FROM opduser WHERE loginname = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
if ($result->num_rows == 1) {
$row = $result->fetch_assoc();
if (isset($row['account_disable']) && $row['account_disable'] === 'Y') {
$error_msg = "บัญชีนี้ถูกยกเลิกการใช้งาน
กรุณาติดต่อผู้ดูแลระบบ (Admin) เพื่อขอเปิดสิทธิ์";
system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Account disabled']);
} else if (md5($password) === $row['passweb']) {
// Check 2FA if user has secret key
$secretkey = '';
$stmt2 = $conn2->prepare("SELECT secret_key FROM sys_user_2fa WHERE loginname = ?");
if ($stmt2) {
$stmt2->bind_param("s", $username);
$stmt2->execute();
$res2 = $stmt2->get_result();
if ($res2->num_rows > 0) {
$secretkey = $res2->fetch_assoc()['secret_key'];
}
$stmt2->close();
}
$pass_2fa = true;
if (!empty($secretkey)) {
if (empty($otp_val)) {
$pass_2fa = false;
$error_msg = "ตรวจสอบสิทธิ์ล้มเหลว (2FA)
กรุณากรอกรหัสยืนยันตัวตน 6 หลัก จากแอปพลิเคชัน";
system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Missing 2FA code']);
record_failed_login($conn2, $ip_address, $username);
} else {
$pass_2fa = TokenAuth6238::verify($secretkey, $otp_val);
if (!$pass_2fa) {
$error_msg = "รหัส 2FA ไม่ถูกต้อง
กรุณาตรวจสอบรหัสจาก Google Authenticator และลองอีกครั้ง";
system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Invalid 2FA code']);
record_failed_login($conn2, $ip_address, $username);
}
}
}
if ($pass_2fa) {
session_regenerate_id();
$_SESSION['sess_userid'] = session_id();
$_SESSION['account'] = $row['loginname'];
$_SESSION['name'] = $row['name'];
$_SESSION['position'] = 'เจ้าหน้าที่'; // simplified
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$client_os = getOS();
$client_browser = getBrowser();
system_log($conn2, $username, 'LOGIN_SUCCESS', [
'message' => 'Logged in successfully',
'os' => $client_os,
'browser' => $client_browser
]);
clear_failed_logins($conn2, $ip_address);
header("Location: dashboard.php");
exit();
}
} else {
record_failed_login($conn2, $ip_address, $username);
$error_msg = "รหัสผ่านไม่ถูกต้อง
กรุณาตรวจสอบตัวสะกด พิมพ์เล็ก/ใหญ่ แล้วลองอีกครั้ง";
system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Invalid password']);
}
} else {
record_failed_login($conn2, $ip_address, $username);
$error_msg = "ไม่พบชื่อผู้ใช้งานนี้
ไม่มีชื่อผู้ใช้งานนี้ในระบบ HOSxP กรุณาตรวจสอบ Username อีกครั้ง";
system_log($conn2, $username, 'LOGIN_FAILED', ['reason' => 'Username not found']);
}
}
}
?>
ระบบฐานข้อมูล HOSxP Data