Untitled
user_0176460
plain_text
10 months ago
4.1 kB
19
Indexable
<?php
require_once '../includes/config.php';
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['success' => false, 'message' => 'Method not allowed']);
exit;
}
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (!isset($data['username']) || !isset($data['password'])) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Username and password are required']);
exit;
}
$username = trim($data['username']);
$password = trim($data['password']);
if ($username === '' || $password === '') {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Username and password cannot be empty']);
exit;
}
try {
$conn = getDBConnection();
$stmt = $conn->prepare("
SELECT user_id, username, password, email, full_name, user_type, is_active
FROM users
WHERE username = ? OR email = ?
");
$stmt->execute([$username, $username]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user) {
http_response_code(401);
echo json_encode(['success' => false, 'message' => 'Invalid username or password']);
exit;
}
if (empty($user['is_active']) && $user['is_active'] !== '1' && $user['is_active'] !== 1) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'Account is disabled. Please contact support.']);
exit;
}
$stored = $user['password'] ?? '';
$stored_trimmed = rtrim($stored, "\0 ");
$safe_prefix = substr($stored_trimmed, 0, 6);
error_log("Signin debug: user_id={$user['user_id']} stored_len=" . strlen($stored) .
" trimmed_len=" . strlen($stored_trimmed) . " prefix={$safe_prefix}");
if ($stored_trimmed !== '' && password_verify($password, $stored_trimmed)) {
if (password_needs_rehash($stored_trimmed, PASSWORD_DEFAULT)) {
$newHash = password_hash($password, PASSWORD_DEFAULT);
$upd = $conn->prepare("UPDATE users SET password = ? WHERE user_id = ?");
$upd->execute([$newHash, $user['user_id']]);
error_log("Signin notice: rehashed password for user_id={$user['user_id']}");
}
} elseif ($stored_trimmed === $password || $stored === $password) {
$newHash = password_hash($password, PASSWORD_DEFAULT);
$upd = $conn->prepare("UPDATE users SET password = ? WHERE user_id = ?");
$upd->execute([$newHash, $user['user_id']]);
error_log("Signin notice: migrated plain-text password to hash for user_id={$user['user_id']}");
} else {
if (strlen($stored_trimmed) > 0 && strlen($stored_trimmed) < 60) {
error_log("Signin error: stored password length suspicious (possible truncation). user_id={$user['user_id']} stored_len=" . strlen($stored_trimmed));
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Server configuration error: password storage invalid. Contact administrator.']);
exit;
}
http_response_code(401);
echo json_encode(['success' => false, 'message' => 'Invalid username or password']);
exit;
}
unset($user['password']);
session_start();
$_SESSION['user'] = $user;
http_response_code(200);
echo json_encode([
'success' => true,
'message' => 'Sign in successful',
'user' => $user
]);
} catch (PDOException $e) {
error_log("Signin exception: " . $e->getMessage());
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'An error occurred. Please try again later.']);
}
Editor is loading...
Leave a Comment