Initial commit with updated Auth and media ignored
This commit is contained in:
128
migrate_driver_passwords.php
Executable file
128
migrate_driver_passwords.php
Executable file
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
// migrate_driver_passwords.php
|
||||
// سكربت لمرة واحدة لإعادة توليد كلمة السر لكل السائقين
|
||||
// المعادلة: baseString = id | normalizedPhone | [national_number OR birthYear]
|
||||
// السر: hmacHex = hash_hmac('sha256', baseString, SECRET_KEY_HMAC, false)
|
||||
// المخزن في DB: password_hash(hmacHex)
|
||||
|
||||
set_time_limit(0); // منع انتهاء المهلة أثناء المايغريشن
|
||||
ini_set('memory_limit', '512M');
|
||||
|
||||
require_once realpath(__DIR__ . '/../vendor/autoload.php');
|
||||
require_once 'load_env.php';
|
||||
|
||||
$env_file = '/home/intaleq-api/env/.env';
|
||||
loadEnvironment($env_file);
|
||||
|
||||
include "encrypt_decrypt.php"; // لاستخدام $encryptionHelper
|
||||
|
||||
$dbUser = getenv('USER');
|
||||
$dbPass = getenv('PASS');
|
||||
$dbname = getenv('dbname');
|
||||
$pepper = getenv('SECRET_KEY_HMAC');
|
||||
|
||||
if ($dbUser === false || $dbPass === false || $dbname === false || $pepper === false) {
|
||||
error_log("[MIGRATE] Missing env vars (USER/PASS/dbname/SECRET_KEY_HMAC). Abort.");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
$dsn = "mysql:host=localhost;dbname={$dbname};charset=utf8mb4";
|
||||
$options = [
|
||||
PDO::ATTR_EMULATE_PREPARES => false,
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8",
|
||||
];
|
||||
$pdo = new PDO($dsn, $dbUser, $dbPass, $options);
|
||||
|
||||
// نجلب الحقول التي نحتاجها لبناء السر
|
||||
$sql = "SELECT id, phone, birthdate, national_number FROM driver";
|
||||
$stmt = $pdo->query($sql);
|
||||
|
||||
$update = $pdo->prepare("UPDATE driver SET password = :pwd WHERE id = :id");
|
||||
|
||||
$count = 0;
|
||||
$skipped = 0;
|
||||
$startTime = microtime(true);
|
||||
|
||||
while ($row = $stmt->fetch()) {
|
||||
$id = $row['id'];
|
||||
$encPhone = $row['phone'];
|
||||
$encBirth = $row['birthdate'] ?? null;
|
||||
$encNat = $row['national_number'] ?? null;
|
||||
|
||||
// نفك التشفير – قد يرجع null لو الحقل فاضي
|
||||
$phone = $encPhone ? $encryptionHelper->decryptData($encPhone) : null;
|
||||
$birth = $encBirth ? $encryptionHelper->decryptData($encBirth) : null;
|
||||
$nat = $encNat ? $encryptionHelper->decryptData($encNat) : null;
|
||||
|
||||
if (empty($id) || empty($phone)) {
|
||||
// لو ناقصين، نتجاوز السطر مع تسجيل في اللوج
|
||||
error_log("[MIGRATE] Skip driver id={$id}: missing phone or id.");
|
||||
$skipped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// في الوضع المثالي عندك nat + birthdate لكل السائقين
|
||||
// لو حاب تجبرهم يكونوا موجودين:
|
||||
/*
|
||||
if (empty($nat) || empty($birth)) {
|
||||
error_log("[MIGRATE] Skip driver id={$id}: missing nat or birthdate.");
|
||||
$skipped++;
|
||||
continue;
|
||||
}
|
||||
*/
|
||||
|
||||
// phone مفروض يكون أصلاً مطبّع (9639...) من سكربت التسجيل
|
||||
$normalizedPhone = trim($phone);
|
||||
|
||||
// نبني baseString: الأساس id + phone
|
||||
$parts = [$id, $normalizedPhone];
|
||||
|
||||
// نضيف رقم وطني أو سنة الميلاد (حسب الموجود)
|
||||
if (!empty($nat)) {
|
||||
$parts[] = trim($nat);
|
||||
} elseif (!empty($birth)) {
|
||||
// birthdate متوقعة بصيغة YYYY-01-01 -> نأخذ السنة فقط
|
||||
$year = substr($birth, 0, 4);
|
||||
if (preg_match('/^\d{4}$/', $year)) {
|
||||
$parts[] = $year;
|
||||
}
|
||||
}
|
||||
|
||||
$baseString = implode('|', $parts);
|
||||
|
||||
// اشتقاق السر النهائي (HEX string، بدون باينري)
|
||||
$hmacHex = hash_hmac('sha256', $baseString, $pepper, false);
|
||||
|
||||
// نخزن فقط الهاش باستخدام password_hash
|
||||
$pwdHash = password_hash($hmacHex, PASSWORD_DEFAULT);
|
||||
|
||||
$update->execute([
|
||||
':pwd' => $pwdHash,
|
||||
':id' => $id,
|
||||
]);
|
||||
|
||||
$count++;
|
||||
|
||||
// لوج بسيط كل 100 سائق
|
||||
if ($count % 100 === 0) {
|
||||
$elapsed = round(microtime(true) - $startTime, 2);
|
||||
error_log("[MIGRATE] Progress: updated {$count} drivers, skipped {$skipped}, elapsed {$elapsed}s");
|
||||
}
|
||||
}
|
||||
|
||||
$totalTime = round(microtime(true) - $startTime, 2);
|
||||
error_log("[MIGRATE] Done. Updated {$count} driver passwords, skipped {$skipped}. Total time: {$totalTime}s");
|
||||
echo "Migration finished. Updated {$count} drivers, skipped {$skipped}. Time: {$totalTime}s\n";
|
||||
|
||||
} catch (PDOException $e) {
|
||||
error_log("[MIGRATE][PDO] " . $e->getMessage());
|
||||
echo "Migration failed (DB error).\n";
|
||||
exit(1);
|
||||
} catch (Exception $e) {
|
||||
error_log("[MIGRATE][GENERAL] " . $e->getMessage());
|
||||
echo "Migration failed (general error).\n";
|
||||
exit(1);
|
||||
}
|
||||
Reference in New Issue
Block a user