291 lines
12 KiB
Markdown
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> |