Compare commits
No commits in common. "master" and "site" have entirely different histories.
|
@ -1,33 +0,0 @@
|
|||
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
|
@ -1,2 +0,0 @@
|
|||
static/processed_images
|
||||
public
|
0
.nojekyll
Normal file
123
404.html
Normal file
|
@ -0,0 +1,123 @@
|
|||
<!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://otmp.4rs.nl/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://otmp.4rs.nl/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
Normal file
|
@ -0,0 +1 @@
|
|||
otmp.4rs.nl
|
22
LICENSE
|
@ -1,22 +0,0 @@
|
|||
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
|
@ -1,67 +0,0 @@
|
|||
<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).
|
133
ar/faq/index.html
Normal file
|
@ -0,0 +1,133 @@
|
|||
<!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://otmp.4rs.nl/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://otmp.4rs.nl/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>
|
||||
|
149
ar/index.html
Normal file
|
@ -0,0 +1,149 @@
|
|||
<!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://otmp.4rs.nl/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://otmp.4rs.nl/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>
|
||||
|
134
ar/protocol/index.html
Normal file
|
@ -0,0 +1,134 @@
|
|||
<!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://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/">
|
||||
<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/">
|
||||
<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>
|
||||
|
499
ar/protocol/v1/index.html
Normal file
|
@ -0,0 +1,499 @@
|
|||
<!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>
|
||||
|
33
config.toml
|
@ -1,33 +0,0 @@
|
|||
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/"},
|
||||
]
|
|
@ -1,26 +0,0 @@
|
|||
+++
|
||||
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/)
|
|
@ -1,27 +0,0 @@
|
|||
+++
|
||||
title = "بروتوكول الرسائل الخاص بـ OxideTalis"
|
||||
|
||||
[extra]
|
||||
image = "/otmp_ar.png"
|
||||
lang = "ar-SA"
|
||||
dir = "rtl"
|
||||
+++
|
||||
|
||||
هذه الصفحة الرئيسية لبروتوكول الرسائل الخاص بـ OxideTalis (OTMP)، وهو بروتوكول
|
||||
للتواصل بين طرفين (أليس وبوب) باستخدام مفتاح تشفير مشترك. تم تصميم البروتوكول
|
||||
ليكون بسيطًا وسهل التنفيذ، مع توفير وسيلة آمنة للتواصل.
|
||||
|
||||
|
||||
### الأهداف
|
||||
- تواصل آمن بين طرفين.
|
||||
- سهولة التنفيذ.
|
||||
- القدرة على إرسال رسائل إلى مستخدمين في خوادم أخرى مباشرة، بدون الاعتماد على
|
||||
خادم المرسل.
|
||||
|
||||
### الأهداف الغير مرغوبة
|
||||
- التواصل الجماعي.
|
||||
- المكالمات الصوتية أو الفيديو.
|
||||
|
||||
## المحتويات
|
||||
- [البروتوكول](/ar/protocol/)
|
||||
- [الاسئلة الشائعة](/ar/faq/)
|
|
@ -1,10 +0,0 @@
|
|||
+++
|
||||
title = "الاسئلة الشائعة"
|
||||
|
||||
[extra]
|
||||
image = "/otmp_ar.png"
|
||||
lang = "ar-SA"
|
||||
dir = "rtl"
|
||||
+++
|
||||
|
||||
... لايوجد اسئلة شائعة حتى الان، يمكنك التواصل مع المؤلف عبر البريد الإلكتروني او احد قنوات التواصل لطرح الاسئلة ...
|
|
@ -1,14 +0,0 @@
|
|||
+++
|
||||
title = "إصدارات بروتوكول OxideTalis"
|
||||
|
||||
[extra]
|
||||
image = "/otmp_ar.png"
|
||||
lang = "ar-SA"
|
||||
dir = "rtl"
|
||||
+++
|
||||
|
||||
حتى الان بروتوكول OxideTalis يملك اصدار واحد فقط، ولكن من الممكن تواجد عدة إصدارات في المستقبل
|
||||
|
||||
### الإصدارات
|
||||
|
||||
- [الإصدار الاول](/ar/protocol/v1/)
|
|
@ -1,312 +0,0 @@
|
|||
+++
|
||||
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
|
|
@ -1,9 +0,0 @@
|
|||
+++
|
||||
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 ...
|
|
@ -1,13 +0,0 @@
|
|||
+++
|
||||
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/)
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
+++
|
||||
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
|
@ -1,15 +0,0 @@
|
|||
#! /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
|
133
faq/index.html
Normal file
|
@ -0,0 +1,133 @@
|
|||
<!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://otmp.4rs.nl/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://otmp.4rs.nl/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>
|
||||
|
146
index.html
Normal file
|
@ -0,0 +1,146 @@
|
|||
<!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://otmp.4rs.nl/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://otmp.4rs.nl/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>
|
||||
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
134
protocol/index.html
Normal file
|
@ -0,0 +1,134 @@
|
|||
<!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://otmp.4rs.nl/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://otmp.4rs.nl/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>
|
||||
|
148
protocol/v1/index.html
Normal file
|
@ -0,0 +1,148 @@
|
|||
<!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://otmp.4rs.nl/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://otmp.4rs.nl/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>
|
||||
|
4
robots.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
User-agent: *
|
||||
Disallow:
|
||||
Allow: /
|
||||
Sitemap: https://otmp.4rs.nl/sitemap.xml
|
113
sass/style.scss
|
@ -1,113 +0,0 @@
|
|||
// -------------- 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; }
|
36
sitemap.xml
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?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>
|
1
style.css
Normal file
|
@ -0,0 +1 @@
|
|||
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}
|
|
@ -1,5 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
404
|
||||
{% endblock content %}
|
|
@ -1,139 +0,0 @@
|
|||
<!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>
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
{% 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 %}
|
|
@ -1,26 +0,0 @@
|
|||
{% 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 }}"><< First</a> <a href="{{ paginator.previous }}">< Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next ></a> <a href="{{ paginator.last }}">Last >></a>{% endif %}</p>
|
||||
{% endif %}
|
||||
{% endblock content %}
|
|
@ -1,14 +0,0 @@
|
|||
{% 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 %}
|
|
@ -1,26 +0,0 @@
|
|||
{% 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 }}"><< First</a> <a href="{{ paginator.previous }}">< Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next ></a> <a href="{{ paginator.last }}">Last >></a>{% endif %}</p>
|
||||
{% endif %}
|
||||
{% endblock content %}
|
|
@ -1,16 +0,0 @@
|
|||
{% 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 }}"><< First</a> <a href="{{ paginator.previous }}">< Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next ></a> <a href="{{ paginator.last }}">Last >></a>{% endif %}</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endblock content %}
|
|
@ -1,50 +0,0 @@
|
|||
{% 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 %}
|
|
@ -1,17 +0,0 @@
|
|||
{% 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 }}"><< First</a> <a href="{{ paginator.previous }}">< Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next ></a> <a href="{{ paginator.last }}">Last >></a>{% endif %}</p>
|
||||
{% endif %}
|
||||
{% endblock content %}
|
|
@ -1 +0,0 @@
|
|||
<hr data-content="{% if data_content %}{{ data_content }}{% endif %}" \>
|
|
@ -1 +0,0 @@
|
|||
<img class="invertable" {% if src %}src="{{ src }}"{% endif %} {% if alt %}alt="{{ alt }}"{% endif %} />
|
|
@ -1,14 +0,0 @@
|
|||
{% 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 %}
|
|
@ -1,26 +0,0 @@
|
|||
{% 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 }}"><< First</a> <a href="{{ paginator.previous }}">< Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next ></a> <a href="{{ paginator.last }}">Last >></a>{% endif %}</p>
|
||||
{% endif %}
|
||||
{% endblock content %}
|
|
@ -1,16 +0,0 @@
|
|||
{% 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 %}
|
|
@ -1,26 +0,0 @@
|
|||
{% 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 }}"><< First</a> <a href="{{ paginator.previous }}">< Previous</a>{% endif %} [{{ paginator.current_index }}/{{ paginator.number_pagers }}] {% if paginator.next %}<a href="{{ paginator.next }}">Next ></a> <a href="{{ paginator.last }}">Last >></a>{% endif %}</p>
|
||||
{% endif %}
|
||||
{% endblock content %}
|
18
theme.toml
|
@ -1,18 +0,0 @@
|
|||
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"
|