Compare commits
4 commits
4dd4c8490b
...
e4b310fc1c
Author | SHA1 | Date | |
---|---|---|---|
e4b310fc1c | |||
6f410a82f1 | |||
17956a9ff6 | |||
c71dbeda6b |
5 changed files with 123 additions and 57 deletions
30
README.md
30
README.md
|
@ -1,19 +1,24 @@
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<img src="https://otmp.4rs.nl/otmp_logo.png" alt="OTMP Logo" width="100" height="100">
|
||||||
|
|
||||||
# OxideTalis Messaging Protocol (OTMP)
|
# OxideTalis Messaging Protocol (OTMP)
|
||||||
|
|
||||||
A simple site explaining the OxideTalis Messaging Protocol (OTMP).
|
A simple site explaining the OxideTalis Messaging Protocol (OTMP).
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
## How to view the site?
|
## How to view the site?
|
||||||
There are three ways to view the site, you can choose any of them
|
There are three ways to view the site, you can choose any of them
|
||||||
|
|
||||||
### View the site online (if available)
|
### View the site online (if available)
|
||||||
You can view the site online by visiting the following link: [https://otmp.4rs.nl](https://otmp.4rs.nl)
|
You can view the site online by visiting the following link:
|
||||||
|
[https://otmp.4rs.nl](https://otmp.4rs.nl)
|
||||||
|
|
||||||
### Build the site locally
|
### Build the site locally
|
||||||
You can build the site locally by following the steps below:
|
You can build the site locally by following the steps below:
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE] My current zola version is `0.18.0`.
|
||||||
> My current zola version is `0.18.0`.
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Clone the repository
|
# Clone the repository
|
||||||
|
@ -29,10 +34,12 @@ The site will be built in the `public` directory (you can view it by opening the
|
||||||
```
|
```
|
||||||
|
|
||||||
### `site` branch
|
### `site` branch
|
||||||
You can view the site by visiting the `site` branch of the repository. The site is built and pushed to the `site` branch automatically by the CI pipeline.
|
You can view the site by visiting the `site` branch of the repository. The site
|
||||||
|
is built and pushed to the `site` branch automatically by the CI pipeline.
|
||||||
|
|
||||||
## How to contribute?
|
## How to contribute?
|
||||||
Write changes can be made at `templates` directory. You can't change the `content` directory as it contains the protocol itself.
|
Write changes can be made at `templates` directory. You can't change the
|
||||||
|
`content` directory as it contains the protocol itself.
|
||||||
|
|
||||||
You can open an issue to write a comments or suggestions about the protocol.
|
You can open an issue to write a comments or suggestions about the protocol.
|
||||||
|
|
||||||
|
@ -41,8 +48,19 @@ Simple script to build the site and push it to GitHub pages.
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
This **site** is built on top of Ahmed Alaa [no-style-please](https://gitlab.com/atgumx/no-style-please) theme, with some modifications, you can view the changes at the `templates` directory by running the following command:
|
### Theme
|
||||||
|
This **site** is built on top of Ahmed Alaa
|
||||||
|
[no-style-please](https://gitlab.com/atgumx/no-style-please) theme, with some
|
||||||
|
modifications, you can view the changes at the `templates` directory by running
|
||||||
|
the following command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git log --author="Awiteb <a@4rs.nl>" -p templates
|
git log --author="Awiteb <a@4rs.nl>" -p templates
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Logo
|
||||||
|
The orignal logo is designed by [Lorc](https://lorcblog.blogspot.com/) under [CC
|
||||||
|
BY 3.0](http://creativecommons.org/licenses/by/3.0/) license. The logo is
|
||||||
|
modified by [Awiteb](https://4rs.nl), you can view the changes at the
|
||||||
|
`static/otmp_logo.png` file. The original logo can be found at
|
||||||
|
[game-icons.net](https://game-icons.net/1x1/lorc/atomic-slashes.html).
|
|
@ -15,7 +15,7 @@ taxonomies = [
|
||||||
highlight_code = true
|
highlight_code = true
|
||||||
|
|
||||||
[extra]
|
[extra]
|
||||||
logo = "/otmp_en.png"
|
logo = "/otmp_logo.svg"
|
||||||
ar_footer_nav = [
|
ar_footer_nav = [
|
||||||
{name = "البريد الإلكتروني", url = "mailto:a@4rs.nl", new_tab = true},
|
{name = "البريد الإلكتروني", url = "mailto:a@4rs.nl", new_tab = true},
|
||||||
{name = "مفتاح PGP", url = "/pgp.asc", new_tab = true},
|
{name = "مفتاح PGP", url = "/pgp.asc", new_tab = true},
|
||||||
|
|
|
@ -16,10 +16,9 @@ add_toc = true
|
||||||
|
|
||||||
## نظرة عامة
|
## نظرة عامة
|
||||||
بروتوكول OxideTalis هو بروتوكول تواصل بين طرفين بتشفير تام من طرف إلى طرف عبر
|
بروتوكول OxideTalis هو بروتوكول تواصل بين طرفين بتشفير تام من طرف إلى طرف عبر
|
||||||
مفتاح تشفير مشترك بينهم، يهدف البروتوكول إلى توفير سهولة التنقل من خادم إلى أخر بشكل إفتراضي
|
مفتاح تشفير مشترك بينهم، يهدف البروتوكول إلى توفير سهولة التنقل من خادم إلى أخر
|
||||||
والتواصل مع الافراد بغض النظر عن خوادمهم، ويهدف
|
بشكل إفتراضي وتوفير طريقة للتواصل بين الافراد في خوادم مختلفة بشكل مباشر بدون
|
||||||
البروتوكول أيضاً على توفير طريقة للتواصل بين الافراد في خوادم مختلفة بشكل مباشر
|
تواصل خادم المرسل وخادم المستقبل مع بعضهم البعض.
|
||||||
بدون تواصل خادم المرسل وخادم المستقبل مع بعضهم البعض.
|
|
||||||
|
|
||||||
### الاهداف
|
### الاهداف
|
||||||
- تواصل آمن بين طرفين مُشفر من ند إلى ند.
|
- تواصل آمن بين طرفين مُشفر من ند إلى ند.
|
||||||
|
@ -39,11 +38,14 @@ add_toc = true
|
||||||
مضغوط وهو يتكون من 33 بايت (264 بت) يتم ترميزه بترميز [base58] على سبيل المثال
|
مضغوط وهو يتكون من 33 بايت (264 بت) يتم ترميزه بترميز [base58] على سبيل المثال
|
||||||
العنوان التالي `becZJsZZqGR7qBG8t1Pm4uy62jDTzJsabxnkARhr2syo`.
|
العنوان التالي `becZJsZZqGR7qBG8t1Pm4uy62jDTzJsabxnkARhr2syo`.
|
||||||
|
|
||||||
يتم وضع العنوان العام في رأس (Header) الطلب (Request) بأسم `X-OTMP-PUBLIC` او في بيانات ال [Websocket] في المفتاح `public_key` ويجب
|
يتم وضع العنوان العام في رأس (Header) الطلب (Request) بأسم `X-OTMP-PUBLIC` او في
|
||||||
ان يكون نص [base58] صحيح مكون من 33 بايت (264 بت).
|
بيانات ال [Websocket] في المفتاح `public_key` ويجب ان يكون نص [base58] صحيح مكون
|
||||||
|
من 33 بايت (264 بت).
|
||||||
|
|
||||||
> يجب على الخوادم عدم تخزين اسماء خوادم المرسلين الخارجيين، ويتم تحديده في الطلب المرسل من قبلهم فقط، حيث يعتبر المفتاح العام هو المعرف المشترك بين جميع الخوادم.
|
> يجب على الخوادم عدم تخزين اسماء خوادم المرسلين الخارجيين، ويتم تحديده في الطلب
|
||||||
> سوف يوفر هذا سهولة إنتقال الافراد من خادم إلى أخر مع بقاء تعرف الخوادم الاخرى عليهم.
|
> المرسل من قبلهم فقط، حيث يعتبر المفتاح العام هو المعرف المشترك بين جميع
|
||||||
|
> الخوادم. سوف يوفر هذا سهولة إنتقال الافراد من خادم إلى أخر مع بقاء تعرف
|
||||||
|
> الخوادم الاخرى عليهم.
|
||||||
|
|
||||||
## أسم الخادم
|
## أسم الخادم
|
||||||
أسم الخادم هو نطاق إلكتروني طبيعي، على سبيل المثال `example.com` ويتم جلب عنوان
|
أسم الخادم هو نطاق إلكتروني طبيعي، على سبيل المثال `example.com` ويتم جلب عنوان
|
||||||
|
@ -62,7 +64,8 @@ add_toc = true
|
||||||
حيث يتم وضع نقطتان رأسيتان `:` بين عنوان الخادم والمنفذ الذي يستمع إليه. سيسهل
|
حيث يتم وضع نقطتان رأسيتان `:` بين عنوان الخادم والمنفذ الذي يستمع إليه. سيسهل
|
||||||
هذا من جعل أسماء الخوادم سهلة التذكر والكتابة.
|
هذا من جعل أسماء الخوادم سهلة التذكر والكتابة.
|
||||||
|
|
||||||
يتم وضع اسم خادم المرسل في رأس الطلب بأسم `X-OTMP-SERVER` ويجب ان يكون اسم الخادم فقط، على سبيل المثال `example.com`.
|
يتم وضع اسم خادم المرسل في رأس الطلب بأسم `X-OTMP-SERVER` ويجب ان يكون اسم
|
||||||
|
الخادم فقط، على سبيل المثال `example.com`.
|
||||||
|
|
||||||
## مفتاح التشفير المشترك
|
## مفتاح التشفير المشترك
|
||||||
يتم انشاء مفتاح التشفير المشترك عبر خوارزمية [Elliptic Curve Diffie-Hellman] حيث
|
يتم انشاء مفتاح التشفير المشترك عبر خوارزمية [Elliptic Curve Diffie-Hellman] حيث
|
||||||
|
@ -72,9 +75,9 @@ add_toc = true
|
||||||
32 بايت (256 بت).
|
32 بايت (256 بت).
|
||||||
|
|
||||||
### التشفير
|
### التشفير
|
||||||
سوف يتم استخدام [مفتاح التشفير المشترك] مفتاحاً للتشفير في خوارزمية
|
سوف يتم استخدام [مفتاح التشفير المشترك] مفتاحاً للتشفير في خوارزمية [AES-256
|
||||||
[AES-256 CBC]، بعد تشفير الرسالة يتم وضع قيمة التهيئة (iv) في أخر الرسالة، ليكون
|
CBC]، بعد تشفير الرسالة يتم وضع قيمة التهيئة (iv) في أخر الرسالة، ليكون اخر 16
|
||||||
اخر 16 بايت (128 بت) هي قيمة التهيئة (iv) التي سوف يستخدمها المستقبِل لفك تشفير
|
بايت (128 بت) هي قيمة التهيئة (iv) التي سوف يستخدمها المستقبِل لفك تشفير
|
||||||
الرسالة.
|
الرسالة.
|
||||||
|
|
||||||
مثال لمفتاح تشفير مشترك بترميز [base58]\
|
مثال لمفتاح تشفير مشترك بترميز [base58]\
|
||||||
|
@ -93,40 +96,52 @@ add_toc = true
|
||||||
> يقومون بتخزينه بالعادة.
|
> يقومون بتخزينه بالعادة.
|
||||||
|
|
||||||
## توقيع الطلب
|
## توقيع الطلب
|
||||||
هو التوقيع الخاص بالطلب يتم وضعه في رأس الطلب (Header) بأسم `X-OTMP-SIGNATURE` او في بيانات ال [Websocket] في المفتاح `signature`
|
هو التوقيع الخاص بالطلب يتم وضعه في رأس الطلب (Header) بأسم `X-OTMP-SIGNATURE`
|
||||||
بترميز [Hex] ويتم أستخدامه للتأكد من ان مرسل الطلب هو مالك المفتاح العام.
|
او في بيانات ال [Websocket] في المفتاح `signature` بترميز [Hex] ويتم أستخدامه
|
||||||
|
للتأكد من ان مرسل الطلب هو مالك المفتاح العام.
|
||||||
|
|
||||||
### إنشاء التوقيع
|
### إنشاء التوقيع
|
||||||
التوقيع يحتاج إلى ثلاث اشياء ليتم إنشائه
|
التوقيع يحتاج إلى ثلاث اشياء ليتم إنشائه
|
||||||
- مفتاح التشفير المشترك.
|
- مفتاح التشفير المشترك.
|
||||||
- جسم الطلب (body) او بيانات الحدث (data).
|
- جسم الطلب (body) او بيانات الحدث (data).
|
||||||
- ثواني الوقت الحالي للمنطقة الزمنية UTC بتنسيق [Unix Time] (8 بايت أي 64 بت **big-endian**).
|
- ثواني الوقت الحالي للمنطقة الزمنية UTC بتنسيق [Unix Time] (8 بايت أي 64 بت
|
||||||
|
**big-endian**).
|
||||||
- 16 بايت عشوائي (128 بت).
|
- 16 بايت عشوائي (128 بت).
|
||||||
|
|
||||||
يتم إدخال جسم الطلب (body) او بيانات الحدث في الـ[Websocket] إلى دالة [HMAC-SHA256] و إستخدام [مفتاح التشفير المشترك] مضافاً إليه الوقت الحالي (8 بايت) و الـ16 بايت العشوائي، أي المفتاح المستخدم في دالة [HMAC-SHA256] سوف يكون
|
يتم إدخال جسم الطلب (body) او بيانات الحدث في الـ[Websocket] إلى دالة
|
||||||
|
[HMAC-SHA256] و إستخدام [مفتاح التشفير المشترك] مضافاً إليه الوقت الحالي (8
|
||||||
|
بايت) و الـ16 بايت العشوائي، أي المفتاح المستخدم في دالة [HMAC-SHA256] سوف يكون
|
||||||
|
|
||||||
```
|
```
|
||||||
مفتاح التشفير المشترك+الوقت الحالي+16 بايت عشوائي
|
مفتاح التشفير المشترك+الوقت الحالي+16 بايت عشوائي
|
||||||
```
|
```
|
||||||
بعد ذلك يتم أخذ نتيجة دالة [HMAC-SHA256] و إضافة الوقت المستخدم في الأعلى و الـ16 بايت المستخدمة في الأعلى و جميعهم بترميز [Hex]، مثال
|
بعد ذلك يتم أخذ نتيجة دالة [HMAC-SHA256] و إضافة الوقت المستخدم في الأعلى و
|
||||||
|
الـ16 بايت المستخدمة في الأعلى و جميعهم بترميز [Hex]، مثال
|
||||||
|
|
||||||
```
|
```
|
||||||
bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66
|
bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66
|
||||||
```
|
```
|
||||||
بعد تحويله إلى بايتات سوف يكون المجموع 56 بايت، وسوف يكون التقسيم كالتالي
|
بعد تحويله إلى بايتات سوف يكون المجموع 56 بايت، وسوف يكون التقسيم كالتالي
|
||||||
- مخرج دالة [HMAC-SHA256]: من بايت 0 إلى بايت31. (التوقيع الذي سوف يتحقق منه الخادم)
|
- مخرج دالة [HMAC-SHA256]: من بايت 0 إلى بايت31. (التوقيع الذي سوف يتحقق منه
|
||||||
- الوقت: من بايت 32 إلى بايت 39. (الذي سوف يتم إضافته بعد [مفتاح التشفير المشترك])
|
الخادم)
|
||||||
|
- الوقت: من بايت 32 إلى بايت 39. (الذي سوف يتم إضافته بعد [مفتاح التشفير
|
||||||
|
المشترك])
|
||||||
- ال 16 بايت العشوائي: من بايت 40 إلى بايت 55. (سوف يتم إضافته بعد الوقت)
|
- ال 16 بايت العشوائي: من بايت 40 إلى بايت 55. (سوف يتم إضافته بعد الوقت)
|
||||||
|
|
||||||
سوف يتحقق الخادم من أن الوقت الذي في التوقيع لم يتجاوز الـ20 ثانية، وسوف يقوم الخادم بتخزين ال 16 بايت العشوائي في الكاش بمدة حياة 30 ثانية، ليتأكد الخادم من ان ال 16 بايت العشوائي لن يتم إستخدامهم في توقيع أخر، بالتالي ضمان عدم إرسال الطلب مرة أخرى من المهاجمين (ضمان أن التوقيع صالح لمرة واحدة فقط).
|
سوف يتحقق الخادم من أن الوقت الذي في التوقيع لم يتجاوز الـ20 ثانية، وسوف يقوم
|
||||||
|
الخادم بتخزين ال 16 بايت العشوائي في الكاش بمدة حياة 30 ثانية، ليتأكد الخادم من
|
||||||
|
ان ال 16 بايت العشوائي لن يتم إستخدامهم في توقيع أخر، بالتالي ضمان عدم إرسال
|
||||||
|
الطلب مرة أخرى من المهاجمين (ضمان أن التوقيع صالح لمرة واحدة فقط).
|
||||||
|
|
||||||
### شكل البيانات داخل إتصال الـWebsocket
|
### شكل البيانات داخل إتصال الـWebsocket
|
||||||
بعد الإتصال بـ[Websocket] مع الخادم، سوف يكون تنسيق البيانات التي يتم تبادلها بين المرسل والخادم json ويجب عليها توفر المفاتيح التالية
|
بعد الإتصال بـ[Websocket] مع الخادم، سوف يكون تنسيق البيانات التي يتم تبادلها
|
||||||
|
بين المرسل والخادم json ويجب عليها توفر المفاتيح التالية
|
||||||
|
|
||||||
- `event`: إسم الحدث، على سبيل المثال إرسال رسالة او تحديث حالة الكتابة.
|
- `event`: إسم الحدث، على سبيل المثال إرسال رسالة او تحديث حالة الكتابة.
|
||||||
- `data`: البيانات الخاصة بالحدث.
|
- `data`: البيانات الخاصة بالحدث.
|
||||||
- `public_key`: وهو العنوان العام الخاص بالمرسل.
|
- `public_key`: وهو العنوان العام الخاص بالمرسل.
|
||||||
- `signature`: توقيع بيانات الحدث (data)، هذا التوقيع يكون بين المرسل وبين الخادم وليس المُستقبل.
|
- `signature`: توقيع بيانات الحدث (data)، هذا التوقيع يكون بين المرسل وبين
|
||||||
|
الخادم وليس المُستقبل.
|
||||||
|
|
||||||
ليكون الشكل النهائي كالتالي (مثال)
|
ليكون الشكل النهائي كالتالي (مثال)
|
||||||
|
|
||||||
|
@ -146,11 +161,13 @@ bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a69
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
> يمكن للخادم طلب أي شكل من البيانات، ويمكنه طلب منك بعض القيم مشفرة بينك وبينه (مثل عنوان المُستقبل) ولكن يجب على المعلومات الحساسة مثل الرسالة او الملف أن يكون مشفر بينك وبين المُستقبل فقط.
|
> يمكن للخادم طلب أي شكل من البيانات، ويمكنه طلب منك بعض القيم مشفرة بينك وبينه
|
||||||
|
> (مثل عنوان المُستقبل) ولكن يجب على المعلومات الحساسة مثل الرسالة او الملف أن
|
||||||
|
> يكون مشفر بينك وبين المُستقبل فقط.
|
||||||
|
|
||||||
## طريقة التواصل
|
## طريقة التواصل
|
||||||
هنا سوف يتم توضيح طريقة التواصل بين طرفين في خادم واحد (تواصل داخلي)، وبين
|
هنا سوف يتم توضيح طريقة التواصل بين طرفين في خادم واحد (تواصل داخلي)، وبين طرفين
|
||||||
طرفين في خوادم مختلفة (تواصل خارجي)
|
في خوادم مختلفة (تواصل خارجي)
|
||||||
|
|
||||||
### مفاهيم مهمة
|
### مفاهيم مهمة
|
||||||
- التواصل الداخلي: هو تواصل طرفين في الخادم نفسه.
|
- التواصل الداخلي: هو تواصل طرفين في الخادم نفسه.
|
||||||
|
@ -159,57 +176,75 @@ bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a69
|
||||||
المسموح لهم بمراسلته.
|
المسموح لهم بمراسلته.
|
||||||
- القائمة السوداء: هي قائمة يمتلكها كل مستخدم في الخادم يوجد بها المستخدمين
|
- القائمة السوداء: هي قائمة يمتلكها كل مستخدم في الخادم يوجد بها المستخدمين
|
||||||
الغير مسموح لهم بمراسلته.
|
الغير مسموح لهم بمراسلته.
|
||||||
- قائمة الخادم السوداء: هي قائمة يقوم بوضعها مالك الخادم ليمنع خادمه من التواصل مع خوادم محددة او اشخاص محددين.
|
- قائمة الخادم السوداء: هي قائمة يقوم بوضعها مالك الخادم ليمنع خادمه من التواصل
|
||||||
|
مع خوادم محددة او اشخاص محددين.
|
||||||
- جدول الإتصالات الخارجية: هو جدول يتم حفظ به الرسائل الخارجية التي وصلت إلى
|
- جدول الإتصالات الخارجية: هو جدول يتم حفظ به الرسائل الخارجية التي وصلت إلى
|
||||||
المستخدم عندما لم يكن متصل بالخادم، ويتم مسحها بعد إرسالها له.
|
المستخدم عندما لم يكن متصل بالخادم، ويتم مسحها بعد إرسالها له.
|
||||||
- جدول طلبات الدردشة: هو جدول يتضمن طلبات الدردشة التي قاموا بإرسالها او إستقبالها افراد الخادم إلى/من افراد اخرين في نفس الخادم او في خوادم أخرى، ويتم مسح الطلب بعد وصول قبوله او رفضه. يتم الإستفادة من هذا الجدول لعدم إستقبال إشعارات قبول او رفض مزيفة.
|
- جدول طلبات الدردشة: هو جدول يتضمن طلبات الدردشة التي قاموا بإرسالها او
|
||||||
|
إستقبالها افراد الخادم إلى/من افراد اخرين في نفس الخادم او في خوادم أخرى، ويتم
|
||||||
|
مسح الطلب بعد وصول قبوله او رفضه. يتم الإستفادة من هذا الجدول لعدم إستقبال
|
||||||
|
إشعارات قبول او رفض مزيفة.
|
||||||
|
|
||||||
> سوف يتم استبدال العنوان العام بأسم Alice و Bob لآن العناوين العامة طويلة
|
> سوف يتم استبدال العنوان العام بأسم Alice و Bob لآن العناوين العامة طويلة
|
||||||
> نسبياً
|
> نسبياً
|
||||||
|
|
||||||
### التواصل الداخلي
|
### التواصل الداخلي
|
||||||
اولاً **يجب**[^1] عند فتحك لعميل التواصل أن تقوم بإنشاء تواصل [Websocket] بينك وبين الخادم
|
اولاً **يجب**[^1] عند فتحك لعميل التواصل أن تقوم بإنشاء تواصل [Websocket] بينك
|
||||||
الخاص بك، عبر هذا الإتصال سوف تستقبل الرسائل الجديدة من الخادم الخاص بك، وسوف
|
وبين الخادم الخاص بك، عبر هذا الإتصال سوف تستقبل الرسائل الجديدة من الخادم الخاص
|
||||||
تقوم بالتواصل من خلاله لإرسال الرسائل إلى افراد الخادم.
|
بك، وسوف تقوم بالتواصل من خلاله لإرسال الرسائل إلى افراد الخادم.
|
||||||
|
|
||||||
لدينا الآن المرسل alice والمستقبِل bob و كلاهم في الخادم نفسه، سوف يقوم
|
لدينا الآن المرسل alice والمستقبِل bob و كلاهم في الخادم نفسه، سوف يقوم alice
|
||||||
alice بإرسال طلب Get إلى الخادم يطلب فيه الدردشة مع bob، سوف يرد الخادم بأحد الردود التالية إعتماداً
|
بإرسال طلب Get إلى الخادم يطلب فيه الدردشة مع bob، سوف يرد الخادم بأحد الردود
|
||||||
على حالة alice
|
التالية إعتماداً على حالة alice
|
||||||
|
|
||||||
#### إذا لم يكن هناك مستخدم بأسم bob في الخادم
|
#### إذا لم يكن هناك مستخدم بأسم bob في الخادم
|
||||||
سوف يرجع الخادم 404 و يُعلم alice بأنه ليس لديه مستخدم بهذا الأسم.
|
سوف يرجع الخادم 404 و يُعلم alice بأنه ليس لديه مستخدم بهذا الأسم.
|
||||||
|
|
||||||
#### إذا لم يكن alice في قائمة bob البيضاء ولا السوداء
|
#### إذا لم يكن alice في قائمة bob البيضاء ولا السوداء
|
||||||
سوف يقوم الخادم اولاً بإضافة bob إلى قائمة alice البيضاء، وبعد ذلك إضافة الطلب في جدول طلبات الدردشة **المُستقبلة** بالنسبة لـbob وسوف يضيفه إلى **المُرسلة** بالنسبة إلى alice ويرجع 200 ويقوم بإرسال طلب الدردشة إلى bob وينتظر رد bob، عندما يرد
|
سوف يقوم الخادم اولاً بإضافة bob إلى قائمة alice البيضاء، وبعد ذلك إضافة الطلب
|
||||||
bob بالموافقة ام الرفض (عبر إتصال ال [Websocket])، سوف يُعلم الخادم alice بأن
|
في جدول طلبات الدردشة **المُستقبلة** بالنسبة لـbob وسوف يضيفه إلى **المُرسلة**
|
||||||
bob وافق او رفض التواصل معه (عبر إتصال الـ [Websocket] او إضافته إلى جدول ليعلمه عند تواصله مع الخادم). إذا لم يوافق bob سوف
|
بالنسبة إلى alice ويرجع 200 ويقوم بإرسال طلب الدردشة إلى bob وينتظر رد bob،
|
||||||
يقوم الخادم بإضافة alice إلى قائمة bob السوداء، و إذا وافق سوف يتم إضافته إلى القائمة البيضاء.
|
عندما يرد bob بالموافقة ام الرفض (عبر إتصال ال [Websocket])، سوف يُعلم الخادم
|
||||||
|
alice بأن bob وافق او رفض التواصل معه (عبر إتصال الـ [Websocket] او إضافته إلى
|
||||||
|
جدول ليعلمه عند تواصله مع الخادم). إذا لم يوافق bob سوف يقوم الخادم بإضافة alice
|
||||||
|
إلى قائمة bob السوداء، و إذا وافق سوف يتم إضافته إلى القائمة البيضاء.
|
||||||
|
|
||||||
#### إذا كان alice في قائمة bob البيضاء
|
#### إذا كان alice في قائمة bob البيضاء
|
||||||
سوف يرجع الخادم 400 و يُعلم alice بأنه يمكنه مراسلة bob بشكل مباشر عبر إتصال الـ[Websocket].
|
سوف يرجع الخادم 400 و يُعلم alice بأنه يمكنه مراسلة bob بشكل مباشر عبر إتصال
|
||||||
|
الـ[Websocket].
|
||||||
|
|
||||||
#### إذا كان alice في قائمة bob السوداء
|
#### إذا كان alice في قائمة bob السوداء
|
||||||
سوف يرجع الخادم 403 و يُعلم alice انه في قائمة bob السوداء ولا يمكنه الدردشة معه.
|
سوف يرجع الخادم 403 و يُعلم alice انه في قائمة bob السوداء ولا يمكنه الدردشة
|
||||||
|
معه.
|
||||||
|
|
||||||
> يتم تخزين رسائل الطرفين مُشفرة في قاعدة البيانات الخاصة بالخادم
|
> يتم تخزين رسائل الطرفين مُشفرة في قاعدة البيانات الخاصة بالخادم
|
||||||
|
|
||||||
### التواصل الخارجي
|
### التواصل الخارجي
|
||||||
لدينا الآن المرسل alice من `example1.com` والمستقبِل bob من `example2.com` سوف يقوم
|
لدينا الآن المرسل alice من `example1.com` والمستقبِل bob من `example2.com` سوف
|
||||||
alice بإرسال طلب Get إلى `example2.com` يطلب فيه الدردشة مع bob، سوف يرد الخادم
|
يقوم alice بإرسال طلب Get إلى `example2.com` يطلب فيه الدردشة مع bob، سوف يرد
|
||||||
بأحد الردود التالية
|
الخادم بأحد الردود التالية
|
||||||
|
|
||||||
#### إذا لم يكن هناك مستخدم بأسم bob في الخادم
|
#### إذا لم يكن هناك مستخدم بأسم bob في الخادم
|
||||||
سوف يرجع الخادم 404 و يُعلم alice بأنه ليس لديه مستخدم بهذا الأسم.
|
سوف يرجع الخادم 404 و يُعلم alice بأنه ليس لديه مستخدم بهذا الأسم.
|
||||||
|
|
||||||
#### إذا لم يكن alice في قائمة bob البيضاء ولا السوداء
|
#### إذا لم يكن alice في قائمة bob البيضاء ولا السوداء
|
||||||
سوف يقوم خادم bob بإرسال طلب الدردشة إلى bob او يقوم بتخزين الطلب في جدول طلبات الدردشة **المٌستقبلة**، ويرد عليه بـ200، بعد ذلك يقوم alice بطلب الخادم الخاص به من إضافة bob إلى قائمته البيضاء ليستقبل منه الرسائل مستقبلاً بدون حاجة bob إرسال طلب دردشة وإنتظار قبولها، سوف يقوم alice ايضاً بطلب الخادم من إضافة bob إلى جدول طلبات الدردشة **المُرسلة** ويتم تضمين خادم bob الحالي الذي تم إرسال طلب الدردشة إليه[^2]
|
سوف يقوم خادم bob بإرسال طلب الدردشة إلى bob او يقوم بتخزين الطلب في جدول طلبات
|
||||||
|
الدردشة **المٌستقبلة**، ويرد عليه بـ200، بعد ذلك يقوم alice بطلب الخادم الخاص به
|
||||||
|
من إضافة bob إلى قائمته البيضاء ليستقبل منه الرسائل مستقبلاً بدون حاجة bob إرسال
|
||||||
|
طلب دردشة وإنتظار قبولها، سوف يقوم alice ايضاً بطلب الخادم من إضافة bob إلى جدول
|
||||||
|
طلبات الدردشة **المُرسلة** ويتم تضمين خادم bob الحالي الذي تم إرسال طلب الدردشة
|
||||||
|
إليه[^2]
|
||||||
|
|
||||||
إذا قبل/رفض bob الدردشة سوف يُعلم خادم bob خادم alice أن bob قام بقبول/رفض الدردشة، سوف يضع الخادم التوقيع الخاص به في `X-OTMP-SIGNATURE` وسوف يتم جلب المفتاح العام الخاص به من مسار الخادم[^3] (لقد قام alice بإضافة bob والخادم الخاص به في جدول طلبات الدردشة **المُرسلة** لذالك خادم alice يعلم ماهو خادم bob).
|
إذا قبل/رفض bob الدردشة سوف يُعلم خادم bob خادم alice أن bob قام بقبول/رفض
|
||||||
|
الدردشة، سوف يضع الخادم التوقيع الخاص به في `X-OTMP-SIGNATURE` وسوف يتم جلب
|
||||||
|
المفتاح العام الخاص به من مسار الخادم[^3] (لقد قام alice بإضافة bob والخادم
|
||||||
|
الخاص به في جدول طلبات الدردشة **المُرسلة** لذالك خادم alice يعلم ماهو خادم
|
||||||
|
bob).
|
||||||
|
|
||||||
بعد ذلك إذا لم يكن لـalice إتصال [Websocket] سابق مع خادم bob، سوف يقوم بإرسال طلب دردشة
|
بعد ذلك إذا لم يكن لـalice إتصال [Websocket] سابق مع خادم bob، سوف يقوم بإرسال
|
||||||
ليتم ترقية الإتصال إلى [Websocket]، ونفس المسئلة مع bob إذا اراد التواصل مع
|
طلب دردشة ليتم ترقية الإتصال إلى [Websocket]، ونفس المسئلة مع bob إذا اراد
|
||||||
alice سوف يقوم بإرسال طلب دردشة ويتم ترقية الإتصال او إعلامه بوجود إتصال
|
التواصل مع alice سوف يقوم بإرسال طلب دردشة ويتم ترقية الإتصال او إعلامه بوجود
|
||||||
[Websocket] مفتوح.
|
إتصال [Websocket] مفتوح.
|
||||||
|
|
||||||
#### إذا كان alice في قائمة bob البيضاء
|
#### إذا كان alice في قائمة bob البيضاء
|
||||||
سوف يقوم الخادم بترقية الإتصال إلى [Websocket] او إذا كان alice متصل معه من قبل،
|
سوف يقوم الخادم بترقية الإتصال إلى [Websocket] او إذا كان alice متصل معه من قبل،
|
||||||
|
@ -228,7 +263,8 @@ alice سوف يقوم بإرسال طلب دردشة ويتم ترقية الإ
|
||||||
|
|
||||||
## شكر و تقدير
|
## شكر و تقدير
|
||||||
شكراً للأشخاص التاليين على مراجعة و تحسين البروتوكول.
|
شكراً للأشخاص التاليين على مراجعة و تحسين البروتوكول.
|
||||||
- أمجد الشرفي <<me@amjad.alsharafi.dev>>: تحسين طريقة عمل التوقيع، و أقتراح الطريقة الحالية.
|
- أمجد الشرفي <<me@amjad.alsharafi.dev>>: تحسين طريقة عمل التوقيع، و أقتراح
|
||||||
|
الطريقة الحالية.
|
||||||
|
|
||||||
{{ hr(data_content="وصلات") }}
|
{{ hr(data_content="وصلات") }}
|
||||||
|
|
||||||
|
|
BIN
static/otmp_logo.png
Normal file
BIN
static/otmp_logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
12
static/otmp_logo.svg
Normal file
12
static/otmp_logo.svg
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<svg viewBox="0 0 512 512" style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientUnits="userSpaceOnUse" x1="257.625" y1="28.597" x2="257.625" y2="441.511" id="gradient-0" spreadMethod="pad" gradientTransform="matrix(0.853694, -0.520775, 0.505956, 0.829404, -74.399602, 183.918722)">
|
||||||
|
<stop offset="0" style="stop-color: rgb(255, 242, 0);"></stop>
|
||||||
|
<stop offset="0.596" style="stop-color: rgb(193, 160, 0);"></stop>
|
||||||
|
<stop offset="1" style="stop-color: rgb(99, 83, 0);"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g class="" transform="translate(-3.272705078125,-14.545455932617188)" style="">
|
||||||
|
<path d="M222.25 51.813c-59.778.797-102.472 36.19-97.47 91.593-175.105 173.99-42.24 388.292 82.72 301.281 234.398 24.897 320.07-138.203 253.688-215.875-68.157-127.71-166.197-177.97-238.938-177zm35.28 54c59.782-.537 138.234 35.254 194.314 113.593-32.668-28.783-91.096-41.137-175.594-17.906 233.673-4.713 159.012 242.056-65.813 241.094 23.605-17.352 46.84-45.562 67.563-86.97-141.047 157.87-264.124-48.664-152.094-203.78 6.14 35.83 31.486 79.165 83.5 126.5-75.762-109.73-29.625-171.834 48.125-172.53zm20.314 112.03c-28.427-.322-54.126 19.32-60.375 48.188-7.143 32.992 13.82 65.547 46.81 72.69 32.992 7.14 65.516-13.823 72.658-46.814 7.14-32.99-13.822-65.545-46.813-72.687-4.124-.894-8.22-1.33-12.28-1.376z" style="fill-rule: evenodd; fill: url(#gradient-0); paint-order: stroke markers;"></path>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
Loading…
Reference in a new issue