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

291 lines
12 KiB
Markdown

<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>