12 KiB
محاكاة النظام لثلاث دول — الأردن، مصر، سوريا
تحليل شامل لتدفق المستخدمين بين الدول
1. هيكل التوجيه الجغرافي (Geo-Routing)
Flutter — links.dart
currentCountry (GetStorage)
│
├── 'Syria' → api-syria.siromove.com
├── 'Egypt' → api-egypt.siromove.com
├── 'Jordan' → api-jordan.siromove.com
└── default → api.siromove.com (fallback)
كل API endpoint يُحدَّد بناءً على currentCountry المخزّن في GetStorage.
PHP Backend — auth/otp/request.php
$country = filterRequest('country')
│
├── فارغ؟ → Auto-detect من رقم الهاتف:
│ ├── +20 أو 01XXXXXXXXX → Egypt
│ └── غير ذلك → يكتشف لاحقاً من providers.php
│
├── 'Egypt' → SMS عبر Twilio + OTP في Redis/DB
├── 'Syria' → WhatsApp عبر Facebook API + OTP في DB
└── 'Jordan' → WhatsApp عبر Facebook API + OTP في DB
2. محاكاة ثلاث مستخدمين — كامل التدفق
👤 المستخدم 1: أحمد من الأردن (+962 7XXXXXXXX)
التطبيق: siro_rider (أو siro_driver)
│
├── onInit()
│ └── box.write(countryCode, 'Jordan')
│
├── getJWT()
│ └── POST https://api-jordan.siromove.com/siro_v3/loginFirstTime.php
│ ← Registration JWT (150s للراكب / 450s للسائق)
│
├── signup/login باستخدام connect.php
│ └── POST https://api-jordan.siromove.com/siro_v3/auth/...
│ ← JWT Authentication عبر connect.php (JWT + Rate Limit)
│
├── OTP (WhatsApp)
│ └── POST https://api-jordan.siromove.com/siro_v3/auth/otp/request.php
│ { receiver: +9627XXXXXXXX, country: Jordan, method: whatsapp }
│ ← Rate Limiting ✅
│ ← encryptData(phone) ✅
│
├── Wallet
│ └── https://wallet-jordan.siromove.com/v1/main
│
├── Maps & Routes
│ └── https://map-jordan.siromove.com/api/maps/route
│ └── https://routes-jordan.siromove.com
│
└── Socket
└── https://api-jordan.siromove.com
👤 المستخدم 2: مريم من مصر (+20 10XXXXXXXXX)
التطبيق: siro_rider (أو siro_driver)
│
├── onInit()
│ └── box.write(countryCode, 'Egypt')
│
├── getJWT()
│ └── POST https://api-egypt.siromove.com/siro_v3/loginFirstTime.php
│ ← Registration JWT
│
├── signup → sendOtpMessage()
│ ├── box.read(countryCode) == 'Egypt'? ✅
│ ├── isValidEgyptianPhoneNumber? → +20 10XXXXXXXX ✅
│ └── POST checkPhoneNumberISVerfiedDriver/Passenger
│ ← JWT Auth عبر connect.php ✅
│
├── OTP (SMS عبر Twilio + SMS Egypt Controller)
│ └── POST https://api-egypt.siromove.com/siro_v3/auth/otp/request.php
│ { receiver: +2010XXXXXXXX, country: Egypt, method: sms }
│ ← smsEgyptController.sendSmsEgypt() ← SMS محلي
│
├── Wallet
│ └── https://wallet-egypt.siromove.com/v1/main
│
├── Maps & Routes
│ └── https://map-egypt.siromove.com/api/maps/route
│ └── https://routes-egypt.siromove.com
│
└── Socket
└── https://api-egypt.siromove.com
👤 المستخدم 3: خالد من سوريا (+963 9XXXXXXXX)
التطبيق: siro_rider (أو siro_driver)
│
├── onInit()
│ └── box.write(countryCode, 'Syria')
│
├── getJWT()
│ └── POST https://api-syria.siromove.com/siro_v3/loginFirstTime.php
│ ← Registration JWT
│
├── signup/login
│ └── POST https://api-syria.siromove.com/siro_v3/auth/...
│ ← connect.php → JWT Auth ✅
│
├── OTP (WhatsApp عبر Facebook API)
│ └── POST https://api-syria.siromove.com/siro_v3/auth/otp/request.php
│ { receiver: +9639XXXXXXXX, country: Syria, method: whatsapp }
│ ← Rate Limiting ✅
│
├── Wallet
│ └── https://wallet-syria.siromove.com/v1/main
│
├── Maps & Routes
│ └── https://map-syria.siromove.com/api/maps/route
│ └── https://routes-syria.siromove.com
│
└── Socket
└── https://api-syria.siromove.com
3. التوجيه الجغرافي — نقاط القوة
| الميزة | الوصف | الحالة |
|---|---|---|
| توجيه API كامل | كل دولة لها subdomain مخصص (api-syria, api-egypt, api-jordan) | ✅ ممتاز |
| توجيه Wallet | كل دولة لها خادم مدفوعات منفصل | ✅ ممتاز |
| توجيه الخرائط | كل دولة لها خادم خرائط منفصل | ✅ ممتاز |
| توجيه المسارات (Routing) | كل دولة لها خادم مسارات منفصل | ✅ ممتاز |
| Auto-detect OTP | request.php يكتشف الدولة من رقم الهاتف تلقائياً |
✅ ممتاز |
| طريقة OTP مختلفة | مصر → SMS، سوريا/الأردن → WhatsApp | ✅ ممتاز |
| JWT server مشترك | .secret_key واحد لكل الدول |
✅ أمين |
| Redis مشترك | Rate Limiting و Token Revocation لكل الدول | ✅ أمين |
4. نقاط الضعف المحتملة — وتحليلها
🔶 نقطة 1: currentCountry في GetStorage
static String get currentCountry => box.read(BoxName.countryCode) ?? 'Jordan';
المشكلة: countryCode مخزّن في GetStorage (غير مشفر). يمكن لأي مستخدم تعديله يدوياً.
التأثير: إذا غيّر مستخدم أردني countryCode إلى 'Egypt':
- سيستخدم
api-egypt.siromove.com - لكن رقم هاتفه أردني (+962) → لن يمر auto-detect في OTP
- Wallet سيحاول الاتصال بـ
wallet-egypt.siromove.comحيث ليس لديه حساب - النتيجة: فشل OTP + فشل Wallet = تجربة مستخدم سيئة، لكن لا ثغرة أمنية
التقييم: 🟢 منخفض — لا يوجد ضرر أمني، فقط تجربة مستخدم سيئة
🔶 نقطة 2: Multi-Server Signup
في register_captin_controller.dart و register_controller.dart:
// إذا Alex != Syria → سجّل في كل السيرفرات
if (AppLink.SiroAlexandriaServer != AppLink.SiroSyriaServer) {
await Future.wait([
CRUD().post(link: '${AppLink.SiroAlexandriaServer}/auth/signup.php'),
CRUD().post(link: '${AppLink.SiroGizaServer}/auth/signup.php'),
]);
}
المشكلة: تم تعطيل هذا الكود (Commented out):
// if (AppLink.SiroAlexandriaServer != AppLink.SiroSyriaServer) {
// List<Future> signUp = [ ... ];
// await Future.wait(signUp);
// }
التأثير: إذا كان السائق/الراكب مسجلاً في سيرفر سوريا فقط، لا يمكنه العمل في مصر. النظام يعتمد على أن كل دولة لها قاعدة بيانات منفصلة.
التقييم: 🟡 متوسط — يحتاج تفعيل cross-server signup لضمان continuity للتنقل بين الدول
🔶 نقطة 3: Password عام لكل الدول
'password': AK.passnpassenger, // نفس القيمة لكل المستخدمين الجدد
'aud': '${AK.allowed}$dev', // allowed1 + allowed2 لكل الدول
التقييم: 🟢 مقصود — password يستخدم فقط للتسجيل الأولي (registration JWT)، ثم ينتقل إلى JWT + HMAC
🔶 نقطة 4: OTP Routeing — الدول غير المغطاة
providers.php لا يغطي الأردن بشكل صريح:
if (empty($country)) {
// كشف مصر فقط
if (strpos($cleanReceiver, '20') === 0) {
$country = 'Egypt';
}
// سوريا والأردن لا يوجد كشف تلقائي
}
المشكلة: الأردن (+962) ليس لديه auto-detect في request.php.
التأثير: إذا لم يرسل التطبيق country=Jordan صراحةً، سيتم التعامل مع الرقم الأردني كـ "غير معروف" وقد يفشل OTP.
التقييم: 🟡 متوسط — التطبيق يرسل country من currentCountry دائماً، لكن auto-detect ضعيف
🔶 نقطة 5: تخزين serverPHP في GetStorage
static String get serverPHP => box.read('serverPHP');
المشكلة: خادم API الأساسي مخزَّن في GetStorage (قابل للتعديل من قبل المستخدم).
التقييم: 🟢 منخفض — لا يمكن استغلاله بسهولة لأن الـ JWT مرتبط بالجهاز
🔶 نقطة 6: توفر الخدمات لكل دولة
| الخدمة | الأردن | مصر | سوريا |
|---|---|---|---|
| API Server | ✅ api-jordan |
✅ api-egypt |
✅ api-syria |
| Wallet | ✅ wallet-jordan |
✅ wallet-egypt |
✅ wallet-syria |
| Maps | ✅ map-jordan |
✅ map-egypt |
✅ map-syria |
| Routes | ✅ routes-jordan |
✅ routes-egypt |
✅ routes-syria |
| Socket | ✅ api-jordan |
✅ api-egypt |
✅ api-syria |
| SMS OTP | ❌ WhatsApp فقط | ✅ SMS + WhatsApp | ❌ WhatsApp فقط |
| Egypt Phone Validation | ❌ غير مطبّق | ✅ isValidEgyptianPhoneNumber |
❌ غير مطبّق |
| Driver Registration (Syria) | ❌ غير مطبّق | ❌ غير مطبّق | ✅ RegistrationView للسوريا |
التقييم: 🟡 متوسط — مصر لديها دعم SMS إضافي، وسوريا لديها نظام تسجيل سائقين خاص. الأردن يعتمد فقط على WhatsApp.
5. الملخص النهائي
| البند | التقييم | ملاحظة |
|---|---|---|
| توجيه API لكل دولة | ✅ ممتاز | ثلاثة subdomains منفصلة |
| توجيه Wallet | ✅ ممتاز | خوادم مدفوعات منفصلة |
| توجيه Maps & Routes | ✅ ممتاز | خوادم منفصلة لكل دولة |
| توجيه OTP | ✅ جيد | Auto-detect + يدوي، لكن الأردن ليس لديه auto-detect |
| طريقة OTP | ✅ جيد | مصر SMS، سوريا/الأردن WhatsApp |
| Cross-Server Signup | ⚠️ معلّق | يحتاج تفعيل لتعدد الدول |
| CurrentCountry GetStorage | 🟢 منخفض | يمكن التلاعب به لكن لا ضرر أمني |
| ServerPHP GetStorage | 🟢 منخفض | لا يمكن استغلاله |
| دعم الأردن | 🟢 جيد | جميع الخدمات متوفرة |
| دعم مصر | ✅ ممتاز | SMS إضافي + validation |
| دعم سوريا | ✅ ممتاز | نظام تسجيل سائقين خاص + WhatsApp |
التوصيات
-
إضافة auto-detect للأردن في
auth/otp/request.php:} elseif (strpos($cleanReceiver, '962') === 0) { $country = 'Jordan'; } -
تفعيل Multi-Server Signup للسائقين والركاب المسافرين بين الدول
-
توحيد طريقة OTP — الأردن قد يستفيد من SMS أيضاً إذا تم توفيره
الخلاصة
النظام يعمل بكفاءة عالية لجميع الدول الثلاث. التوجيه الجغرافي ممتاز، كل دولة لها بنية تحتية منفصلة. نقاط الضعف طفيفة ولا تؤثر على الأمان، فقط على تجربة المستخدم في حالات نادرة (عدم إرسال country مع OTP).