2024-06-02 22:36:59 +02:00
|
|
|
|
+++
|
|
|
|
|
title = "الأصدار الاول من بروتوكول OxideTalis"
|
|
|
|
|
|
|
|
|
|
[extra]
|
|
|
|
|
image = "/otmp_ar.png"
|
|
|
|
|
lang = "ar-SA"
|
|
|
|
|
dir = "rtl"
|
|
|
|
|
add_toc = true
|
|
|
|
|
+++
|
|
|
|
|
|
|
|
|
|
<small>المؤلف: [عويتب](https://4rs.nl)</small>\
|
|
|
|
|
<small>التاريخ: 2024/6/1</small>\
|
|
|
|
|
<small>الاصدار: 1.0.0</small>\
|
|
|
|
|
<small>الحالة: مسودة</small>
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
## نظرة عامة {#overview}
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
|
|
|
|
بروتوكول OxideTalis هو بروتوكول تواصل بين طرفين بتشفير تام من طرف إلى طرف عبر
|
2024-06-05 08:39:31 +02:00
|
|
|
|
مفتاح تشفير مشترك بينهم، يهدف البروتوكول إلى توفير سهولة التنقل من خادم إلى أخر
|
|
|
|
|
بشكل إفتراضي وتوفير طريقة للتواصل بين الافراد في خوادم مختلفة بشكل مباشر بدون
|
|
|
|
|
تواصل خادم المرسل وخادم المستقبل مع بعضهم البعض.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
### الاهداف {#goals}
|
|
|
|
|
|
2024-06-02 22:36:59 +02:00
|
|
|
|
- تواصل آمن بين طرفين مُشفر من ند إلى ند.
|
|
|
|
|
- سهولة التنفيذ.
|
|
|
|
|
- امكانية الإنتقال إلى خادم آخر.
|
|
|
|
|
- امكانية التواصل مع اطراف خارج الخادم الخاص بالمرسل.
|
2024-06-17 23:41:45 +02:00
|
|
|
|
- عدم الحاجة لتواصل المرسل مع الخادم الخاص به للتواصل مع اشخاص خارج الخادم.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
- عدم الحاجة ﻷسم مستخدم وكلمة مرور لتخويل المسخدم للمراسلة، والاكتفاء بالعنوان
|
|
|
|
|
العام الخاص به.
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
### الاهداف الغير مرغوبة {#non-goals}
|
|
|
|
|
|
2024-06-02 22:36:59 +02:00
|
|
|
|
- التواصل الجماعي.
|
|
|
|
|
- المكالمات الصوتية أو الفيديو.
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
## العناوين العامة {#public-addresses}
|
|
|
|
|
|
2024-06-02 22:36:59 +02:00
|
|
|
|
العنوان العام هو المفتاح العام الخاص بخوارزمية [Elliptic Curve Diffie-Hellman]
|
|
|
|
|
مضغوط وهو يتكون من 33 بايت (264 بت) يتم ترميزه بترميز [base58] على سبيل المثال
|
|
|
|
|
العنوان التالي `becZJsZZqGR7qBG8t1Pm4uy62jDTzJsabxnkARhr2syo`.
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
يتم وضع العنوان العام في رأس (Header) الطلب (Request) بأسم `X-OTMP-PUBLIC` ويجب
|
|
|
|
|
ان يكون نص [base58] صحيح مكون من 33 بايت (264 بت).
|
|
|
|
|
|
|
|
|
|
## أسم الخادم {#server-name}
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-08-05 16:13:10 +02:00
|
|
|
|
يكون أسم الخادم عنوان إلكتروني مثل `example.com` ولا يجب أن يكون الخادم نفسه، هو
|
|
|
|
|
أسم فقط يشير إلى الخادم، على سبيل المثال، أسم الخادم `example.com` ولكن الخادم
|
|
|
|
|
هو `otmp.example.com:443`، هكذا سوف يتم الإشارة لى مستخدمين هذا الخادم <snap
|
|
|
|
|
dir='ltr'><code>@becZJsZZqGR7qBG8t1Pm4uy62jDTzJsabxnkARhr2syo/example.com</code></snap>
|
|
|
|
|
ويمكن إختصاره بالواجهات الرسومية بأخذ أول ثلاث أحرف و أخر ثلاث أحرف ووضع `..`
|
|
|
|
|
بينهم، ليصبح بهذا الشكل <snap
|
|
|
|
|
dir='ltr'><code>@bec..syo/example.com</code></snap>.
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
### كيفية الإشارة {#referencing}
|
|
|
|
|
|
2024-08-05 16:13:10 +02:00
|
|
|
|
يشير أسم الخادم إلى الخادم عبر المسار التالي <span
|
|
|
|
|
dir='ltr'><code>/.well-known/oxidetalis/server</code></span>
|
|
|
|
|
|
|
|
|
|
سوف يتم إرسال طلب GET إلى هذا المسار و يجب أن يُرجع هذا المسار نص بتنسيق
|
|
|
|
|
`application/json` يحتوي على المفتاح `otmp_server` ولذي يحتوي على مكان إستضافة
|
|
|
|
|
الخادم والمنفذ الذي يستمع إليه، سوف يتم إرسال الطلب ببروتوكول https و يجب أن
|
|
|
|
|
يدعم الخادم https و يجب ان تكون الشهادة موقعة من جهة موثوقة وليست موقعة
|
|
|
|
|
ذاتياً[^1]
|
|
|
|
|
|
|
|
|
|
### مفتاح `otmp_server`
|
2024-10-12 15:25:25 +02:00
|
|
|
|
|
2024-08-05 16:13:10 +02:00
|
|
|
|
محتوى هذا المفتاح يجب أن يكون نص، يتكون هذا النص من جزئين يفصل بينهم نقطتان
|
|
|
|
|
رأسيتان، الجزء الأول هو مكان الإستضافة و الجزء الثاني هو المنفذ على سبيل المثال
|
|
|
|
|
`"example.com:443"` و `"otmp.example.com:7294"` و `"93.184.215.14:7294"` و <snap
|
2024-10-12 15:25:25 +02:00
|
|
|
|
dir='ltr'><code>"[2606:2800:021f:cb07:6820:80da:af6b:8b2c]:7294"</code></snap>.
|
2024-08-05 16:13:10 +02:00
|
|
|
|
|
|
|
|
|
### مثال
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
|
|
|
|
<div dir="ltr">
|
|
|
|
|
|
|
|
|
|
```json
|
2024-10-12 15:25:25 +02:00
|
|
|
|
{ "otmp_server": "otmp.example.com:443" }
|
2024-06-02 22:36:59 +02:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
> يجب على الخوادم عدم تخزين اسماء خوادم المرسلين، ويتم تحديده في الطلب المرسل من
|
|
|
|
|
> قبلهم فقط، حيث أن المفتاح العام هو المعرف المشترك بين جميع الخوادم.
|
|
|
|
|
|
|
|
|
|
## مفتاح التشفير المشترك {#shared-encryption-key}
|
|
|
|
|
|
|
|
|
|
يتم انشاء مفتاح التشفير المشترك عبر خوارزمية [Elliptic Curve Diffie-Hellman]
|
|
|
|
|
secp256k1 حيث يقوم مرسل الرسالة بوضع العنوان العام الخاص بالمستقبِل لإنتاج
|
|
|
|
|
المفتاح المشترك، بعد إنتاج المفتاح المشترك يتم ادخاله إلى دالة [HKDF] **بدون
|
|
|
|
|
ملح** بخوارزمية [Sha256] وبعد ذلك يتم عمل له توسعة (expand) بدون معلومات (info)
|
|
|
|
|
بطول 32 بايت (256 بت).
|
2024-06-17 23:41:45 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
### التشفير {#encryption}
|
2024-06-03 22:25:52 +02:00
|
|
|
|
|
2024-06-05 08:39:53 +02:00
|
|
|
|
سوف يتم استخدام [مفتاح التشفير المشترك] مفتاحاً للتشفير في خوارزمية [AES-256
|
|
|
|
|
CBC]، بعد تشفير الرسالة يتم وضع قيمة التهيئة (iv) في أخر الرسالة، ليكون اخر 16
|
|
|
|
|
بايت (128 بت) هي قيمة التهيئة (iv) التي سوف يستخدمها المستقبِل لفك تشفير
|
2024-10-12 15:25:25 +02:00
|
|
|
|
الرسالة.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-08-05 16:13:10 +02:00
|
|
|
|
مثال لمفتاح تشفير مشترك بترميز [base58] <span
|
|
|
|
|
dir="ltr"><code>LKGKeuV3SRu1n3fez4SdboM3FT48vbBxHai9MbuWxb3</code></span>
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
## مفتاح الخادم العام {#server-public-key}
|
|
|
|
|
|
2024-08-05 16:13:10 +02:00
|
|
|
|
مفتاح الخادم العام هو مثل العنواين العامة الخاصة بالمستخدمين، ولكنه خاص بالخادم،
|
|
|
|
|
حيث ان الخادم سوف يقوم بأنشاء مفتاح مشترك بينه وبين مرسل الطلب (Request) ليتأكد
|
|
|
|
|
من أن المرسل (صاحب العنوان العام) هو مالك هذا العنوان. يتم التأكد عبر مطابقة
|
|
|
|
|
التوقيع الموجود في الطلب (Request).
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-08-05 16:13:10 +02:00
|
|
|
|
يتم جلب مفتاح الخادم العام من المسار <span
|
|
|
|
|
dir='ltr'><code>/api/info</code></span> سوف يتم إرسال طلب GET إلى هذا المسار و
|
|
|
|
|
يجب أن يُرجع هذا المسار نص بتنسيق `application/json` يحتوي على المفتاح
|
|
|
|
|
`public_key` ولذي قيمته نص المفتاح العام الخاص بالخادم بترميز [base58]، سوف يتم
|
|
|
|
|
إرسال الطلب ببروتوكول https و يجب أن يدعم الخادم https و يجب ان تكون الشهادة
|
|
|
|
|
موقعة من جهة موثوقة وليست موقعة ذاتياً[^1]
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
> تم توضيح المفتاح العام هنا ([العناوين العامة](#public-addresses))
|
2024-06-17 23:41:45 +02:00
|
|
|
|
|
2024-06-02 22:36:59 +02:00
|
|
|
|
> حاول ان لا تقوم بتغيير المفتاح العام الخاص بالخادم بشكل مستمر، لآن العملاء سوف
|
|
|
|
|
> يقومون بتخزينه بالعادة.
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
## توقيع الطلب {#request-signature}
|
|
|
|
|
|
2024-06-05 08:39:53 +02:00
|
|
|
|
هو التوقيع الخاص بالطلب يتم وضعه في رأس الطلب (Header) بأسم `X-OTMP-SIGNATURE`
|
|
|
|
|
او في بيانات ال [Websocket] في المفتاح `signature` بترميز [Hex] ويتم أستخدامه
|
|
|
|
|
للتأكد من ان مرسل الطلب هو مالك المفتاح العام.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
### إنشاء التوقيع {#create-signature}
|
|
|
|
|
|
2024-06-03 22:25:52 +02:00
|
|
|
|
التوقيع يحتاج إلى ثلاث اشياء ليتم إنشائه
|
2024-10-12 15:25:25 +02:00
|
|
|
|
|
2024-06-03 22:25:52 +02:00
|
|
|
|
- مفتاح التشفير المشترك.
|
2024-10-12 15:25:25 +02:00
|
|
|
|
- جسم الطلب (body) أو بيانات الحدث (data) أو طريقة الطلب+المسار، مثال
|
|
|
|
|
(GET/ws/chat)
|
|
|
|
|
- ثواني الوقت الحالي للمنطقة الزمنية UTC+00:00 بتنسيق [Unix Time] (8 بايت أي 64
|
|
|
|
|
بت **big-endian**).
|
2024-06-03 22:25:52 +02:00
|
|
|
|
- 16 بايت عشوائي (128 بت).
|
|
|
|
|
|
2024-06-05 08:39:53 +02:00
|
|
|
|
يتم إدخال جسم الطلب (body) او بيانات الحدث في الـ[Websocket] إلى دالة
|
|
|
|
|
[HMAC-SHA256] و إستخدام [مفتاح التشفير المشترك] مضافاً إليه الوقت الحالي (8
|
|
|
|
|
بايت) و الـ16 بايت العشوائي، أي المفتاح المستخدم في دالة [HMAC-SHA256] سوف يكون
|
2024-06-03 22:25:52 +02:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
مفتاح التشفير المشترك+الوقت الحالي+16 بايت عشوائي
|
|
|
|
|
```
|
2024-10-12 15:25:25 +02:00
|
|
|
|
|
2024-06-05 08:39:53 +02:00
|
|
|
|
بعد ذلك يتم أخذ نتيجة دالة [HMAC-SHA256] و إضافة الوقت المستخدم في الأعلى و
|
|
|
|
|
الـ16 بايت المستخدمة في الأعلى و جميعهم بترميز [Hex]، مثال
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-08-05 16:13:10 +02:00
|
|
|
|
<div dir="ltr">
|
|
|
|
|
|
2024-06-03 22:25:52 +02:00
|
|
|
|
```
|
|
|
|
|
bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66
|
|
|
|
|
```
|
2024-08-05 16:13:10 +02:00
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
2024-06-03 23:51:12 +02:00
|
|
|
|
بعد تحويله إلى بايتات سوف يكون المجموع 56 بايت، وسوف يكون التقسيم كالتالي
|
2024-10-12 15:25:25 +02:00
|
|
|
|
|
2024-06-05 08:39:53 +02:00
|
|
|
|
- مخرج دالة [HMAC-SHA256]: من بايت 0 إلى بايت31. (التوقيع الذي سوف يتحقق منه
|
|
|
|
|
الخادم)
|
|
|
|
|
- الوقت: من بايت 32 إلى بايت 39. (الذي سوف يتم إضافته بعد [مفتاح التشفير
|
2024-10-12 15:25:25 +02:00
|
|
|
|
المشترك])
|
2024-06-03 22:25:52 +02:00
|
|
|
|
- ال 16 بايت العشوائي: من بايت 40 إلى بايت 55. (سوف يتم إضافته بعد الوقت)
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-06-05 08:39:53 +02:00
|
|
|
|
سوف يتحقق الخادم من أن الوقت الذي في التوقيع لم يتجاوز الـ20 ثانية، وسوف يقوم
|
|
|
|
|
الخادم بتخزين ال 16 بايت العشوائي في الكاش بمدة حياة 30 ثانية، ليتأكد الخادم من
|
|
|
|
|
ان ال 16 بايت العشوائي لن يتم إستخدامهم في توقيع أخر، بالتالي ضمان عدم إرسال
|
2024-10-12 15:25:25 +02:00
|
|
|
|
الطلب مرة أخرى من المهاجمين (ضمان أن التوقيع صالح لمرة واحدة فقط).
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
### شكل البيانات داخل إتصال الـWebsocket {#websocket-data}
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
بعد الإتصال بـ[Websocket] مع الخادم، يكون تنسيق البيانات التي يتم تبادلها بين
|
|
|
|
|
المرسل والخادم json ويجب عليها توفر المفاتيح التالية
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
- `event`: إسم الحدث، على سبيل المثال إرسال رسالة او تحديث حالة الكتابة (التنسيق
|
|
|
|
|
PascalCase).
|
|
|
|
|
- `data`: البيانات الخاصة بالحدث.
|
|
|
|
|
- `signature`: توقيع بيانات الحدث (data)، هذا التوقيع يكون بين المرسل وبين
|
|
|
|
|
الخادم وليس المُستقبل.
|
|
|
|
|
|
|
|
|
|
#### مثال لشكل البيانات في ال websocket {#websocket-data-example}
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
|
|
|
|
<div dir="ltr">
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
2024-07-04 12:54:51 +02:00
|
|
|
|
"event": "EventName",
|
2024-06-02 22:36:59 +02:00
|
|
|
|
"data": {
|
|
|
|
|
"key": "value"
|
|
|
|
|
},
|
2024-06-03 22:25:52 +02:00
|
|
|
|
"signature": "bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66"
|
2024-06-02 22:36:59 +02:00
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
> يمكن للخادم طلب أي شكل من البيانات، و يجب أن تكون المعلومات الحساسة مثل
|
|
|
|
|
> الرسالة او الملف مُشفرة بين المُرسل و المُستقبل.
|
|
|
|
|
|
|
|
|
|
## طريقة التواصل {#communication}
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-06-05 08:39:53 +02:00
|
|
|
|
هنا سوف يتم توضيح طريقة التواصل بين طرفين في خادم واحد (تواصل داخلي)، وبين طرفين
|
|
|
|
|
في خوادم مختلفة (تواصل خارجي)
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
### مفاهيم مهمة {#important-concepts}
|
|
|
|
|
|
2024-06-02 22:36:59 +02:00
|
|
|
|
- التواصل الداخلي: هو تواصل طرفين في الخادم نفسه.
|
|
|
|
|
- التواصل الخارجي: هو تواصل طرفين في خوادم مختلفة.
|
|
|
|
|
- القائمة البيضاء: هي قائمة يمتلكها كل مستخدم في الخادم يوجد بها المستخدمين
|
|
|
|
|
المسموح لهم بمراسلته.
|
|
|
|
|
- القائمة السوداء: هي قائمة يمتلكها كل مستخدم في الخادم يوجد بها المستخدمين
|
2024-10-12 15:25:25 +02:00
|
|
|
|
الغير مسموح لهم بإرسال طلب دردشة إليه.
|
2024-06-05 08:39:53 +02:00
|
|
|
|
- قائمة الخادم السوداء: هي قائمة يقوم بوضعها مالك الخادم ليمنع خادمه من التواصل
|
|
|
|
|
مع خوادم محددة او اشخاص محددين.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
- جدول الإتصالات الخارجية: هو جدول يتم حفظ به الرسائل الخارجية التي وصلت إلى
|
|
|
|
|
المستخدم عندما لم يكن متصل بالخادم، ويتم مسحها بعد إرسالها له.
|
2024-06-05 08:39:53 +02:00
|
|
|
|
- جدول طلبات الدردشة: هو جدول يتضمن طلبات الدردشة التي قاموا بإرسالها او
|
|
|
|
|
إستقبالها افراد الخادم إلى/من افراد اخرين في نفس الخادم او في خوادم أخرى، ويتم
|
|
|
|
|
مسح الطلب بعد وصول قبوله او رفضه. يتم الإستفادة من هذا الجدول لعدم إستقبال
|
|
|
|
|
إشعارات قبول او رفض مزيفة.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
> سوف يتم استبدال العنوان العام بأسم **سارة** و **أحمد** لآن العناوين العامة
|
|
|
|
|
> طويلة نسبياً
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
### التواصل الداخلي {#internal-communication}
|
|
|
|
|
|
|
|
|
|
اولاً **يجب**[^2] عند فتحك لعميل التواصل أن تقوم بإنشاء إتصال [Websocket] بينك
|
2024-06-05 08:39:53 +02:00
|
|
|
|
وبين الخادم الخاص بك، عبر هذا الإتصال سوف تستقبل الرسائل الجديدة من الخادم الخاص
|
|
|
|
|
بك، وسوف تقوم بالتواصل من خلاله لإرسال الرسائل إلى افراد الخادم.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
لدينا الآن المرسلة **سارة** والمستقبِل **أحمد** و كلاهم في الخادم نفسه، سوف تقوم
|
|
|
|
|
**سارة** بإرسال حدث [Websocket] تطلب من الخادم إرسال طلب دردشة إلى **أحمد** سوف
|
|
|
|
|
يرد الخادم بأحد الأخطأ التالية، او لا يقوم بالرد إذا لم يكن هناك خطأ.
|
|
|
|
|
|
|
|
|
|
#### إذا لم يكن هناك مستخدم بأسم **أحمد** في الخادم {#no-user}
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
سوف يرجع الخادم خطأ ويخبر فيه **سارة** أنه ليس هناك مستخدم بهذا الأسم.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
#### إذا لم تكن **سارة** في قائمة **أحمد** البيضاء ولا السوداء {#not-in-white-or-black-list}
|
|
|
|
|
|
|
|
|
|
سوف يقوم الخادم اولاً بإضافة **أحمد** إلى قائمة **سارة** البيضاء، وبعد ذلك إضافة
|
|
|
|
|
الطلب في جدول طلبات دردشة **أحمد** **المُستقبلة** إذا كان غير متصل مع الخادم
|
|
|
|
|
وسوف يضيفه إلى **المُرسلة** بالنسبة إلى **سارة**، لا يرجع الخادم أي خطأ في هذه
|
2024-07-30 07:10:21 +02:00
|
|
|
|
الحالة.
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
عندما يرد **أحمد** بالموافقة أو الرفض (عبر إتصال الـ[Websocket])، سوف يُعلم
|
|
|
|
|
الخادم **سارة** بأن **أحمد** وافق أو رفض التواصل معها (عبر إتصال الـ[Websocket]
|
|
|
|
|
أو إضافتها إلى جدول ليُعلمها عند تواصلها مع الخادم). إذا لم يوافق **أحمد** سوف
|
|
|
|
|
يقوم الخادم بإضافة **سارة** إلى قائمة **أحمد** السوداء، و إذا وافق سوف يتم
|
|
|
|
|
إضافتها إلى القائمة البيضاء.
|
|
|
|
|
|
|
|
|
|
#### إذا كانت **سارة** في قائمة **أحمد** البيضاء {#in-white-list}
|
|
|
|
|
|
|
|
|
|
سوف يرجع الخادم خطأ، يُعلم **سارة** أنها في قائمة **أحمد** البيضاء (يمكنها
|
|
|
|
|
التواصل معه)
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
#### إذا كانت **سارة** في قائمة **أحمد** السوداء {#in-black-list}
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
سوف يرجع الخادم خطأ و يُعلم **سارة** انها في قائمة **أحمد** السوداء ولا يمكنه
|
|
|
|
|
الدردشة معه.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
|
|
|
|
> يتم تخزين رسائل الطرفين مُشفرة في قاعدة البيانات الخاصة بالخادم
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
### التواصل الخارجي {#external-communication}
|
|
|
|
|
|
|
|
|
|
لدينا الآن المرسلة **سارة** من `example1.com` والمستقبِل **أحمد** من
|
|
|
|
|
`example2.com` سوف تقوم **سارة** بإرسال طلب Get إلى `example2.com` تطلب فيه
|
|
|
|
|
الدردشة مع **أحمد**، **يجب** على **سارة** وضع الرأس `X-OTMP-SERVER` يحتوي على
|
|
|
|
|
أسم الخادم الخاص بها، سوف يستخدم **أحمد** هذا الخادم لإرسال طلب القبول أو الرفض
|
|
|
|
|
إليه إذا لم تكن **سارة** في قائمته السوداء ولا البيضاء، سوف يرد الخادم بأحد
|
|
|
|
|
الردود التالية
|
|
|
|
|
|
|
|
|
|
#### إذا لم يكن هناك مستخدم بأسم **أحمد** في الخادم {#no-user-external}
|
|
|
|
|
|
|
|
|
|
سوف يرجع الخادم 404 و يُعلم **سارة** بأنه ليس لديه مستخدم بهذا الأسم.
|
|
|
|
|
|
|
|
|
|
#### إذا لم تكن **سارة** في قائمة **أحمد** البيضاء ولا السوداء {#not-in-white-or-black-list-external}
|
|
|
|
|
|
|
|
|
|
سوف يقوم خادم **أحمد** بإرسال طلب الدردشة إلى **أحمد** او يقوم بتخزين الطلب في
|
|
|
|
|
جدول طلبات الدردشة **المٌستقبلة**، ويرد عليها بـ202، بعد ذلك تقوم **سارة** بطلب
|
|
|
|
|
الخادم الخاص بها من إضافة **أحمد** إلى قائمتها البيضاء لتستقبل منه الرسائل
|
|
|
|
|
مستقبلاً بدون حاجة **أحمد** إرسال طلب دردشة وإنتظار قبولها، سوف تقوم **سارة**
|
|
|
|
|
ايضاً بطلب الخادم من إضافة **أحمد** إلى جدول طلبات الدردشة **المُرسلة**[^3]
|
|
|
|
|
|
|
|
|
|
#### قبول أو رفض طلب الدردشة {#accept-or-reject-external}
|
|
|
|
|
|
|
|
|
|
بعدما يستقبل **أحمد** طلب دردشة **سارة** و خادمها و عندما يريد قبول أو رفض
|
|
|
|
|
الطلب سيقوم بالإرسال إلى النقطة <span
|
|
|
|
|
dir='ltr'><code>/api/chat_response</code></span> في خادم **سارة**، يجب على
|
|
|
|
|
**أحمد** وضع عنوانه العام في الرأس `X-OTMP-PUBLIC` وتوقيع الطلب في
|
|
|
|
|
`X-OTMP-SIGNATURE`، يجب أن يرسل طلب POST إلى النقطة مع جسم يوضح من مرسل الطلب
|
|
|
|
|
(**سارة** في حالتنا) و إذا اراد قبوله أم لا.
|
|
|
|
|
|
|
|
|
|
بعد ذلك إذا لم يكن لـ**سارة** إتصال [Websocket] سابق مع خادم **أحمد**، سوف تقوم
|
|
|
|
|
بإرسال طلب دردشة ليتم ترقية الإتصال إلى [Websocket]، ونفس المسئلة مع **أحمد**
|
|
|
|
|
إذا اراد التواصل مع **سارة** سوف يقوم بإرسال طلب دردشة ويتم ترقية الإتصال او
|
|
|
|
|
إعلامه بوجود إتصال [Websocket] مفتوح.
|
|
|
|
|
|
|
|
|
|
#### إذا كانت **سارة** في قائمة **أحمد** البيضاء {#in-white-list-external}
|
|
|
|
|
|
|
|
|
|
سوف يقوم الخادم بترقية الإتصال إلى [Websocket] او إذا كانت **سارة** متصلة معه من
|
|
|
|
|
قبل، سوف يقوم بإرجاع 400 ويخبر **سارة** بالتواصل معه عبر ال [Websocket].
|
|
|
|
|
|
|
|
|
|
#### إذا كانت **سارة** في قائمة **أحمد** السوداء او كانت هي او خادمها في قائمة الخادم السوداء {#in-black-list-external}
|
|
|
|
|
|
2024-06-02 22:36:59 +02:00
|
|
|
|
سوف يرجع الخادم 403 مع توضيح السبب.
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
#### أساسيات التواصل الخارجي {#external-communication-basics}
|
|
|
|
|
|
|
|
|
|
- يجب على **سارة** فتح إتصال [Websocket] مع جميع الخوادم التي تريد التواصل مع
|
2024-06-02 22:36:59 +02:00
|
|
|
|
افرادها.
|
2024-10-12 15:25:25 +02:00
|
|
|
|
- لايتم تخزين الرسائل الخارجية التي يستقبلها الخادم بشكل دائم، يتم تخزينها فقط
|
|
|
|
|
إذا لم يكن **أحمد** متصل بالخادم، ويتم مسحها بعد إرسالها إلى **أحمد**.
|
|
|
|
|
- الرسائل والملفات تكون مشفرة بين **سارة** و **أحمد** وتكون موقعة للخادم المراد
|
|
|
|
|
التواصل مع افراده.
|
|
|
|
|
|
|
|
|
|
## شكر و تقدير {#acknowledgment}
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-06-03 22:25:52 +02:00
|
|
|
|
شكراً للأشخاص التاليين على مراجعة و تحسين البروتوكول.
|
2024-10-12 15:25:25 +02:00
|
|
|
|
|
2024-06-05 08:39:53 +02:00
|
|
|
|
- أمجد الشرفي <<me@amjad.alsharafi.dev>>: تحسين طريقة عمل التوقيع، و أقتراح
|
|
|
|
|
الطريقة الحالية.
|
2024-06-03 22:25:52 +02:00
|
|
|
|
|
2024-06-02 22:36:59 +02:00
|
|
|
|
{{ hr(data_content="وصلات") }}
|
|
|
|
|
|
2024-08-05 16:40:11 +02:00
|
|
|
|
[^1]: لضمان عدم وجود شخص في المنتصف، يقوم بالتلاعب بالبيانات و الإطلاع عليها.
|
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
<!-- -->
|
|
|
|
|
|
2024-08-05 16:13:10 +02:00
|
|
|
|
[^2]: طالما انك عضو في الخادم، سوف يعتقد الخادم دائماً انك في إتصال [Websocket] معه، ولن يقوم بترقية أي إتصال إلى [Websocket]
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
<!-- -->
|
2024-06-03 10:39:59 +02:00
|
|
|
|
|
2024-10-12 15:25:25 +02:00
|
|
|
|
[^3]: يتم إضافة العنوان الخاص بـ**أحمد** في جدول طلبات الدردشة المُرسلة للتاكد من عدم إستقبال إشعارات قبول/رفض مزيفة هدفها الإزعاج.
|
2024-06-02 22:36:59 +02:00
|
|
|
|
|
|
|
|
|
[Websocket]: https://en.wikipedia.org/wiki/WebSocket
|
2024-06-03 22:25:52 +02:00
|
|
|
|
[HMAC-SHA256]: https://en.wikipedia.org/wiki/HMAC
|
2024-10-12 15:25:25 +02:00
|
|
|
|
[مفتاح التشفير المشترك]: #shared-encryption-key
|
2024-06-02 22:36:59 +02:00
|
|
|
|
[Hex]: https://en.wikipedia.org/wiki/Hexadecimal
|
|
|
|
|
[Unix Time]: https://en.wikipedia.org/wiki/Unix_time
|
|
|
|
|
[AES-256 CBC]: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
|
|
|
|
|
[Sha256]: https://en.wikipedia.org/wiki/SHA-2
|
|
|
|
|
[HKDF]: https://en.wikipedia.org/wiki/HKDF
|
|
|
|
|
[base58]: https://bitcoinwiki.org/wiki/base58
|
|
|
|
|
[Elliptic Curve Diffie-Hellman]: https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman
|