shubraVeil/reset-password.php

167 lines
7.1 KiB
PHP
Raw Normal View History

2024-12-25 13:05:50 +02:00
<?php
require_once 'includes/config.php';
require_once 'includes/Security.php';
session_start();
$error = '';
$success = '';
// التحقق من وجود الرمز
if (!isset($_GET['token'])) {
header('Location: login.php');
exit;
}
$token = Security::sanitizeInput($_GET['token']);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
try {
$password = $_POST['password'];
$confirm_password = $_POST['confirm_password'];
if (empty($password) || empty($confirm_password)) {
throw new Exception('جميع الحقول مطلوبة');
}
if (strlen($password) < 8) {
throw new Exception('يجب أن تكون كلمة المرور 8 أحرف على الأقل');
}
if ($password !== $confirm_password) {
throw new Exception('كلمتا المرور غير متطابقتين');
}
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
if ($conn->connect_error) {
throw new Exception('فشل الاتصال بقاعدة البيانات');
}
// التحقق من صلاحية الرمز
$stmt = $conn->prepare("SELECT user_id FROM password_resets WHERE token = ? AND expiry > NOW() AND used = 0");
$stmt->bind_param("s", $token);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
throw new Exception('رابط إعادة تعيين كلمة المرور غير صالح أو منتهي الصلاحية');
}
$reset = $result->fetch_assoc();
// تحديث كلمة المرور
$hashed_password = Security::hashPassword($password);
$stmt = $conn->prepare("UPDATE users SET password = ? WHERE id = ?");
$stmt->bind_param("si", $hashed_password, $reset['user_id']);
if (!$stmt->execute()) {
throw new Exception('حدث خطأ أثناء تحديث كلمة المرور');
}
// تعليم الرمز كمستخدم
$stmt = $conn->prepare("UPDATE password_resets SET used = 1 WHERE token = ?");
$stmt->bind_param("s", $token);
$stmt->execute();
$success = 'تم تحديث كلمة المرور بنجاح! يمكنك الآن تسجيل الدخول باستخدام كلمة المرور الجديدة.';
} catch (Exception $e) {
$error = $e->getMessage();
}
}
?>
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>إعادة تعيين كلمة المرور - ShubraVeil</title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.rtl.min.css">
</head>
<body class="bg-light">
<div class="container">
<div class="row justify-content-center mt-5">
<div class="col-md-6">
<div class="card shadow">
<div class="card-body">
<h2 class="text-center mb-4">إعادة تعيين كلمة المرور</h2>
<?php if ($error): ?>
<div class="alert alert-danger"><?php echo $error; ?></div>
<?php endif; ?>
<?php if ($success): ?>
<div class="alert alert-success">
<?php echo $success; ?>
<br>
<a href="login.php" class="alert-link">اضغط هنا لتسجيل الدخول</a>
</div>
<?php else: ?>
<form method="POST" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'] . '?token=' . $token); ?>" class="needs-validation" novalidate>
<div class="mb-3">
<label for="password" class="form-label">كلمة المرور الجديدة</label>
<input type="password" class="form-control" id="password" name="password" required
minlength="8" title="يجب أن تحتوي كلمة المرور على 8 أحرف على الأقل">
<div class="invalid-feedback">
يجب أن تحتوي كلمة المرور على 8 أحرف على الأقل
</div>
</div>
<div class="mb-3">
<label for="confirm_password" class="form-label">تأكيد كلمة المرور</label>
<input type="password" class="form-control" id="confirm_password" name="confirm_password" required>
<div class="invalid-feedback">
كلمتا المرور غير متطابقتين
</div>
</div>
<div class="d-grid gap-2">
<button type="submit" class="btn btn-primary">تحديث كلمة المرور</button>
</div>
</form>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
// تفعيل التحقق من صحة النموذج
(function () {
'use strict'
var forms = document.querySelectorAll('.needs-validation')
Array.prototype.slice.call(forms)
.forEach(function (form) {
form.addEventListener('submit', function (event) {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
// التحقق من تطابق كلمتي المرور
var password = document.getElementById('password')
var confirm_password = document.getElementById('confirm_password')
if (password.value !== confirm_password.value) {
confirm_password.setCustomValidity('كلمتا المرور غير متطابقتين')
event.preventDefault()
event.stopPropagation()
} else {
confirm_password.setCustomValidity('')
}
form.classList.add('was-validated')
}, false)
})
})()
</script>
</body>
</html>