Разрешить pairing без доп пароля

This commit is contained in:
AidarKC
2026-06-15 00:54:56 +04:00
parent 49fdbbf7ae
commit bef205aec7
10 changed files with 94 additions and 27 deletions
+26 -3
View File
@@ -68,12 +68,16 @@ export function render({ navigate }) {
<span class="field-label">Логин</span>
<input class="input" id="pair-login" type="text" autocomplete="username" placeholder="@login" value="${String(state.loginDraft.login || '')}" />
</label>
<label class="checkbox-row">
<input type="checkbox" id="pair-use-password" />
использовать доп. пароль
</label>
<label class="stack">
<span class="field-label">Пароль подключения</span>
<input class="input" id="pair-password" type="password" autocomplete="current-password" placeholder="Пароль, заданный на другом устройстве" />
</label>
<button class="primary-btn" type="button" id="pair-start-btn">Получить код</button>
<p class="meta-muted">Сначала вводится ваш логин и pairing-пароль. После этого появится 7-значный код для подтверждения на уже подключённом устройстве.</p>
<p class="meta-muted" id="pair-mode-hint">Сначала вводится ваш логин. Если на доверённом устройстве включён доп. пароль, включите галочку и введите его. После этого появится 7-значный код для подтверждения.</p>
`;
const status = document.createElement('p');
@@ -86,13 +90,26 @@ export function render({ navigate }) {
resultWrap.innerHTML = codeCardHtml();
const loginInput = formCard.querySelector('#pair-login');
const usePasswordInput = formCard.querySelector('#pair-use-password');
const passwordInput = formCard.querySelector('#pair-password');
const startBtn = formCard.querySelector('#pair-start-btn');
const modeHintEl = formCard.querySelector('#pair-mode-hint');
const shortCodeEl = resultWrap.querySelector('#pairing-short-code');
const statusHintEl = resultWrap.querySelector('#pairing-status-hint');
const onlineHintEl = resultWrap.querySelector('#pairing-online-hint');
const expireHintEl = resultWrap.querySelector('#pairing-expire-hint');
const syncPasswordUi = () => {
const usePassword = !!usePasswordInput.checked;
passwordInput.parentElement.style.display = usePassword ? '' : 'none';
modeHintEl.textContent = usePassword
? 'Введите логин и доп. пароль, который был задан на доверённом устройстве.'
: 'Введите логин. Если на доверённом устройстве пароль не задан, вход пойдёт без доп. пароля.';
if (!usePassword) {
passwordInput.value = '';
}
};
const stopPolling = () => {
if (pollTimer) {
window.clearTimeout(pollTimer);
@@ -167,14 +184,18 @@ export function render({ navigate }) {
}, 2200);
};
usePasswordInput.addEventListener('change', syncPasswordUi);
syncPasswordUi();
startBtn.addEventListener('click', async () => {
const login = String(loginInput.value || '').trim();
const usePassword = !!usePasswordInput.checked;
const password = String(passwordInput.value || '');
if (!login) {
setStatus(status, 'Введите логин.', 'error');
return;
}
if (!password) {
if (usePassword && !password) {
setStatus(status, 'Введите пароль подключения.', 'error');
return;
}
@@ -195,7 +216,9 @@ export function render({ navigate }) {
}
requesterMaterial = await createRequesterPairingMaterial();
const passwordHash = await deriveEspPairingPasswordHash(login, password);
const passwordHash = usePassword
? await deriveEspPairingPasswordHash(login, password)
: '';
const payload = await authService.startEspPairing({
login,
passwordHash,