Update: 2026-08-03 12:30:24
This commit is contained in:
@@ -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,5 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once __DIR__ . '/../../../connect.php';
|
require_once __DIR__ . '/../../connect.php';
|
||||||
|
|
||||||
$phoneNumber = filterRequest("phone_number");
|
$phoneNumber = filterRequest("phone_number");
|
||||||
|
|
||||||
|
|||||||
@@ -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,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,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. ---");
|
||||||
|
|||||||
@@ -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,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,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");
|
||||||
|
|||||||
@@ -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. */
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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__ عبر المطابقة مع
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user