Update: 2026-08-07 19:10:47
This commit is contained in:
@@ -23,82 +23,10 @@ $envFile = getenv('ENV_FILE_PATH') ?: "$root/docker/.env";
|
||||
$command = $argv[1] ?? 'audit';
|
||||
$dryRun = in_array('--dry-run', $argv, true);
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// التصنيف
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
/** أسرار داخلية: طرفاها كلاهما لنا. توليدها وتدويرها آمنان. */
|
||||
const GENERATED = [
|
||||
'S2S_SHARED_KEY' => 32, // خادم ↔ خادم داخلي
|
||||
'WEBHOOK_SECRET_KEY' => 32, // هاتف الرسائل ↔ الويبهوك
|
||||
'INTERNAL_SOCKET_KEY' => 32, // الباك إند ↔ خوادم السوكيت
|
||||
'BOT_SECRET_KEY' => 24, // بوت الأسعار
|
||||
'FCM_INTERNAL_API_KEY' => 32,
|
||||
'MIGRATION_ADMIN_KEY' => 24,
|
||||
'PAYMENT_KEY' => 32,
|
||||
];
|
||||
|
||||
/**
|
||||
* تدويرها يبطل كل الجلسات القائمة: كل سائق وكل راكب سيُخرَج ويُطالَب
|
||||
* بتسجيل دخول جديد. ليس عطلاً لكنه حدث تشغيلي — لا يُفعل وقت الذروة.
|
||||
*/
|
||||
const SESSION_SCOPED = [
|
||||
'JWT_SECRET_KEY' => 64,
|
||||
'SECRET_KEY_HMAC' => 32,
|
||||
];
|
||||
|
||||
/**
|
||||
* ⛔ مجمّدة. هذه ليست «مفاتيح يمكن تغييرها من عندنا» رغم أنها ملكنا:
|
||||
*
|
||||
* ENC_KEY / ENCRYPTION_KEY_PATH
|
||||
* تُشفَّر به أسماء الركّاب وهواتفهم وبرديهم ولوحات السيارات
|
||||
* **المخزَّنة في القاعدة**. تغييره لا يعيد تشفير شيء — يجعل كل
|
||||
* صف قديم رطانةً لا تُفكّ. لا استرجاع، ولا نسخة احتياطية تنفع
|
||||
* لأن النسخة نفسها مشفّرة بالمفتاح القديم.
|
||||
*
|
||||
* BLIND_INDEX_PEPPER
|
||||
* أعمدة `*_bidx` محسوبة به ومخزَّنة. تغييره يعني أن كل بحث
|
||||
* بالهاتف أو البريد يفشل — لا يجد المستخدم حسابه، ويُنشأ له
|
||||
* حساب مكرر عند أول تسجيل.
|
||||
*
|
||||
* TRACKING_SECRET_SALT / FP_PEPPER
|
||||
* قيم مشتقّة منها مخزَّنة أيضاً.
|
||||
*
|
||||
* تدويرها ممكن نظرياً لكنه **ترحيل بيانات** لا تغيير إعداد: فكّ بالقديم
|
||||
* وإعادة تشفير بالجديد على كل صف، بتوقّف مخطَّط ونسخة احتياطية أولاً.
|
||||
*/
|
||||
const FROZEN = [
|
||||
'ENC_KEY', 'ENCRYPTION_KEY_PATH', 'ENCRYPTION_MODE',
|
||||
'BLIND_INDEX_PEPPER', 'TRACKING_SECRET_SALT', 'FP_PEPPER',
|
||||
];
|
||||
|
||||
/** لا تُولَّد — تُنسخ من لوحة المزوّد. */
|
||||
const EXTERNAL = [
|
||||
'GEMINI_API_KEY', 'NABEH_API_KEY', 'NABEH_PASSWORD', 'NABEH_OTP_APP_KEY',
|
||||
'ELEVENLABS_API_KEY', 'CREATOMATE_API_KEY', 'SOCIAL_BOT_TOKEN',
|
||||
'MAIL_PASSWORD', 'SIRO_SMTP_PASSWORD', 'SMS_PASSWORD_EGYPT',
|
||||
'VOICE_CALL_API_KEY', 'RASEEL_DRIVER_ACCESS_TOKEN',
|
||||
'FIREBASE_SERVICE_ACCOUNT_PATH', 'SERVICE_ACCOUNT_FILE_PATH',
|
||||
];
|
||||
|
||||
/**
|
||||
* كلمات مرور قواعد البيانات — صنف قائم بذاته.
|
||||
*
|
||||
* تغييرها في .env **لا يغيّر شيئاً في MySQL**. متغيّرات صورة mysql
|
||||
* (ومنها MYSQL_ROOT_PASSWORD) تُقرأ مرة واحدة فقط عند تهيئة مجلّد
|
||||
* البيانات الفارغ أول مرة. بعد ذلك كلمة المرور تعيش داخل جدول
|
||||
* mysql.user لا في .env — فتعديل .env وحده يعني تطبيقاً يحمل كلمة
|
||||
* لا يقبلها الخادم: انقطاع كامل بلا أي تغيير في القاعدة نفسها.
|
||||
*
|
||||
* الترتيب الصحيح: ALTER USER في MySQL أولاً، ثم .env، ثم إعادة تشغيل
|
||||
* حاويات php (لا mysql، ولا إعادة بناء، ولا مساس بالبيانات إطلاقاً).
|
||||
*/
|
||||
const DB_CREDENTIALS = [
|
||||
'DB_PRIMARY_PASS_V2', 'DB_PRIMARY_PASS', 'DB_TRACKING_PASS',
|
||||
'DB_RIDE_PASS', 'DB_TRANSIT_PASS', 'DB_FOOD_PASS', 'DB_PAYMENT_PASS',
|
||||
'MYSQL_ROOT_PASSWORD', 'REDIS_PASSWORD', 'REDIS_MAIN_PASSWORD',
|
||||
'REDIS_LOCATION_PASSWORD', 'REDIS_AUTH', 'REDIS_MAIN_AUTH',
|
||||
];
|
||||
// التصنيف كله في env_registry.php — مصدر واحد تشترك فيه هذه الأداة
|
||||
// واللوحة. نسختان منه كانتا ستتباعدان، وأخطر تباعد هو قائمة المجمّدة:
|
||||
// مفتاح يسقط منها في نسخة يعني لوحةً تعرضه قابلاً للتعديل.
|
||||
require_once __DIR__ . '/env_registry.php';
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// القراءة
|
||||
@@ -148,11 +76,11 @@ $report = static function (string $title, array $keys, array $present,
|
||||
}
|
||||
};
|
||||
|
||||
$report('أسرار داخلية (تُولَّد وتُدوَّر بحرية)', GENERATED, $present, $isPlaceholder, $toSeed, true);
|
||||
$report('مرتبطة بالجلسات (تدويرها يُخرج الجميع)', SESSION_SCOPED, $present, $isPlaceholder, $toSeed, true);
|
||||
$report('⛔ مجمّدة — لا تُدوَّر (بيانات مخزَّنة مشتقّة منها)', FROZEN, $present, $isPlaceholder);
|
||||
$report('اعتماد قواعد البيانات (يُغيَّر في MySQL أولاً لا هنا)', DB_CREDENTIALS, $present, $isPlaceholder);
|
||||
$report('طرف ثالث (تُنسخ من لوحة المزوّد)', EXTERNAL, $present, $isPlaceholder);
|
||||
$report('أسرار داخلية (تُولَّد وتُدوَّر بحرية)', ENV_GENERATED, $present, $isPlaceholder, $toSeed, true);
|
||||
$report('مرتبطة بالجلسات (تدويرها يُخرج الجميع)', ENV_SESSION_SCOPED, $present, $isPlaceholder, $toSeed, true);
|
||||
$report('⛔ مجمّدة — لا تُدوَّر (بيانات مخزَّنة مشتقّة منها)', ENV_FROZEN, $present, $isPlaceholder);
|
||||
$report('اعتماد قواعد البيانات (يُغيَّر في MySQL أولاً لا هنا)', ENV_DB_CREDENTIALS, $present, $isPlaceholder);
|
||||
$report('طرف ثالث (تُنسخ من لوحة المزوّد)', ENV_EXTERNAL, $present, $isPlaceholder);
|
||||
|
||||
echo "\n" . str_repeat('─', 62) . "\n";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user