499 lines
32 KiB
HTML
499 lines
32 KiB
HTML
<!doctype html>
|
||
<html
|
||
dir="rtl"
|
||
lang="ar-SA"
|
||
>
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
|
||
<meta content="text/html; charset=UTF-8" http-equiv="content-type"/>
|
||
<meta content="width=device-width, initial-scale=1" name="viewport"/>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<title>الأصدار الاول من بروتوكول OxideTalis</title>
|
||
|
||
<meta name="title" content="الأصدار الاول من بروتوكول OxideTalis">
|
||
<meta name="author" content="Awiteb">
|
||
<meta name="description" content="OxideTalis Messaging Protocol (OTMP) specification">
|
||
<meta name="generator" content="Zola v0.16.1">
|
||
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:url" content="https://otmp.4rs.nl/ar/protocol/v1/">
|
||
<meta property="og:site_name" content="OxideTalis Messaging Protocol">
|
||
<meta property="og:title" content="الأصدار الاول من بروتوكول OxideTalis">
|
||
<meta property="og:description" content="OxideTalis Messaging Protocol (OTMP) specification">
|
||
<meta property="og:image" content="https://otmp.4rs.nl/otmp_ar.png">
|
||
|
||
|
||
|
||
<meta property="twitter:card" content="summary_large_image">
|
||
<meta property="twitter:url" content="https://otmp.4rs.nl/ar/protocol/v1/">
|
||
<meta property="twitter:title" content="الأصدار الاول من بروتوكول OxideTalis">
|
||
<meta property="twitter:description" content="OxideTalis Messaging Protocol (OTMP) specification">
|
||
<meta property="twitter:image" content="https://otmp.4rs.nl/otmp_ar.png">
|
||
|
||
|
||
<link rel="canonical" href="https://otmp.4rs.nl/ar/protocol/v1/">
|
||
<link rel="shortcut icon" type="image/x-icon" href="https://otmp.4rs.nl/otmp_logo.svg">
|
||
<script type="application/ld+json">
|
||
{
|
||
"description":"OxideTalis Messaging Protocol (OTMP) specification",
|
||
"url":"https://otmp.4rs.nl/ar/protocol/v1/",
|
||
"@type":"WebSite",
|
||
"headline":"الأصدار الاول من بروتوكول OxideTalis",
|
||
"name":"الأصدار الاول من بروتوكول OxideTalis",
|
||
"author":{
|
||
"@type":"Person",
|
||
"name":"Awiteb"
|
||
},
|
||
"@context":"https://schema.org"
|
||
}
|
||
</script>
|
||
|
||
|
||
|
||
<link rel="alternate" type="application/atom+xml" title="RSS" href="https://otmp.4rs.nl/atom.xml">
|
||
|
||
|
||
|
||
<link rel="stylesheet" href="https://otmp.4rs.nl/style.css"/>
|
||
|
||
</head>
|
||
<body theme="auto">
|
||
<div class="w">
|
||
<header>
|
||
|
||
|
||
|
||
|
||
<nav>
|
||
|
||
<a href="/ar/" >العربية</a>
|
||
|
||
<a href="/" >English</a>
|
||
|
||
</nav>
|
||
|
||
|
||
<h2>الأصدار الاول من بروتوكول OxideTalis</h2>
|
||
|
||
</header>
|
||
<main class="page-content" aria-label="Content">
|
||
|
||
|
||
|
||
جدول المحتويات
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#nzr-m">نظرة عامة</a>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#lhdf">الاهداف</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#lhdf-lgyr-mrgwb">الاهداف الغير مرغوبة</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#l-nwyn-l-m">العناوين العامة</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#sm-lkhdm">أسم الخادم</a>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#kyfy-lshr">كيفية الإشارة</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#mfth-otmp-server">مفتاح otmp_server</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#mthl">مثال</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#mfth-ltshfyr-lmshtrk">مفتاح التشفير المشترك</a>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#ltshfyr">التشفير</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#mfth-lkhdm-l-m">مفتاح الخادم العام</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#twqy-ltlb">توقيع الطلب</a>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#nsh-ltwqy">إنشاء التوقيع</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#shkl-lbynt-dkhl-tsl-lwebsocket">شكل البيانات داخل إتصال الـWebsocket</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#tryq-ltwsl">طريقة التواصل</a>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#mfhym-mhm">مفاهيم مهمة</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#ltwsl-ldkhly">التواصل الداخلي</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#ltwsl-lkhrjy">التواصل الخارجي</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://otmp.4rs.nl/ar/protocol/v1/#shkr-w-tqdyr">شكر و تقدير</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
|
||
<p><small>المؤلف: <a href="https://4rs.nl">عويتب</a></small><br />
|
||
<small>التاريخ: 2024/6/1</small><br />
|
||
<small>الاصدار: 1.0.0</small><br />
|
||
<small>الحالة: مسودة</small></p>
|
||
<h2 id="nzr-m">نظرة عامة</h2>
|
||
<p>بروتوكول OxideTalis هو بروتوكول تواصل بين طرفين بتشفير تام من طرف إلى طرف عبر
|
||
مفتاح تشفير مشترك بينهم، يهدف البروتوكول إلى توفير سهولة التنقل من خادم إلى أخر
|
||
بشكل إفتراضي وتوفير طريقة للتواصل بين الافراد في خوادم مختلفة بشكل مباشر بدون
|
||
تواصل خادم المرسل وخادم المستقبل مع بعضهم البعض.</p>
|
||
<h3 id="lhdf">الاهداف</h3>
|
||
<ul>
|
||
<li>تواصل آمن بين طرفين مُشفر من ند إلى ند.</li>
|
||
<li>سهولة التنفيذ.</li>
|
||
<li>امكانية الإنتقال إلى خادم آخر.</li>
|
||
<li>امكانية التواصل مع اطراف خارج الخادم الخاص بالمرسل.</li>
|
||
<li>عدم الحاجة لتواصل المرسل مع الخادم الخاص به للتواصل مع اشخاص خارج الخادم.</li>
|
||
<li>عدم الحاجة ﻷسم مستخدم وكلمة مرور لتخويل المسخدم للمراسلة، والاكتفاء بالعنوان
|
||
العام الخاص به.</li>
|
||
</ul>
|
||
<h3 id="lhdf-lgyr-mrgwb">الاهداف الغير مرغوبة</h3>
|
||
<ul>
|
||
<li>التواصل الجماعي.</li>
|
||
<li>المكالمات الصوتية أو الفيديو.</li>
|
||
</ul>
|
||
<h2 id="l-nwyn-l-m">العناوين العامة</h2>
|
||
<p>العنوان العام هو المفتاح العام الخاص بخوارزمية <a href="https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman">Elliptic Curve Diffie-Hellman</a>
|
||
مضغوط وهو يتكون من 33 بايت (264 بت) يتم ترميزه بترميز <a href="https://bitcoinwiki.org/wiki/base58">base58</a> على سبيل المثال
|
||
العنوان التالي <code>becZJsZZqGR7qBG8t1Pm4uy62jDTzJsabxnkARhr2syo</code>.</p>
|
||
<p>يتم وضع العنوان العام في رأس (Header) الطلب (Request) بأسم <code>X-OTMP-PUBLIC</code> ويجب ان يكون نص <a href="https://bitcoinwiki.org/wiki/base58">base58</a> صحيح مكون من 33 بايت (264 بت).</p>
|
||
<h2 id="sm-lkhdm">أسم الخادم</h2>
|
||
<p>يكون أسم الخادم عنوان إلكتروني مثل <code>example.com</code> ولا يجب أن يكون الخادم نفسه، هو
|
||
أسم فقط يشير إلى الخادم، على سبيل المثال، أسم الخادم <code>example.com</code> ولكن الخادم
|
||
هو <code>otmp.example.com:443</code>، هكذا سوف يتم الإشارة لى مستخدمين هذا الخادم <snap
|
||
dir='ltr'><code>@becZJsZZqGR7qBG8t1Pm4uy62jDTzJsabxnkARhr2syo/example.com</code></snap>
|
||
ويمكن إختصاره بالواجهات الرسومية بأخذ أول ثلاث أحرف و أخر ثلاث أحرف ووضع <code>..</code>
|
||
بينهم، ليصبح بهذا الشكل <snap
|
||
dir='ltr'><code>@bec..syo/example.com</code></snap>.</p>
|
||
<h3 id="kyfy-lshr">كيفية الإشارة</h3>
|
||
<p>يشير أسم الخادم إلى الخادم عبر المسار التالي <span
|
||
dir='ltr'><code>/.well-known/oxidetalis/server</code></span></p>
|
||
<p>سوف يتم إرسال طلب GET إلى هذا المسار و يجب أن يُرجع هذا المسار نص بتنسيق
|
||
<code>application/json</code> يحتوي على المفتاح <code>otmp_server</code> ولذي يحتوي على مكان إستضافة
|
||
الخادم والمنفذ الذي يستمع إليه، سوف يتم إرسال الطلب ببروتوكول https و يجب أن
|
||
يدعم الخادم https و يجب ان تكون الشهادة موقعة من جهة موثوقة وليست موقعة
|
||
ذاتياً<sup class="footnote-reference"><a href="#1">1</a></sup></p>
|
||
<h3 id="mfth-otmp-server">مفتاح <code>otmp_server</code></h3>
|
||
<p>محتوى هذا المفتاح يجب أن يكون نص، يتكون هذا النص من جزئين يفصل بينهم نقطتان
|
||
رأسيتان، الجزء الأول هو مكان الإستضافة و الجزء الثاني هو المنفذ على سبيل المثال
|
||
<code>"example.com:443"</code> و <code>"otmp.example.com:7294"</code> و <code>"93.184.215.14:7294"</code> و <snap
|
||
dir='ltr'><code>"[2606:2800:021f:cb07:6820:80da:af6b:8b2c]:7294"</code></snap>. </p>
|
||
<h3 id="mthl">مثال</h3>
|
||
<div dir="ltr">
|
||
<pre data-lang="json" style="background-color:#2b303b;color:#c0c5ce;" class="language-json "><code class="language-json" data-lang="json"><span>{"</span><span style="color:#a3be8c;">otmp_server</span><span>": "</span><span style="color:#a3be8c;">otmp.example.com:443</span><span>"}
|
||
</span></code></pre>
|
||
</div>
|
||
<blockquote>
|
||
<p>يجب على الخوادم عدم تخزين اسماء خوادم المرسلين الخارجيين، ويتم تحديده في الطلب
|
||
المرسل من قبلهم فقط، حيث يعتبر المفتاح العام هو المعرف المشترك بين جميع
|
||
الخوادم. سوف يوفر هذا سهولة إنتقال الافراد من خادم إلى أخر مع بقاء تعرف
|
||
الخوادم الاخرى عليهم.</p>
|
||
</blockquote>
|
||
<h2 id="mfth-ltshfyr-lmshtrk">مفتاح التشفير المشترك</h2>
|
||
<p>يتم انشاء مفتاح التشفير المشترك عبر خوارزمية <a href="https://en.wikipedia.org/wiki/Elliptic-curve_Diffie%E2%80%93Hellman">Elliptic Curve Diffie-Hellman</a> حيث
|
||
سوف يقوم مرسل الرسالة بوضع العنوان العام الخاص بالمستقبِل ليتم انتاج المفتاح
|
||
المشترك، بعد إنتاج المفتاح المشترك يتم ادخاله إلى دالة <a href="https://en.wikipedia.org/wiki/HKDF">HKDF</a> <strong>بدون ملح</strong>
|
||
بخوارزمية <a href="https://en.wikipedia.org/wiki/SHA-2">Sha256</a> وبعد ذلك يتم عمل له توسعة (expand) بدون معلومات (info) بطول
|
||
32 بايت (256 بت).</p>
|
||
<h3 id="ltshfyr">التشفير</h3>
|
||
<p>سوف يتم استخدام <a href="https://otmp.4rs.nl/ar/protocol/v1/#mfth-ltshfyr-lmshtrk">مفتاح التشفير المشترك</a> مفتاحاً للتشفير في خوارزمية <a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard">AES-256
|
||
CBC</a>، بعد تشفير الرسالة يتم وضع قيمة التهيئة (iv) في أخر الرسالة، ليكون اخر 16
|
||
بايت (128 بت) هي قيمة التهيئة (iv) التي سوف يستخدمها المستقبِل لفك تشفير
|
||
الرسالة. </p>
|
||
<p>مثال لمفتاح تشفير مشترك بترميز <a href="https://bitcoinwiki.org/wiki/base58">base58</a> <span
|
||
dir="ltr"><code>LKGKeuV3SRu1n3fez4SdboM3FT48vbBxHai9MbuWxb3</code></span></p>
|
||
<h2 id="mfth-lkhdm-l-m">مفتاح الخادم العام</h2>
|
||
<p>مفتاح الخادم العام هو مثل العنواين العامة الخاصة بالمستخدمين، ولكنه خاص بالخادم،
|
||
حيث ان الخادم سوف يقوم بأنشاء مفتاح مشترك بينه وبين مرسل الطلب (Request) ليتأكد
|
||
من أن المرسل (صاحب العنوان العام) هو مالك هذا العنوان. يتم التأكد عبر مطابقة
|
||
التوقيع الموجود في الطلب (Request).</p>
|
||
<p>يتم جلب مفتاح الخادم العام من المسار <span
|
||
dir='ltr'><code>/api/info</code></span> سوف يتم إرسال طلب GET إلى هذا المسار و
|
||
يجب أن يُرجع هذا المسار نص بتنسيق <code>application/json</code> يحتوي على المفتاح
|
||
<code>public_key</code> ولذي قيمته نص المفتاح العام الخاص بالخادم بترميز <a href="https://bitcoinwiki.org/wiki/base58">base58</a>، سوف يتم
|
||
إرسال الطلب ببروتوكول https و يجب أن يدعم الخادم https و يجب ان تكون الشهادة
|
||
موقعة من جهة موثوقة وليست موقعة ذاتياً<sup class="footnote-reference"><a href="#1">1</a></sup></p>
|
||
<blockquote>
|
||
<p>تم توضيح المفتاح العام هنا (<a href="https://otmp.4rs.nl/ar/protocol/v1/#l-nwyn-l-m">العناوين العامة</a>)</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>حاول ان لا تقوم بتغيير المفتاح العام الخاص بالخادم بشكل مستمر، لآن العملاء سوف
|
||
يقومون بتخزينه بالعادة.</p>
|
||
</blockquote>
|
||
<h2 id="twqy-ltlb">توقيع الطلب</h2>
|
||
<p>هو التوقيع الخاص بالطلب يتم وضعه في رأس الطلب (Header) بأسم <code>X-OTMP-SIGNATURE</code>
|
||
او في بيانات ال <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> في المفتاح <code>signature</code> بترميز <a href="https://en.wikipedia.org/wiki/Hexadecimal">Hex</a> ويتم أستخدامه
|
||
للتأكد من ان مرسل الطلب هو مالك المفتاح العام.</p>
|
||
<h3 id="nsh-ltwqy">إنشاء التوقيع</h3>
|
||
<p>التوقيع يحتاج إلى ثلاث اشياء ليتم إنشائه</p>
|
||
<ul>
|
||
<li>مفتاح التشفير المشترك.</li>
|
||
<li>جسم الطلب (body) أو بيانات الحدث (data) أو طريقة الطلب+المسار، مثال (GET/ws/chat)</li>
|
||
<li>ثواني الوقت الحالي للمنطقة الزمنية UTC بتنسيق <a href="https://en.wikipedia.org/wiki/Unix_time">Unix Time</a> (8 بايت أي 64 بت
|
||
<strong>big-endian</strong>).</li>
|
||
<li>16 بايت عشوائي (128 بت).</li>
|
||
</ul>
|
||
<p>يتم إدخال جسم الطلب (body) او بيانات الحدث في الـ<a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> إلى دالة
|
||
<a href="https://en.wikipedia.org/wiki/HMAC">HMAC-SHA256</a> و إستخدام <a href="https://otmp.4rs.nl/ar/protocol/v1/#mfth-ltshfyr-lmshtrk">مفتاح التشفير المشترك</a> مضافاً إليه الوقت الحالي (8
|
||
بايت) و الـ16 بايت العشوائي، أي المفتاح المستخدم في دالة <a href="https://en.wikipedia.org/wiki/HMAC">HMAC-SHA256</a> سوف يكون</p>
|
||
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>مفتاح التشفير المشترك+الوقت الحالي+16 بايت عشوائي
|
||
</span></code></pre>
|
||
<p>بعد ذلك يتم أخذ نتيجة دالة <a href="https://en.wikipedia.org/wiki/HMAC">HMAC-SHA256</a> و إضافة الوقت المستخدم في الأعلى و
|
||
الـ16 بايت المستخدمة في الأعلى و جميعهم بترميز <a href="https://en.wikipedia.org/wiki/Hexadecimal">Hex</a>، مثال</p>
|
||
<div dir="ltr">
|
||
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66
|
||
</span></code></pre>
|
||
</div>
|
||
<p>بعد تحويله إلى بايتات سوف يكون المجموع 56 بايت، وسوف يكون التقسيم كالتالي</p>
|
||
<ul>
|
||
<li>مخرج دالة <a href="https://en.wikipedia.org/wiki/HMAC">HMAC-SHA256</a>: من بايت 0 إلى بايت31. (التوقيع الذي سوف يتحقق منه
|
||
الخادم)</li>
|
||
<li>الوقت: من بايت 32 إلى بايت 39. (الذي سوف يتم إضافته بعد <a href="https://otmp.4rs.nl/ar/protocol/v1/#mfth-ltshfyr-lmshtrk">مفتاح التشفير
|
||
المشترك</a>) </li>
|
||
<li>ال 16 بايت العشوائي: من بايت 40 إلى بايت 55. (سوف يتم إضافته بعد الوقت)</li>
|
||
</ul>
|
||
<p>سوف يتحقق الخادم من أن الوقت الذي في التوقيع لم يتجاوز الـ20 ثانية، وسوف يقوم
|
||
الخادم بتخزين ال 16 بايت العشوائي في الكاش بمدة حياة 30 ثانية، ليتأكد الخادم من
|
||
ان ال 16 بايت العشوائي لن يتم إستخدامهم في توقيع أخر، بالتالي ضمان عدم إرسال
|
||
الطلب مرة أخرى من المهاجمين (ضمان أن التوقيع صالح لمرة واحدة فقط). </p>
|
||
<h3 id="shkl-lbynt-dkhl-tsl-lwebsocket">شكل البيانات داخل إتصال الـWebsocket</h3>
|
||
<p>بعد الإتصال بـ<a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> مع الخادم، يكون تنسيق البيانات التي يتم تبادلها
|
||
بين المرسل والخادم json ويجب عليها توفر المفاتيح التالية</p>
|
||
<ul>
|
||
<li><code>event</code>: إسم الحدث، على سبيل المثال إرسال رسالة او تحديث حالة الكتابة (التنسيق PascalCase).</li>
|
||
<li><code>data</code>: البيانات الخاصة بالحدث. </li>
|
||
<li><code>signature</code>: توقيع بيانات الحدث (data)، هذا التوقيع يكون بين المرسل وبين
|
||
الخادم وليس المُستقبل.</li>
|
||
</ul>
|
||
<h4 id="mthl-lshkl-lbynt-fy-l-websocket">مثال لشكل البيانات في ال websocket</h4>
|
||
<div dir="ltr">
|
||
<pre data-lang="json" style="background-color:#2b303b;color:#c0c5ce;" class="language-json "><code class="language-json" data-lang="json"><span>{
|
||
</span><span> "</span><span style="color:#a3be8c;">event</span><span>": "</span><span style="color:#a3be8c;">EventName</span><span>",
|
||
</span><span> "</span><span style="color:#a3be8c;">data</span><span>": {
|
||
</span><span> "</span><span style="color:#a3be8c;">key</span><span>": "</span><span style="color:#a3be8c;">value</span><span>"
|
||
</span><span> },
|
||
</span><span> "</span><span style="color:#a3be8c;">signature</span><span>": "</span><span style="color:#a3be8c;">bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66</span><span>"
|
||
</span><span>}
|
||
</span></code></pre>
|
||
</div>
|
||
<blockquote>
|
||
<p>يمكن للخادم طلب أي شكل من البيانات، و يجب أن تكون المعلومات الحساسة مثل
|
||
الرسالة او الملف أن مشفر بينك وبين المُستقبل فقط.</p>
|
||
</blockquote>
|
||
<h2 id="tryq-ltwsl">طريقة التواصل</h2>
|
||
<p>هنا سوف يتم توضيح طريقة التواصل بين طرفين في خادم واحد (تواصل داخلي)، وبين طرفين
|
||
في خوادم مختلفة (تواصل خارجي)</p>
|
||
<h3 id="mfhym-mhm">مفاهيم مهمة</h3>
|
||
<ul>
|
||
<li>التواصل الداخلي: هو تواصل طرفين في الخادم نفسه.</li>
|
||
<li>التواصل الخارجي: هو تواصل طرفين في خوادم مختلفة.</li>
|
||
<li>القائمة البيضاء: هي قائمة يمتلكها كل مستخدم في الخادم يوجد بها المستخدمين
|
||
المسموح لهم بمراسلته.</li>
|
||
<li>القائمة السوداء: هي قائمة يمتلكها كل مستخدم في الخادم يوجد بها المستخدمين
|
||
الغير مسموح لهم بمراسلته.</li>
|
||
<li>قائمة الخادم السوداء: هي قائمة يقوم بوضعها مالك الخادم ليمنع خادمه من التواصل
|
||
مع خوادم محددة او اشخاص محددين.</li>
|
||
<li>جدول الإتصالات الخارجية: هو جدول يتم حفظ به الرسائل الخارجية التي وصلت إلى
|
||
المستخدم عندما لم يكن متصل بالخادم، ويتم مسحها بعد إرسالها له.</li>
|
||
<li>جدول طلبات الدردشة: هو جدول يتضمن طلبات الدردشة التي قاموا بإرسالها او
|
||
إستقبالها افراد الخادم إلى/من افراد اخرين في نفس الخادم او في خوادم أخرى، ويتم
|
||
مسح الطلب بعد وصول قبوله او رفضه. يتم الإستفادة من هذا الجدول لعدم إستقبال
|
||
إشعارات قبول او رفض مزيفة.</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>سوف يتم استبدال العنوان العام بأسم Alice و Bob لآن العناوين العامة طويلة
|
||
نسبياً</p>
|
||
</blockquote>
|
||
<h3 id="ltwsl-ldkhly">التواصل الداخلي</h3>
|
||
<p>اولاً <strong>يجب</strong><sup class="footnote-reference"><a href="#2">2</a></sup> عند فتحك لعميل التواصل أن تقوم بإنشاء تواصل <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> بينك
|
||
وبين الخادم الخاص بك، عبر هذا الإتصال سوف تستقبل الرسائل الجديدة من الخادم الخاص
|
||
بك، وسوف تقوم بالتواصل من خلاله لإرسال الرسائل إلى افراد الخادم.</p>
|
||
<p>لدينا الآن المرسل alice والمستقبِل bob و كلاهم في الخادم نفسه، سوف يقوم alice
|
||
بإرسال رسالة <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> يطلب من الخادم إرسال طلب الدردشة إلى bob وسوف يرد
|
||
الخادم بأحد الأخطأ التالية، او لا يقوم بالرد إذا لم يكن هناك خطأ.</p>
|
||
<h4 id="dh-lm-ykn-hnk-mstkhdm-b-sm-bob-fy-lkhdm">إذا لم يكن هناك مستخدم بأسم bob في الخادم</h4>
|
||
<p>سوف يرجع الخادم خطأ ويخبر فيه العميل أنه ليس هناك مستخدم بهذا الأسم.</p>
|
||
<h4 id="dh-lm-ykn-alice-fy-qy-m-bob-lbyd-wl-lswd">إذا لم يكن alice في قائمة bob البيضاء ولا السوداء</h4>
|
||
<p>سوف يقوم الخادم اولاً بإضافة bob إلى قائمة alice البيضاء، وبعد ذلك إضافة الطلب
|
||
في جدول طلبات الدردشة <strong>المُستقبلة</strong> بالنسبة لـbob إذا كان غير متصل مع الخادم
|
||
وسوف يضيفه إلى <strong>المُرسلة</strong> بالنسبة إلى alice، لا يرجع الخادم أي خطأ في هذه
|
||
الحالة.</p>
|
||
<p>عندما يرد bob بالموافقة ام الرفض (عبر إتصال ال <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a>)، سوف يُعلم الخادم
|
||
alice بأن bob وافق او رفض التواصل معه (عبر إتصال الـ <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> او إضافته إلى
|
||
جدول ليعلمه عند تواصله مع الخادم). إذا لم يوافق bob سوف يقوم الخادم بإضافة alice
|
||
إلى قائمة bob السوداء، و إذا وافق سوف يتم إضافته إلى القائمة البيضاء.</p>
|
||
<h4 id="dh-kn-alice-fy-qy-m-bob-lbyd">إذا كان alice في قائمة bob البيضاء</h4>
|
||
<p>سوف يرجع الخادم خطأ، يعلم العميل أنه في قائمة bob البيضاء.</p>
|
||
<h4 id="dh-kn-alice-fy-qy-m-bob-lswd">إذا كان alice في قائمة bob السوداء</h4>
|
||
<p>سوف يرجع الخادم خطأ و يُعلم alice انه في قائمة bob السوداء ولا يمكنه الدردشة
|
||
معه.</p>
|
||
<blockquote>
|
||
<p>يتم تخزين رسائل الطرفين مُشفرة في قاعدة البيانات الخاصة بالخادم</p>
|
||
</blockquote>
|
||
<h3 id="ltwsl-lkhrjy">التواصل الخارجي</h3>
|
||
<p>لدينا الآن المرسل alice من <code>example1.com</code> والمستقبِل bob من <code>example2.com</code> سوف
|
||
يقوم alice بإرسال طلب Get إلى <code>example2.com</code> يطلب فيه الدردشة مع bob، سوف يرد
|
||
الخادم بأحد الردود التالية</p>
|
||
<h4 id="dh-lm-y3kn-hnk-mstkhdm-b-sm-bob-fy-lkhdm">إذا لم ي3كن هناك مستخدم بأسم bob في الخادم</h4>
|
||
<p>سوف يرجع الخادم 404 و يُعلم alice بأنه ليس لديه مستخدم بهذا الأسم.</p>
|
||
<h4 id="dh-lm-ykn-alice-fy-qy-m-bob-lbyd-wl-lswd-1">إذا لم يكن alice في قائمة bob البيضاء ولا السوداء</h4>
|
||
<p>سوف يقوم خادم bob بإرسال طلب الدردشة إلى bob او يقوم بتخزين الطلب في جدول طلبات
|
||
الدردشة <strong>المٌستقبلة</strong>، ويرد عليه بـ200، بعد ذلك يقوم alice بطلب الخادم الخاص به
|
||
من إضافة bob إلى قائمته البيضاء ليستقبل منه الرسائل مستقبلاً بدون حاجة bob إرسال
|
||
طلب دردشة وإنتظار قبولها، سوف يقوم alice ايضاً بطلب الخادم من إضافة bob إلى جدول
|
||
طلبات الدردشة <strong>المُرسلة</strong> ويتم تضمين خادم bob الحالي الذي تم إرسال طلب الدردشة
|
||
إليه<sup class="footnote-reference"><a href="#3">3</a></sup></p>
|
||
<p>إذا قبل/رفض bob الدردشة سوف يُعلم خادم bob خادم alice أن bob قام بقبول/رفض
|
||
الدردشة، سوف يضع الخادم التوقيع الخاص به في <code>X-OTMP-SIGNATURE</code> وسوف يتم جلب
|
||
المفتاح العام الخاص به من مسار الخادم<sup class="footnote-reference"><a href="#4">4</a></sup> (لقد قام alice بإضافة bob والخادم
|
||
الخاص به في جدول طلبات الدردشة <strong>المُرسلة</strong> لذالك خادم alice يعلم ماهو خادم
|
||
bob).</p>
|
||
<p>بعد ذلك إذا لم يكن لـalice إتصال <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> سابق مع خادم bob، سوف يقوم بإرسال
|
||
طلب دردشة ليتم ترقية الإتصال إلى <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a>، ونفس المسئلة مع bob إذا اراد
|
||
التواصل مع alice سوف يقوم بإرسال طلب دردشة ويتم ترقية الإتصال او إعلامه بوجود
|
||
إتصال <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> مفتوح.</p>
|
||
<h4 id="dh-kn-alice-fy-qy-m-bob-lbyd-1">إذا كان alice في قائمة bob البيضاء</h4>
|
||
<p>سوف يقوم الخادم بترقية الإتصال إلى <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> او إذا كان alice متصل معه من قبل،
|
||
سوف يقوم بإرجاع 400 ويخبر alice بالتواصل معه عبر ال <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a>.</p>
|
||
<h4 id="dh-kn-alice-fy-qy-m-bob-lswd-w-kn-hw-w-khdmh-fy-qy-m-lkhdm-lswd">إذا كان alice في قائمة bob السوداء او كان هو او خادمه في قائمة الخادم السوداء</h4>
|
||
<p>سوف يرجع الخادم 403 مع توضيح السبب.</p>
|
||
<h4 id="ssyt">أساسيات</h4>
|
||
<ul>
|
||
<li>يجب على alice فتح إتصال <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> مع جميع الخوادم التي يريد التواصل مع
|
||
افرادها.</li>
|
||
<li>لايتم تخزين الرسائل التي يستقبلها الخادم بشكل دائم، يتم تخزينها فقط إذا لم يكن
|
||
bob متصل بالخادم، ويتم مسحها بعد إرسالها إلى bob.</li>
|
||
<li>الرسائل والملفات بين الطرفين تكون مشفرة وتكون موقعة للخادم المراد التواصل مع
|
||
افراده.</li>
|
||
</ul>
|
||
<h2 id="shkr-w-tqdyr">شكر و تقدير</h2>
|
||
<p>شكراً للأشخاص التاليين على مراجعة و تحسين البروتوكول.</p>
|
||
<ul>
|
||
<li>أمجد الشرفي <<a href="mailto:me@amjad.alsharafi.dev">me@amjad.alsharafi.dev</a>>: تحسين طريقة عمل التوقيع، و أقتراح
|
||
الطريقة الحالية.</li>
|
||
</ul>
|
||
<hr data-content="وصلات" \>
|
||
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup>
|
||
<p>لضمان عدم وجود شخص في المنتصف، يقوم بالتلاعب بالبيانات و الإطلاع عليها.</p>
|
||
</div>
|
||
<div class="footnote-definition" id="2"><sup class="footnote-definition-label">2</sup>
|
||
<p>طالما انك عضو في الخادم، سوف يعتقد الخادم دائماً انك في إتصال <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a> معه، ولن يقوم بترقية أي إتصال إلى <a href="https://en.wikipedia.org/wiki/WebSocket">Websocket</a></p>
|
||
</div>
|
||
<div class="footnote-definition" id="3"><sup class="footnote-definition-label">3</sup>
|
||
<p>يتم إضافة العنوان الخاص بـbob و الخادم الخاص به في جدول طلبات الدردشة للتاكد من عدم إستقبال إشعارات قبول/رفض من خوادم مزيفة هدفها الإزعاج.</p>
|
||
</div>
|
||
<div class="footnote-definition" id="4"><sup class="footnote-definition-label">4</sup>
|
||
<p>للتاكد من انه الخادم فعلاً، لن يتم طلب منه المفتاح العام بشكل مباشر، بل سوف يتم جلبه من مسار الخاص به، وهو <span
|
||
dir='ltr'><code>/api/info</code></span></p>
|
||
</div>
|
||
|
||
|
||
</main>
|
||
<footer>
|
||
|
||
<p class="taxonomies">
|
||
|
||
</p>
|
||
|
||
|
||
|
||
|
||
|
||
<nav>
|
||
|
||
<a href="mailto:otmp@4rs.nl" target="_blank" rel="noreferrer noopener">البريد الإلكتروني</a>
|
||
|
||
<a href="/pgp.asc" target="_blank" rel="noreferrer noopener">مفتاح PGP</a>
|
||
|
||
<a href="https://git.4rs.nl/OxideTalis/otmp_site" target="_blank" rel="noreferrer noopener">الشِفرة</a>
|
||
|
||
</nav>
|
||
|
||
</footer>
|
||
</div>
|
||
</body>
|
||
</html>
|
||
|