mirror of
https://codeberg.org/postscriptum/gemlog.git
synced 2026-02-19 14:32:40 +00:00
203 lines
15 KiB
Text
203 lines
15 KiB
Text
# Misfin - поштовий сателіт Geminispace
|
||
|
||
Про Misfin я знаю давно, декілька разів намагався ним користуватись, але жодного - не доводилось перевірити його в реальних умовах. Зокрема, через брак аудиторії та відсутність такої необхідності в сучасному світі месенджерів, де й сама пошта є епохою динозаврів. Утім, хотілось би трішки освітити цю альтернативну технологію для широкого загалу, адже з протоколом Gemini - знайомий не заочно і вже встиг написати для його специфікації, у свій час, повнофункціональний GTK браузер Yoda (https://github.com/YGGverse/Yoda) а також ряд інших серверних рішень різними мовами.
|
||
|
||
Протокол доставки повідомлень Misfin - названо на честь космічного проєкту MSFN, Manned Space Flight Network (https://en.wikipedia.org/wiki/Manned_Space_Flight_Network) і є спробою реалізації мінімалістичної альтернативи класичній пошті e-mail, за образом і подобою концепції протоколу Gemini.
|
||
|
||
З офіційного маніфесту:
|
||
|
||
> Електронна пошта така ж погана, як і Інтернет. Вона стала складною, захищеною лише за допомогою інших протоколів, які до неї приєднані, і підтримує всі неприємні функції, які є в Інтернеті, такі як Cookies та трекінгові маячки. Ще гірше, що вона зазнає активної ворожості з боку великих гравців Інтернету. Більшість провайдерів блокують трафік на порту 25, і ви не можете доставити пошту до жодного з великих сервісів (як-от Gmail), не проходячи через численні перешкоди - і навіть тоді це лотерея.
|
||
|
||
Від себе зауважу, що вбачаю в ньому не стільки боротьбу з корпораціями та монополією, але опцію отримувати чистий вміст листів: без розмітки та зайвих заголовків, що можуть бути частиною трекінгу, характерних для сучасного Веб 2.0 та вище. Якщо ж у вас є проблеми з 25 портом чи бажаєте розгорнути повноцінну локальну пошту за NAT, ознайомтесь з наступними матеріалами:
|
||
=> dns-less-email-server-for-the-local-networks.gmi Організація поштової скриньки для локальних мереж без DNS
|
||
=> yggmail-messenger-with-email-protocol.gmi Yggmail - месенджер з поштовим інтерфейсом
|
||
|
||
## Реалізація
|
||
|
||
На мою думку, Misfin не є альтернативною класичній пошті, це швидше модифікація протоколу відправки даних Titan для Gemini або NPS для Nex, але на відміну від таких, не є частиною інфраструктури жодного з них.
|
||
|
||
Про концепції протоколів Gemini та Nex читайте тут:
|
||
=> gemini-protocol-as-http-alternative.gmi Протокол Gemini як альтернатива HTTP
|
||
=> nex-lightweight-gemini-alternative.gmi Протокол NEX - легка альтернатива Gemini
|
||
|
||
Схоже до Titan, Misfin використовує сервер, який працює на сокеті з виділеним портом (стандартно 1958) і отримує на нього дані через обов'язковий шар шифрування TLS. Окрім тексту повідомлень, дані містять мінімалістичні заголовки (які на відміну від Titan, орієнтовані не на файл, а текст) і включають:
|
||
|
||
* USER_ID - поштова скринька користувача (admin, santa і тд.)
|
||
* COMMON_NAME - псевдонім користувача
|
||
* SUBJECT_ALT_NAME - хост (example.com, misfin.org, тощо)
|
||
|
||
Сирий рядок запиту виглядатиме як:
|
||
|
||
```
|
||
misfin://mailbox@hostname.com \r\n
|
||
Текст повідомлення
|
||
```
|
||
|
||
Відповідь сервера-отримувача при цьому буде такою:
|
||
|
||
```
|
||
20 <fingerprint of the recipient>\r\n
|
||
```
|
||
|
||
Хто вже працював з Gemini, може побачити, що ці протоколи - між собою схожі, як дві краплі води. Більш детально вдаватись в специфікацію тут не буду, вона описана на офіційному сайті (посилання внизу сторінки). Занотую тільки, що наразі існує три базові редакції протоколу:
|
||
* A - сама перша, рання офіційна редакція (наразі вважається архівною)
|
||
* B - друга офіційна редакція протоколу, що включає корекції A
|
||
* C - після релізу версії B його автор (Лем) на деякий час пропав з радарів, тому декілька користувачів не дочекавшись випустили версію C, яка збільшує довжину повідомлення та включає деякі оптимізації, що стосуються формату заголовків
|
||
|
||
Наскільки мені відомо, автор редакцій A і B згодом вийшов на зв'язок та збирався включити редакцію C в офіційну специфікацію, але потім зник. Формально, протоколи B і C є сумісними, а новий софт пишеться з урахуванням специфікації останнього. Тому майте на увазі цю невеличку історію. Більше про неї вам розкаже один з учасників цього процесу:
|
||
=> gemini://bbs.geminispace.org/u/clseibold
|
||
|
||
## Програмне забезпечення
|
||
|
||
Для доставки пошти, передбачається класична пара клієнт-сервер, при цьому для сервера відкривається вказаний в його налаштуваннях порт TCP:
|
||
|
||
``` bash
|
||
ufw allow 1958/tcp
|
||
```
|
||
|
||
### Сервер
|
||
|
||
Є різні реалізації, але мені відомо про щонайменше дві стабільні:
|
||
|
||
=> https://sr.ht/~nixgoat/estampa/ estampa (Rust)
|
||
=> https://gitlab.com/clseibold/misfin-server misfin-server (Go)
|
||
|
||
### estampa
|
||
|
||
Так як сам розробляю програмне забезпечення на Rust, для себе обрав estampa.
|
||
|
||
Встановлюється цей сервер наступним чином:
|
||
|
||
``` bash
|
||
git clone https://git.sr.ht/~nixgoat/estampa
|
||
cd estampa
|
||
cargo build --release
|
||
install target/release/estampa /usr/local/bin/estampa
|
||
```
|
||
* останньою командою ми встановлюємо estampa до канонічного розташування бінарних програм Linux, для подальшої роботи сервера з systemd; якщо ви не плануєте встановлення, цей крок можна пропустити і пускатись через звернення до target/release/estampa
|
||
|
||
=> install-latest-rust-version-on-linux.gmi Встановлення останньої версії Rust в Linux
|
||
|
||
У поточній теці проєкту, відкриваємо файл конфігурації:
|
||
|
||
``` bash
|
||
nano config.toml
|
||
```
|
||
|
||
та додаємо в кінці поштові скриньки користувачів:
|
||
|
||
``` config.toml
|
||
[mailbox.user1]
|
||
enabled = true
|
||
name = "user 1"
|
||
|
||
[mailbox.user2]
|
||
enabled = true
|
||
name = "user 2"
|
||
```
|
||
|
||
Опціонально, можна вказати й інші налаштування (якщо плануєте запуск від systemd) але я лишив стандартно.
|
||
|
||
Далі, сервер запускається командою:
|
||
|
||
``` bash
|
||
estampa
|
||
```
|
||
|
||
При першому запуску, у поточній теці буде згенеровано сертифікат сервера TLS (такий само як для сервера Gemini)
|
||
|
||
* server.crt
|
||
* server.key
|
||
|
||
у цій же теці буде створено файлову структуру для збереження листів, за адресою в прикладі це буде:
|
||
|
||
```
|
||
store/
|
||
certs/
|
||
user1.pem
|
||
user2.pem
|
||
priv/
|
||
user1.pem
|
||
user2.pem
|
||
mbox/
|
||
user1/
|
||
user2/
|
||
```
|
||
* таким чином, при отриманні листів, вони будуть зберігатись у теці store/mbox/user/*.gmi
|
||
|
||
### systemd
|
||
|
||
Публічний сервер можна (і варто) запускати від окремого користувача:
|
||
|
||
``` bash
|
||
useradd -m estampa
|
||
```
|
||
|
||
```
|
||
# /etc/systemd/system/estampa.service
|
||
[Unit]
|
||
After=network-online.target
|
||
Wants=network-online.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
|
||
User=estampa
|
||
Group=estampa
|
||
|
||
# Якщо в конфігурації вказано відносні шляхи до сховища та сертифікатів,
|
||
# важливо вказати шлях до робочої теки:
|
||
# WorkingDirectory=/path/to/working/directory
|
||
|
||
ExecStart=/usr/local/bin/estampa
|
||
|
||
# Вкажіть null якщо не бажаєте журналювати роботу сервера
|
||
StandardOutput=file:/home/estampa/debug.log
|
||
StandardError=file:/home/estampa/error.log
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
* systemctl daemon-reload - оновити конфігурацію
|
||
* systemctl enable estampa - автостарт при запуску системи
|
||
* systemctl start estampa - запуск
|
||
* systemctl status estampa - перевірити статус
|
||
|
||
### Клієнт
|
||
|
||
Наразі, я не знайшов готового рішення для десктоп чи мобільних платформ, як це можна було б очікувати від класичного поштового клієнта. Натомість, листи що надходять - складаються в файлову систему, з розширенням .gmi (Gemtext) і читаються вручну. Можливо, колись таки зроблю повноцінний GUI клієнт зі сповіщеннями і .. блек джеком, а наразі - маємо наступні опції:
|
||
|
||
### Lagrange
|
||
|
||
Найпростіший спосіб відправити листа - зробити це через GUI браузер Lagrange, адже з вірогідністю 99% ви будете користуватись саме ним:
|
||
=> gemini://skyjake.fi/lagrange/
|
||
|
||
Для цього потрібно відкрити в основному меню "Identity" > "Import" та додати сертифікат (я просто зкопіював туди згенерований сертифікат одного з юзерів store/certs). Після цього, в боковому меню "Identities" (Ctrl+4) на імпортованому сертифікаті правою кнопкою миші відкриваємо контекстне меню та шукаємо пункт "Send mail as...", пишемо адресу отримувача, повідомлення та тиснемо кнопку "Send".
|
||
|
||
### CLI
|
||
|
||
У якості клієнта, можна використовувати командний рядок, засобами утиліт, які розраховані на відправлення даних через сокет з шаром SSL:
|
||
|
||
``` bash
|
||
echo -e "misfin://test@localhost < test@localhost2 Test \r\nMESSAGE" | openssl s_client\
|
||
-connect localhost:1958\
|
||
-cert /path/to/cert.pem\
|
||
-key /path/to/key.pem\
|
||
-ign_eof
|
||
```
|
||
* вказуючи "< test@localhost2" ми додаємо відправника і підписуємо його "/path/to/cert.pem" і "/path/to/key.pem" з набору згенерованих скриньок, що вказані в прикладі estampa, тобто лежать вони в "store/certs/*" (запуск окремого сервера `localhost2` не потрібен)
|
||
* згідно специфікації, тут важливо зберегти пробіл перед "\r\n" інакше буде помилка "59"
|
||
* нагадаю, що для сумісності з редакцією B, максимальна довжина повідомлення разом із заголовком, повинна складати не більше 2048 байт
|
||
* при успішному відправленні, як і у випадку з Gemini, має бути код "20" (успішно)
|
||
|
||
## Висновки
|
||
|
||
Як писав вище, я не вважаю даний експеримент заміною e-mail, адже той пройшов довгий шлях еволюції і став таким в умовах промислової реальності. Misfin, може стати хіба що базою для альтернативного обміну повідомленнями в локальних мережах або для спілкування з друзями-гіками, особливо, якщо ви - користувач CLI (хоча й тут, мабуть я обрав би комунікацію сокетами через telnet або IRC).
|
||
|
||
Тут також немає відповіді на питання щодо боротьби з потенційним спамом, але як вказано на офіційному сайті, в Geminispace це явище майже відсутнє через малу популярність протоколів сімейства Gopher.
|
||
|
||
## Посилання
|
||
|
||
=> gemini://misfin.org/ Офіційний сайт
|
||
=> gemini://bbs.geminispace.org/s/misfin Група Misfin на BBS
|
||
=> https://devzone.org.ua/post/misfin-poshtovyy-satelit-geminispace Веб-адаптація цього матеріалу з коментарями на сайті DevZone
|