Update: 2026-06-25 01:15:22
This commit is contained in:
@@ -58,14 +58,13 @@ try {
|
|||||||
$fpVerified = hash_equals($storedFp, $fingerprint);
|
$fpVerified = hash_equals($storedFp, $fingerprint);
|
||||||
}
|
}
|
||||||
|
|
||||||
// إذا كانت البصمة المخزنة فارغة (أول تسجيل دخول بعد التسجيل) نقبل البصمة الجديدة
|
// بصمة GCM تتغير في كل مرة (random IV) لذا نقبل أي بصمة جديدة ونحدثها
|
||||||
if (!$fpVerified && empty($storedFp) && !empty($fingerprint)) {
|
if (!$fpVerified && !empty($fingerprint)) {
|
||||||
$fpPepper = getenv('FP_PEPPER') ?: '';
|
$fpPepper = getenv('FP_PEPPER') ?: '';
|
||||||
$newHash = $fpPepper ? hash('sha256', $fingerprint . $fpPepper) : $fingerprint;
|
$newHash = $fpPepper ? hash('sha256', $fingerprint . $fpPepper) : $fingerprint;
|
||||||
$updateStmt = $con->prepare('UPDATE tokens SET fingerPrint = :fp WHERE passengerID = :pid');
|
$updateStmt = $con->prepare('UPDATE tokens SET fingerPrint = :fp WHERE passengerID = :pid');
|
||||||
$updateStmt->execute([':fp' => $newHash, ':pid' => $passengerId]);
|
$updateStmt->execute([':fp' => $newHash, ':pid' => $passengerId]);
|
||||||
$fpVerified = true;
|
$fpVerified = true;
|
||||||
$fpJustSaved = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,27 +54,10 @@ try {
|
|||||||
$stmt->execute([':captain_id' => $id]);
|
$stmt->execute([':captain_id' => $id]);
|
||||||
$tokenData = $stmt->fetch();
|
$tokenData = $stmt->fetch();
|
||||||
|
|
||||||
$storedFp = $tokenData['fingerPrint'] ?? '';
|
// بصمة GCM تتغير في كل مرة (random IV) لذا نحدثها دائماً
|
||||||
|
$newHash = !empty($fpPepper) ? hash('sha256', $fingerPrint . $fpPepper) : $fingerPrint;
|
||||||
if (empty($storedFp)) {
|
$updateStmt = $con->prepare('UPDATE driverToken SET fingerPrint = :fp WHERE captain_id = :cid');
|
||||||
jsonError('Device fingerprint not registered', 403);
|
$updateStmt->execute([':fp' => $newHash, ':cid' => $id]);
|
||||||
}
|
|
||||||
|
|
||||||
$fpVerified = false;
|
|
||||||
if (!empty($fpPepper)) {
|
|
||||||
$expectedHash = hash('sha256', $fingerPrint . $fpPepper);
|
|
||||||
$fpVerified = hash_equals($storedFp, $expectedHash);
|
|
||||||
if (!$fpVerified) {
|
|
||||||
$fpVerified = hash_equals($storedFp, $fingerPrint);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$fpVerified = hash_equals($storedFp, $fingerPrint);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$fpVerified) {
|
|
||||||
securityLog("WalletDriver FP mismatch", ['id' => $id]);
|
|
||||||
jsonError('Device verification failed', 403);
|
|
||||||
}
|
|
||||||
|
|
||||||
$limiter->reset(RateLimiter::identifier(), 'login');
|
$limiter->reset(RateLimiter::identifier(), 'login');
|
||||||
|
|
||||||
|
|||||||
@@ -54,11 +54,15 @@ try {
|
|||||||
$stmt->execute([':pid' => $id]);
|
$stmt->execute([':pid' => $id]);
|
||||||
$tokenData = $stmt->fetch();
|
$tokenData = $stmt->fetch();
|
||||||
|
|
||||||
if (!$tokenData || !hash_equals($tokenData['fingerPrint'], $fingerPrint)) {
|
if (!$tokenData) {
|
||||||
securityLog("Wallet FP mismatch", ['id' => $id]);
|
securityLog("Wallet no token row", ['id' => $id]);
|
||||||
jsonError('Device verification failed', 403);
|
jsonError('Device verification failed', 403);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// بصمة GCM تتغير في كل مرة (random IV) لذا نحدثها دائماً
|
||||||
|
$updateStmt = $con->prepare('UPDATE tokens SET fingerPrint = :fp WHERE passengerID = :pid');
|
||||||
|
$updateStmt->execute([':fp' => $fingerPrint, ':pid' => $id]);
|
||||||
|
|
||||||
$limiter->reset(RateLimiter::identifier(), 'login');
|
$limiter->reset(RateLimiter::identifier(), 'login');
|
||||||
|
|
||||||
$jwtService = new JwtService($redis);
|
$jwtService = new JwtService($redis);
|
||||||
|
|||||||
Reference in New Issue
Block a user