encryptData($phone); $conditions[] = "driver.phone = :phone"; $params[':phone'] = $phoneEnc; $phoneBidx = $blindIndex ? $blindIndex->index('driver.phone', $phone) : null; if ($phoneBidx) { $conditions[] = "driver.phone_bidx = :phone_bidx"; $params[':phone_bidx'] = $phoneBidx; } } if (!empty($email)) { $emailEnc = $encryptionHelper->encryptData($email); $conditions[] = "driver.email = :email"; $params[':email'] = $emailEnc; $emailBidx = $blindIndex ? $blindIndex->index('driver.email', $email) : null; if ($emailBidx) { $conditions[] = "driver.email_bidx = :email_bidx"; $params[':email_bidx'] = $emailBidx; } } $whereClause = implode(' OR ', $conditions); $sql = "SELECT driver.id, driver.phone, driver.email, driver.password, driver.gender, driver.birthdate, driver.site, driver.first_name, driver.last_name, driver.education, driver.employmentType, driver.maritalStatus, driver.created_at, driver.updated_at, driver.email AS _email_enc FROM driver WHERE $whereClause"; /** * حالة توثيق البريد. * * كان الاستعلام يربط email_verifications.email بعمود البريد في الحساب، لكن * الأول يُخزَّن نصاً صريحاً والثاني مشفّراً — فالربط لم يكن يطابق شيئاً أصلاً * وكانت verified تعود NULL دائماً. نجلبها هنا بالبريد الأصلي. */ function fetchEmailVerified(PDO $con, ?string $plainEmail): ?int { if (!$plainEmail) return null; try { $st = $con->prepare("SELECT verified FROM email_verifications WHERE email = ? LIMIT 1"); $st->execute([$plainEmail]); $v = $st->fetchColumn(); return $v === false ? null : (int) $v; } catch (PDOException $e) { error_log('[email_verifications] ' . $e->getMessage()); return null; } } $stmt = $con->prepare($sql); $stmt->execute($params); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); $count = count($data); if ($count > 0) { $plainEmail = $encryptionHelper->decryptData($data[0]['_email_enc'] ?? null) ?: null; $data[0]['verified'] = fetchEmailVerified($con, $plainEmail); unset($data[0]['_email_enc']); } if ($count > 0) { $stored_password = $data[0]['password']; if (password_verify($password, $stored_password)) { // فك التشفير للحقول الحساسة $data[0]['phone'] = $encryptionHelper->decryptData($data[0]['phone']); $data[0]['email'] = $encryptionHelper->decryptData($data[0]['email']); $data[0]['gender'] = $encryptionHelper->decryptData($data[0]['gender']); $data[0]['birthdate'] = $encryptionHelper->decryptData($data[0]['birthdate']); $data[0]['site'] = $encryptionHelper->decryptData($data[0]['site']); $data[0]['first_name'] = $encryptionHelper->decryptData($data[0]['first_name']); $data[0]['last_name'] = $encryptionHelper->decryptData($data[0]['last_name']); $data[0]['education'] = $encryptionHelper->decryptData($data[0]['education']); $data[0]['employmentType'] = $encryptionHelper->decryptData($data[0]['employmentType']); $data[0]['maritalStatus'] = $encryptionHelper->decryptData($data[0]['maritalStatus']); unset($data[0]['password']); // لا نرجّع الباسورد jsonSuccess($data); } else { jsonError("Incorrect password."); } } else { jsonError("User does not exist."); } ?>