Files
Siro/country_multi_simulation_report.md
2026-06-12 22:40:40 +03:00

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

التوصيات

  1. إضافة auto-detect للأردن في auth/otp/request.php:

    } elseif (strpos($cleanReceiver, '962') === 0) {
        $country = 'Jordan';
    }
    
  2. تفعيل Multi-Server Signup للسائقين والركاب المسافرين بين الدول

  3. توحيد طريقة OTP — الأردن قد يستفيد من SMS أيضاً إذا تم توفيره

الخلاصة

النظام يعمل بكفاءة عالية لجميع الدول الثلاث. التوجيه الجغرافي ممتاز، كل دولة لها بنية تحتية منفصلة. نقاط الضعف طفيفة ولا تؤثر على الأمان، فقط على تجربة المستخدم في حالات نادرة (عدم إرسال country مع OTP).