Amfow
Amfow, или AMFOW (рекурсивный акроним от англ. Amfow Mailer — Fido Over WWW) — название мейлера, который (в виде набора PHP-скриптов) был создан Алексом Кочариным (2:50/13
) для реализации изобретённого им протокола IMW. Этот мейлер осуществляет (а протокол стандартизирует) обмен фидопочтою, совершаемый между фидошниками (то есть между узлами Фидонета, или от узла к пойнту и обратно) через Всемирную Паутину, по протоколу HTTP.
Названия «Amfow», «AMFOW» и «amfow» употребляются чаще всего как равнозначные.
Практическая ценность AMFOW заключается в следующих возможностях:
- IMW-клиент Amfow способен работать изнутри такой защищённой локальной сети, из которой в Интернет возможно передавать только запросы ко внешним сайтам через прокси-сервер (то есть только по протоколу HTTP).
- IMW-сервер Amfow может быть дистанционно развёрнут обладателем любого вебсервера Apache Server с поддержкою PHP (например, покупателем дешёвого веб-хостинга). То есть Amfow куда менее требователен к ресурсам компьютера и особенно ко правам устанавливающего Amfow дистанционного пользователя, нежели binkd, например.
Флаг IMWПравить
Алекс Кочарин (2:50/13
) предложил использовать в ноудлисте специальный флаг IMW
для указания на то, что узел (нода) поддерживает протокол IMW, а за флагом использовать два необязательных параметра, разделяемые двоеточием:
- Имя сервера и путь к мейлеру на нём.
- Порт, на котором отзывается сервер.
Пример:
,12345,...,IMW:myserver.mydomain.org/mailer/:8080,... |№ узла| | имя сервера | путь |порт|
Протокол IMWПравить
Алекс Кочарин (2:50/13
) опубликовал созданную им (30 апреля 2006 года) первую версию протокола IMW, определяющего передачу данных между FTN-совместимыми системами через Интернет поверх протокола HTTP. Ниже мы приводим текст этой версии.
ОпределенияПравить
В каждой сессии данными обмениваются между собой две системы — система-клиент и система-сервер.
Система-клиент инициирует соединение посредством отправки HTTP-запроса серверу. Именно клиент определяет, сколько запросов необходимо для отсылки и приёма всех файлов.
Система-сервер получает запрос и посылает ответ.
БлокиПравить
Системы обмениваются данными. Каждый запрос клиента и каждый ответ сервера содержат один и только один блок, в котором содержится вся необходимая в рамках запроса (ответа) информация. Блок — это бинарная строка.
Клиент посылает блок POST-запросом, причём в нём не должно быть ничего, кроме этого блока.
Сервер посылает блок в теле ответа. Перед ним идет специальная
метка, начинающаяся с «**DATA», далее в скобках идёт размер
(текстовый в десятичной системе счисления), потом двоеточие и сам
блок. То есть получается строка вида: **DATA(size):BINARYDATA
.
Появление данных до и после блока возможно, но не желательно.
Содержимое блокаПравить
Каждый блок делится на секции. Секция — одно «слово», которое может содержать название системы, запросы на файлы, и т. п.
Формат секцииПравить
Ниже описан формат секции в незашифрованном виде. При использовании шифрования, естественно, это меняется. Так что при шифрованном траффике данные должны быть дешифрованы, после чего к ним может быть применён этот алгоритм.
1 2 3 4 +---+---+--------+------------------------------------------------+ | ! | | | | +---+---+--------+------------------------------------------------+
Каждая секция начинается с символа «!», который введён для проверки корректности сессии. (1)
Следующий байт (2) — команда, говорящая, что находится в data-секции (4). Список доступных команд — ниже.
Следующие два (или четыре) байта указывают на размер data-секции. Это — числа в машинном представлении без знака (unsigned). В случае команды «F», которая может содержать большой объём данных, этот размер задаётся четырьмя байтами. Иначе размер задаётся двумя байтами.
Бывают команды-флаги, у которых data-поле нулевое. То есть они занимают 4 байта — «!», команда и два байта с кодом 0.
СессияПравить
Весь блок делится на две части — инициализирующую часть и основную часть.
В инициализирующей части посылаются данные о системах, устанавливаются парольность и параметры соединения.
В основной части находятся запросы на файл, сами файлы, и пр.
Сессия завершается командой-флагом «Q».
Описание файлаПравить
Файл задается четырьмя параметрами — crc файла, размер, offset и имя файла именно в таком порядке. В описании файла эти параметры перечислены через запятую. Crc, размер и offset задаются числовыми значениями в десятичной системе. Имя файла — всё то, что находится в записи после третьей запятой.
Команды инициализирующей частиПравить
В инициализирующей части возможны следующие команды:
- A
- Список адресов системы, разделенный пробелами.
- O
- Параметры, поддерживаемые мейлером.
- T
- Unixtime на системе, то есть количество секунд, прошедших с 1 января 1970 г. 00:00:00.
- H
- Строки, которые не должны обрабатываться системой. Их может быть несколько. Содержат данные о сисопе, станции.
- Y
- Флаг, означающий, что данные после него идут в зашифрованном виде.
Команды основной частиПравить
В основной части возможны следующие команды:
- E
- Ошибка. В data-поле — необязательное пояснение.
- G
- Запрос файла. В data-поле находится описание файла.
- R
- Информация о получении файла. В data-поле — описание файла.
- C
- Информация о получении подтверждения получения файла. То есть подтверждение того, что файл удалён на удалённой системе. В data-поле — описание файла.
- L
- Информация о файле, ожидающем отправления на удалённую систему. В data-поле — описание файла.
- S
- Информация о посылаемом файле. Должна идти сразу перед секцией с файлом. В data-поле — описание файла.
- F
- Секция с самим файлом. Передаётся само содержимое файла.
- Q
- Завершение всего блока. Всё, что после него, должно игнорироваться.
ШифрованиеПравить
Используется простейшая система шифрования — xor.
Заметим, что проxorивание двух строк длиной a
и b
— такая операция,
при которой код каждого символа в 1-й строке проxorивается с соответствующим кодом второй строки так: нулевой символ 1-й строки xorится с нулевым символом второй строки, первый символ — с первым и т. д. Когда счётчик вылезает за пределы второй строки, он обнуляется. Другими словами, n-й символ 1-й строки xorится с (n mod b)
-м символом второй строки при нумерации, начинающейся с нуля.
Итак, первые байты блока обязаны быть нешифрованными и содержать адрес системы и время на системе. Далее идёт флаг «W», а далее — строка, проxorенная с мд5-хешем, взятом от конкатенации двух строк: пароля на сессию и unixtime — именно в таком порядке.