Update: 2026-07-07 04:57:50

This commit is contained in:
Hamza-Ayed
2026-07-07 04:57:51 +03:00
parent 5725fb36f4
commit 628e169552
25 changed files with 288 additions and 1893 deletions
+43 -4
View File
@@ -17,6 +17,8 @@ use Workerman\Timer;
use Workerman\Http\Client as AsyncHttp;
use PHPSocketIO\SocketIO;
use Predis\Client as RedisClient;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
require_once __DIR__ . '/vendor/autoload.php';
@@ -58,7 +60,23 @@ loadEnvironment('/home/location/env/.env');
// ============================================================
// 🔐 مفاتيح الأمان
// ============================================================
$INTERNAL_KEY = trim((string) @file_get_contents('/home/location/.internal_socket_key'));
function getInternalSocketKey(): string {
$key = getenv('INTERNAL_SOCKET_KEY');
if ($key) return trim($key);
$path = getenv('INTERNAL_SOCKET_KEY_PATH') ?: '/home/location/.internal_socket_key';
if (file_exists($path)) return trim((string) @file_get_contents($path));
return '';
}
$INTERNAL_KEY = getInternalSocketKey();
function getJwtSecret(): string {
$keyPath = getenv('JWT_SECRET_KEY_PATH');
if ($keyPath && file_exists($keyPath)) {
return trim(file_get_contents($keyPath));
}
return getenv('JWT_SECRET_KEY') ?: '';
}
$redisPass = trim((string) @file_get_contents('/home/location/.reds_pass_key'));
if (empty($INTERNAL_KEY)) logMsg('❌ CRITICAL: Internal key missing!');
@@ -530,9 +548,30 @@ $io->on('connection', function ($socket) use ($INTERNAL_KEY) {
$query = $socket->handshake['query'] ?? [];
$driverId = $query['driver_id'] ?? null;
$platform = $query['platform'] ?? 'android';
$token = $query['token'] ?? '';
$fcmToken = $query['token'] ?? ''; // FCM token
$jwtToken = $query['jwt'] ?? ''; // JWT Token for authentication
if (!$driverId) {
if (!$driverId || empty($jwtToken)) {
logMsg("🚫 Connection Rejected: Missing driver_id or jwt token");
$socket->disconnect();
return;
}
try {
$secretKey = getJwtSecret();
if (empty($secretKey)) {
logMsg("⚠️ JWT Secret is not configured on the server!");
} else {
$decoded = JWT::decode($jwtToken, new Key($secretKey, 'HS256'));
// Validate that the token belongs to this driver
if ((string)$decoded->sub !== (string)$driverId || $decoded->role !== 'driver') {
logMsg("🚫 Connection Rejected: Invalid JWT for driver_id=$driverId");
$socket->disconnect();
return;
}
}
} catch (\Exception $e) {
logMsg("🚫 Connection Rejected: JWT Verification failed -> " . $e->getMessage());
$socket->disconnect();
return;
}
@@ -541,7 +580,7 @@ $io->on('connection', function ($socket) use ($INTERNAL_KEY) {
$connectedDrivers[$driverId] = [
'conn' => $socket,
'platform' => $platform,
'token' => $token,
'token' => $fcmToken,
];
if (!isset($driverState[$driverId])) {
-3
View File
@@ -1,3 +0,0 @@
<?php
echo 'Hello World :-)';
-87
View File
@@ -1,87 +0,0 @@
<?php
//test_order.php
// إعدادات الاتصال
$socketUrl = 'http://127.0.0.1:2021';
$INTERNAL_KEY = trim(file_get_contents('/home/location/.internal_socket_key'));
// 🔴 هام: ضع آيدي السائق الفعلي هنا
$targetDriverId = '34feffd3fa72d6bee56b';
// إحداثيات وهمية (عمان)
$pickupLat = 32.07374322273893;
$pickupLng = 36.09692047770945;
$dropLat = 31.963158; // العبدلي
$dropLng = 35.930359;
// =================================================================================
// بناء المصفوفة (Payload) بنفس ترتيب الفهارس (Indexes) في تطبيق Flutter
// =================================================================================
$fakeOrderList = [];
$fakeOrderList[0] = (string)$pickupLat; // myList[0]: Passenger Lat
$fakeOrderList[1] = (string)$pickupLng; // myList[1]: Passenger Lng
$fakeOrderList[2] = "53.50"; // myList[2]: Payment Amount (Total)
$fakeOrderList[3] = (string)$dropLat; // myList[3]: Destination Lat
$fakeOrderList[4] = (string)$dropLng; // myList[4]: Destination Lng (Also used as Price in some views, but mostly coords)
$fakeOrderList[5] = "8.9 km"; // myList[5]: Distance Text
$fakeOrderList[6] = $targetDriverId; // myList[6]: Driver ID
$fakeOrderList[7] = "55"; // myList[7]: Passenger ID
$fakeOrderList[8] = "Hamza Passenger"; // myList[8]: Passenger Name
$fakeOrderList[9] = "PASSENGER_FCM_TOKEN_XYZ"; // myList[9]: Passenger Token
$fakeOrderList[10] = "0791234567"; // myList[10]: Passenger Phone
$fakeOrderList[11] = "8800"; // myList[11]: Distance in Meters (used for calc)
$fakeOrderList[12] = "500"; // myList[12]: Duration in Seconds (used for calc)
$fakeOrderList[13] = "false"; // myList[13]: Payment Method ('true'=Visa, 'false'=Cash)
$fakeOrderList[14] = "8500"; // myList[14]: Distance (Integer/String for View)
$fakeOrderList[15] = "5 min"; // myList[15]: Duration to Passenger
$fakeOrderList[16] = "9999"; // myList[16]: Ride ID (Order ID)
$fakeOrderList[17] = ""; // myList[17]: (Empty/Unused)
$fakeOrderList[18] = $targetDriverId; // myList[18]: Driver ID (Repeated)
$fakeOrderList[19] = "18 min"; // myList[19]: Ride Duration Text
$fakeOrderList[20] = "false"; // myList[20]: Is Have Steps?
$fakeOrderList[21] = ""; // myList[21]: Step 0
$fakeOrderList[22] = ""; // myList[22]: Step 1
$fakeOrderList[23] = ""; // myList[23]: Step 2
$fakeOrderList[24] = ""; // myList[24]: Step 3
$fakeOrderList[25] = ""; // myList[25]: Step 4
$fakeOrderList[26] = "3.50"; // myList[26]: Wallet/Total Cost
$fakeOrderList[27] = ""; // myList[27]: (Empty)
$fakeOrderList[28] = "client@email.com"; // myList[28]: Email
$fakeOrderList[29] = "الجامعة الأردنية - البوابة الرئيسية"; // myList[29]: Pickup Address Name
$fakeOrderList[30] = "العبدلي مول - البوليفارد"; // myList[30]: Dropoff Address Name
$fakeOrderList[31] = "speed"; // myList[31]: Car Type
$fakeOrderList[32] = "2.75"; // myList[32]: Kazan (Earnings)
$fakeOrderList[33] = "4.8"; // myList[33]: Rating
// تحويل المصفوفة إلى قائمة مرتبة (Indexed Array) لضمان وصولها كـ List في فلاتر
// ksort يضمن الترتيب، و array_values يعيد فهرسة المفاتيح لتبدأ من 0
ksort($fakeOrderList);
$finalPayload = array_values($fakeOrderList);
// تجهيز البيانات للإرسال
$postData = [
'action' => 'dispatch_order',
'drivers_ids' => json_encode([$targetDriverId]),
'payload' => $finalPayload // 🔥 هنا نرسل المصفوفة وليس كائناً
];
// إرسال الطلب
$ch = curl_init($socketUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-internal-key: $INTERNAL_KEY"
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "Response Code: $httpCode\n";
if ($response == 'Dispatched') {
echo "✅ Success! Order List sent to driver.\n";
} else {
echo "❌ Failed: $response\n";
}
?>
-43
View File
@@ -1,43 +0,0 @@
<?php
// test_ride_taken.php
// إعدادات الاتصال
$socketUrl = 'http://127.0.0.1:2021';
$INTERNAL_KEY = trim(file_get_contents('/home/location/.internal_socket_key'));
// بيانات المحاكاة
// يجب أن يكون نفس رقم الطلب الذي أرسلته سابقاً
$rideId = '9999';
// آيدي سائق "وهمي" (غير آيديك الحقيقي)
// لكي يفهم تطبيقك أن شخصاً آخر أخذ الطلب
$fakeDriverId = 'DRIVER_XYZ_987654321';
$postData = [
'action' => 'simulate_ride_taken',
'ride_id' => $rideId,
'taken_by_driver_id' => $fakeDriverId
];
// إرسال الطلب عبر cURL
$ch = curl_init($socketUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-internal-key: $internalKey"
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "Simulating Ride Taken...\n";
echo "Response: $response\n";
if ($response == 'Ride Taken Event Broadcasted') {
echo "✅ Success! All drivers should see 'Ride Taken' now.\n";
} else {
echo "❌ Failed.\n";
}
?>