const loginCSS = ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #222; color: #ddd; font-family: monospace; z-index: 100; `; const loginHTML = `

Login

`; function forceLogin() { const form = document.createElement('form'); form.method = 'POST'; form.action = `${location.href}login`; form.id = 'loginForm'; form.style.cssText = loginCSS; form.innerHTML = loginHTML; document.body.appendChild(form); const username = form.querySelector('#loginUsername'); const password = form.querySelector('#loginPassword'); const status = form.querySelector('#loginStatus'); form.addEventListener('submit', (event) => { event.preventDefault(); const formData = new FormData(form); formData.append('username', username.value); formData.append('password', password.value); console.warn('login', location.href, formData); fetch(`${location.href}login`, { method: 'POST', body: formData, }) .then(async (res) => { const json = await res.json(); let txt = ''; if (res.status === 200) txt = 'login verified'; else txt = `${res.status}: ${res.statusText} - ${json.detail}`; status.textContent = txt; console.log('login', txt); if (res.status === 200) location.reload(); }) .catch((err) => { status.textContent = err; console.error('login', err); }); }); } function loginCheck() { fetch(`${location.href}login_check`, {}) .then((res) => { if (res.status === 200) console.log('login ok'); else forceLogin(); }) .catch((err) => { console.error('login', err); }); } window.onload = loginCheck;