diff --git a/backend/Admin/auth/login.php b/backend/Admin/auth/login.php index 45b856a8..da9b132f 100644 --- a/backend/Admin/auth/login.php +++ b/backend/Admin/auth/login.php @@ -61,9 +61,26 @@ try { if ($admin) { $isTrustedDevice = true; } else if (!empty($phone)) { - // 1. بحث مباشر بالـ ID المعياري Unencrypted - $stmtId = $con->prepare("SELECT * FROM adminUser WHERE id = :id LIMIT 1"); - $stmtId->execute([':id' => $phone]); + // 1. بحث بالـ ID أو الفهارس العمياء (الهاتف / البريد) لضمان السرعة والتوافق مع التشفير المتغير + global $blindIndex; + $phoneBidx = $blindIndex ? $blindIndex->index('adminUser.phone', $phone) : null; + $emailBidx = $blindIndex ? $blindIndex->index('adminUser.email', $phone) : null; + + $sql = "SELECT * FROM adminUser WHERE id = :id"; + $params = [':id' => $phone]; + + if ($phoneBidx) { + $sql .= " OR phone_bidx = :phone_bidx"; + $params[':phone_bidx'] = $phoneBidx; + } + if ($emailBidx) { + $sql .= " OR email_bidx = :email_bidx"; + $params[':email_bidx'] = $emailBidx; + } + $sql .= " LIMIT 1"; + + $stmtId = $con->prepare($sql); + $stmtId->execute($params); $admin = $stmtId->fetch(PDO::FETCH_ASSOC); // 2. إذا لم يتم العثور بالـ ID، نفحص الحقول المشفّرة (email / phone / name) عبر فك التشفير diff --git a/backend/schema_primary.sql b/backend/schema_primary.sql index 2ad5cf21..25c3d53b 100644 --- a/backend/schema_primary.sql +++ b/backend/schema_primary.sql @@ -58,14 +58,18 @@ CREATE TABLE `adminUser` ( `fingerprint_hash` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'sha256 للبصمة للبحث السريع', `name` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'الاسم مشفر (AES-GCM)', `phone` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'الهاتف مشفر (AES-GCM)', + `phone_bidx` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Blind index for phone', `email` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'البريد مشفر (AES-GCM)', + `email_bidx` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Blind index for email', `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'bcrypt', `role` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'admin' COMMENT 'admin | super_admin | service', `country` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Jordan' COMMENT 'اسم الدولة: Syria, Egypt, Jordan, Iraq, ...', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), - KEY `idx_fp_hash` (`fingerprint_hash`) + KEY `idx_fp_hash` (`fingerprint_hash`), + KEY `idx_phone_bidx` (`phone_bidx`), + KEY `idx_email_bidx` (`email_bidx`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -386,7 +390,9 @@ CREATE TABLE `driver` ( `idn` int NOT NULL AUTO_INCREMENT, `id` varchar(100) NOT NULL, `phone` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `phone_bidx` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT 'Blind index for phone', `email` varchar(255) NOT NULL, + `email_bidx` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT 'Blind index for email', `password` varchar(255) NOT NULL, `gender` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Male', `license_type` varchar(255) DEFAULT NULL, @@ -414,7 +420,9 @@ CREATE TABLE `driver` ( `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`idn`), - UNIQUE KEY `national_number` (`national_number`) + UNIQUE KEY `national_number` (`national_number`), + KEY `idx_phone_bidx` (`phone_bidx`), + KEY `idx_email_bidx` (`email_bidx`) ) ENGINE=InnoDB AUTO_INCREMENT=2085 DEFAULT CHARSET=utf8mb3; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1188,7 +1196,9 @@ DROP TABLE IF EXISTS `passengers`; CREATE TABLE `passengers` ( `id` varchar(100) NOT NULL, `phone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `phone_bidx` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT 'Blind index for phone', `email` varchar(255) NOT NULL, + `email_bidx` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT 'Blind index for email', `password` varchar(100) NOT NULL, `gender` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `status` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'notDeleted', @@ -1203,7 +1213,9 @@ CREATE TABLE `passengers` ( `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), - UNIQUE KEY `phone` (`phone`,`email`) + UNIQUE KEY `phone` (`phone`,`email`), + KEY `idx_phone_bidx` (`phone_bidx`), + KEY `idx_email_bidx` (`email_bidx`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; /*!40101 SET character_set_client = @saved_cs_client */;