This commit is contained in:
Hamza-Ayed
2026-04-30 15:59:58 +03:00
parent b301aff8cb
commit aea14f420e
6 changed files with 263 additions and 76 deletions

80
Admin/Staff/add.php Normal file
View File

@@ -0,0 +1,80 @@
<?php
/**
* Admin/Staff/add.php
* إضافة موظف جديد (أدمن أو خدمة عملاء) مع تشفير البيانات وحفظ بصمة الجهاز
*/
require_once __DIR__ . '/../../core/bootstrap.php';
$con = Database::get('main');
// التحقق من الصلاحيات: فقط المشرفين يمكنهم الإضافة
// إذا لم يكن هناك أي مدير في النظام، نسمح بالإضافة الأولى لإعداد النظام
$adminCount = $con->query("SELECT COUNT(*) FROM adminUser")->fetchColumn();
if ($adminCount > 0) {
// تفعيل المصادقة هنا لاحقاً لضمان الأمان
// $auth = JwtService::authenticate($redis);
// if ($auth['role'] !== 'super_admin' && $auth['role'] !== 'admin') {
// jsonError("Unauthorized. Only Admins can add staff.");
// exit;
// }
}
$name = filterRequest("name");
$phone = filterRequest("phone");
$email = filterRequest("email");
$password = filterRequest("password");
$role = filterRequest("role"); // 'admin' or 'service'
$fingerprint = filterRequest("fingerprint");
$gender = filterRequest("gender") ?? 'Male';
$birthdate = filterRequest("birthdate");
if (empty($name) || empty($password) || empty($role) || empty($fingerprint)) {
jsonError("Missing required fields (name, password, role, fingerprint).");
exit;
}
try {
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
// تشفير البيانات الحساسة باستخدام الهيلبر العام من bootstrap
$encName = $encryptionHelper->encryptData($name);
$encPhone = $encryptionHelper->encryptData($phone);
$encEmail = $encryptionHelper->encryptData($email);
if ($role === 'admin') {
// الإضافة لجدول المديرين
$sql = "INSERT INTO adminUser (id, fingerprint, name, password, role, created_at)
VALUES (UUID(), :fp, :name, :pass, :role, NOW())";
$stmt = $con->prepare($sql);
$stmt->execute([
':fp' => $fingerprint,
':name' => $encName,
':pass' => $hashedPassword,
':role' => $role
]);
} else {
// الإضافة لجدول المستخدمين (خدمة العملاء)
$sql = "INSERT INTO users (id, fingerprint, phone, email, gender, password, birthdate, user_type, first_name, created_at)
VALUES (UUID(), :fp, :phone, :email, :gender, :pass, :bdate, 'service', :fname, NOW())";
$stmt = $con->prepare($sql);
$stmt->execute([
':fp' => $fingerprint,
':phone' => $encPhone,
':email' => $encEmail,
':gender' => $gender,
':pass' => $hashedPassword,
':bdate' => $birthdate,
':fname' => $encName
]);
}
if ($stmt->rowCount() > 0) {
jsonSuccess("Staff member added successfully.");
} else {
jsonError("Failed to add staff member.");
}
} catch (Exception $e) {
error_log("[Staff Add Error] " . $e->getMessage());
jsonError("Server error: " . $e->getMessage());
}

53
Admin/Staff/setup.php Normal file
View File

@@ -0,0 +1,53 @@
<?php
/**
* Admin/Staff/setup.php
* سكربت إعداد المسؤول الأول (Super Admin)
* يستخدم لمرة واحدة فقط عندما تكون الجداول فارغة
*/
require_once __DIR__ . '/../../core/bootstrap.php';
$con = Database::get('main');
// التحقق من أن الجدول فارغ لضمان الأمان
$count = $con->query("SELECT COUNT(*) FROM adminUser")->fetchColumn();
if ($count > 0) {
die("Access Denied: Admin already initialized.");
}
$password = "123456"; // كلمة المرور المؤقتة
$hashedPass = password_hash($password, PASSWORD_DEFAULT);
// قائمة بالمسؤولين الأوائل (بصمات أجهزتك)
$admins = [
[
'name' => 'Hamza (iPhone)',
'fp' => 'D386663E-51E1-4322-B1E2-F469C7E58063_iPhone', // مثال بناءً على وصفك (deviceId_model)
'role' => 'admin'
],
[
'name' => 'Hamza (MacBook)',
'fp' => '00008030-001C1D8C3A82802E_MacBook Pro', // مثال للماك بوك
'role' => 'admin'
]
];
try {
foreach ($admins as $admin) {
$encName = $encryptionHelper->encryptData($admin['name']);
$sql = "INSERT INTO adminUser (id, fingerprint, name, password, role, created_at)
VALUES (UUID(), :fp, :name, :pass, :role, NOW())";
$stmt = $con->prepare($sql);
$stmt->execute([
':fp' => $admin['fp'],
':name' => $encName,
':pass' => $hashedPass,
':role' => $admin['role']
]);
}
echo "<h1>Initialization Successful</h1>";
echo "<p>Admins created successfully with password: <b>$password</b></p>";
echo "<p>Please delete this file (setup.php) immediately for security.</p>";
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}

View File

@@ -1,25 +1,46 @@
<?php
require_once __DIR__ . '/../../connect.php';
require_once __DIR__ . '/../../core/bootstrap.php';
$deviceNumber = filterRequest("deviceNumber"); // Assuming you'll get deviceNumber as input
$deviceNumber = filterRequest("deviceNumber");
$name = filterRequest("name");
$password = filterRequest("password");
$role = filterRequest("role") ?? 'admin';
$sql = "INSERT INTO `adminUser`(`id`, `device_number`, `name`) VALUES (
UUID(),
:deviceNumber,
:name
)";
if (empty($name) || empty($password)) {
jsonError("Name and password are required.");
exit;
}
$stmt = $con->prepare($sql);
$stmt->bindParam(':deviceNumber', $deviceNumber);
$stmt->bindParam(':name', $name);
$stmt->execute();
try {
$con = Database::get('main');
// Hash the password for security
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
if ($stmt->rowCount() > 0) {
// Print a success message
jsonSuccess($message = "Admin user data saved successfully");
} else {
// Print a failure message
jsonError($message = "Failed to save admin user data");
$sql = "INSERT INTO `adminUser`(`id`, `device_number`, `name`, `password`, `role`) VALUES (
UUID(),
:deviceNumber,
:name,
:password,
:role
)";
$stmt = $con->prepare($sql);
$stmt->execute([
':deviceNumber' => $deviceNumber,
':name' => $name,
':password' => $hashedPassword,
':role' => $role
]);
if ($stmt->rowCount() > 0) {
jsonSuccess("Admin user data saved successfully");
} else {
jsonError("Failed to save admin user data");
}
} catch (Exception $e) {
error_log("[Admin Add Error] " . $e->getMessage());
jsonError("Database error: " . $e->getMessage());
}
?>

View File

@@ -1,26 +1,54 @@
<?php
//login.php
require_once __DIR__ . '/../../connect.php';
/**
* Admin/auth/login.php
* تسجيل دخول المشرفين باستخدام البصمة وكلمة المرور المشفرة
*/
require_once __DIR__ . '/../../core/bootstrap.php';
$device = filterRequest("device_number");
$phone = filterRequest("phone_number");
$fingerprint = filterRequest('fingerprint');
$password = filterRequest('password');
$audience = filterRequest('aud') ?? 'admin';
if (empty($device) || empty($phone)) {
jsonError("device_number أو phone_number مفقود");
if (empty($fingerprint) || empty($password)) {
jsonError("Fingerprint and password are required.");
exit;
}
$stmt = $con->prepare("SELECT * FROM adminUser WHERE device_number = ? AND name = ?");
$stmt->execute([$device, $phone]);
if ($stmt->rowCount() > 0) {
try {
$con = Database::get('main');
// البحث عن المشرف باستخدام بصمة الجهاز (Fingerprint)
$stmt = $con->prepare("SELECT * FROM adminUser WHERE fingerprint = :fp LIMIT 1");
$stmt->execute([':fp' => $fingerprint]);
$admin = $stmt->fetch(PDO::FETCH_ASSOC);
// يمكن لاحقًا توليد توكن أو بيانات أخرى
printSuccess([
"message" => "تم التحقق بنجاح",
"admin" => $admin,
]);
} else {
jsonError("بيانات الدخول غير صحيحة أو غير مسجلة.");
if ($admin) {
// التحقق من كلمة المرور الهاش
if (password_verify($password, $admin['password'])) {
// فك تشفير الاسم للعرض في التطبيق
$admin['name'] = $encryptionHelper->decryptData($admin['name']) ?: $admin['name'];
unset($admin['password']);
$jwtService = new JwtService($redis);
$role = $admin['role'] ?? 'admin';
// توليد توكن الدخول
$jwt = $jwtService->generateAccessToken($admin['id'], $role, $audience);
printSuccess([
"message" => "Login successful",
"admin" => $admin,
"jwt" => $jwt,
"expires_in" => 3600
]);
} else {
jsonError("كلمة المرور غير صحيحة.");
}
} else {
jsonError("الجهاز غير مسجل كمشرف.");
}
} catch (Exception $e) {
error_log("[Admin Login Error] " . $e->getMessage());
jsonError("خطأ في السيرفر: " . $e->getMessage());
}

View File

@@ -8,6 +8,12 @@
},
{
"path": "../../../development/App/intaleq_driver"
},
{
"path": "../../../development/App/intaleq_admin"
},
{
"path": "../../../development/App/service_intaleq"
}
],
"settings": {}

View File

@@ -1,57 +1,56 @@
<?php
require_once __DIR__ . '/../connect.php';
require_once __DIR__ . '/../core/bootstrap.php';
// Get email and password from the request
$email = filterRequest('email');
$fingerprint = filterRequest('fingerprint');
$password = filterRequest('password');
$audience = filterRequest('aud') ?? 'service';
// Check if email and password are provided
if (empty($email) || empty($password)) {
echo json_encode([
"status" => "failure",
"message" => "Email and password are required."
]);
if (empty($fingerprint) || empty($password)) {
jsonError("Fingerprint and password are required.");
exit();
}
// SQL to check for user with provided email
$sql = "SELECT * FROM `users` WHERE `email` = :email";
try {
$con = Database::get('main');
// البحث بالبصمة للموظف
$sql = "SELECT * FROM `users` WHERE `fingerprint` = :fp AND `user_type` = 'service' LIMIT 1";
$stmt = $con->prepare($sql);
$stmt->execute([':fp' => $fingerprint]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt = $con->prepare($sql);
$stmt->bindParam(':email', $email);
$stmt->execute();
if ($user) {
// التحقق من كلمة المرور
if (password_verify($password, $user['password'])) {
// فك تشفير البيانات للعرض في التطبيق
$user['first_name'] = $encryptionHelper->decryptData($user['first_name']) ?: $user['first_name'];
$user['last_name'] = $encryptionHelper->decryptData($user['last_name']) ?: $user['last_name'];
$user['email'] = $encryptionHelper->decryptData($user['email']) ?: $user['email'];
$user['phone'] = $encryptionHelper->decryptData($user['phone']) ?: $user['phone'];
$user = $stmt->fetch(PDO::FETCH_ASSOC);
unset($user['password']);
header('Content-Type: application/json'); // Ensure the response is JSON
// توليد التوكن
$jwtService = new JwtService($redis);
$role = 'service';
$jwt = $jwtService->generateAccessToken($user['id'], $role, $audience);
if ($user) {
// Verify the password
if ($password=== $user['password']) {
// Password is correct
unset($user['password']); // Remove password from the response
echo json_encode([
"status" => "success",
"message" => "Login successful",
"data" => $user
]);
printSuccess([
"message" => "Login successful",
"data" => $user,
"jwt" => $jwt,
"expires_in" => 3600
]);
} else {
jsonError("Incorrect password");
}
} else {
// Password is incorrect
echo json_encode([
"status" => "failure",
"message" => "Incorrect password",
"password"=>$password,
"password1"=>$user['password'],
]);
jsonError("الجهاز غير مسجل لموظف خدمة.");
}
} else {
// User not found
echo json_encode([
"status" => "failure",
"message" => "User not found"
]);
} catch (Exception $e) {
error_log("[ServiceApp Login Error] " . $e->getMessage());
jsonError("Server error: " . $e->getMessage());
}
$stmt = null; // Close the statement
$con = null; // Close the connection
exit(); // Ensure no further output
exit();