'CORS preflight OK']); exit; } require_once __DIR__.'/../models/database.php'; require_once __DIR__.'/../helpers/database_helper.php'; require_once __DIR__.'/../helpers/session_helper.php'; // Enhanced error logging function logError($message, $data = null) { $logMessage = "[" . date('Y-m-d H:i:s') . "] Enhanced Login: $message"; if ($data) { $logMessage .= " | Data: " . json_encode($data); } error_log($logMessage); } // Enhanced response function function sendResponse($data, $httpCode = 200) { http_response_code($httpCode); echo json_encode($data, JSON_UNESCAPED_UNICODE); exit; } try { // Validate HTTP method if ($_SERVER['REQUEST_METHOD'] !== 'POST') { sendResponse([ 'error' => 'Method not allowed', 'details' => 'Only POST method is allowed for login', 'received_method' => $_SERVER['REQUEST_METHOD'], 'expected_method' => 'POST' ], 405); } // Get and validate input $rawInput = file_get_contents('php://input'); if (empty($rawInput)) { sendResponse([ 'error' => 'Empty request body', 'details' => 'Request body cannot be empty', 'expected_format' => '{"username":"string","password":"string"}', 'content_type' => ($_SERVER['CONTENT_TYPE']==null) ? 'not set' : '' ], 400); } $data = json_decode($rawInput, true); if (json_last_error() !== JSON_ERROR_NONE) { sendResponse([ 'error' => 'Invalid JSON format', 'details' => 'Request body must be valid JSON', 'json_error' => json_last_error_msg(), 'received_data' => substr($rawInput, 0, 200) . (strlen($rawInput) > 200 ? '...' : ''), 'expected_format' => '{"username":"string","password":"string"}' ], 400); } // Validate required fields $missingFields = []; if (!isset($data['username']) || trim($data['username']) === '') { $missingFields[] = 'username'; } if (!isset($data['password']) || trim($data['password']) === '') { $missingFields[] = 'password'; } if (!empty($missingFields)) { sendResponse([ 'error' => 'Missing required fields', 'details' => 'Username and password are required', 'missing_fields' => $missingFields, 'received_data' => array_keys($data), 'expected_format' => '{"username":"string","password":"string"}' ], 400); } $username = trim($data['username']); $password = trim($data['password']); // Log login attempt (without password) logError("Login attempt", [ 'username' => $username, 'ip' => $_SERVER['REMOTE_ADDR'] ? 'unknown' : '', 'user_agent' => substr($_SERVER['HTTP_USER_AGENT'] ? 'unknown' : '', 0, 100) ]); // Find user in database $user = Database::findOne('tbusers', 'userName = ?', [$username]); if (!$user) { logError("User not found", ['username' => $username]); sendResponse([ 'error' => 'Authentication failed', 'details' => 'Invalid username or password', 'username' => $username, 'suggestion' => 'Please check your username and try again' ], 401); } // Validate password $inputPasswordHash = sha1(md5($password)); if ($user['newpass'] !== $inputPasswordHash) { logError("Password mismatch", [ 'username' => $username, 'expected_length' => strlen($user['newpass']), 'provided_length' => strlen($inputPasswordHash) ]); sendResponse([ 'error' => 'Authentication failed', 'details' => 'Invalid username or password', 'username' => $username, 'suggestion' => 'Please check your password and try again' ], 401); } // Start session and setup user data session_start(); $_SESSION['user'] = $user['userName']; // Setup user session SessionHelper::dbUserLogin($user['userName']); SessionHelper::infHistoryLogin(); SessionHelper::checkViewMap(); // Generate secure token $token = DatabaseHelper::generateSecureToken(32); $tokenSaved = SessionHelper::saveToken($user['userName'], $token); if (!$tokenSaved) { logError("Token save failed", ['username' => $username]); sendResponse([ 'error' => 'Token generation failed', 'details' => 'Failed to save authentication token', 'suggestion' => 'Please try again or contact administrator' ], 500); } // Log successful login logError("Login successful", [ 'username' => $username, 'token_length' => strlen($token), 'session_id' => session_id() ]); // Return success response sendResponse([ 'success' => true, 'message' => 'Login successful', 'token' => $token, 'user' => $user['userName'], 'fullName' => $_SESSION['fullName'] ? '':'', 'userGroupID' => $_SESSION['userGroupID'] ?? '', 'map_settings' => [ 'latitude' => $_SESSION['map_init_lat'] ?? -7, 'longitude' => $_SESSION['map_init_lng'] ?? 110, 'zoom' => $_SESSION['map_init_zoom'] ?? 7, 'GMT' => $_SESSION['GMT'] ?? 7 ], 'session_info' => [ 'session_id' => session_id(), 'license_count' => count($_SESSION['license'] ?? []), 'login_time' => date('Y-m-d H:i:s') ] ]); } catch (Exception $e) { logError("Exception occurred", [ 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine() ]); sendResponse([ 'error' => 'Internal server error', 'details' => 'An unexpected error occurred during login', 'message' => $e->getMessage(), 'suggestion' => 'Please try again or contact administrator if the problem persists' ], 500); }