167 lines
7.1 KiB
PHP
167 lines
7.1 KiB
PHP
|
<?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>
|