Структура модуля

Устройство файла модуля: поля манифеста, параметры, правила доменов, HTTP-правила и действия, скрипты.

Модуль — один JSON-объект в UTF-8 размером до 256 КиБ. Разбор строгий: неизвестные поля, версии, действия и значения отвергаются, после закрывающей скобки ничего писать нельзя, а ошибка показывает строку и столбец. Скрипты — отдельный текст JavaScript, он пишется внутри манифеста или скачивается по HTTPS-адресу; формата архива нет.

Манифест

Поле Тип Обязательное Смысл
schemaVersion число Да Должно быть 1.
id строка Да Строчные буквы, цифры, ., _, -, до 64, начинается с буквы или цифры. Называет модуль и его хранилище; два включённых модуля не могут иметь один id.
name строка Да 1–80 символов.
version строка Да 1–32 символа, любой формат.
author строка Нет До 80. Показывается как заявлено модулем.
description строка Нет До 500.
icon строка Нет HTTPS-адрес изображения. Приложение скачивает его (до 256 КиБ), уменьшает и хранит.
parameters список Нет Значения, которые задаёт пользователь.
mitmHosts список строк Нет До 64 хостов, HTTPS-трафик которых расшифровывается.
excludedHosts список строк Нет До 64 исключений из mitmHosts.
domainRules список Нет Блокировка или разрешение доменов. Сертификат не нужен.
domainSets список Нет До 2 больших списков доменов из файла.
httpRules список Нет До 256 правил для запросов и ответов. Нужны mitmHosts.
scripts список Нет JavaScript для действия script.

Имена хостов — точное имя или *.example.org (только поддомены, после *. минимум две метки). IP-адреса не допускаются. Имена нормализуются.

Параметры

У каждой записи есть id (буквы, цифры, _, до 32, уникальный), необязательный title, type (string, int, number или bool), обязательный default и необязательный enum. Значение вне типа или enum отвергается, а не подменяется молча. В карточке модуля enum — выбор, bool — переключатель, остальное — поле ввода. Значения сохраняются при обновлении, пока тип и enum подходят. Правило может использовать параметр только как целую строку "{{id}}" в значениях заголовков, query и правках JSON.

Правила и списки доменов

Поле Значения
domainRules[].action block или allow
domainRules[].match exact либо suffix — домен и его поддомены
domainRules[].domain имя
domainSets[].id, asset, sha256, format, action файл списка рядом с манифестом (до 4 МиБ), его обязательный SHA-256, text или mrs, и block или allow

Побеждает самое длинное совпадение, при равенстве — точное. allow снимает только блокировку этого фильтра, но не REJECT из вашего профиля. Блокировка действует на любом порту, для TCP и UDP. В списке text один домен на строку: example.com — точно, +.example.com — домен и поддомены, *.example.com — только поддомены. Так как файл списка берётся из папки манифеста, domainSets работают только при установке модуля по ссылке.

HTTP-правила

Поле Смысл
id Имя правила.
phase request или response.
host Точное имя или *.suffix; должен входить в mitmHosts.
method Пусто или ANY, GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS.
path Ровно одно из exact, prefix (оба начинаются с /) или regex (до 512 символов).
status Коды ответа для сопоставления; только фаза response.
action См. ниже.
action.type Фаза Что делает
block request Запрос не отправляется; статус 400–599.
respond request Локальный ответ: status, headers.set, текстовый body до 64 КиБ.
edit обе headers.set и delete; query.set и delete для запросов.
json response До 32 правок set или delete по пути вида a.b.0.c.
script обе Запускает скрипт по его id; needBody передаёт тело.

Правила не могут менять Host, Content-Length, Transfer-Encoding, Connection, Upgrade, TE и Trailer. Первое подходящее правило фазы завершает обработку.

Скрипты

У скрипта есть id и ровно один источник: source (текст) или sourceURL (HTTPS, до 8 КиБ) с обязательным sha256. Скрипт по ссылке скачивается и проверяется до установки; во время работы сеть не используется.

Движок — QuickJS, без JIT и без системных модулей. Скрипт определяет синхронную функцию transform(event, context), которая возвращает патч или null, чтобы оставить обмен как есть. async не поддерживается.

Объект Содержимое
event phase, rule, request (url, method, headers), response (status, headers; только фаза response), body (только с needBody, уже распакован). Заголовки — пары [имя, значение].
context parameters, storage (get, set, delete, keys; значения JSON; только свой модуль), utf8 (encode, decode).
патч path, query, headers (заменяет весь список), status, body или respond. Схему, хост, порт и адрес назначения менять нельзя.

Нет fetch, сокетов, таймеров, console, доступа к файлам и import, а также доступа к сертификату, подпискам, настройкам VPN и другим модулям.

Права в предпросмотре

Они выводятся из содержимого; модуль не может объявить меньше: блокировать подключения к доменам, менять запросы или ответы выбранных хостов, читать тела запросов и ответов, выполнять код модуля на устройстве, видеть заголовки и cookie этих запросов.

Нашли ошибку? Создайте обращение на GitHub.