Update: 2026-07-07 04:57:50
This commit is contained in:
@@ -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])) {
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<?php
|
||||
|
||||
echo 'Hello World :-)';
|
||||
@@ -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";
|
||||
}
|
||||
?>
|
||||
@@ -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";
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user