# محاكاة النظام لثلاث دول — الأردن، مصر، سوريا ## تحليل شامل لتدفق المستخدمين بين الدول --- ## 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 ```dart 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`: ```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): ```dart // if (AppLink.SiroAlexandriaServer != AppLink.SiroSyriaServer) { // List signUp = [ ... ]; // await Future.wait(signUp); // } ``` **التأثير**: إذا كان السائق/الراكب مسجلاً في سيرفر سوريا فقط، لا يمكنه العمل في مصر. النظام يعتمد على أن كل دولة لها قاعدة بيانات منفصلة. **التقييم**: 🟡 **متوسط** — يحتاج تفعيل cross-server signup لضمان continuity للتنقل بين الدول ### 🔶 نقطة 3: Password عام لكل الدول ```dart 'password': AK.passnpassenger, // نفس القيمة لكل المستخدمين الجدد 'aud': '${AK.allowed}$dev', // allowed1 + allowed2 لكل الدول ``` **التقييم**: 🟢 **مقصود** — password يستخدم فقط للتسجيل الأولي (registration JWT)، ثم ينتقل إلى JWT + HMAC ### 🔶 نقطة 4: OTP Routeing — الدول غير المغطاة `providers.php` لا يغطي الأردن بشكل صريح: ```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 ```dart 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 | ### التوصيات 1. **إضافة auto-detect للأردن** في `auth/otp/request.php`: ```php } elseif (strpos($cleanReceiver, '962') === 0) { $country = 'Jordan'; } ``` 2. **تفعيل Multi-Server Signup** للسائقين والركاب المسافرين بين الدول 3. **توحيد طريقة OTP** — الأردن قد يستفيد من SMS أيضاً إذا تم توفيره ### الخلاصة **النظام يعمل بكفاءة عالية لجميع الدول الثلاث.** التوجيه الجغرافي ممتاز، كل دولة لها بنية تحتية منفصلة. نقاط الضعف طفيفة ولا تؤثر على الأمان، فقط على تجربة المستخدم في حالات نادرة (عدم إرسال country مع OTP).