Update: 2026-08-03 12:30:24

This commit is contained in:
Hamza-Ayed
2026-08-03 12:30:25 +03:00
parent ec467b01c6
commit f36b30f0b8
14 changed files with 66 additions and 32 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
<?php <?php
require_once __DIR__ . '/../../../connect.php'; require_once __DIR__ . '/../../connect.php';
// 🔥 [Fix Broken Access Control] كان يتحقق من صلاحية التوكن فقط — أي مستخدم // 🔥 [Fix Broken Access Control] كان يتحقق من صلاحية التوكن فقط — أي مستخدم
// مسجّل دخول (راكب/سائق آخر) كان يقدر يجلب بيانات أي سائق مفكوكة التشفير // مسجّل دخول (راكب/سائق آخر) كان يقدر يجلب بيانات أي سائق مفكوكة التشفير
+1 -1
View File
@@ -1,5 +1,5 @@
<?php <?php
require_once __DIR__ . '/../../../connect.php'; require_once __DIR__ . '/../../connect.php';
$phoneNumber = filterRequest("phone_number"); $phoneNumber = filterRequest("phone_number");
+1 -1
View File
@@ -7,7 +7,7 @@
*/ */
//register_driver_and_car.php //register_driver_and_car.php
$allowRegistration = true; $allowRegistration = true;
require_once __DIR__ . '/../../../connect.php'; require_once __DIR__ . '/../../connect.php';
header('Content-Type: application/json; charset=utf-8'); header('Content-Type: application/json; charset=utf-8');
// Rate Limiting: الحماية من التسجيل العشوائي وهجمات الـ Bots // Rate Limiting: الحماية من التسجيل العشوائي وهجمات الـ Bots
+1 -1
View File
@@ -1,6 +1,6 @@
<?php <?php
// File: send_otp.php (بديل عن النسخة المعتمدة على RaseelPlus) // File: send_otp.php (بديل عن النسخة المعتمدة على RaseelPlus)
require_once __DIR__ . '/../../connect.php'; require_once __DIR__ . '/../../../connect.php';
/* 1) توليد رمز التحقق (3 خانات) */ /* 1) توليد رمز التحقق (3 خانات) */
$otp = (string)random_int(100, 999); $otp = (string)random_int(100, 999);
+1 -1
View File
@@ -1,7 +1,7 @@
<?php <?php
// File: verify_otp.php (with enhanced logging) // File: verify_otp.php (with enhanced logging)
// siro_v1/auth/token_passenger // siro_v1/auth/token_passenger
require_once __DIR__ . '/../../connect.php'; require_once __DIR__ . '/../../../connect.php';
// --- Start of Script Execution --- // --- Start of Script Execution ---
error_log("--- [verify_otp.php] Script execution started. ---"); error_log("--- [verify_otp.php] Script execution started. ---");
+7 -1
View File
@@ -1,4 +1,9 @@
<?php <?php
// ‏نفس الاسم معرّف أيضاً في core/helpers.php بتوقيع مختلف. أي ملف يُحمِّل
// ‏bootstrap.php (ومنه helpers.php) ثم يصل إلى هنا كان ينهار بـ
// ‏"Cannot redeclare loadEnvironment()" — وهو ما أسقط blacklist_manager.php.
// ‏الحارس يُبقي أول تعريف محمَّل ويتجاهل الثاني، والسلوك متوافق بينهما.
if (!function_exists('loadEnvironment')) {
function loadEnvironment($env_file) { function loadEnvironment($env_file) {
if (!file_exists($env_file)) { if (!file_exists($env_file)) {
error_log("❌ .env not found: $env_file"); error_log("❌ .env not found: $env_file");
@@ -19,4 +24,5 @@ function loadEnvironment($env_file) {
} }
return true; return true;
} }
}
+1 -1
View File
@@ -1,5 +1,5 @@
<?php <?php
require_once __DIR__ . '/../connect.php'; require_once __DIR__ . '/../../connect.php';
// If Main Redis is not available, return empty array // If Main Redis is not available, return empty array
if (!isset($redis) || $redis === null) { if (!isset($redis) || $redis === null) {
+1 -1
View File
@@ -1,5 +1,5 @@
<?php <?php
require_once __DIR__ . '/../connect.php'; require_once __DIR__ . '/../../connect.php';
$lat = filterRequest("lat"); $lat = filterRequest("lat");
$lng = filterRequest("lng"); $lng = filterRequest("lng");
+1 -1
View File
@@ -37,6 +37,6 @@ _flutter.buildConfig = {"engineRevision":"6c0baaebf70e0148f485f27d5616b3d3382da7
_flutter.loader.load({ _flutter.loader.load({
serviceWorkerSettings: { serviceWorkerSettings: {
serviceWorkerVersion: "4103993464" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */ serviceWorkerVersion: "2712676207" /* Flutter's service worker is deprecated and will be removed in a future Flutter release. */
} }
}); });
+1 -1
View File
@@ -12,7 +12,7 @@
# docker-compose.yml — لا يوجد فيها ports:). أي أن Redis يُرى فقط # docker-compose.yml — لا يوجد فيها ports:). أي أن Redis يُرى فقط
# من داخل شبكة دوكر. كل سكربت على المضيف يحصل على $redis = null. # من داخل شبكة دوكر. كل سكربت على المضيف يحصل على $redis = null.
# #
# • MySQL منشور على 127.0.0.1:33061 وليس 3306، فأي .env على المضيف # • MySQL منشور على 127.0.0.1:33062 وليس 3306، فأي .env على المضيف
# ما زال يشير إلى 3306 يفشل في الاتصال. # ما زال يشير إلى 3306 يفشل في الاتصال.
# #
# • bootstrap.php يستنتج مسار .env من __DIR__ عبر المطابقة مع # • bootstrap.php يستنتج مسار .env من __DIR__ عبر المطابقة مع
+14 -1
View File
@@ -63,6 +63,9 @@ services:
volumes: volumes:
- ../backend/core:/var/www/backend/core:ro - ../backend/core:/var/www/backend/core:ro
- ../backend/functions.php:/var/www/backend/functions.php:ro - ../backend/functions.php:/var/www/backend/functions.php:ro
# ‏نفس سبب php_food: JwtService يحتاج Firebase\JWT من backend/vendor،
# ‏والصورة بلا composer. للقراءة فقط.
- ../backend/vendor:/var/www/backend/vendor:ro
- ../backend/transit:/var/www/backend/transit - ../backend/transit:/var/www/backend/transit
- ./php/opcache.ini:/usr/local/etc/php/conf.d/zz-opcache.ini:ro - ./php/opcache.ini:/usr/local/etc/php/conf.d/zz-opcache.ini:ro
- ./php/www-pool.transit.conf:/usr/local/etc/php-fpm.d/zz-pool.conf:ro - ./php/www-pool.transit.conf:/usr/local/etc/php-fpm.d/zz-pool.conf:ro
@@ -85,6 +88,11 @@ services:
volumes: volumes:
- ../backend/core:/var/www/backend/core:ro - ../backend/core:/var/www/backend/core:ro
- ../backend/functions.php:/var/www/backend/functions.php:ro - ../backend/functions.php:/var/www/backend/functions.php:ro
# ‏core/bootstrap.php يحمّل backend/vendor/autoload.php، و JwtService
# ‏يحتاج Firebase\JWT. الصورة هنا بلا composer عمداً، ودون هذا التركيب
# ‏كانت كل نقطة طعام تسقط بـ Class "Firebase\JWT\JWT" not found.
# ‏للقراءة فقط: مكتبات مشتركة لا كود مشترك — العزل باقٍ.
- ../backend/vendor:/var/www/backend/vendor:ro
- ../backend/food:/var/www/backend/food - ../backend/food:/var/www/backend/food
- ./php/opcache.ini:/usr/local/etc/php/conf.d/zz-opcache.ini:ro - ./php/opcache.ini:/usr/local/etc/php/conf.d/zz-opcache.ini:ro
- ./php/food-pool.conf:/usr/local/etc/php-fpm.d/zz-pool.conf:ro - ./php/food-pool.conf:/usr/local/etc/php-fpm.d/zz-pool.conf:ro
@@ -185,7 +193,12 @@ services:
- --long-query-time=0.2 - --long-query-time=0.2
- --slow-query-log-file=/var/lib/mysql/slow.log - --slow-query-log-file=/var/lib/mysql/slow.log
ports: ports:
- "127.0.0.1:33061:3306" # للإدارة من السيرفر نفسه فقط — ليس للعامة # ‏للإدارة من السيرفر نفسه فقط — ليس للعامة.
# ‏33061 يحتجزه مشروع آخر على السيرفر نفسه (intaleq-mysql-1)، و33063
# ‏يحتجزه tripz-core-mysql-1. كان المنفذ هنا 33061 بينما الحاوية تعمل
# ‏فعلياً على 33062 (تعديل يدوي وقت الإقلاع لم يُنقل إلى الملف)، فلمّا
# ‏أعاد compose الإنشاء فرض قيمة الملف وفشل الربط وسقطت القاعدة.
- "127.0.0.1:33062:3306"
mem_limit: 2560m mem_limit: 2560m
restart: unless-stopped restart: unless-stopped
+25 -13
View File
@@ -666,29 +666,42 @@ class _AdminHomePageState extends State<AdminHomePage>
); );
} }
/// تحويل آمن لأي قيمة رقمية قادمة من الـ API.
///
/// حقول MySQL من نوع DECIMAL/SUM تصل نصاً في JSON (مثل "0.00")، بينما
/// حقول COUNT تصل أعداداً صحيحة. الكتابة السابقة
/// `(data['x'] ?? 0).toDouble()` كانت تنهار بـ
/// "Class 'String' has no instance method 'toDouble'" فور وصول أول حقل
/// نصّي — وهو ما حدث عندما نجح تسجيل دخول المحفظة وأرجع payments: "0.00".
double _num(dynamic v) {
if (v == null) return 0;
if (v is num) return v.toDouble();
return double.tryParse(v.toString()) ?? 0;
}
Widget _buildChartsSection( Widget _buildChartsSection(
dynamic data, DashboardController controller, ColorScheme cs) { dynamic data, DashboardController controller, ColorScheme cs) {
final completed = (data['completed_rides'] ?? 0).toDouble(); final completed = _num(data['completed_rides']);
final cancelled = (data['cancelled_rides'] ?? 0).toDouble(); final cancelled = _num(data['cancelled_rides']);
final total = completed + cancelled; final total = completed + cancelled;
final completedPercent = total > 0 ? (completed / total * 100).toStringAsFixed(1) : '0.0'; final completedPercent = total > 0 ? (completed / total * 100).toStringAsFixed(1) : '0.0';
final comfort = (data['comfort'] ?? 0).toDouble(); final comfort = _num(data['comfort']);
final speed = (data['speed'] ?? 0).toDouble(); final speed = _num(data['speed']);
final lady = (data['lady'] ?? 0).toDouble(); final lady = _num(data['lady']);
final maxBar = [comfort, speed, lady].reduce((a, b) => a > b ? a : b); final maxBar = [comfort, speed, lady].reduce((a, b) => a > b ? a : b);
final barMaxY = maxBar > 0 ? (maxBar * 1.3).ceilToDouble() : 10.0; final barMaxY = maxBar > 0 ? (maxBar * 1.3).ceilToDouble() : 10.0;
final payments = (data['payments'] ?? 0).toDouble(); final payments = _num(data['payments']);
final passengerCount = (data['countPassengers'] ?? 0).toDouble(); final passengerCount = _num(data['countPassengers']);
final driverCount = (data['countDriver'] ?? 0).toDouble(); final driverCount = _num(data['countDriver']);
final monthRides = (data['countRideThisMonth'] ?? 0).toDouble(); final monthRides = _num(data['countRideThisMonth']);
// توزيع الرحلات على أوقات اليوم — تعيده dashbord.php منذ البداية // توزيع الرحلات على أوقات اليوم — تعيده dashbord.php منذ البداية
// (morning/evening/night_ride_count) ولم يكن معروضاً في أي شاشة. // (morning/evening/night_ride_count) ولم يكن معروضاً في أي شاشة.
final morningRides = (data['morning_ride_count'] ?? 0).toDouble(); final morningRides = _num(data['morning_ride_count']);
final eveningRides = (data['evening_ride_count'] ?? 0).toDouble(); final eveningRides = _num(data['evening_ride_count']);
final nightRides = (data['night_ride_count'] ?? 0).toDouble(); final nightRides = _num(data['night_ride_count']);
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
@@ -1660,7 +1673,6 @@ class _GlowOrb extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final cs = Theme.of(context).colorScheme;
return Container( return Container(
width: size, width: size,
height: size, height: size,
@@ -246,7 +246,10 @@ class _RidesDashboardScreenState extends State<RidesDashboardScreen>
SliverAppBar( SliverAppBar(
pinned: true, pinned: true,
floating: false, floating: false,
expandedHeight: 268.0, // 268 كان أقصر بـ 7 بكسل من محتوى الرأس فيفيض عمودياً
// (رُصد على macOS بعرض 1512). المحتوى: العنوان 35 + البطاقات
// 114 + فاصل 14 + شريط البحث 50 + مساحة الـ TabBar 62 = 275.
expandedHeight: 275.0,
backgroundColor: cs.surface, backgroundColor: cs.surface,
surfaceTintColor: Colors.transparent, surfaceTintColor: Colors.transparent,
elevation: 0, elevation: 0,
+7 -7
View File
@@ -892,10 +892,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.12.19" version: "0.12.18"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
@@ -908,10 +908,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.18.0" version: "1.17.0"
mgrs_dart: mgrs_dart:
dependency: transitive dependency: transitive
description: description:
@@ -1232,10 +1232,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.11" version: "0.7.9"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@@ -1413,5 +1413,5 @@ packages:
source: hosted source: hosted
version: "3.1.3" version: "3.1.3"
sdks: sdks:
dart: ">=3.10.0-0 <4.0.0" dart: ">=3.9.0-0 <4.0.0"
flutter: ">=3.32.0" flutter: ">=3.32.0"