Compare commits

...

No commits in common. "site" and "master" have entirely different histories.
site ... master

51 changed files with 1125 additions and 1641 deletions

33
.forgejo/workflows/ci.yml Normal file
View file

@ -0,0 +1,33 @@
name: Build site
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
build_ci:
name: Rust CI
runs-on: debian
steps:
- uses: actions/checkout@v4
- name: Build the site
run: |
curl -s -L https://github.com/getzola/zola/releases/download/v0.18.0/zola-v0.18.0-x86_64-unknown-linux-gnu.tar.gz | tar xvzf - -C .
./zola build
- name: Publish the site
run: |
cd public
git init
git checkout -B site
git config user.name forgejo-actions
git config user.email forgejo-actions@noreply.localhost
URL=$(echo $GITHUB_SERVER_URL | sed -E 's/^\s*.*:\/\///g')
# Http and not https because the request is inside the instance network
git remote add origin http://forgejo-actions:$GITHUB_TOKEN@$URL/$GITHUB_REPOSITORY.git
echo "otmp.4rs.nl" > CNAME
touch .nojekyll
git add .
git commit -m "Deploy site"
git push --set-upstream origin site -f

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
static/processed_images
public

View file

123
404.html
View file

@ -1,123 +0,0 @@
<!doctype html>
<html
dir="ltr"
lang="en-US"
>
<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 Messaging Protocol</title>
<meta name="title" content="OxideTalis Messaging Protocol">
<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">
<meta property="og:site_name" content="OxideTalis Messaging Protocol">
<meta property="og:title" content="OxideTalis Messaging Protocol">
<meta property="og:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="og:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://otmp.4rs.nl">
<meta property="twitter:title" content="OxideTalis Messaging Protocol">
<meta property="twitter:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="twitter:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<link rel="canonical" href="https://otmp.4rs.nl">
<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",
"@type":"WebSite",
"headline":"OxideTalis Messaging Protocol",
"name":"OxideTalis Messaging Protocol",
"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="/" >English</a>
<a href="/ar/" >العربية</a>
</nav>
<h2>OxideTalis Messaging Protocol</h2>
</header>
<main class="page-content" aria-label="Content">
404
</main>
<footer>
<nav>
<a href="mailto:otmp@4rs.nl" target="_blank" rel="noreferrer noopener">Email</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">Source</a>
</nav>
</footer>
</div>
</body>
</html>

1
CNAME
View file

@ -1 +0,0 @@
otmp.4rs.nl

22
LICENSE Normal file
View file

@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2024 Awiteb <a@4rs.nl>
Copyright (c) 2022 Ahmed Alaa
Copyright (c) 2020 Riccardo Graziosi (original theme)
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

67
README.md Normal file
View file

@ -0,0 +1,67 @@
<div align="center">
<img src="https://otmp.4rs.nl/otmp_logo.png" alt="OTMP Logo" width="100" height="100">
# OxideTalis Messaging Protocol (OTMP)
A simple site explaining the OxideTalis Messaging Protocol (OTMP).
</div>
## How to view the site?
There are three ways to view the site, you can choose any of them
### 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)
### Build the site locally
You can build the site locally by following the steps below:
> [!NOTE]
> My current zola version is `0.18.0`.
```bash
# Clone the repository
git clone https://git.4rs.nl/awiteb/otmp_site.git
# Change directory to the repository
cd otmp_site
# Build the site
zola build
The site will be built in the `public` directory (you can view it by opening the `index.html` file in your browser)
```
### `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.
## How to contribute?
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.
## `deploy.sh` script
Simple script to build the site and push it to GitHub pages.
## Credits
### 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
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).

View file

@ -1,133 +0,0 @@
<!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>الاسئلة الشائعة</title>
<meta name="title" content="الاسئلة الشائعة">
<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/faq/">
<meta property="og:site_name" content="OxideTalis Messaging Protocol">
<meta property="og:title" content="الاسئلة الشائعة">
<meta property="og:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="og:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_ar.png">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://otmp.4rs.nl/ar/faq/">
<meta property="twitter:title" content="الاسئلة الشائعة">
<meta property="twitter:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="twitter:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_ar.png">
<link rel="canonical" href="https://otmp.4rs.nl/ar/faq/">
<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/faq/",
"@type":"WebSite",
"headline":"الاسئلة الشائعة",
"name":"الاسئلة الشائعة",
"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>الاسئلة الشائعة</h2>
</header>
<main class="page-content" aria-label="Content">
<p>... لايوجد اسئلة شائعة حتى الان، يمكنك التواصل مع المؤلف عبر البريد الإلكتروني او احد قنوات التواصل لطرح الاسئلة ...</p>
</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>

View file

@ -1,149 +0,0 @@
<!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/">
<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:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_ar.png">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://otmp.4rs.nl/ar/">
<meta property="twitter:title" content="بروتوكول الرسائل الخاص بـ OxideTalis">
<meta property="twitter:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="twitter:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_ar.png">
<link rel="canonical" href="https://otmp.4rs.nl/ar/">
<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/",
"@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">
<p>هذه الصفحة الرئيسية لبروتوكول الرسائل الخاص بـ OxideTalis (OTMP)، وهو بروتوكول
للتواصل بين طرفين (أليس وبوب) باستخدام مفتاح تشفير مشترك. تم تصميم البروتوكول
ليكون بسيطًا وسهل التنفيذ، مع توفير وسيلة آمنة للتواصل.</p>
<h3 id="l-hdf">الأهداف</h3>
<ul>
<li>تواصل آمن بين طرفين.</li>
<li>سهولة التنفيذ.</li>
<li>القدرة على إرسال رسائل إلى مستخدمين في خوادم أخرى مباشرة، بدون الاعتماد على
خادم المرسل.</li>
</ul>
<h3 id="l-hdf-lgyr-mrgwb">الأهداف الغير مرغوبة</h3>
<ul>
<li>التواصل الجماعي.</li>
<li>المكالمات الصوتية أو الفيديو.</li>
</ul>
<h2 id="lmhtwyt">المحتويات</h2>
<ul>
<li><a href="/ar/protocol/">البروتوكول</a></li>
<li><a href="/ar/faq/">الاسئلة الشائعة</a></li>
</ul>
</main>
<footer>
<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>

View file

@ -1,134 +0,0 @@
<!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/">
<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:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_ar.png">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://otmp.4rs.nl/ar/protocol/">
<meta property="twitter:title" content="إصدارات بروتوكول OxideTalis">
<meta property="twitter:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="twitter:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_ar.png">
<link rel="canonical" href="https://otmp.4rs.nl/ar/protocol/">
<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/",
"@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">
<p>حتى الان بروتوكول OxideTalis يملك اصدار واحد فقط، ولكن من الممكن تواجد عدة إصدارات في المستقبل</p>
<h3 id="lsdrt">الإصدارات</h3>
<ul>
<li><a href="/ar/protocol/v1/">الإصدار الاول</a></li>
</ul>
</main>
<footer>
<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>

View file

@ -1,499 +0,0 @@
<!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:&#x2F;&#x2F;otmp.4rs.nl&#x2F;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:&#x2F;&#x2F;otmp.4rs.nl&#x2F;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>&quot;example.com:443&quot;</code> و <code>&quot;otmp.example.com:7294&quot;</code> و <code>&quot;93.184.215.14:7294&quot;</code> و <snap
dir='ltr'><code>&quot;[2606:2800:021f:cb07:6820:80da:af6b:8b2c]:7294&quot;</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>{&quot;</span><span style="color:#a3be8c;">otmp_server</span><span>&quot;: &quot;</span><span style="color:#a3be8c;">otmp.example.com:443</span><span>&quot;}
</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> &quot;</span><span style="color:#a3be8c;">event</span><span>&quot;: &quot;</span><span style="color:#a3be8c;">EventName</span><span>&quot;,
</span><span> &quot;</span><span style="color:#a3be8c;">data</span><span>&quot;: {
</span><span> &quot;</span><span style="color:#a3be8c;">key</span><span>&quot;: &quot;</span><span style="color:#a3be8c;">value</span><span>&quot;
</span><span> },
</span><span> &quot;</span><span style="color:#a3be8c;">signature</span><span>&quot;: &quot;</span><span style="color:#a3be8c;">bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66</span><span>&quot;
</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>أمجد الشرفي &lt;<a href="mailto:me@amjad.alsharafi.dev">me@amjad.alsharafi.dev</a>&gt;: تحسين طريقة عمل التوقيع، و أقتراح
الطريقة الحالية.</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>

33
config.toml Normal file
View file

@ -0,0 +1,33 @@
base_url = "https://otmp.4rs.nl"
description = "OxideTalis Messaging Protocol (OTMP) specification"
title = "OxideTalis Messaging Protocol"
compile_sass = true
generate_feed = true
taxonomies = [
{name = "tags"},
{name = "categories"},
{name = "contexts"},
]
[markdown]
highlight_code = true
[extra]
logo = "/otmp_logo.svg"
ar_footer_nav = [
{name = "البريد الإلكتروني", url = "mailto:otmp@4rs.nl", new_tab = true},
{name = "مفتاح PGP", url = "/pgp.asc", new_tab = true},
{name = "الشِفرة", url = "https://git.4rs.nl/OxideTalis/otmp_site", new_tab = true},
]
author = "Awiteb"
footer_nav = [
{name = "Email", url = "mailto:otmp@4rs.nl", new_tab = true},
{name = "PGP", url = "/pgp.asc", new_tab = true},
{name = "Source", url = "https://git.4rs.nl/OxideTalis/otmp_site", new_tab = true},
]
header_nav = [
{name = "English", url = "/"},
{name = "العربية", url = "/ar/"},
]

26
content/_index.md Normal file
View file

@ -0,0 +1,26 @@
+++
title = "OxideTalis Messaging Protocol"
[extra]
lang = "en-US"
dir = "ltr"
+++
This is the homepage of the OxideTalis Messaging Protocol (OTMP), a protocol to
communicate between two parties (Alice and Bob) using a shared secret. The
protocol is designed to be simple and easy to implement, while
providing a secure way to communicate.
### Goals
- Secure communication between two parties.
- Simple and easy to implement.
- Ability to send messages to users in another server directly, no dependency
the server of the sender.
### Non-Goals
- Group communication.
- Voice or video calls.
## Contents
- [Protocol](/protocol/)
- [FAQ](/faq/)

27
content/ar/_index.md Normal file
View file

@ -0,0 +1,27 @@
+++
title = "بروتوكول الرسائل الخاص بـ OxideTalis"
[extra]
image = "/otmp_ar.png"
lang = "ar-SA"
dir = "rtl"
+++
هذه الصفحة الرئيسية لبروتوكول الرسائل الخاص بـ OxideTalis (OTMP)، وهو بروتوكول
للتواصل بين طرفين (أليس وبوب) باستخدام مفتاح تشفير مشترك. تم تصميم البروتوكول
ليكون بسيطًا وسهل التنفيذ، مع توفير وسيلة آمنة للتواصل.
### الأهداف
- تواصل آمن بين طرفين.
- سهولة التنفيذ.
- القدرة على إرسال رسائل إلى مستخدمين في خوادم أخرى مباشرة، بدون الاعتماد على
خادم المرسل.
### الأهداف الغير مرغوبة
- التواصل الجماعي.
- المكالمات الصوتية أو الفيديو.
## المحتويات
- [البروتوكول](/ar/protocol/)
- [الاسئلة الشائعة](/ar/faq/)

10
content/ar/faq.md Normal file
View file

@ -0,0 +1,10 @@
+++
title = "الاسئلة الشائعة"
[extra]
image = "/otmp_ar.png"
lang = "ar-SA"
dir = "rtl"
+++
... لايوجد اسئلة شائعة حتى الان، يمكنك التواصل مع المؤلف عبر البريد الإلكتروني او احد قنوات التواصل لطرح الاسئلة ...

View file

@ -0,0 +1,14 @@
+++
title = "إصدارات بروتوكول OxideTalis"
[extra]
image = "/otmp_ar.png"
lang = "ar-SA"
dir = "rtl"
+++
حتى الان بروتوكول OxideTalis يملك اصدار واحد فقط، ولكن من الممكن تواجد عدة إصدارات في المستقبل
### الإصدارات
- [الإصدار الاول](/ar/protocol/v1/)

312
content/ar/protocol/v1.md Normal file
View file

@ -0,0 +1,312 @@
+++
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>
## نظرة عامة
بروتوكول OxideTalis هو بروتوكول تواصل بين طرفين بتشفير تام من طرف إلى طرف عبر
مفتاح تشفير مشترك بينهم، يهدف البروتوكول إلى توفير سهولة التنقل من خادم إلى أخر
بشكل إفتراضي وتوفير طريقة للتواصل بين الافراد في خوادم مختلفة بشكل مباشر بدون
تواصل خادم المرسل وخادم المستقبل مع بعضهم البعض.
### الاهداف
- تواصل آمن بين طرفين مُشفر من ند إلى ند.
- سهولة التنفيذ.
- امكانية الإنتقال إلى خادم آخر.
- امكانية التواصل مع اطراف خارج الخادم الخاص بالمرسل.
- عدم الحاجة لتواصل المرسل مع الخادم الخاص به للتواصل مع اشخاص خارج الخادم.
- عدم الحاجة ﻷسم مستخدم وكلمة مرور لتخويل المسخدم للمراسلة، والاكتفاء بالعنوان
العام الخاص به.
### الاهداف الغير مرغوبة
- التواصل الجماعي.
- المكالمات الصوتية أو الفيديو.
## العناوين العامة
العنوان العام هو المفتاح العام الخاص بخوارزمية [Elliptic Curve Diffie-Hellman]
مضغوط وهو يتكون من 33 بايت (264 بت) يتم ترميزه بترميز [base58] على سبيل المثال
العنوان التالي `becZJsZZqGR7qBG8t1Pm4uy62jDTzJsabxnkARhr2syo`.
يتم وضع العنوان العام في رأس (Header) الطلب (Request) بأسم `X-OTMP-PUBLIC` ويجب ان يكون نص [base58] صحيح مكون من 33 بايت (264 بت).
## أسم الخادم
يكون أسم الخادم عنوان إلكتروني مثل `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>.
### كيفية الإشارة
يشير أسم الخادم إلى الخادم عبر المسار التالي <span
dir='ltr'><code>/.well-known/oxidetalis/server</code></span>
سوف يتم إرسال طلب GET إلى هذا المسار و يجب أن يُرجع هذا المسار نص بتنسيق
`application/json` يحتوي على المفتاح `otmp_server` ولذي يحتوي على مكان إستضافة
الخادم والمنفذ الذي يستمع إليه، سوف يتم إرسال الطلب ببروتوكول https و يجب أن
يدعم الخادم https و يجب ان تكون الشهادة موقعة من جهة موثوقة وليست موقعة
ذاتياً[^1]
### مفتاح `otmp_server`
محتوى هذا المفتاح يجب أن يكون نص، يتكون هذا النص من جزئين يفصل بينهم نقطتان
رأسيتان، الجزء الأول هو مكان الإستضافة و الجزء الثاني هو المنفذ على سبيل المثال
`"example.com:443"` و `"otmp.example.com:7294"` و `"93.184.215.14:7294"` و <snap
dir='ltr'><code>"[2606:2800:021f:cb07:6820:80da:af6b:8b2c]:7294"</code></snap>.
### مثال
<div dir="ltr">
```json
{"otmp_server": "otmp.example.com:443"}
```
</div>
> يجب على الخوادم عدم تخزين اسماء خوادم المرسلين الخارجيين، ويتم تحديده في الطلب
> المرسل من قبلهم فقط، حيث يعتبر المفتاح العام هو المعرف المشترك بين جميع
> الخوادم. سوف يوفر هذا سهولة إنتقال الافراد من خادم إلى أخر مع بقاء تعرف
> الخوادم الاخرى عليهم.
## مفتاح التشفير المشترك
يتم انشاء مفتاح التشفير المشترك عبر خوارزمية [Elliptic Curve Diffie-Hellman] حيث
سوف يقوم مرسل الرسالة بوضع العنوان العام الخاص بالمستقبِل ليتم انتاج المفتاح
المشترك، بعد إنتاج المفتاح المشترك يتم ادخاله إلى دالة [HKDF] **بدون ملح**
بخوارزمية [Sha256] وبعد ذلك يتم عمل له توسعة (expand) بدون معلومات (info) بطول
32 بايت (256 بت).
### التشفير
سوف يتم استخدام [مفتاح التشفير المشترك] مفتاحاً للتشفير في خوارزمية [AES-256
CBC]، بعد تشفير الرسالة يتم وضع قيمة التهيئة (iv) في أخر الرسالة، ليكون اخر 16
بايت (128 بت) هي قيمة التهيئة (iv) التي سوف يستخدمها المستقبِل لفك تشفير
الرسالة.
مثال لمفتاح تشفير مشترك بترميز [base58] <span
dir="ltr"><code>LKGKeuV3SRu1n3fez4SdboM3FT48vbBxHai9MbuWxb3</code></span>
## مفتاح الخادم العام
مفتاح الخادم العام هو مثل العنواين العامة الخاصة بالمستخدمين، ولكنه خاص بالخادم،
حيث ان الخادم سوف يقوم بأنشاء مفتاح مشترك بينه وبين مرسل الطلب (Request) ليتأكد
من أن المرسل (صاحب العنوان العام) هو مالك هذا العنوان. يتم التأكد عبر مطابقة
التوقيع الموجود في الطلب (Request).
يتم جلب مفتاح الخادم العام من المسار <span
dir='ltr'><code>/api/info</code></span> سوف يتم إرسال طلب GET إلى هذا المسار و
يجب أن يُرجع هذا المسار نص بتنسيق `application/json` يحتوي على المفتاح
`public_key` ولذي قيمته نص المفتاح العام الخاص بالخادم بترميز [base58]، سوف يتم
إرسال الطلب ببروتوكول https و يجب أن يدعم الخادم https و يجب ان تكون الشهادة
موقعة من جهة موثوقة وليست موقعة ذاتياً[^1]
> تم توضيح المفتاح العام هنا ([العناوين العامة](#l-nwyn-l-m))
> حاول ان لا تقوم بتغيير المفتاح العام الخاص بالخادم بشكل مستمر، لآن العملاء سوف
> يقومون بتخزينه بالعادة.
## توقيع الطلب
هو التوقيع الخاص بالطلب يتم وضعه في رأس الطلب (Header) بأسم `X-OTMP-SIGNATURE`
او في بيانات ال [Websocket] في المفتاح `signature` بترميز [Hex] ويتم أستخدامه
للتأكد من ان مرسل الطلب هو مالك المفتاح العام.
### إنشاء التوقيع
التوقيع يحتاج إلى ثلاث اشياء ليتم إنشائه
- مفتاح التشفير المشترك.
- جسم الطلب (body) أو بيانات الحدث (data) أو طريقة الطلب+المسار، مثال (GET/ws/chat)
- ثواني الوقت الحالي للمنطقة الزمنية UTC بتنسيق [Unix Time] (8 بايت أي 64 بت
**big-endian**).
- 16 بايت عشوائي (128 بت).
يتم إدخال جسم الطلب (body) او بيانات الحدث في الـ[Websocket] إلى دالة
[HMAC-SHA256] و إستخدام [مفتاح التشفير المشترك] مضافاً إليه الوقت الحالي (8
بايت) و الـ16 بايت العشوائي، أي المفتاح المستخدم في دالة [HMAC-SHA256] سوف يكون
```
مفتاح التشفير المشترك+الوقت الحالي+16 بايت عشوائي
```
بعد ذلك يتم أخذ نتيجة دالة [HMAC-SHA256] و إضافة الوقت المستخدم في الأعلى و
الـ16 بايت المستخدمة في الأعلى و جميعهم بترميز [Hex]، مثال
<div dir="ltr">
```
bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66
```
</div>
بعد تحويله إلى بايتات سوف يكون المجموع 56 بايت، وسوف يكون التقسيم كالتالي
- مخرج دالة [HMAC-SHA256]: من بايت 0 إلى بايت31. (التوقيع الذي سوف يتحقق منه
الخادم)
- الوقت: من بايت 32 إلى بايت 39. (الذي سوف يتم إضافته بعد [مفتاح التشفير
المشترك])
- ال 16 بايت العشوائي: من بايت 40 إلى بايت 55. (سوف يتم إضافته بعد الوقت)
سوف يتحقق الخادم من أن الوقت الذي في التوقيع لم يتجاوز الـ20 ثانية، وسوف يقوم
الخادم بتخزين ال 16 بايت العشوائي في الكاش بمدة حياة 30 ثانية، ليتأكد الخادم من
ان ال 16 بايت العشوائي لن يتم إستخدامهم في توقيع أخر، بالتالي ضمان عدم إرسال
الطلب مرة أخرى من المهاجمين (ضمان أن التوقيع صالح لمرة واحدة فقط).
### شكل البيانات داخل إتصال الـWebsocket
بعد الإتصال بـ[Websocket] مع الخادم، يكون تنسيق البيانات التي يتم تبادلها
بين المرسل والخادم json ويجب عليها توفر المفاتيح التالية
- `event`: إسم الحدث، على سبيل المثال إرسال رسالة او تحديث حالة الكتابة (التنسيق PascalCase).
- `data`: البيانات الخاصة بالحدث.
- `signature`: توقيع بيانات الحدث (data)، هذا التوقيع يكون بين المرسل وبين
الخادم وليس المُستقبل.
#### مثال لشكل البيانات في ال websocket
<div dir="ltr">
```json
{
"event": "EventName",
"data": {
"key": "value"
},
"signature": "bad035084e11bfd266c7b7dfa473d6603be551b3aa215f869776b75bf42ef31900000000665e1a696e6d776f65726e6664757265686a66"
}
```
</div>
> يمكن للخادم طلب أي شكل من البيانات، و يجب أن تكون المعلومات الحساسة مثل
> الرسالة او الملف أن مشفر بينك وبين المُستقبل فقط.
## طريقة التواصل
هنا سوف يتم توضيح طريقة التواصل بين طرفين في خادم واحد (تواصل داخلي)، وبين طرفين
في خوادم مختلفة (تواصل خارجي)
### مفاهيم مهمة
- التواصل الداخلي: هو تواصل طرفين في الخادم نفسه.
- التواصل الخارجي: هو تواصل طرفين في خوادم مختلفة.
- القائمة البيضاء: هي قائمة يمتلكها كل مستخدم في الخادم يوجد بها المستخدمين
المسموح لهم بمراسلته.
- القائمة السوداء: هي قائمة يمتلكها كل مستخدم في الخادم يوجد بها المستخدمين
الغير مسموح لهم بمراسلته.
- قائمة الخادم السوداء: هي قائمة يقوم بوضعها مالك الخادم ليمنع خادمه من التواصل
مع خوادم محددة او اشخاص محددين.
- جدول الإتصالات الخارجية: هو جدول يتم حفظ به الرسائل الخارجية التي وصلت إلى
المستخدم عندما لم يكن متصل بالخادم، ويتم مسحها بعد إرسالها له.
- جدول طلبات الدردشة: هو جدول يتضمن طلبات الدردشة التي قاموا بإرسالها او
إستقبالها افراد الخادم إلى/من افراد اخرين في نفس الخادم او في خوادم أخرى، ويتم
مسح الطلب بعد وصول قبوله او رفضه. يتم الإستفادة من هذا الجدول لعدم إستقبال
إشعارات قبول او رفض مزيفة.
> سوف يتم استبدال العنوان العام بأسم Alice و Bob لآن العناوين العامة طويلة
> نسبياً
### التواصل الداخلي
اولاً **يجب**[^2] عند فتحك لعميل التواصل أن تقوم بإنشاء تواصل [Websocket] بينك
وبين الخادم الخاص بك، عبر هذا الإتصال سوف تستقبل الرسائل الجديدة من الخادم الخاص
بك، وسوف تقوم بالتواصل من خلاله لإرسال الرسائل إلى افراد الخادم.
لدينا الآن المرسل alice والمستقبِل bob و كلاهم في الخادم نفسه، سوف يقوم alice
بإرسال رسالة [Websocket] يطلب من الخادم إرسال طلب الدردشة إلى bob وسوف يرد
الخادم بأحد الأخطأ التالية، او لا يقوم بالرد إذا لم يكن هناك خطأ.
#### إذا لم يكن هناك مستخدم بأسم bob في الخادم
سوف يرجع الخادم خطأ ويخبر فيه العميل أنه ليس هناك مستخدم بهذا الأسم.
#### إذا لم يكن alice في قائمة bob البيضاء ولا السوداء
سوف يقوم الخادم اولاً بإضافة bob إلى قائمة alice البيضاء، وبعد ذلك إضافة الطلب
في جدول طلبات الدردشة **المُستقبلة** بالنسبة لـbob إذا كان غير متصل مع الخادم
وسوف يضيفه إلى **المُرسلة** بالنسبة إلى alice، لا يرجع الخادم أي خطأ في هذه
الحالة.
عندما يرد bob بالموافقة ام الرفض (عبر إتصال ال [Websocket])، سوف يُعلم الخادم
alice بأن bob وافق او رفض التواصل معه (عبر إتصال الـ [Websocket] او إضافته إلى
جدول ليعلمه عند تواصله مع الخادم). إذا لم يوافق bob سوف يقوم الخادم بإضافة alice
إلى قائمة bob السوداء، و إذا وافق سوف يتم إضافته إلى القائمة البيضاء.
#### إذا كان alice في قائمة bob البيضاء
سوف يرجع الخادم خطأ، يعلم العميل أنه في قائمة bob البيضاء.
#### إذا كان alice في قائمة bob السوداء
سوف يرجع الخادم خطأ و يُعلم alice انه في قائمة bob السوداء ولا يمكنه الدردشة
معه.
> يتم تخزين رسائل الطرفين مُشفرة في قاعدة البيانات الخاصة بالخادم
### التواصل الخارجي
لدينا الآن المرسل alice من `example1.com` والمستقبِل bob من `example2.com` سوف
يقوم alice بإرسال طلب Get إلى `example2.com` يطلب فيه الدردشة مع bob، سوف يرد
الخادم بأحد الردود التالية
#### إذا لم ي3كن هناك مستخدم بأسم bob في الخادم
سوف يرجع الخادم 404 و يُعلم alice بأنه ليس لديه مستخدم بهذا الأسم.
#### إذا لم يكن alice في قائمة bob البيضاء ولا السوداء
سوف يقوم خادم bob بإرسال طلب الدردشة إلى bob او يقوم بتخزين الطلب في جدول طلبات
الدردشة **المٌستقبلة**، ويرد عليه بـ200، بعد ذلك يقوم alice بطلب الخادم الخاص به
من إضافة bob إلى قائمته البيضاء ليستقبل منه الرسائل مستقبلاً بدون حاجة bob إرسال
طلب دردشة وإنتظار قبولها، سوف يقوم alice ايضاً بطلب الخادم من إضافة bob إلى جدول
طلبات الدردشة **المُرسلة** ويتم تضمين خادم bob الحالي الذي تم إرسال طلب الدردشة
إليه[^3]
إذا قبل/رفض bob الدردشة سوف يُعلم خادم bob خادم alice أن bob قام بقبول/رفض
الدردشة، سوف يضع الخادم التوقيع الخاص به في `X-OTMP-SIGNATURE` وسوف يتم جلب
المفتاح العام الخاص به من مسار الخادم[^4] (لقد قام alice بإضافة bob والخادم
الخاص به في جدول طلبات الدردشة **المُرسلة** لذالك خادم alice يعلم ماهو خادم
bob).
بعد ذلك إذا لم يكن لـalice إتصال [Websocket] سابق مع خادم bob، سوف يقوم بإرسال
طلب دردشة ليتم ترقية الإتصال إلى [Websocket]، ونفس المسئلة مع bob إذا اراد
التواصل مع alice سوف يقوم بإرسال طلب دردشة ويتم ترقية الإتصال او إعلامه بوجود
إتصال [Websocket] مفتوح.
#### إذا كان alice في قائمة bob البيضاء
سوف يقوم الخادم بترقية الإتصال إلى [Websocket] او إذا كان alice متصل معه من قبل،
سوف يقوم بإرجاع 400 ويخبر alice بالتواصل معه عبر ال [Websocket].
#### إذا كان alice في قائمة bob السوداء او كان هو او خادمه في قائمة الخادم السوداء
سوف يرجع الخادم 403 مع توضيح السبب.
#### أساسيات
- يجب على alice فتح إتصال [Websocket] مع جميع الخوادم التي يريد التواصل مع
افرادها.
- لايتم تخزين الرسائل التي يستقبلها الخادم بشكل دائم، يتم تخزينها فقط إذا لم يكن
bob متصل بالخادم، ويتم مسحها بعد إرسالها إلى bob.
- الرسائل والملفات بين الطرفين تكون مشفرة وتكون موقعة للخادم المراد التواصل مع
افراده.
## شكر و تقدير
شكراً للأشخاص التاليين على مراجعة و تحسين البروتوكول.
- أمجد الشرفي <<me@amjad.alsharafi.dev>>: تحسين طريقة عمل التوقيع، و أقتراح
الطريقة الحالية.
{{ hr(data_content="وصلات") }}
[^1]: لضمان عدم وجود شخص في المنتصف، يقوم بالتلاعب بالبيانات و الإطلاع عليها.
[^2]: طالما انك عضو في الخادم، سوف يعتقد الخادم دائماً انك في إتصال [Websocket] معه، ولن يقوم بترقية أي إتصال إلى [Websocket]
[^3]: يتم إضافة العنوان الخاص بـbob و الخادم الخاص به في جدول طلبات الدردشة للتاكد من عدم إستقبال إشعارات قبول/رفض من خوادم مزيفة هدفها الإزعاج.
[^4]: للتاكد من انه الخادم فعلاً، لن يتم طلب منه المفتاح العام بشكل مباشر، بل سوف يتم جلبه من مسار الخاص به، وهو <span
dir='ltr'><code>/api/info</code></span>
[Websocket]: https://en.wikipedia.org/wiki/WebSocket
[HMAC-SHA256]: https://en.wikipedia.org/wiki/HMAC
[مفتاح التشفير المشترك]: #mfth-ltshfyr-lmshtrk
[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

9
content/faq.md Normal file
View file

@ -0,0 +1,9 @@
+++
title = "Frequently Asked Questions"
[extra]
lang = "en-US"
dir = "ltr"
+++
... Until now, there are no frequently asked questions, you can contact the author via email or one of the communication channels to ask questions ...

View file

@ -0,0 +1,13 @@
+++
title = "OTMP Protocol"
[extra]
lang = "en-US"
dir = "ltr"
+++
OxideTalis Messaging Protocol (OTMP) has only one version so far, but multiple versions may exist in the future.
### Versions
- [Version 1](/protocol/v1/)

18
content/protocol/v1.md Normal file
View file

@ -0,0 +1,18 @@
+++
title = "OTMP Protocol V1"
[extra]
lang = "en-US"
dir = "ltr"
add_toc = true
+++
<small>Author: [Awiteb](https://4rs.nl)</small>\
<small>Date: 2024/6/1</small>\
<small>Version: 1.0.0</small>\
<small>Status: Draft</small>
## Overview
... Currently, there is no English content for the protocol, after the protocol is finalized, the content will be translated into English, check the [Arabic version](/ar/protocol/v1/) if you are interested in the protocol ...

15
deploy.sh Executable file
View file

@ -0,0 +1,15 @@
#! /usr/bin/env bash
zola build
cd public
git init .
git checkout -B gh-pages
touch .nojekyll
echo "otmp.4rs.nl" > CNAME
git add .
git commit -m "Deploy to GitHub Pages"
git remote add origin https://github.com/TheAwiteb/otmp_site.git
git push origin gh-pages -f
cd ..
rm -fr public

View file

@ -1,133 +0,0 @@
<!doctype html>
<html
dir="ltr"
lang="en-US"
>
<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>Frequently Asked Questions</title>
<meta name="title" content="Frequently Asked Questions">
<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/faq/">
<meta property="og:site_name" content="OxideTalis Messaging Protocol">
<meta property="og:title" content="Frequently Asked Questions">
<meta property="og:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="og:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://otmp.4rs.nl/faq/">
<meta property="twitter:title" content="Frequently Asked Questions">
<meta property="twitter:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="twitter:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<link rel="canonical" href="https://otmp.4rs.nl/faq/">
<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/faq/",
"@type":"WebSite",
"headline":"Frequently Asked Questions",
"name":"Frequently Asked Questions",
"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="/" >English</a>
<a href="/ar/" >العربية</a>
</nav>
<h2>Frequently Asked Questions</h2>
</header>
<main class="page-content" aria-label="Content">
<p>... Until now, there are no frequently asked questions, you can contact the author via email or one of the communication channels to ask questions ...</p>
</main>
<footer>
<p class="taxonomies">
</p>
<nav>
<a href="mailto:otmp@4rs.nl" target="_blank" rel="noreferrer noopener">Email</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">Source</a>
</nav>
</footer>
</div>
</body>
</html>

View file

@ -1,146 +0,0 @@
<!doctype html>
<html
dir="ltr"
lang="en-US"
>
<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 Messaging Protocol</title>
<meta name="title" content="OxideTalis Messaging Protocol">
<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/">
<meta property="og:site_name" content="OxideTalis Messaging Protocol">
<meta property="og:title" content="OxideTalis Messaging Protocol">
<meta property="og:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="og:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://otmp.4rs.nl/">
<meta property="twitter:title" content="OxideTalis Messaging Protocol">
<meta property="twitter:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="twitter:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<link rel="canonical" href="https://otmp.4rs.nl/">
<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/",
"@type":"WebSite",
"headline":"OxideTalis Messaging Protocol",
"name":"OxideTalis Messaging Protocol",
"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="/" >English</a>
<a href="/ar/" >العربية</a>
</nav>
<h2>OxideTalis Messaging Protocol</h2>
</header>
<main class="page-content" aria-label="Content">
<p>This is the homepage of the OxideTalis Messaging Protocol (OTMP), a protocol to
communicate between two parties (Alice and Bob) using a shared secret. The
protocol is designed to be simple and easy to implement, while
providing a secure way to communicate.</p>
<h3 id="goals">Goals</h3>
<ul>
<li>Secure communication between two parties.</li>
<li>Simple and easy to implement.</li>
<li>Ability to send messages to users in another server directly, no dependency
the server of the sender.</li>
</ul>
<h3 id="non-goals">Non-Goals</h3>
<ul>
<li>Group communication.</li>
<li>Voice or video calls.</li>
</ul>
<h2 id="contents">Contents</h2>
<ul>
<li><a href="/protocol/">Protocol</a></li>
<li><a href="/faq/">FAQ</a></li>
</ul>
</main>
<footer>
<nav>
<a href="mailto:otmp@4rs.nl" target="_blank" rel="noreferrer noopener">Email</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">Source</a>
</nav>
</footer>
</div>
</body>
</html>

View file

@ -1,134 +0,0 @@
<!doctype html>
<html
dir="ltr"
lang="en-US"
>
<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>OTMP Protocol</title>
<meta name="title" content="OTMP Protocol">
<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/protocol/">
<meta property="og:site_name" content="OxideTalis Messaging Protocol">
<meta property="og:title" content="OTMP Protocol">
<meta property="og:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="og:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://otmp.4rs.nl/protocol/">
<meta property="twitter:title" content="OTMP Protocol">
<meta property="twitter:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="twitter:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<link rel="canonical" href="https://otmp.4rs.nl/protocol/">
<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/protocol/",
"@type":"WebSite",
"headline":"OTMP Protocol",
"name":"OTMP Protocol",
"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="/" >English</a>
<a href="/ar/" >العربية</a>
</nav>
<h2>OTMP Protocol</h2>
</header>
<main class="page-content" aria-label="Content">
<p>OxideTalis Messaging Protocol (OTMP) has only one version so far, but multiple versions may exist in the future.</p>
<h3 id="versions">Versions</h3>
<ul>
<li><a href="/protocol/v1/">Version 1</a></li>
</ul>
</main>
<footer>
<nav>
<a href="mailto:otmp@4rs.nl" target="_blank" rel="noreferrer noopener">Email</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">Source</a>
</nav>
</footer>
</div>
</body>
</html>

View file

@ -1,148 +0,0 @@
<!doctype html>
<html
dir="ltr"
lang="en-US"
>
<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>OTMP Protocol V1</title>
<meta name="title" content="OTMP Protocol V1">
<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/protocol/v1/">
<meta property="og:site_name" content="OxideTalis Messaging Protocol">
<meta property="og:title" content="OTMP Protocol V1">
<meta property="og:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="og:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://otmp.4rs.nl/protocol/v1/">
<meta property="twitter:title" content="OTMP Protocol V1">
<meta property="twitter:description" content="OxideTalis Messaging Protocol (OTMP) specification">
<meta property="twitter:image" content="https:&#x2F;&#x2F;otmp.4rs.nl&#x2F;otmp_logo.svg">
<link rel="canonical" href="https://otmp.4rs.nl/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/protocol/v1/",
"@type":"WebSite",
"headline":"OTMP Protocol V1",
"name":"OTMP Protocol V1",
"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="/" >English</a>
<a href="/ar/" >العربية</a>
</nav>
<h2>OTMP Protocol V1</h2>
</header>
<main class="page-content" aria-label="Content">
Table of Contents
<ul>
<li>
<a href="https://otmp.4rs.nl/protocol/v1/#overview">Overview</a>
</li>
</ul>
<p><small>Author: <a href="https://4rs.nl">Awiteb</a></small><br />
<small>Date: 2024/6/1</small><br />
<small>Version: 1.0.0</small><br />
<small>Status: Draft</small></p>
<h2 id="overview">Overview</h2>
<p>... Currently, there is no English content for the protocol, after the protocol is finalized, the content will be translated into English, check the <a href="/ar/protocol/v1/">Arabic version</a> if you are interested in the protocol ...</p>
</main>
<footer>
<p class="taxonomies">
</p>
<nav>
<a href="mailto:otmp@4rs.nl" target="_blank" rel="noreferrer noopener">Email</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">Source</a>
</nav>
</footer>
</div>
</body>
</html>

View file

@ -1,4 +0,0 @@
User-agent: *
Disallow:
Allow: /
Sitemap: https://otmp.4rs.nl/sitemap.xml

113
sass/style.scss Normal file
View file

@ -0,0 +1,113 @@
// -------------- THEME SWITCHER -------------- //
@mixin dark-appearance {
filter: invert(1);
img {
filter: invert(1);
&.invertable { filter: invert(0); }
}
}
body[theme="dark"] { @include dark-appearance; }
@media (prefers-color-scheme: dark) {
body[theme="auto"] { @include dark-appearance; }
}
@font-face {
font-family: "Vazir";
src: url(fonts/Vazirmatn-Regular.ttf) format("truetype");
}
// -------------------------------------------- //
// bg color is also needed in html in order to
// block body's background propagation
// see: https://stackoverflow.com/a/61265706
html, body { background: white; }
html { height: 100%; }
body {
color: black;
font-family: "Vazir";
font-size: 16px;
line-height: 1.4;
margin: 0;
min-height: 100%;
overflow-wrap: break-word;
}
.post-meta { text-align: right; }
h2, h3, h4, h5, h6 { margin-top: 3rem; }
hr { margin: 2rem 0; }
p { margin: 1rem 0; }
li { margin: 0.4rem 0; }
*:target { background: yellow; }
.w {
max-width: 850px;
margin: 0 auto;
padding: 4rem 2rem;
}
hr {
text-align: center;
border: 0;
&:before { content: '/////' }
&:after { content: attr(data-content) '/////' }
}
table { width: 100%; }
table, th, td {
border: thin solid black;
border-collapse: collapse;
padding: 0.4rem;
}
code {
color: white;
background: rgb(99, 99, 99);
}
pre code {
display: block;
overflow-x: auto;
white-space: pre-wrap;
padding: 1rem;
}
blockquote {
font-style: italic;
border: thin solid black;
padding: 1rem;
p { margin: 0; }
}
img {
max-width: 100%;
display: block;
margin: 0 auto;
}
.footnote-definition {
padding: 0 1rem;
&:target {
background: yellow;
color: #212121;
}
p {
display: inline;
}
}
nav, .taxonomies { text-align: center; }

View file

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://otmp.4rs.nl/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/ar/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/ar/faq/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/ar/protocol/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/ar/protocol/v1/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/categories/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/contexts/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/faq/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/protocol/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/protocol/v1/</loc>
</url>
<url>
<loc>https://otmp.4rs.nl/tags/</loc>
</url>
</urlset>

View file

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View file

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View file

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -1 +0,0 @@
body[theme=dark]{filter:invert(1)}body[theme=dark] img{filter:invert(1)}body[theme=dark] img.invertable{filter:invert(0)}@media (prefers-color-scheme: dark){body[theme=auto]{filter:invert(1)}body[theme=auto] img{filter:invert(1)}body[theme=auto] img.invertable{filter:invert(0)}}@font-face{font-family:"Vazir";src:url(fonts/Vazirmatn-Regular.ttf) format("truetype")}html,body{background:#fff}html{height:100%}body{color:#000;font-family:"Vazir";font-size:16px;line-height:1.4;margin:0;min-height:100%;overflow-wrap:break-word}.post-meta{text-align:right}h2,h3,h4,h5,h6{margin-top:3rem}hr{margin:2rem 0}p{margin:1rem 0}li{margin:.4rem 0}*:target{background:#ff0}.w{max-width:850px;margin:0 auto;padding:4rem 2rem}hr{text-align:center;border:0}hr:before{content:"/////"}hr:after{content:attr(data-content) "/////"}table{width:100%}table,th,td{border:thin solid #000;border-collapse:collapse;padding:.4rem}code{color:#fff;background:#636363}pre code{display:block;overflow-x:auto;white-space:pre-wrap;padding:1rem}blockquote{font-style:italic;border:thin solid #000;padding:1rem}blockquote p{margin:0}img{max-width:100%;display:block;margin:0 auto}.footnote-definition{padding:0 1rem}.footnote-definition:target{background:#ff0;color:#212121}.footnote-definition p{display:inline}nav,.taxonomies{text-align:center}

5
templates/404.html Normal file
View file

@ -0,0 +1,5 @@
{% extends "base.html" %}
{% block content %}
404
{% endblock content %}

139
templates/base.html Normal file
View file

@ -0,0 +1,139 @@
<!doctype html>
<html
dir="{% if section.extra.dir %}{{section.extra.dir}}{% elif page.extra.dir %}{{page.extra.dir}}{% else %}ltr{% endif %}"
lang="{% if section.extra.lang %}{{section.extra.lang}}{% elif page.extra.lang %}{{page.extra.lang}}{% else %}en-US{% endif %}"
>
<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"/>
{% if page.title %}
{% set title = page.title %}
{% elif section.title %}
{% set title = section.title %}
{% elif config.title %}
{% set title = config.title %}
{% endif %}
{% if page.extra.author %}
{% set author = page.extra.author %}
{% elif section.extra.author %}
{% set author = section.extra.author %}
{% elif config.extra.author %}
{% set author = config.extra.author %}
{% endif %}
{% if page.description %}
{% set description = page.description | truncate(length=150) %}
{% elif section.description %}
{% set description = section.description | truncate(length=150) %}
{% elif config.description %}
{% set description = config.description | truncate(length=150) %}
{% endif %}
{% if page.extra.image %}
{% set image = get_url(path=page.extra.image, trailing_slash=false) %}
{% elif section.extra.image %}
{% set image = get_url(path=section.extra.image, trailing_slash=false) %}
{% elif config.extra.logo %}
{% set image = get_url(path=config.extra.logo, trailing_slash=false) %}
{% endif %}
{% if page.permalink %}
{% set url = page.permalink %}
{% elif section.permalink %}
{% set url = section.permalink %}
{% elif config.base_url %}
{% set url = config.base_url %}
{% endif %}
{% if title %}<title>{{ title }}</title>{% endif %}
{% block metatags %}
{% if title %}<meta name="title" content="{{ title }}">{% endif %}
{% if author %}<meta name="author" content="{{ author }}">{% endif %}
{% if description %}<meta name="description" content="{{ description }}">{% endif %}
<meta name="generator" content="Zola v0.16.1">
<meta property="og:type" content="website">
<meta property="og:url" content="{{ url | safe }}">
{% if title %}<meta property="og:site_name" content="{{ config.title }}">{% endif %}
{% if title %}<meta property="og:title" content="{{ title }}">{% endif %}
{% if description %}<meta property="og:description" content="{{ description }}">{% endif %}
{% if image %}<meta property="og:image" content="{{ image }}">{% endif %}
{% set twitter_card = config.extra.twitter_card | default(value=true) %}
{% if twitter_card != false %}
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="{{ url | safe }}">
{% if title %}<meta property="twitter:title" content="{{ title }}">{% endif %}
{% if description %}<meta property="twitter:description" content="{{ description }}">{% endif %}
{% if image %}<meta property="twitter:image" content="{{ image }}">{% endif %}
{% endif %}
<link rel="canonical" href="{{ url | safe }}">
{% if image %}<link rel="shortcut icon" type="image/x-icon" href="{{ get_url(path=config.extra.logo, trailing_slash=false) }}">{% endif %}
<script type="application/ld+json">
{
{% if description %}"description":"{{ description | safe }}",{% endif %}
"url":"{{ url | safe }}",
"@type":"WebSite",
{% if title %}"headline":"{{ title | safe }}",{% endif %}
{% if title %}"name":"{{ title | safe }}",{% endif %}
{% if author %}"author":{
"@type":"Person",
"name":"{{ author | safe }}"
},{% endif %}
"@context":"https://schema.org"
}
</script>
{% endblock metatags %}
{% if config.generate_feed %}
{% block feed %}
<link rel="alternate" type="application/atom+xml" title="RSS" href="{{ get_url(path="atom.xml", trailing_slash=false) }}">
{% endblock feed %}
{% endif %}
{% block css %}
<link rel="stylesheet" href="{{ get_url(path='style.css', trailing_slash=false) | safe }}"/>
{% endblock css %}
</head>
<body theme="auto">
<div class="w">
<header>
{% if config.extra.header_nav %}
{% if page.extra.lang and page.extra.lang == "ar-SA" or section.extra.lang and section.extra.lang == "ar-SA" %}
{% set header_nav = config.extra.header_nav | reverse %}
{% else %}
{% set header_nav = config.extra.header_nav %}
{% endif %}
<nav>
{% for nav_item in header_nav %}
<a href="{{ nav_item.url | safe }}" {% if nav_item.new_tab %}target="_blank" rel="noreferrer noopener"{% endif %}>{{ nav_item.name }}</a>
{% endfor %}
</nav>
{% endif %}
{% block header %}{% if title %}<h2>{{ config.title }}</h2>{% endif %}{% endblock header %}
</header>
<main class="page-content" aria-label="Content">
{% block content %}{% endblock content %}
</main>
<footer>
{% block footer %}{% endblock footer %}
{% if page.extra.lang and page.extra.lang == "ar-SA" or section.extra.lang and section.extra.lang == "ar-SA" and config.extra.ar_footer_nav %}
{% set footer_nav = config.extra.ar_footer_nav %}
{% elif config.extra.footer_nav %}
{% set footer_nav = config.extra.footer_nav %}
{% endif %}
{% if footer_nav %}
<nav>
{% for nav_item in footer_nav %}
<a href="{{ nav_item.url | safe }}" {% if nav_item.new_tab %}target="_blank" rel="noreferrer noopener"{% endif %}>{{ nav_item.name }}</a>
{% endfor %}
</nav>
{% endif %}
</footer>
</div>
</body>
</html>

View file

@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block header %}
<p><a href="{{ current_path }}..">..</a>{{ current_path }}</p>
<h1>{{ taxonomy.name }}</h1>
{% endblock header %}
{% block content %}
<ul>
{% for term in terms %}
<li>
<a href="{{ term.permalink | safe }}">{{ term.name }}</a> [{{ term.pages | length }}]
</li>
{% endfor %}
</ul>
{% endblock content %}

View file

@ -0,0 +1,26 @@
{% extends "base.html" %}
{% block header %}
<p><a href="{{ current_path }}">..</a>/{{ term.slug }}/</p>
<h1>{{ term.name }}</h1>
{% endblock header %}
{% block content %}
{% if paginator %}
{% set pages = paginator.pages %}
{% else %}
{% set pages = term.pages %}
{% endif %}
<ul>
{% for page in pages %}
<li>
<a href="{{ page.permalink | safe }}">{% if page.date %}{{ page.date }} - {% endif %}{{ page.title }}</a>
<br />
{{ page.description }}
</li>
{% endfor %}
</ul>
{% if paginator %}
<p>{% if paginator.previous %}<a href="{{ paginator.first }}">&lt;&lt; First</a> <a href="{{ paginator.previous }}">&lt; Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next &gt;</a> <a href="{{ paginator.last }}">Last &gt;&gt;</a>{% endif %}</p>
{% endif %}
{% endblock content %}

View file

@ -0,0 +1,14 @@
{% extends "base.html" %}
{% block header %}
<p><a href="{{ current_path }}..">..</a>{{ current_path }}</p>
<h1>{{ taxonomy.name }}</h1>
{% endblock header %}
{% block content %}
<p>
{% for term in terms %}
<a href="{{ term.permalink | safe }}">@{{ term.name }}</a>
{% endfor %}
</p>
{% endblock content %}

View file

@ -0,0 +1,26 @@
{% extends "base.html" %}
{% block header %}
<p><a href="{{ current_path }}">..</a>/{{ term.slug }}/</p>
<h1>{{ term.name }}</h1>
{% endblock header %}
{% block content %}
{% if paginator %}
{% set pages = paginator.pages %}
{% else %}
{% set pages = term.pages %}
{% endif %}
<ul>
{% for page in pages %}
<li>
<a href="{{ page.permalink | safe }}">{% if page.date %}{{ page.date }} - {% endif %}{{ page.title }}</a>
<br />
{{ page.description }}
</li>
{% endfor %}
</ul>
{% if paginator %}
<p>{% if paginator.previous %}<a href="{{ paginator.first }}">&lt;&lt; First</a> <a href="{{ paginator.previous }}">&lt; Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next &gt;</a> <a href="{{ paginator.last }}">Last &gt;&gt;</a>{% endif %}</p>
{% endif %}
{% endblock content %}

16
templates/index.html Normal file
View file

@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block content %}
{{ section.content | safe }}
{% if config.extra.list_pages %}
{% if paginator %}
{% set pages = paginator.pages %}
{% else %}
{% set pages = section.pages %}
{% endif %}
{% if paginator %}
<p>{% if paginator.previous %}<a href="{{ paginator.first }}">&lt;&lt; First</a> <a href="{{ paginator.previous }}">&lt; Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next &gt;</a> <a href="{{ paginator.last }}">Last &gt;&gt;</a>{% endif %}</p>
{% endif %}
{% endif %}
{% endblock content %}

50
templates/page.html Normal file
View file

@ -0,0 +1,50 @@
{% extends "base.html" %}
{% block header %}
<h2>{{ page.title }}</h2>
{% endblock header %}
{% block content %}
{% if page.toc and page.extra.add_toc %}
{% if page.extra.lang == "ar-SA" %}جدول المحتويات{% else %}Table of Contents{% endif %}
<ul>
{% for h1 in page.toc %}
<li>
<a href="{{ h1.permalink | safe }}">{{ h1.title }}</a>
{% if h1.children %}
<ul>
{% for h2 in h1.children %}
<li>
<a href="{{ h2.permalink | safe }}">{{ h2.title }}</a>
</li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
{{ page.content | safe }}
{% endblock content %}
{% block footer %}
<p class="taxonomies">
{% if page.taxonomies.tags %}
{% for tag in page.taxonomies.tags %}
<a href="/tags/{{ tag | slugify }}">#{{ tag }}</a>
{% endfor %}
{% if page.taxonomies.categories %}
{% for category in page.taxonomies.categories %}
<a href="/categories/{{ category | slugify }}">+{{ category }}</a>
{% endfor %}
{% endif %}
{% if page.taxonomies.contexts %}
{% for context in page.taxonomies.contexts %}
<a href="/contexts/{{ context | slugify }}">@{{ context }}</a>
{% endfor %}
{% endif %}
{% endif %}
</p>
{% endblock footer %}

17
templates/section.html Normal file
View file

@ -0,0 +1,17 @@
{% extends "base.html" %}
{% block header %}
<h2>{{ section.title }}</h2>
{% endblock header %}
{% block content %}
{{ section.content | safe }}
{% if paginator %}
{% set pages = paginator.pages %}
{% else %}
{% set pages = section.pages %}
{% endif %}
{% if paginator %}
<p>{% if paginator.previous %}<a href="{{ paginator.first }}">&lt;&lt; First</a> <a href="{{ paginator.previous }}">&lt; Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next &gt;</a> <a href="{{ paginator.last }}">Last &gt;&gt;</a>{% endif %}</p>
{% endif %}
{% endblock content %}

View file

@ -0,0 +1 @@
<hr data-content="{% if data_content %}{{ data_content }}{% endif %}" \>

View file

@ -0,0 +1 @@
<img class="invertable" {% if src %}src="{{ src }}"{% endif %} {% if alt %}alt="{{ alt }}"{% endif %} />

14
templates/tags/list.html Normal file
View file

@ -0,0 +1,14 @@
{% extends "base.html" %}
{% block header %}
<p><a href="{{ current_path }}..">..</a>{{ current_path }}</p>
<h1>{{ taxonomy.name }}</h1>
{% endblock header %}
{% block content %}
<p>
{% for term in terms %}
<a href="{{ term.permalink | safe }}">#{{ term.name }}</a>[{{ term.pages | length }}]
{% endfor %}
</p>
{% endblock content %}

View file

@ -0,0 +1,26 @@
{% extends "base.html" %}
{% block header %}
<p><a href="{{ current_path }}">..</a>/{{ term.slug }}/</p>
<h1>{{ term.name }}</h1>
{% endblock header %}
{% block content %}
{% if paginator %}
{% set pages = paginator.pages %}
{% else %}
{% set pages = term.pages %}
{% endif %}
<ul>
{% for page in pages %}
<li>
<a href="{{ page.permalink | safe }}">{% if page.date %}{{ page.date }} - {% endif %}{{ page.title }}</a>
<br />
{{ page.description }}
</li>
{% endfor %}
</ul>
{% if paginator %}
<p>{% if paginator.previous %}<a href="{{ paginator.first }}">&lt;&lt; First</a> <a href="{{ paginator.previous }}">&lt; Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next &gt;</a> <a href="{{ paginator.last }}">Last &gt;&gt;</a>{% endif %}</p>
{% endif %}
{% endblock content %}

View file

@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block header %}
<p><a href="{{ current_path }}..">..</a>{{ current_path }}</p>
<h1>{{ taxonomy.name }}</h1>
{% endblock header %}
{% block content %}
<ul>
{% for term in terms %}
<li>
<a href="{{ term.permalink | safe }}">{{ term.name }}</a>
</li>
{% endfor %}
</ul>
{% endblock content %}

View file

@ -0,0 +1,26 @@
{% extends "base.html" %}
{% block header %}
<p><a href="{{ current_path }}">..</a>/{{ term.slug }}/</p>
<h1>{{ term.name }}</h1>
{% endblock header %}
{% block content %}
{% if paginator %}
{% set pages = paginator.pages %}
{% else %}
{% set pages = term.pages %}
{% endif %}
<ul>
{% for page in pages %}
<li>
<a href="{{ page.permalink | safe }}">{% if page.date %}{{ page.date }} - {% endif %}{{ page.title }}</a>
<br />
{{ page.description }}
</li>
{% endfor %}
</ul>
{% if paginator %}
<p>{% if paginator.previous %}<a href="{{ paginator.first }}">&lt;&lt; First</a> <a href="{{ paginator.previous }}">&lt; Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next &gt;</a> <a href="{{ paginator.last }}">Last &gt;&gt;</a>{% endif %}</p>
{% endif %}
{% endblock content %}

18
theme.toml Normal file
View file

@ -0,0 +1,18 @@
name = "no style, please!"
description = "A (nearly) no-CSS, fast, minimalist Zola theme"
license = "MIT"
homepage = "https://gitlab.com/atgumx/no-style-please"
min_version = "0.4.0"
demo = "https://atgumx.gitlab.io/no-style-please"
[extra]
# The theme author info: you!
[author]
name = "Ahmed Alaa"
homepage = "https://gumx.cc"
[original]
author = "Riccardo Graziosi"
homepage = "https://riggraz.dev"
repo = "https://github.com/riggraz/no-style-please"