Сузить диалог изменения pairing-пароля

This commit is contained in:
AidarKC 2026-06-15 15:23:19 +04:00
parent d6c5757dfa
commit e1f2b54de3
3 changed files with 42 additions and 21 deletions

View File

@ -1,2 +1,2 @@
client.version=1.2.201 client.version=1.2.202
server.version=1.2.190 server.version=1.2.191

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 toolsSettingsView from './pages/tools-settings-view.js';
import * as deviceView from './pages/device-view.js?v=202606131435'; import * as deviceView from './pages/device-view.js?v=202606131435';
import * as connectDeviceView from './pages/connect-device-view.js?v=202606142055'; import * as connectDeviceView from './pages/connect-device-view.js?v=202606142055';
import * as devicePairingView from './pages/device-pairing-view.js?v=202606151000'; import * as devicePairingView from './pages/device-pairing-view.js?v=202606151030';
import * as deviceQrView from './pages/device-qr-view.js'; import * as deviceQrView from './pages/device-qr-view.js';
import * as deviceCameraView from './pages/device-camera-view.js'; import * as deviceCameraView from './pages/device-camera-view.js';
import * as showKeysView from './pages/show-keys-view.js'; import * as showKeysView from './pages/show-keys-view.js';

View File

@ -173,13 +173,10 @@ export function render({ navigate }) {
passwordDialog.style.zIndex = '30'; passwordDialog.style.zIndex = '30';
passwordDialog.innerHTML = ` passwordDialog.innerHTML = `
<div style="position:absolute; inset:0; background:rgba(5,9,16,0.72); backdrop-filter:blur(4px);" data-action="close-dialog"></div> <div style="position:absolute; inset:0; background:rgba(5,9,16,0.72); backdrop-filter:blur(4px);" data-action="close-dialog"></div>
<div class="card stack" style="position:absolute; left:16px; right:16px; top:24px; gap:12px; box-shadow:var(--shadow);"> <div class="card stack" style="position:absolute; left:50%; top:24px; width:min(calc(100vw - 32px), 360px); transform:translateX(-50%); gap:12px; box-shadow:var(--shadow);">
<div class="row" style="align-items:flex-start;"> <div class="stack" style="gap:6px;">
<div class="stack" style="gap:6px; flex:1;"> <p class="field-label" id="pairing-dialog-title">Задать дополнительный пароль</p>
<p class="field-label" id="pairing-dialog-title">Задать дополнительный пароль</p> <p class="meta-muted" id="pairing-dialog-text">Дополнительный пароль не даёт права на подключение сам по себе. Он только отсекает лишние заявки, чтобы посторонние не могли засыпать ваш аккаунт запросами. Обычно он не нужен, поэтому при желании можно задать и что-то простое, что легко запомнить.</p>
<p class="meta-muted" id="pairing-dialog-text">Дополнительный пароль не даёт права на подключение сам по себе. Он только отсекает лишние заявки, чтобы посторонние не могли засыпать ваш аккаунт запросами. Обычно он не нужен, поэтому при желании можно задать и что-то простое, что легко запомнить.</p>
</div>
<button class="ghost-btn" type="button" data-action="close-dialog">Закрыть</button>
</div> </div>
<label class="stack"> <label class="stack">
<span class="field-label">Пароль</span> <span class="field-label">Пароль</span>
@ -250,6 +247,18 @@ export function render({ navigate }) {
passwordDialog.hidden = true; passwordDialog.hidden = true;
}; };
const removeAdditionalPassword = async () => {
const payload = await authService.upsertEspPairingSettings({
enabled: true,
passwordHash: '',
ttlSeconds: 180,
});
pairingPasswordConfigured = false;
saveLocalPairingPasswordState(state.session.login, state.entrySettings.shineServer, false);
setAuthInfo(`Подключение по коду без дополнительного пароля включено. TTL: ${payload?.ttlSeconds || 180} сек.`);
setStatus(status, 'Дополнительный пароль убран. Подключение по коду теперь работает без него.', 'info');
};
const setSettingsBusy = (flag) => { const setSettingsBusy = (flag) => {
settingsBusy = flag; settingsBusy = flag;
renderSettingsCard(); renderSettingsCard();
@ -294,15 +303,7 @@ export function render({ navigate }) {
removeBtn.addEventListener('click', async () => { removeBtn.addEventListener('click', async () => {
setSettingsBusy(true); setSettingsBusy(true);
try { try {
const payload = await authService.upsertEspPairingSettings({ await removeAdditionalPassword();
enabled: true,
passwordHash: '',
ttlSeconds: 180,
});
pairingPasswordConfigured = false;
saveLocalPairingPasswordState(state.session.login, state.entrySettings.shineServer, false);
setAuthInfo(`Подключение по коду без дополнительного пароля включено. TTL: ${payload?.ttlSeconds || 180} сек.`);
setStatus(status, 'Дополнительный пароль убран. Подключение по коду теперь работает без него.', 'info');
} catch (error) { } catch (error) {
const message = toUserMessage(error, 'Не удалось убрать дополнительный пароль.'); const message = toUserMessage(error, 'Не удалось убрать дополнительный пароль.');
setAuthError(message); setAuthError(message);
@ -407,8 +408,28 @@ export function render({ navigate }) {
const password = String(dialogPasswordInput.value || ''); const password = String(dialogPasswordInput.value || '');
const confirm = String(dialogPasswordConfirmInput.value || ''); const confirm = String(dialogPasswordConfirmInput.value || '');
const currentMode = dialogMode; const currentMode = dialogMode;
if (!password) { if (!password && !confirm) {
setStatus(status, 'Введите дополнительный пароль.', 'error'); const shouldRemove = window.confirm('Пароль не задан. Хотите убрать дополнительный пароль?');
if (!shouldRemove) {
setStatus(status, 'Введите пароль или отмените изменение.', 'error');
return;
}
dialogSaveBtn.disabled = true;
try {
await removeAdditionalPassword();
closePasswordDialog();
renderSettingsCard();
} catch (error) {
const message = toUserMessage(error, 'Не удалось убрать дополнительный пароль.');
setAuthError(message);
setStatus(status, message, 'error');
} finally {
dialogSaveBtn.disabled = false;
}
return;
}
if (!password || !confirm) {
setStatus(status, 'Заполните пароль и подтверждение пароля.', 'error');
return; return;
} }
if (password !== confirm) { if (password !== confirm) {