Обзор ========
Данное предложение добавляет новую информацию в API i2pcontrol, обеспечивая большую гибкость. Эта информация включает: добавление, удаление, получение и изменение записей в адресных книгах и скрытых сервисах. Также в рамках данного предложения предоставляется дополнительная информация о вашем маршрутизаторе, например, о пирах, новостях, netDb и другое.
Мотивация ==========
Причиной данного предложения является обеспечение большей гибкости в API I2P для реализации и управления административным интерфейсом I2P приложениями. Предоставление такой информации через i2pcontrol позволяет пользователям создавать более сложные приложения и обеспечивает лучшую поддержку удалённого управления.
Дизайн ======
Когда пользователи взаимодействуют с API i2pcontrol, они смогут получать доступ к новым конечным точкам, предоставляющим информацию, упомянутую выше. Например, API i2pcontrol предоставит новые методы TunnelManager и AddressBook, которые позволят пользователям вводить параметры для создания, удаления, получения и изменения туннелей и адресных книг. Кроме того, у уже существующего метода RouterInfo появятся новые параметры для предоставления информации о маршрутизаторе.
Последствия для безопасности =====================
У данного предложения не ожидается дополнительных последствий для безопасности, поскольку информация, которая становится доступной, уже может быть получена другими способами. Однако важно обеспечить наличие надлежащих механизмов аутентификации и авторизации для доступа к API i2pcontrol, с целью предотвращения несанкционированного доступа к конфиденциальной информации или управления маршрутизатором.
Спецификация API и методы ===========================
Все запросы следуют структуре JSON-RPC 2.0:
{
"jsonrpc": "2.0",
"method": "MethodName",
"params": {
// method-specific parameters
},
"id": 1
}
Метод - RouterInfo ——————-
Ниже приведены новые параметры для метода RouterInfo и возвращаемые ими значения:
i2p.router.news- возвращает все записи новостей маршрутизатора.i2p.router.id- возвращает хэш маршрутизатора в виде строки Base64 илиnull.i2p.router.clockskew- возвращает среднее отклонение часов пиров илиnull.i2p.router.info- возвращает сериализованный RouterInfo в виде строки Base64 илиnull.i2p.router.logs- возвращает недавние сообщения журнала маршрутизатора.i2p.router.logs.clear- очищает буфер журнала маршрутизатора и возвращает"success".i2p.router.net.total.received.bytes— возвращает общее количество принятых байтов с момента запуска. (взято из i2pd)i2p.router.net.total.sent.bytes— возвращает общее количество отправленных байтов с момента запуска. (взято из i2pd)i2p.router.net.total.transit.bytes— возвращает общее количество транзитных байтов, пересылаемых с момента запуска. (взято из i2pd)i2p.router.net.bw.transit.15s— возвращает среднюю пропускную способность транзита за 15 секунд (байт/сек). (взято из i2pd)i2p.router.net.tunnels.shareratio- возвращает коэффициент обмена туннелями.i2p.router.net.tunnels.participating.info- возвращает информацию об участвующих туннелях.i2p.router.net.tunnels.i2ptunnel- возвращает информацию о настроенных контроллерах I2PTunnel (краткая статистика по всем).i2p.router.net.tunnels.exploratory.inbound- возвращает количество исследовательских входящих туннелей.i2p.router.net.tunnels.exploratory.outbound- возвращает количество исследовательских исходящих туннелей.i2p.router.net.tunnels.exploratory.info.list- возвращает список информации об исследовательских туннелях.i2p.router.net.tunnels.client.inbound- возвращает количество клиентских входящих туннелей.i2p.router.net.tunnels.client.outbound- возвращает количество клиентских исходящих туннелей.i2p.router.net.tunnels.client.info.list- возвращает список информации о клиентских туннелях.i2p.router.net.status.v6- возвращает код состояния IPv6-сети. (заимствовано из i2pd)i2p.router.net.error- возвращает код ошибки IPv4-сети. (заимствовано из i2pd)i2p.router.net.error.v6- возвращает код ошибки IPv6-сети. (заимствовано из i2pd)i2p.router.net.testing- возвращает, находится ли IPv4-сеть в состоянии тестирования (0 или 1). (заимствовано из i2pd)i2p.router.net.testing.v6- возвращает, находится ли IPv6-сеть в состоянии тестирования (0 или 1). (заимствовано из i2pd)i2p.router.net.tunnels.successrate— возвращает недавний процент успешного создания туннелей (%). (заимствовано из i2pd)i2p.router.net.tunnels.totalsuccessrate— возвращает общий процент успешного создания туннелей с момента запуска (%). (заимствовано из i2pd)i2p.router.net.tunnels.queue— возвращает размер очереди запросов на создание туннелей. (заимствовано из i2pd)i2p.router.net.tunnels.tbmqueue— возвращает размер очереди сообщений создания туннелей (Tunnel Build Message). (заимствовано из i2pd)i2p.router.netdb.peers- возвращает список известных хешей пиров.i2p.router.netdb.activepeers.info- возвращает сериализованные данные RouterInfo для активных пиров.i2p.router.netdb.ntcp.limit- возвращает лимит подключений NTCP.i2p.router.netdb.ssu.limit- возвращает лимит подключений SSU.i2p.router.netdb.bannedpeers- возвращает список заблокированных пиров с деталями блокировки.i2p.router.netdb.activepeers.list- возвращает хеши активных пиров.i2p.router.netdb.peers.list- возвращает хеши известных пиров.i2p.router.netdb.peers.info- возвращает сериализованные данные RouterInfo для известных пиров.i2p.router.netdb.activepeers.stats- возвращает статистику по активным пирам.i2p.router.addressbook.private.list- возвращает записи из приватной адресной книги.i2p.router.addressbook.local.list- возвращает записи из локальной адресной книги.i2p.router.addressbook.router.list- возвращает записи из адресной книги роутера.i2p.router.addressbook.published.list- возвращает опубликованные записи адресной книги.i2p.router.addressbook.subscriptions- возвращает путь к файлу подписок и его записи.i2p.router.addressbook.config- возвращает путь к конфигурационному файлу адресной книги и его записи.
Пример:
{
"jsonrpc": "2.0",
"method": "RouterInfo",
"params": {
"i2p.router.id": "",
},
"id": 1
}
Возврат:
{
"jsonrpc": "2.0",
"result": "{ data }",
"id": 1
}
Метод - AddressBook ——————–
Для метода AddressBook требуется три параметра/аргумента для удаления и добавления записей в адресную книгу:
Type— соответствует типу адресной книги:privatelocalrouterpublished
Hostname— соответствует имени хоста или доменному имени, связанному с записью в адресной книге.Destination— соответствует назначению, связанному с записью в адресной книге.Delete— этот параметр является необязательным и используется для удаления записи из адресной книги. Если параметр не указан, метод добавит новую запись в адресную книгу.
Пример:
{
"jsonrpc": "2.0",
"method": "AddressBook",
"params": {
"Type": "private",
"Hostname": "example.i2p",
"Destination": "exampleDestinationString",
"Delete": "" <--- this parameter is optional
},
"id": 1
}
Возврат:
{
"jsonrpc": "2.0",
"success": true or false,
"message": "Deleted/Added (hostname) in (address book type) address book" OR "Failed to delete/add (hostname) to (address book type) address book",
"id": 1
}
Для редактирования AddressBookSubscriptions:
SetSubscriptions- этот параметр используется для установки подписок для записи в адресной книге. В качестве аргумента он принимает список строк.
Пример:
{
"jsonrpc": "2.0",
"method": "AddressBook",
"params": {
"SetSubscriptions": ["notbob.i2p", "helloworld.i2p", ...]
},
"id": 1
}
Возврат:
{
"jsonrpc": "2.0",
"success": true,
"message": "Successfully modified: /path/to/subscriptions.txt"
}
Для редактирования AddressBookConfig:
SetConfig— этот параметр используется для установки конфигурации записи в адресной книге.
Принимает в качестве аргумента объект JSON, содержащий параметры конфигурации.
Доступные/распространённые параметры конфигурации:
subscriptions— файл, содержащий список URL-адресов подписок.update_delay— интервал обновления в часах.published_addressbook— путь к опубликованной адресной книге.router_addressbook— путь к адресной книге маршрутизатора.local_addressbook— путь к локальной адресной книге.private_addressbook— путь к приватной адресной книге.proxy_port— порт eepProxy.proxy_host— имя хоста eepProxy.should_publish— следует ли обновлять опубликованную адресную книгу.etags— файл, содержащий etag-идентификаторы URL-адресов подписок.last_modified— файл, содержащий временные метки последнего изменения URL-адресов подписок.log— путь к файлу журнала.theme— тема оформления.
Пример:
{
"jsonrpc": "2.0",
"method": "AddressBook",
"params": {
"SetConfig": {
"subscriptions": "subscriptions.txt",
"update_delay": "12",
"published_addressbook": "../eepsite/docroot/hosts.txt",
"router_addressbook": "hosts.txt",
"local_addressbook": "../userhosts.txt",
"private_addressbook": "../privatehosts.txt",
"proxy_port": "4444",
"proxy_host": "127.0.0.1",
"should_publish": "true",
"etags": "etags.txt",
"last_modified": "last_modified.txt",
"log": "log.txt",
"theme": "light"
}
},
"id": 1
}
Возврат:
{
"jsonrpc": "2.0",
"result": {
"success": true,
"message": "Successfully modified: /path/to/config.txt"
},
"id": 1
}
Метод - TunnelManager ——–
Метод TunnelManager используется для создания, редактирования, получения, запуска, остановки, перезапуска и удаления контроллеров I2PTunnel.
Обязательные параметры:
Name- имя туннеля. Это идентификатор туннеля.Action- действие, которое необходимо выполнить:create.editgetstartstoprestartdelete
Дополнительные параметры:
All- булево значение, указывает, нужно ли применить действие ко всем туннелям. Допустимо только для действийstart,stopиrestart.
Поддерживаемые типы туннелей для create:
clienthttpclientircclientsockssocksircconnectclientstreamrclientserverhttpserverhttpbidirserverircserverstreamrserver
Общие параметры для создания/редактирования туннелей:
Type- тип туннеля. Обязателен дляcreate.NewName- необязательное новое имя при редактировании.Port- локальный порт прослушивания.TargetHostилиHost- целевой хост для серверных туннелей.TargetPort- целевой порт для серверных туннелей.TargetDestinationилиDestination- назначение для клиентских туннелей, которым оно требуется.StartOnLoad- булево значение, должен ли туннель запускаться при загрузке.Description- описание туннеля.ReachableBy- интерфейс/адрес, на котором прослушивает туннель.Shared- булево значение, должен ли быть клиентский туннель общим.UseSSL- булево значение, включить SSL, где поддерживается.TunnelLength- длина туннеля, от0до3.TunnelVariance- вариативность туннеля, от-2до2.TunnelQuantity- количество туннелей, от1до6.TunnelBackupQuantity- количество резервных туннелей, от0до3.SigType- тип ключа подписи.EncType- тип шифрования.CustomOptions- пользовательские параметры туннеля.
Параметры клиентского прокси:
ProxyListUseOutproxyPluginProxyAuthProxyUsernameProxyPasswordOutproxyAuthOutproxyUsernameOutproxyPasswordOutproxyTypeSSLProxiesJumpList
Параметры управления клиентом:
ConnectDelayProfileDelayOpenReduceReduceCountReduceTimeCloseCloseTimeNewDestPersistentClientKeyPrivKeyFile
Параметры фильтрации HTTP-клиента:
AllowUserAgentAllowRefererAllowAcceptAllowInternalSSL
Параметры сервера:
WebsiteHostnameилиSpoofedHostBlockAccessInProxiesBlockUserAgentsUserAgentsUniqueLocalAddressPerClientBlockReferersMultiHomingAccessOptionAccessListFilterFilePathMaxConcurrentConnsClientPerMinuteClientPerHourClientPerDayTotalInPerMinuteTotalInPerHourTotalInPerDayPostLimitPostLimitTimePerClientPeriodTotalPeriodTotalBanTime
Параметры LeaseSet:
EncryptLeaseSet- один из:disableencrypted (aes)blindedblinded with lookup passwordencrypted (psk)encrypted with lookup password (psk)encrypted with per-user key (psk)encrypted with lookup password and per-user key (psk)encrypted with per-user key (dh)encrypted with lookup password and per-user key (dh)
OptionalLookupLeaseSetClientAuths
Пример создания:
{
"jsonrpc": "2.0",
"method": "TunnelManager",
"params": {
"Name": "example-client",
"Action": "create",
"Type": "client",
"Port": 7656,
"TargetDestination": "exampleDestinationString",
"StartOnLoad": false,
....
},
"id": 1
}
Возврат:
{
"jsonrpc": "2.0",
"result": {
"status": "success - created tunnel example-client" OR "error - { error message }",
"results": [ {/* information about where persistent keys are stored */} ]
},
"id": 1
}
Пример редактирования:
{
"jsonrpc": "2.0",
"method": "TunnelManager",
"params": {
"Name": "example-client",
"Action": "edit",
"NewName": "renamed-client",
"Port": 7657,
"TargetDestination": "newDestinationString",
"StartOnLoad": true
},
"id": 1
}
Возврат:
{
"jsonrpc": "2.0",
"result": {
"status": "success - edited tunnel example-client" OR "error - { error message }"
},
"id": 1
}
Пример получения:
{
"jsonrpc": "2.0",
"method": "TunnelManager",
"params": {
"Name": "example-client",
"Action": "get"
},
"id": 1
}
Возврат:
{
"jsonrpc": "2.0",
"result": {
"status": "success - options for example-client" OR "error - { error message }",
"info": {
"client": true,
"status": "running",
"persistentClientKey": false,
"offlineKeys": false,
"targetDestination": "exampleDestinationString",
"localDestination": "exampleBase64Destination",
"destination": "exampleBase64Destination",
"destinationB32": "example.b32.i2p",
"rawConfig": {
"name": "example-client",
"type": "client"
}
}
},
"id": 1
}
Примеры запуска, остановки, перезапуска и удаления. Они имеют одинаковую структуру, просто с разными параметрами Action:
{
"jsonrpc": "2.0",
"method": "TunnelManager",
"params": {
"Name": "example-client",
"Action": "start"
},
"id": 1
}
Возврат:
{
"jsonrpc": "2.0",
"result": {
"status": "success - starting tunnel example-client" OR "error - { error message }"
},
"id": 1
}
Метод - ClientServicesInfo (адаптировано из i2pd) ————————————————-
Метод ClientServicesInfo возвращает информацию о состоянии клиентских служб, работающих на маршрутизаторе. Включите нужные ключи служб (с любыми значениями) в параметр params, чтобы запросить состояние каждой службы.
Поддерживаемые параметры:
I2PTunnel- возвращает отображение настроенных имён туннелей на их адреса, разделённое на подобъектыclientиserver.HTTPProxy- возвращает состояние включённости HTTP-прокси и его адрес.SOCKS- возвращает состояние включённости SOCKS-прокси и его адрес.SAM- возвращает состояние включённости моста SAM и информацию об активных сессиях.BOB- возвращает состояние включённости моста BOB. (Устарело в Java I2P; всегда возвращаетfalse.)I2CP- возвращает состояние включённости сервера I2CP.
Пример:
{
"jsonrpc": "2.0",
"method": "ClientServicesInfo",
"params": {
"I2PTunnel": "",
"SAM": ""
},
"id": 1
}
Возврат:
{
"jsonrpc": "2.0",
"result": {
"I2PTunnel": {
"client": {"my-client": {"address": "example.b32.i2p"}},
"server": {"my-server": {"address": "example.b32.i2p", "port": 8080}}
},
"SAM": {
"enabled": true,
"sessions": {}
}
},
"id": 1
}
Совместимость =============
Совместимость с существующим API i2pcontrol должна быть сохранена, поскольку новые методы и параметры добавляются таким образом, что не мешают существующей функциональности. Приложения, уже использующие API i2pcontrol, должны продолжать работать без изменений, в то время как новые приложения смогут воспользоваться дополнительной информацией и возможностями, предусмотренными в данном предложении.
Реализация ==============
Java I2P ——–
Это предложение еще не реализовано в Java I2P, однако код доступен в репозитории i2p.plugins.i2pcontrol в рамках запроса на слияние #6 . Это сделано для того, чтобы разрешить тестирование и разработку новых методов без влияния на существующий код. После готовности кода к использованию в продакшене он будет включен в основной репозиторий I2P в каталог i2pcontrol.
i2pd —-
Методы и параметры, помеченные как “(заимствовано из i2pd)”, реализованы в i2pd и не изменяются в данном предложении. Расширения i2pd не потребуют модификации в рамках данного предложения. Части, не отмеченные таким образом, в i2pd не реализованы.
go-i2p ——
go-i2p стремится реализовать это предложение, чтобы включить и улучшить своё приложение консоли маршрутизатора. В будущем оно примет и реализует данное предложение.
emissary ——–
Вероятность внедрения в Emissary на данный момент неизвестна, однако Emissary, вероятно, получит выгоду от данного предложения теми же способами, что и go-i2p.
Производительность ===========
Ожидается отсутствие влияния на производительность.