SHA256
Разрешить pairing без доп пароля
This commit is contained in:
@@ -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', () => {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user