<div dir="rtl" lang="ar">

# محاكاة النظام لثلاث دول — الأردن، مصر، سوريا

## تحليل شامل لتدفق المستخدمين بين الدول

---

## 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<Future> 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).

</div>