<?xml version="1.0" encoding="UTF-8"?>
	<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:media="http://search.yahoo.com/mrss/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:georss="http://www.georss.org/georss">
	<channel>
	<title>fox :: echo/tMyHyWF5VWamTu9m1Yf8</title>
	<link>https://idec.foxears.su/echo/tMyHyWF5VWamTu9m1Yf8</link>
	<description>
	fox :: echo/tMyHyWF5VWamTu9m1Yf8
	</description>
	<language>ru</language>
<item><title>Описание протокола</title><guid>tMyHyWF5VWamTu9m1Yf8</guid><pubDate>2024-11-20 17:32:27</pubDate><author>gornekib</author><link>https://idec.foxears.su/forum/tMyHyWF5VWamTu9m1Yf8#tMyHyWF5VWamTu9m1Yf8</link>
		<description>
		источник https://github.com/idec-net/new-docs/blob/master/extensions.md

Расширения IDEC
===============

Здесь описаны расширения протокола, являющиеся основным отличием IDEC от ii. Многие из них реализовывать совсем необязательно.

Количество сообщений в эхоконференциях
-------...
		</description>
		<content:encoded>
<![CDATA[
gornekib -> All<br><br>
источник <a href="https://github.com/idec-net/new-docs/blob/master/extensions.md" class="url">https://github.com/idec-net/new-docs/blob/master/extensions.md</a><br>
<br>
Расширения IDEC<br>
===============<br>
<br>
Здесь описаны расширения протокола, являющиеся основным отличием IDEC от ii. Многие из них реализовывать совсем необязательно.<br>
<br>
Количество сообщений в эхоконференциях<br>
--------------------------------------<br>
<br>
Предназначен для отслеживания изменений в эхе и для отсеивания лишнего трафика. Обычное целое число. Важно: параметр неубывающий. Если в эхе удалили сообщения, то возвращаемое число не должно уменьшаться.<br>
<br>
Метод<br>
<br>
GET /x/с/&lt;параметры&gt;<br>
<br>
Параметры<br>
<br>
Единственный параметр метода - список, разделенный '/'.<br>
Возвращаемое значение<br>
<br>
Словарь "эха":"количество".<br>
<br>
Пример<br>
<br>
```<br>
GET /x/c/test.14/im.100<br>
<br>
test.14:221<br>
im.100:1500<br>
```<br>
<br>
Push (пуш), обратная синхронизация<br>
----------------------------------<br>
<br>
Предназначен для получения сервером (нодой) сообщений от другого доверенного авторизованного сервера. Может быть полезным для транзитных гейтов-посредников или серверов с неработающим фетчингом. Хоть пуш и является частью /u/, он остаётся необязательным расширением.<br>
<br>
Проще говоря, push - это бандл наоборот. Если фетчинг скачивает бандлы, то push их проталкивает на другой узел. Сначала у push-ноды запрашивается список сообщений, которые уже есть в эхе, а затем через /u/push загружаются недостающие.<br>
<br>
Метод<br>
<br>
POST /u/push<br>
<br>
Параметры в теле POST запроса:<br>
<br>
    nauth - ключ для авторизации на сервере (пароль)<br>
    upush - бандл сообщений<br>
    echoarea - эхоконференция, в которую помещать сообщения<br>
<br>
Возвращаемое значение<br>
<br>
Может отличаться, в зависимости от сервера, либо отсутствовать. PHP-нода возвращает message saved: ok для каждого сообщения в бандле в случае успешного принятия, либо error: &lt;название ошибки&gt; в случае неправильного формата сообщений или error: no auth, если неправильный пароль.<br>
<br>
Список эхоконференций<br>
---------------------<br>
<br>
Нужен для автоматического получения данных о наличии эх на станции. Может пригодиться для автоподписки на клиентах.<br>
<br>
Метод<br>
<br>
GET /list.txt<br>
<br>
Возвращаемое значение<br>
<br>
Словарь "эха":"количество сообщений":"описание эхи".<br>
<br>
Пример<br>
<br>
```<br>
GET /list.txt<br>
<br>
test.14:35:Тестирование и проверки<br>
im.100:270:Болталка, общение на любые темы<br>
```<br>
<br>
Чёрный список<br>
-------------<br>
<br>
Номера тех сообщений, которые нода не принимает во время обмена и не показывает в эхоконференциях. Используется для чистки станции от спама/некорректных сообщений.<br>
<br>
Метод<br>
<br>
GET /blacklist.txt<br>
<br>
Возвращаемое значение<br>
<br>
Список номеров сообщений на каждой строке по одному.<br>
<br>
Сокращённый индекс (расширенный /u/e)<br>
-------------------------------------<br>
<br>
Вариант схемы /u/e с указанием смещения и количества отдаваемых msgid. Полезно для экономии трафика, чтобы не скачивать абсолютно все сообщения с эхи, а только нужные.<br>
<br>
Метод<br>
<br>
<span class="quote">/u/e/эха/эха/эха/.../&lt;смещение&gt;:&lt;лимит&gt; &lt;Смещение&gt; и &lt;лимит&gt; - целые числа. Смещение может быть отрицательным. Если параметры указаны ошибочно, выдаёт эхи целиком.</span><br>
<br>
Возвращаемое значение<br>
<br>
Список сообщений из заданных эхоконференций, с максимумом &lt;лимит&gt;.<br>
<br>
Пример<br>
<br>
```<br>
GET /u/e/ii.test.14/test.15/1:2<br>
<br>
ii.test.14<br>
msgid<br>
msgid<br>
test.15<br>
msgid<br>
msgid<br>
```<br>
<br>
```<br>
GET /u/e/ii.test.14/test.15/-5:5<br>
<br>
ii.test.14<br>
msgid<br>
msgid<br>
msgid<br>
msgid<br>
msgid<br>
test.15<br>
msgid<br>
msgid<br>
msgid<br>
msgid<br>
msgid<br>
```<br>
<br>
Список схем<br>
-----------<br>
<br>
Нужен, чтобы узнать, какие дополнительные возможности поддерживает станция.<br>
<br>
Метод<br>
<br>
GET /x/features<br>
<br>
Пример<br>
<br>
```<br>
GET /x/features<br>
<br>
x/c<br>
list.txt<br>
blacklist.txt<br>
```<br>
<br>
Полный перечень обозначения возможностей:<br>
<br>
    u/e — расширенная схема u/e<br>
    list.txt - список эхоконференций<br>
    blacklist.txt - чёрный список сообщений<br>
    x/file - файловые запросы<br>
    x/c - количество сообщений в эхе на ноде<br>
    f/ - файлэхоконференции<br>
<br>
Размещение файлов<br>
-----------------<br>
<br>
Сисоп складывает разные файлы себе на ноду, а поинты (либо просто желающие) могут их скачивать.<br>
<br>
Методы<br>
<br>
POST /x/filelist или GET /x/filelist/pauth<br>
<br>
Получение списка файлов в формате &lt;Имя&gt;:&lt;Размер в байтах&gt;:&lt;Описание&gt;. Параметр pauth - строка авторизации. Если pauth проходит проверку (существует поинт с таким паролем), то к публичному списку добавляется также список скрытых от посторонних глаз файлов.<br>
<br>
POST /x/file или GET /x/file/filename<br>
<br>
Параметры для запросов: pauth и filename. pauth - строка авторизации (передаётся всегда в POST), filename - имя скачиваемого файла.<br>
<br>
Если filename отсутствует, то выдаётся ошибка. Если параметр pauth верный (т.е. пароль верный), то это даёт пользователю возможность скачивать скрытые файлы. Если файл публичный, то pauth может быть и неверным. Внимание: POST-параметры имеют приоритет перед GET.<br>
<br>
Примеры<br>
<br>
```<br>
POST /x/filelist pauth=12345<br>
<br>
myfile.txt:421:Интересная информация<br>
cats.jpg:63253:Скрытый файл<br>
```<br>
<br>
POST /x/file pauth=12345;filename=cats.jpg<br>
<br>
или<br>
<br>
POST /x/file/cats.jpg pauth=12345<br>
<br>
&lt;Содержимое скрытого файла&gt;<br>
<br>
POST /x/file filename=myfile.txt<br>
<br>
или<br>
<br>
GET /x/file/myfile.txt<br>
<br>
&lt;Содержимое публичного файла&gt;<br>
<br>
GET /x/file/cats.jpg<br>
<br>
&lt;Ошибка, т.к. пароль не указан, а файл приватный&gt;<br>
<br>
Файлэхоконференции<br>
------------------<br>
<br>
Механизм распространения файлов пользователями сети по принципам, схожим с распространением эхоконференций.<br>
<br>
Имя файлэхи - от 3 до 120 символов: маленькие латинские буквы, цифры, символы подчёркивания, минуса и точки.<br>
<br>
Вся синхронизация односторонняя. Две ноды просто собирают друг у друга файлы. Пойнты же, наоборот, публикуют свои файлы, которые нода добавляет в общую БД сети, одобряя их (или не делает, не одобряя).<br>
<br>
Метод<br>
<br>
GET /f/c/test1/test2<br>
<br>
Параметры<br>
<br>
Единственный параметр метода - список, разделенный '/'.<br>
<br>
Возвращаемое значение<br>
<br>
Словарь "файлэха":"количество".<br>
<br>
Пример<br>
<br>
```<br>
GET /f/c/test1/test2<br>
<br>
test1:32<br>
test2:17<br>
```<br>
<br>
Список файлэхоконференций<br>
-------------------------<br>
<br>
Аналог /list.txt для файлэхоконференций.<br>
<br>
Метод<br>
<br>
GET /f/list.txt<br>
<br>
Возвращаемое значение<br>
<br>
Словарь "фэха":"количество сообщений":"описание эхи".<br>
<br>
Пример<br>
<br>
```<br>
GET /f/list.txt<br>
<br>
books:35:Книги<br>
pics:270:Картинки<br>
```<br>
<br>
Чёрный список для файлэх<br>
------------------------<br>
<br>
Хеши тех файлов, которые нода не принимает во время обмена и не показывает в файлэхоконференциях. Используется для чистки станции от спама/некорректных файлов.<br>
<br>
Метод<br>
<br>
GET /f/blacklist.txt<br>
<br>
Возвращаемое значение<br>
<br>
Список хешей файлов на каждой строке по одному.<br>
<br>
Метод /f/e<br>
----------<br>
<br>
Возвращает список файлов с метаинформацией для указанных файлэхоконференций.<br>
<br>
Возвращаемое значение<br>
<br>
Список файлов из заданных файлэхоконференций.<br>
<br>
Пример<br>
<br>
```<br>
GET /f/e/файлэха1/файлэха2<br>
<br>
файлэха1<br>
fid:filename:size:address:description<br>
fid:filename:size:address:description<br>
fid:filename:size:address:description<br>
файлэха2<br>
fid:filename:size:address:description<br>
```<br>
<br>
Где<br>
<br>
    fid — file ID, представляющий собой хеш содержимого файла, сформированный по тем же правилам, что и msgid.<br>
    filename — имя файла, ограничено длиной 120 символов<br>
    size — размер файла в байтах<br>
    address — адрес отправителя файла<br>
    description — краткое описание файла, ограничено 1024 символами. Если в файл-строке и дальше встречаются двоеточия-разделители с информацией, то весь текст после них идёт в счёт description.<br>
<br>
Отличить фэху от строчки файла очень просто по наличию ":". В имени файлэхи этот символ недопустим. Внимание: все поля, включая description, обязательны к заполнению.<br>
<br>
Также метод поддерживает сокращённый индекс подобно расширенной схеме u/e. Например,<br>
<br>
GET /f/e/fecho1/fecho2/-2:2<br>
<br>
вернёт в индексе только последние два файла из указанных файлэхоконференций.<br>
<br>
Метод<br>
<br>
GET /f/f/fecho/fid<br>
<br>
Возвращаемое значение<br>
<br>
Возвращает файл из указанной файлэхоконференции с указанным файл ID.<br>
<br>
Метод<br>
<br>
POST /f/p<br>
<br>
Публикует файл в файлэхе на узле.<br>
<br>
Передаваемые параметры (заполняются все):<br>
<br>
    pauth — строка авторизации поинта<br>
    fecho — имя файлэхоконференции<br>
    file — отправляемый файл, имя файла максимально 120 символов латиницей; допустимы цифры, точки, нижние подчёркивания, дефисы.<br>
    dsc — описание файла, юникод<br>

]]>
</content:encoded></item>
<item><title>Описание протокола</title><guid>La8hrTTGe2eWZKfAwplw</guid><pubDate>2024-11-20 17:25:32</pubDate><author>gornekib</author><link>https://idec.foxears.su/forum/La8hrTTGe2eWZKfAwplw#La8hrTTGe2eWZKfAwplw</link>
		<description>
		источник https://github.com/idec-net/new-docs/blob/master/protocol.md

Api обмена IDEC и ii, протокол
==============================

Протокол может быть реализован поверх чего угодно: будь то простые файлы, принесённые на физическом носителе, ssh, ftp, http или что-нибудь ещё. П...
		</description>
		<content:encoded>
<![CDATA[
gornekib -> All<br><br>
источник <a href="https://github.com/idec-net/new-docs/blob/master/protocol.md" class="url">https://github.com/idec-net/new-docs/blob/master/protocol.md</a><br>
<br>
Api обмена IDEC и ii, протокол<br>
==============================<br>
<br>
Протокол может быть реализован поверх чего угодно: будь то простые файлы, принесённые на физическом носителе, ssh, ftp, http или что-нибудь ещё. Пока что на практике применяется только его http-версия.<br>
<br>
Схема параметров<br>
----------------<br>
<br>
Для обмена сообщениями в серверах используется понятие схемы параметров. Она представляет из себя строку, которая передаётся серверу через GET запрос, состоящую из слешей и того, что находится между ними. Пример: /u/e/echoname.100. Разные параметры этой схемы отвечают за разную выдачу или принятие информации сервером.<br>
<br>
В настоящее время у нас используется схема /u/ (универсальная). /u/ - это запросы для обмена сообщениями, на которых и строится вся синхронизация.<br>
<br>
О кодах ответов (в том числе об ошибках) ноды можно прочитать здесь.<br>
<br>
Обработчики /u/<br>
---------------<br>
<br>
Вся синхронизация односторонняя. Две ноды просто собирают друг у друга сообщения. Пойнты же, наоборот, проталкивают свои письма, которые нода добавляет в общую БД сети, одобряя их (или не делает, не одобряя).<br>
/u/e/эха.номер/эха.номер/эха.номер...<br>
<br>
Список идентификаторов сообщений из заданных эхоконференций, в формате:<br>
<br>
```<br>
эха<br>
msgid<br>
msgid<br>
msgid<br>
эха<br>
msgid<br>
```<br>
<br>
Отличить эху от id очень просто - в имени эхи есть точка, а в msgid - нет.<br>
/u/m/msgid/msgid/msgid...<br>
<br>
Бандл - основной способ получения сообщений на клиенте и при синхронизации серверов. Формат указан на странице стандартов.<br>
GET /u/point/pauth/tmsg или POST /u/point<br>
<br>
Передаёт пользовательское сообщение на ноду в виде запакованного текста base64 определённого формата. (если его передавать через GET-запрос, то оно там уже обязано быть base64-urlsafe).<br>
<br>
pauth здесь - поинтовая строка авторизации (пароль), tmsg - закодированное base64 сообщение (см. msgline, стандарты). В случае POST параметры называются так же: pauth и tmsg.<br>
<br>
Максимальный размер base64-кодированного сообщения - 87382 байт (соответствует 64КБ для исходного файла).<br>
<br>
Нода должна вернуть в ответ строку начинающуюся с msg ok.<br>
<br>
Другие схемы<br>
------------<br>
<br>
/e/эха.номер<br>
<br>
Выдаёт файл определённой эхоконференции для просмотра вручную. В обмене не применяется.<br>
/m/msgid<br>
Выдаёт единственное сообщение (опять см. стандарты) в "сыром" виде (без base64). В обмене также не используется, служит для отладки.<br>

]]>
</content:encoded></item>
<item><title>Описание протокола</title><guid>4bUDh71byynw1Cw9yNpX</guid><pubDate>2024-11-20 17:23:18</pubDate><author>gornekib</author><link>https://idec.foxears.su/forum/4bUDh71byynw1Cw9yNpX#4bUDh71byynw1Cw9yNpX</link>
		<description>
		источник https://github.com/idec-net/new-docs/blob/master/standarts.md

Стандарт и его реализация
=========================

Эхи и сообщения
---------------

**Имя эхи** - от 3 до 120 символов: маленькие латинские буквы, цифры, символы подчёркивания, минуса и точки. Название долж...
		</description>
		<content:encoded>
<![CDATA[
gornekib -> All<br><br>
источник <a href="https://github.com/idec-net/new-docs/blob/master/standarts.md" class="url">https://github.com/idec-net/new-docs/blob/master/standarts.md</a><br>
<br>
Стандарт и его реализация<br>
=========================<br>
<br>
Эхи и сообщения<br>
---------------<br>
<br>
**Имя эхи** - от 3 до 120 символов: маленькие латинские буквы, цифры, символы подчёркивания, минуса и точки. Название должно содержать минимум одну точку. В старых версиях обязано заканчиваться на точку и число.<br>
<br>
Примеры правильных названий эх: 1.1 ii.14 ii.about.14 to.ivan.15, my.beseda<br>
<br>
**Id сообщения (msgid)** - уникальный номер, который генерируется станцией, как 20 первых символов base64 sha256-bin хэша сообщения.<br>
<br>
Примечание: production-реализации нод заменяют в полученной base64-строке плюс (+) и слэш (/) либо их аналоги (- и _) на буквы "A" и "Z" соответственно, дабы убрать из msgid спецсимволы.<br>
<br>
Сама эха представляет собой изнутри всего лишь список (массив) msgid, расположенных в определённом порядке. После каждого написанного/принятого сообщения его msgid добавляется в конец этого списка.<br>
<br>
База данных<br>
-----------<br>
<br>
Простейшая база данных реализации IDEC и ii состоит из двух каталогов: echo/ и msg/. В msg/ хранятся сами сообщения (имя файла = msgid). В echo/ хранятся индексы сообщений, т.е. файлы эхоконференций (имя файла = название эхи).<br>
<br>
Файл в echo/&lt;эха&gt; состоит из списка имён файлов сообщений, находящихся в msg/, по порядку, в конце пустая строка. Из-за простой структуры базы данных сообщения можно передавать даже оффлайн, на флешке: достаточно лишь положить сообщение в msg/ и в файле эхоконференции прописать его хэш (вручную или простейшим скриптом).<br>
<br>
Хранить файлы на самом деле можно и в json, и в sqlite, и в любом другом формате на ваше усмотрение.<br>
<br>
Получение данных<br>
----------------<br>
<br>
Получить данные из нужных эх может любой пользователь, авторизованный или нет. Сначала нужно получить список сообщений эхи, и потом загрузить недостающие сообщения, которых ещё нет в базе данных. Подобным образом могут получать данные любые поинты, и так же, настроив взаимное получение данных друг с друга, обмениваться между собой ноды. Подробности на странице протокола.<br>
<br>
бандл (нод2нод)<br>
---------------<br>
<br>
Бандл - это полное, сформированное сообщение, уже имеющее идентификатор. Возможно, не одно.<br>
<br>
По умолчанию, при распаковке, бандл создаёт все эхи, которые указаны в заголовках. То есть, распаковка бандла - это команда сохранить такое-то сообщение и прописать его во все эхи.<br>
<br>
Бандлу не нужен онлайн. Можно создать бандл со всеми нужными сообщениями и передать его любым способом - после его распаковки в базе создадутся все сообщения.<br>
<br>
Формат кодирования:<br>
<br>
```<br>
msgid:text<br>
msgid:text<br>
msgid:text<br>
и так далее<br>
```<br>
<br>
где text - это просто текстовый файл самого сообщения, кодированный base64 (все серверы обязаны принимать как обычный, так и urlsafe-словарь, генерируются же бандлы в формате обычного base64). Разделитель для бандла - новая линия (LF, код 10).<br>
<br>
Формат текста в бандле<br>
----------------------<br>
<br>
Строка      Поле        Описание<br>
<br>
1           tags        теги (используются только для repto и для идентификатора ii/ok)<br>
2           echoarea    основная эхоконференция, в которую помещается сообщение<br>
3           date        число секунд от эпохи unix, в utc<br>
4           msgfrom     отправитель<br>
5           addr        адрес отправителя (практического смысла не имеет, служит для того, чтобы узнавать, с какой станции пришло сообщение)<br>
6           msgto       пользователь, которому предназначено сообщение (либо All)<br>
7           subj        тема сообщения<br>
8           -           пустая строка<br>
9 и далее   msg         текст сообщения<br>
<br>
Формат тегов<br>
------------<br>
<br>
Строки, разделённые слешами. Сначала ключ, потом значение и так далее.<br>
<br>
Образец: ii/ok/repto/fjLkfrmjNvO4fjzlUs5U<br>
<br>
Тег ii/ok проставляется обязательно. Требуется для совместимости с ii.<br>
<br>
Пример текста<br>
-------------<br>
<br>
```<br>
ii/ok/repto/IZXhLBKJx0rhx0lXYu3L<br>
im.16<br>
1455789357<br>
Vasya<br>
Lunar, 2<br>
Pupkin<br>
Re: Мое первое сообщение в эху<br>
<br>
текст сообщения<br>
```<br>
<br>
Сообщения, которые отправляют поинты (msgline)<br>
----------------------------------------------<br>
<br>
Перед отправкой этот файл кодируется base64.<br>
<br>
Строка      Поле        Описание<br>
1           echoarea    эхоконференция, в которую помещается сообщение<br>
2           msgto       пользователь, которому вы пишете (либо All, если обращаетесь ко всем)<br>
3           subj        тема сообщения<br>
4           -           пустая строка<br>
5           repto       если начинается с @repto:, то нода проставляет тэг repto (указывает id письма, на которое отвечаем). Иначе строка относится к тексту сообщения<br>
6 и далее   msg         текст сообщения<br>
<br>
Внимание!<br>
<br>
    Пустые поля (в том числе subj или msg) не допускаются.<br>
    В отличие от бандлов, в одном запросе нельзя передать сразу несколько сообщений.<br>
    Максимальный размер файла 64КБ (65536 байт) на полезную нагрузку (а в base64-виде - 4/3 от исходного, т.е. 87382 байт)<br>
<br>
Пример<br>
<br>
```<br>
im.16<br>
All<br>
Тестируем<br>
<br>
@repto:2hEUbMAxKSA83vcmgU4s<br>
И вот я пишу своё первое письмо в нашу секту.<br>
Меня видно?<br>
```<br>

]]>
</content:encoded></item>
<item><title>Описание протокола</title><guid>SbMjAUG17eUKbTd7mAfh</guid><pubDate>2024-11-20 16:45:21</pubDate><author>gornekib</author><link>https://idec.foxears.su/forum/SbMjAUG17eUKbTd7mAfh#SbMjAUG17eUKbTd7mAfh</link>
		<description>
		Источник https://git.luxferre.top/tii/file/ii-doc.txt.html
1 ii protocol documentation
2 =========================
3 This document describes the basic ii protocol, as implemented in tii.
4 It aims to be as clear and concise as possible.
5 
6 Network structure
7 -----------------
...
		</description>
		<content:encoded>
<![CDATA[
gornekib -> All<br><br>
Источник <a href="https://git.luxferre.top/tii/file/ii-doc.txt.html" class="url">https://git.luxferre.top/tii/file/ii-doc.txt.html</a><br>
1 ii protocol documentation<br>
2 =========================<br>
3 This document describes the basic ii protocol, as implemented in tii.<br>
4 It aims to be as clear and concise as possible.<br>
5 <br>
6 Network structure<br>
7 -----------------<br>
8 Clients aka points can:<br>
9 * post messages<br>
10 * fetch echos (conferences) and their message ID lists<br>
11 * fetch messages by their IDs<br>
12 <br>
13 Nodes aka stations can:<br>
14 * accept (or reject) posted messages from points<br>
15 * serve echo lists<br>
16 * serve echos and their indexes (message ID lists)<br>
17 * serve message bundles or single messages<br>
18 * fetch echos and messages from other stations<br>
19 <br>
20 The main transport protocol is currently HTTP/HTTPS, although the spec doesn't<br>
21 theoretically limit the ways of message transfer. E.g. fetching can be easily<br>
22 implemented over Gopher/Finger/Nex/Spartan/Gemini etc.<br>
23 <br>
24 The API spec below is given for the HTTP(S) protocol.<br>
25 <br>
26 Echo and message naming convention<br>
27 ----------------------------------<br>
28 Within the network, echo names must be from 3 to 120 characters long and have<br>
29 at least one dot (.) character. Message IDs must be exactly 20 characters long<br>
30 and depend on the message contents hash upon posting (see the exact algorithm<br>
31 below in the "Message ID generation algorithm" section).<br>
32 <br>
33 Station (node) HTTP API<br>
34 -----------------------<br>
35 Every station must implement the following HTTP API calls.<br>
36 In case of multi-line responses, the newline separator must be "\n" character<br>
37 (line feed, ASCII 10).<br>
38 All station responses must end with a newline separator.<br>
39 <br>
40 - Fetching the public echo list -<br>
41 <br>
42 Request: GET /list.txt<br>
43 Response: newline-separated list of echo_name:msg_count:echo_description<br>
44 <br>
45 Note: the msg_count field must reflect the actual non-blacklisted message<br>
46 count that the station can serve.<br>
47 <br>
48 - Fetching the public message blacklist -<br>
49 <br>
50 Request: GET /blacklist.txt<br>
51 Response: newline-separated list of message IDs<br>
52 <br>
53 The blacklisted message IDs must not be served to the clients in any of the<br>
54 API calls specified below.<br>
55 <br>
56 - Listing messages in a single echo -<br>
57 <br>
58 Request: GET /e/echo.name<br>
59 Response: newline-separated message ID list<br>
60 <br>
61 When a new message is posted to the echo, it gets appended to the end of the<br>
62 corresponding message ID list for this echo.<br>
63 <br>
64 The message order in an echo does not always match the timestamp ordering;<br>
65 it is fully up to the client on how to sort the messages internally. The<br>
66 messages are only guaranteed to be saved by the server in the order they<br>
67 arrive onto the server.<br>
68 <br>
69 - Listing messages in any amount of echos -<br>
70 <br>
71 Request: GET /u/e/echo.1.name/echo.2.name/...<br>
72 Limited request: GET /u/e/echo.1.name/echo.2.name/.../offset:limit<br>
73 Response: newline-separated list of echo names and message IDs in the format:<br>
74 <br>
75 echo.1.name<br>
76 msgid1fromecho1<br>
77 msgid2fromecho1<br>
78 ...<br>
79 echo.2.name<br>
80 msgid1fromecho2<br>
81 msgid2fromecho2<br>
82 ...<br>
83 <br>
84 In case of limited request, the offset can be negative. E.g. -10:10 means<br>
85 requesting last 10 messages from the index. If the offset:limit pair is not<br>
86 valid for a particular echo, all message IDs from this echo are returned.<br>
87 <br>
88 The same message ID ordering rule as for /e applies to /u/e as well. <br>
89 <br>
90 - Fetching a single message by its ID -<br>
91 <br>
92 Request: GET /m/msgid<br>
93 Response: plaintext message in the Node-to Point Message format<br>
94 <br>
95 - Fetching a message bundle -<br>
96 <br>
97 Request: GET /u/m/msgid1/msgid2/...<br>
98 Response: newline-separated list of msgid:base64_msgtext<br>
99 <br>
100 Here, base64_msgtext is a Base64-encoded Node-to-Point Message (see below).<br>
101 The standardized ID count limit is at most 40 messages per bundle.<br>
102 <br>
103 - Posting a message (via POST) -<br>
104 <br>
105 Request: POST /u/point<br>
106 Content-Type: application/x-www-form-urlencoded <br>
107 Data: pauth=auth_string&amp;tmsg=base64_msgtext<br>
108 Response: in case of success, must start with "msg ok", otherwise with "error"<br>
109 <br>
110 Here, auth_string is the user's authorization string and base64_msgtext is the<br>
111 Base64-encoded Point-to-Node Message (see below).<br>
112 The maximum length of the tmsg field must be 87382 bytes.<br>
113 <br>
114 - Posting a message (via GET) -<br>
115 <br>
116 Request: GET /u/point/auth_string/base64_msgtext<br>
117 Response: in case of success, must start with "msg ok", otherwise with "error"<br>
118 <br>
119 Here, auth_string is the user's authorization string and base64_msgtext is the<br>
120 Base64URL-encoded Point-to-Node Message.<br>
121 The maximum length of the tmsg field must be 87382 bytes.<br>
122 <br>
123 Note: the Base64URL encoding means that after the standard Base64 encoding,<br>
124 the + character is replaced with -, the / character is replaced with _, and<br>
125 the = character is omitted from the end.<br>
126 <br>
127 - Pushing a message bundle to another node -<br>
128 <br>
129 Request: POST /u/push<br>
130 Content-Type: application/x-www-form-urlencoded<br>
131 Data: nauth=auth_string&amp;upush=bundle_contents&amp;echoarea=echo.name<br>
132 Response: in case of success, must start with "message saved: ok", otherwise<br>
133           with "error:"<br>
134 <br>
135 Here, auth_string is the node authorization string and bundle_contents is the<br>
136 message bundle in the exact format as received by GET /u/m API method.<br>
137 <br>
138 Node-to-Point Message format<br>
139 ----------------------------<br>
140 The encoding must be UTF-8 and the newline separator must be "\n" (ASCII 10).<br>
141 Every Node-to-Point message contains the following fields in this particular<br>
142 order, all of them are mandatory and start on a new line each:<br>
143 <br>
144 * Line 1: message tags. Must start with "ii/ok". If "ii/ok/repto/id" form is<br>
145   encountered, then the id refers to the message this message replies to.<br>
146 * Line 2: echo name where the message was posted.<br>
147 * Line 3: message Unix timestamp (integer, in seconds, UTC)<br>
148 * Line 4: message sender name<br>
149 * Line 5: message sender address (autofilled by the originating station)<br>
150 * Line 6: message recipient name (or All if there's no particular recipient)<br>
151 * Line 7: message subject<br>
152 * Line 8: must be empty<br>
153 * Line 9 and further: message body<br>
154 <br>
155 Point-to-Node Message format<br>
156 ----------------------------<br>
157 The encoding must be UTF-8 and the newline separator must be "\n" (ASCII 10).<br>
158 Every Point-to-Node message contains the following fields in this particular<br>
159 order, all of them are mandatory and start on a new line each:<br>
160 <br>
161 * Line 1: echo name where the message is being posted.<br>
162 * Line 2: message recipient name (or All if there's no particular recipient)<br>
163 * Line 3: message subject<br>
164 * Line 4: must be empty<br>
165 * Line 5 and further: message body<br>
166 <br>
167 If you are replying to a message [msgid], then message body must begin with:<br>
168 <br>
169 @repto:msgid<br>
170 <br>
171 and the message text itself must start on the next line.<br>
172 <br>
173 Message ID generation algorithm<br>
174 -------------------------------<br>
175 This algorithm must be implemented by every station to generate message IDs:<br>
176 <br>
177 1. Calculate SHA256 of the message in the Node-to-Point format as binary data.<br>
178 2. Calculate Base64 of the resulting binary hash sum.<br>
179 3. Truncate to the first 20 characters.<br>
180 4. Replace all occurrences of + or - with A, and / or _ with z.<br>
181 5. The result of these operations is your ii message ID.<br>
182 <br>
183 --- Luxferre ---<br>

]]>
</content:encoded></item>
</channel></rss>
