# إعداد SMS Forwarder

## إنشاء الجهاز

1. سجّل الدخول كـAdmin وافتح الإعدادات.
2. أضف جهازًا ضمن الحد المخصص.
3. انسخ رابط Webhook الذي يظهر مرة واحدة، واحفظه في مدير أسرار. يحتوي الرابط على سر؛ لا ترسله في لقطة شاشة أو تذكرة عامة.
4. عند فقد الرابط، دوّر السر من قائمة الأجهزة ثم حدّث إعداد الهاتف؛ الرابط السابق يتوقف فورًا.

## قالب الرسالة

اختر Slack Webhook/Custom URL في تطبيق Android، واستخدم الرابط كما ظهر. اجعل نص الرسالة:

```text
SMSFW_V1
Sender: {Incoming Number}

{Message Body}
```

لا تضف أسطرًا قبل `SMSFW_V1`. تبقى الأسطر الفارغة داخل نص الرسالة كما هي. تُقبل JSON أيضًا، مثل `{"text":"SMSFW_V1\nSender: Bank\n\nتم التحويل"}`، وكذلك form-urlencoded والنص الخام.

## اختبار cURL

استخدم متغيرات Shell بدل كتابة رابط السر في سجل الأوامر:

```bash
export SMS_WEBHOOK_URL='https://example.com/api/webhooks/sms/DEVICE_UUID/ONE_TIME_SECRET'
curl --fail-with-body -i -X POST "$SMS_WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -H 'X-SMSFW-Delivery-ID: stable-delivery-id-from-source' \
  --data-binary '{"text":"SMSFW_V1\nSender: Bank\n\nتم إيداع 300 ر.ي"}'
unset SMS_WEBHOOK_URL
```

الاستجابة المتوقعة `202` مع `{"ok":true,"accepted":true}`. تُحلل الرسالة في Queue بعد الرد.

## منع التكرار والخصوصية

إذا كان مصدر الرسالة قادرًا على إرسال `X-SMSFW-Delivery-ID` ثابت لكل SMS، استخدمه؛ هذا أفضل خيار لإعادة المحاولة دون دمج رسالتين متطابقتين مستقلتين. عند عدم وجود معرّف ثابت، تستخدم المنصة بصمة الحزمة ضمن نافذة `SMS_WEBHOOK_DEDUP_SECONDS` (120 ثانية افتراضيًا). الرسالتان المتطابقتان على الجهاز نفسه داخل النافذة قد تُدمجان، وإعادة المحاولة بعد انتهائها قد تعيد الرسالة.

يُخزن Payload مشفرًا داخل جدول الإيصالات، ويُستبعد Authorization وCookie من مجموعة الرؤوس المحفوظة. يحتوي الرابط نفسه على السر؛ فعّل HTTPS، وقيّد سجلات الوصول في خادم الويب/الوكيل كي لا تُحتفظ بمسارات الأسرار، ودوّر السر عند الاشتباه بالتسريب.
