feat: باقي المجموعة I — أمان السحب (OTP + بصمة + HMAC + تدقيق)

I4 — OTP على السحب عبر نبيه. تدفّق خطوتين، وقاعدته: **لا يتحرك مال قبل
إثبات الهوية**:
- POST /payouts/request → يرسل رمزاً، حالة pending_otp، **بلا خصم**
- POST /payouts/:id/confirm → يتحقق ثم يحجز ذرّياً (خصم I1)
- حدّ 5 محاولات (رمز 4 خانات يُخمَّن في دقائق بلا حدّ)، الرمز يُستهلك مرة
- complete يرفض طلباً بلا otp_verified_at (حارس ضد تخطّي التأكيد)
- fail لا يردّ مالاً لطلب pending_otp — لم يُخصم منه شيء، وردّه يخلق مالاً

I5 — biometric_method/at + device_id + request_ip على السحب. أثرٌ للتحقيق
لا مصادقة: العميل يستطيع ادّعاءها، والمصادقة الحقيقية JWT + رمز واتساب.

I6 — HMAC **مبنيّ ومطفأ** (PAYMENTS_REQUIRE_SIGNATURE=false) حتى يوقّع
فلاتر؛ تفعيله الآن يقطع كل سحب. مفتاح **لكل جلسة** يُصدره الدخول لا سرّ
ثابت في التطبيق (الثابت يُستخرج بالهندسة العكسية فيصير التوقيع مسرحية).
يوقّع timestamp.METHOD.path.body بنافذة 5 دقائق؛ rawBody مفعّل في main.

I7 — tripz_audit_log append-only: من·ماذا·متى·أي IP وجهاز. لا يرمي أبداً —
فشل التدقيق يجب ألّا يُسقط عمليةً مالية نجحت.

I2 أُلغيت الحاجة إليها: إيراد المنصة = الشحن، و credit_txns دفتره فعلاً؛
محفظة ثانية = دفتر مزدوج يحتاج مطابقة. الباقي تقرير لا محفظة.
I3/I8 مؤجَّلتان بوعي (توثيق في docs/17).

wallet-race-test.mjs حُدِّث: السباق انتقل من request إلى confirm، وأُضيف
محكّ أن الطلب وحده لا يمسّ الرصيد.

هجرة: PayoutSecurityAndAudit (تعتبر السحوبات القائمة مُتحقَّقة وإلا رفض
complete صرفها للأبد).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hamza-Ayed
2026-07-17 16:22:00 +03:00
co-authored by Claude Opus 4.8
parent 91e1692457
commit 1605754722
18 changed files with 879 additions and 60 deletions
+4
View File
@@ -9,6 +9,8 @@ import { I18nModule } from './common/i18n/i18n.module';
import { CacheModule } from './common/cache/cache.module';
import { EntitlementsModule } from './common/entitlements/entitlements.module';
import { PlatformModule } from './common/platform/platform.module';
import { AuditModule } from './common/audit/audit.module';
import { SigningModule } from './common/signing/signing.module';
import { SeedModule } from './common/seed/seed.module';
import { HealthModule } from './modules/health/health.module';
import { TenantsModule } from './modules/tenants/tenants.module';
@@ -64,6 +66,8 @@ import { GeminiModule } from './integrations/gemini/gemini.module';
CacheModule, // عالمي — كاش-جانبي فوق Redis (خط أول قبل القاعدة)
EntitlementsModule, // عالمي — استحقاقات الاشتراك + FeatureGuard
PlatformModule, // عالمي — حارس السوبر-أدمن (x-platform-secret)
AuditModule, // عالمي — سجل التدقيق المالي
SigningModule, // عالمي — توقيع HMAC للعمليات المالية
NabehModule, // عالمي — إرسال OTP واتساب
NotificationsModule, // عالمي — FCM
StorageModule, // عالمي — تخزين ملفات الوثائق