Исправить pairing без пароля и убрать фантомные заявки

This commit is contained in:
AidarKC 2026-06-15 02:21:21 +04:00
parent bef205aec7
commit 7972676eb8
7 changed files with 8 additions and 7 deletions

View File

@ -267,6 +267,7 @@ K9v3nQ4u8jYk0a2p7cD4mLx1zR0sT5wV6bN8eH3fQ1M
### 5.3. `ListEspPairingRequests`
Доступно для любой уже авторизованной доверенной сессии пользователя.
Возвращает только реально активные pending-заявки со `state = created`. Уже `approved` и `rejected` заявки в этот список больше не попадают.
### Успешный ответ

View File

@ -59,7 +59,7 @@
## 3. Что именно делает сервер
- хранит включённость pairing и optional opaque `passwordHash`;
- хранит pending/approved/rejected pairing-заявки;
- хранит pairing-заявки всех статусов, но в список активных для доверённого устройства отдаёт только pending `created`;
- рассчитывает короткий код `shortCode` из `7` цифр;
- рассчитывает длинный `fingerprintB58` из `SHA-256` заявки;
- уведомляет онлайн доверенные сессии событием `IncomingEspPairingRequest`, если такие сессии подключены;

View File

@ -112,7 +112,7 @@ public final class EspPairingRequestsDAO {
FROM esp_pairing_requests
WHERE login = ? COLLATE NOCASE
AND expires_at_ms > ?
AND status IN ('created', 'approved', 'rejected')
AND status = 'created'
ORDER BY created_at_ms DESC
""";
List<EspPairingRequestEntry> list = new ArrayList<>();

View File

@ -63,7 +63,7 @@ public class Net_StartEspPairing_Handler implements JsonMessageHandler {
String canonicalLogin = user.getLogin();
EspPairingSettingsEntry settings = EspPairingSettingsDAO.getInstance().getByLogin(canonicalLogin);
if (settings == null || !settings.isEnabled() || settings.getPasswordHash() == null || settings.getPasswordHash().isBlank()) {
if (settings == null || !settings.isEnabled()) {
return NetExceptionResponseFactory.error(req, 422, "PAIRING_NOT_AVAILABLE", "Для этого login pairing недоступен");
}

View File

@ -1,2 +1,2 @@
client.version=1.2.196
server.version=1.2.185
client.version=1.2.197
server.version=1.2.186

View File

@ -55,7 +55,7 @@ import * as serverSettingsView from './pages/server-settings-view.js';
import * as toolsSettingsView from './pages/tools-settings-view.js';
import * as deviceView from './pages/device-view.js?v=202606131435';
import * as connectDeviceView from './pages/connect-device-view.js?v=202606142055';
import * as devicePairingView from './pages/device-pairing-view.js?v=202606150010';
import * as devicePairingView from './pages/device-pairing-view.js?v=202606150030';
import * as deviceQrView from './pages/device-qr-view.js';
import * as deviceCameraView from './pages/device-camera-view.js';
import * as showKeysView from './pages/show-keys-view.js';

View File

@ -102,7 +102,7 @@ export function render({ navigate }) {
<button class="primary-btn" type="button" id="enable-pairing-btn">Включить / обновить</button>
<button class="ghost-btn" type="button" id="disable-pairing-btn">Выключить</button>
</div>
<p class="meta-muted">Пароль хранится на сервере только в виде hash. После включения можно переходить к заявкам ниже.</p>
<p class="meta-muted">Чтобы включить pairing без пароля: оставьте галочку выключенной и нажмите `Включить / обновить`. Чтобы включить pairing с паролем: включите галочку, введите пароль и нажмите ту же кнопку.</p>
`;
const keySummaryCard = document.createElement('div');