Структура модуля
Устройство файла модуля: поля манифеста, параметры, правила доменов, 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.