Сузить диалог изменения 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
server.version=1.2.190
client.version=1.2.202
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 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=202606151000';
import * as devicePairingView from './pages/device-pairing-view.js?v=202606151030';
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

@ -173,14 +173,11 @@ export function render({ navigate }) {
passwordDialog.style.zIndex = '30';
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 class="card stack" style="position:absolute; left:16px; right:16px; top:24px; gap:12px; box-shadow:var(--shadow);">
<div class="row" style="align-items:flex-start;">
<div class="stack" style="gap:6px; flex:1;">
<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="stack" style="gap:6px;">
<p class="field-label" id="pairing-dialog-title">Задать дополнительный пароль</p>
<p class="meta-muted" id="pairing-dialog-text">Дополнительный пароль не даёт права на подключение сам по себе. Он только отсекает лишние заявки, чтобы посторонние не могли засыпать ваш аккаунт запросами. Обычно он не нужен, поэтому при желании можно задать и что-то простое, что легко запомнить.</p>
</div>
<button class="ghost-btn" type="button" data-action="close-dialog">Закрыть</button>
</div>
<label class="stack">
<span class="field-label">Пароль</span>
<div class="inline-input-row">
@ -250,6 +247,18 @@ export function render({ navigate }) {
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) => {
settingsBusy = flag;
renderSettingsCard();
@ -294,15 +303,7 @@ export function render({ navigate }) {
removeBtn.addEventListener('click', async () => {
setSettingsBusy(true);
try {
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');
await removeAdditionalPassword();
} catch (error) {
const message = toUserMessage(error, 'Не удалось убрать дополнительный пароль.');
setAuthError(message);
@ -407,8 +408,28 @@ export function render({ navigate }) {
const password = String(dialogPasswordInput.value || '');
const confirm = String(dialogPasswordConfirmInput.value || '');
const currentMode = dialogMode;
if (!password) {
setStatus(status, 'Введите дополнительный пароль.', 'error');
if (!password && !confirm) {
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;
}
if (password !== confirm) {