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, а за флагом использовать два необязательных параметра, разделяемые двоеточием:

  1. Имя сервера и путь к мейлеру на нём.
  2. Порт, на котором отзывается сервер.

Пример:

  ,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 — именно в таком порядке.