Разрешить 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
+30 -4
View File
@@ -90,8 +90,12 @@ export function render({ navigate }) {
settingsCard.className = 'card stack';
settingsCard.innerHTML = `
<p class="field-label">Пароль подключения</p>
<label class="checkbox-row">
<input type="checkbox" id="pairing-use-password" />
использовать доп. пароль
</label>
<label class="stack">
<span class="meta-muted">Задайте пароль, который новое устройство введёт перед получением кода.</span>
<span class="meta-muted" id="pairing-password-help">Если включено, новое устройство должно будет ввести этот пароль перед получением кода.</span>
<input class="input" id="pairing-password" type="password" autocomplete="new-password" placeholder="Новый pairing-пароль" />
</label>
<div class="row">
@@ -127,6 +131,8 @@ export function render({ navigate }) {
status.style.display = 'none';
const passwordInput = settingsCard.querySelector('#pairing-password');
const usePasswordInput = settingsCard.querySelector('#pairing-use-password');
const passwordHelpEl = settingsCard.querySelector('#pairing-password-help');
const enableBtn = settingsCard.querySelector('#enable-pairing-btn');
const disableBtn = settingsCard.querySelector('#disable-pairing-btn');
const keySummaryEl = keySummaryCard.querySelector('#pairing-key-summary');
@@ -134,6 +140,17 @@ export function render({ navigate }) {
const refreshBtn = requestsCard.querySelector('#refresh-pairing-requests');
const requestsListEl = requestsCard.querySelector('#pairing-requests-list');
const syncPasswordUi = () => {
const usePassword = !!usePasswordInput.checked;
passwordInput.parentElement.style.display = usePassword ? '' : 'none';
passwordHelpEl.textContent = usePassword
? 'Если включено, новое устройство должно будет ввести этот пароль перед получением кода.'
: 'Если выключено, новое устройство сможет входить без доп. пароля.';
if (!usePassword) {
passwordInput.value = '';
}
};
const renderRequests = () => {
const filterCode = normalizeCode(codeFilterInput.value);
const filtered = filterCode
@@ -187,6 +204,7 @@ export function render({ navigate }) {
enableBtn.disabled = flag;
disableBtn.disabled = flag;
refreshBtn.disabled = flag;
usePasswordInput.disabled = flag;
};
const approveRequest = async (request, mode) => {
@@ -205,26 +223,33 @@ export function render({ navigate }) {
await reloadRequests({ silent: true });
};
usePasswordInput.addEventListener('change', syncPasswordUi);
settingsCard.addEventListener('click', async (event) => {
const target = event.target;
if (!(target instanceof HTMLElement)) return;
if (target.id === 'enable-pairing-btn') {
const usePassword = !!usePasswordInput.checked;
const password = String(passwordInput.value || '');
if (!password) {
if (usePassword && !password) {
setStatus(status, 'Введите pairing-пароль.', 'error');
return;
}
setButtonsBusy(true);
try {
const passwordHash = await deriveEspPairingPasswordHash(state.session.login, password);
const passwordHash = usePassword
? await deriveEspPairingPasswordHash(state.session.login, password)
: '';
const payload = await authService.upsertEspPairingSettings({
enabled: true,
passwordHash,
ttlSeconds: 180,
});
setAuthInfo(`Подключение по коду включено. TTL: ${payload?.ttlSeconds || 180} сек.`);
setStatus(status, 'Подключение по коду включено или обновлено.', 'info');
setStatus(status, usePassword
? 'Подключение по коду включено с доп. паролем.'
: 'Подключение по коду включено без доп. пароля.', 'info');
passwordInput.value = '';
} catch (error) {
const message = toUserMessage(error, 'Не удалось включить pairing.');
@@ -297,6 +322,7 @@ export function render({ navigate }) {
void (async () => {
try {
syncPasswordUi();
await loadSavedKeys();
await reloadRequests({ silent: true });
cleanupEvent = authService.onEvent('IncomingEspPairingRequest', () => {