Skip to content

API and token lifetime fixes - #427

Merged
e-khalilov merged 5 commits into
developfrom
e.khalilov/api-issues/TAP-4526
Oct 23, 2026
Merged

e-khalilov merged 5 commits into
developfrom
e.khalilov/api-issues/TAP-4526

Conversation

@e-khalilov

Copy link
Copy Markdown
Collaborator

Кратко

Доработки Provider API и API-ключей, исправления стабильности и безопасности.

  • Provider API показывает, занято ли устройство и кем, и отдаёт одно устройство по serial.
  • Для API-ключей появился выбор срока жизни, по умолчанию ключ бессрочный. Удалённый ключ перестаёт работать.
  • Закрыта возможность взять через API устройство из группы, в которой пользователь не состоит.
  • Лимит запросов считается отдельно для каждого клиента.
  • Исправлены зависание DELETE /user/devices, ошибка 504 при взятии устройства через API, несколько процессов adb при --adb-autostart и ошибки CORS при OAuth-авторизации.

Provider API

  • GET /api/v1/remote-devices. У каждого устройства есть поля acquired (занято ли оно) и owner (email пользователя или null). Занятость видна прямо в provider, без запросов в основной API.
  • GET /api/v1/remote-devices/{serial} возвращает одно устройство. Если устройство подключено не через API, ответ — 404. Serial с IPv6 ([::1]:5555) передаётся в URL-кодированном виде.
  • state: connecting → active → releasing. active означает, что adb подключён и воркер готов, то есть устройство можно отдавать пользователю. Пока устройство запускается или восстанавливается после сбоя, у него connecting. Webhook-события не изменились.

GET /api/v1/remote-devices/{serial} – Response:

{
  "device": {
    "serial": "10.0.0.5:5555", 
    "state": "active", 
    "acquired": true, 
    "owner": "user@example.com"
  }
}

API-ключи

  • При создании ключа в UI выбирается срок: без срока (по умолчанию), 1, 2 или 3 месяца (месяц = 30 дней). Срок показывается в окне ключа.
  • В REST тот же параметр lifetime (0–3): POST /api/v1/user/accessTokens и POST /api/v1/users/{email}/accessTokens.
  • Удалённый ключ перестаёт работать в течение 2 минут. Раньше он продолжал работать до истечения 30 дней с момента создания.
  • Ключи, созданные до этого изменения, по-прежнему действуют 30 дней с момента создания: срок зашит в сам ключ.

ADB-ключи

  • В настройках появилось пояснение: ADB-ключи необязательны. Они ограничивают adb connect владельцами этих ключей. Без ключей подключиться может любой, у кого есть команда подключения.
  • POST /api/v1/user/adbPublicKeys: на невалидный ключ ответ 400 (раньше 500). Повторное добавление того же ключа даёт 200 без дубликата.
  • Ключи пользователя применяются в момент взятия устройства. Ключ, добавленный во время сессии, начинает действовать со следующего взятия, в том числе в silent-режиме.

Лимит запросов

Раньше все клиенты делили один общий лимит на юнит (2800 запросов в минуту): заголовок с адресом клиента не читался из-за регистра имени. Теперь лимит считается для каждого клиента отдельно. Адрес клиента берётся из заголовка X-Real-IP, если запрос пришёл от обратного прокси на том же хосте (loopback), а иначе — из адреса соединения. Если прокси не передаёт X-Real-IP, запросы через него по-прежнему учитываются вместе.

Исправления

Проблема Изменение
Через POST /api/v1/user/devices можно было взять устройство из группы, в которой пользователь не состоит. Блокировка при взятии не работала, и два одновременных запроса могли забрать одно устройство Взять можно только устройство своей группы, иначе 403 Forbidden (device not changed). Из одновременных запросов успешен ровно один
POST /api/v1/user/devices отвечал 504 «Device is not responding» пользователям, которые ни разу не добавляли ADB-ключ Исправлено
DELETE /api/v1/user/devices/{serial} и /users/{email}/devices/{serial} не возвращали ответ: устройство освобождалось, а запрос висел до таймаута клиента Ответ 200 приходит сразу. Если устройство не ответило — 504
Provider API: подключение недоступного хоста могло на минуту остановить опрос adb и отключить остальные устройства этого provider Подключение не влияет на другие устройства
Provider API: повторное подключение сразу после DELETE могло вернуть 409 Исправлено
--adb-autostart: при падении adb-сервера его одновременно перезапускали provider и каждый воркер устройства, и запускалось несколько процессов adb adb-сервер запускает только provider. Воркер устройства его не запускает и при недоступном сервере пишет в лог «ADB server … is not running»
OAuth 2.0: каждая страница UI в фоне запускала OAuth-авторизацию, в консоли браузера появлялись ошибки CORS на /auth/oauth/callback Исправлено
Переименование группы могло стереть название группы у её устройств Исправлено
Storage-юнит мог упасть из-за ошибки при проверке пользователя во время загрузки файла с устройства Ошибка обрабатывается, ответ 401

@e-khalilov
e-khalilov requested a review from a team as a code owner October 23, 2026 10:13
@e-khalilov
e-khalilov merged commit 19dfcb5 into develop Oct 23, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants