modified: Dockerfile modified: composer.json modified: composer.lock modified: config/packages/twig.yaml modified: config/services.yaml modified: docs/Caddyfile modified: docs/compose.yaml renamed: docs/env.example -> docs/example.env modified: public/index.php modified: readme.md modified: src/Command/GenerateBackupCodesCommand.php modified: src/ConfigBag.php modified: src/Data/Payload.php modified: src/Enum/Scope.php modified: src/Listener/AcceptListener.php modified: src/Listener/AllowListener.php modified: src/Listener/InterceptListener.php modified: src/Listener/LoginListener.php modified: src/MonitorCacheKeys.php modified: src/PersistCache.php modified: src/Service/BackupCodeManager.php modified: src/Service/DomainManager.php new file: src/Service/LoginManager.php modified: src/Trait/CookieNameTrait.php modified: src/Trait/GetTotpTrait.php modified: src/Trait/MakeNonceTrait.php modified: src/Trait/StringTrait.php modified: src/Utilities.php modified: templates/_script.html.twig modified: templates/_style.html.twig modified: templates/base.html.twig modified: templates/login.html.twig
69 lines
2.9 KiB
Twig
69 lines
2.9 KiB
Twig
<script>
|
|
const form = document.getElementById('preauth-form');
|
|
const message = document.getElementById('preauth-message');
|
|
const body = document.getElementById('preauth-body');
|
|
const style = document.getElementById('preauth-style');
|
|
|
|
form.addEventListener('submit', (event) => {
|
|
event.preventDefault();
|
|
|
|
/* make base64url string containing our payload json object */
|
|
const data = btoa(JSON.stringify({
|
|
id: form.preauth_id.value,
|
|
token: form.preauth_token.value,
|
|
nonce: form.preauth_nonce.value,
|
|
json: true
|
|
})).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
|
|
/* send our request to the server */
|
|
fetch(window.location.href, {
|
|
method: 'GET',
|
|
headers: { 'X-Preauth': data },
|
|
}).then((response) => {
|
|
if (response.headers.has('Location')) {
|
|
/* follow redirect (not needed in most browsers) */
|
|
window.location.href = response.headers.get('Location');
|
|
} else if (response.headers.get('Content-Type') === 'application/json') {
|
|
/* got json, update the page */
|
|
response.json().then((content) => {
|
|
if (Object.hasOwn(content, 'message')) {
|
|
message.innerText = content.message;
|
|
}
|
|
if (Object.hasOwn(content, 'nonce')) {
|
|
form.preauth_nonce.value = content.nonce;
|
|
form.preauth_token.value = '';
|
|
form.preauth_token.focus();
|
|
}
|
|
}).catch((error) => {
|
|
console.log('failed to parse json from response');
|
|
console.log(error);
|
|
});
|
|
} else if (response.headers.get('Content-Type') === 'text/html') {
|
|
/* got HTML, replace the page */
|
|
response.text().then((html) => {
|
|
document.open();
|
|
document.write(html);
|
|
document.close();
|
|
}).catch((error) => {
|
|
console.log('failed to get html from response');
|
|
console.log(error);
|
|
});
|
|
} else { /* non-json, non-html, non-redirect response */
|
|
/* update the page, change style to plain text */
|
|
response.text().then((text) => {
|
|
body.innerText = text;
|
|
style.disabled = true;
|
|
body.style.whiteSpace = 'pre-wrap';
|
|
body.style.wordWrap = 'break-word';
|
|
}).catch((error) => {
|
|
console.log('failed to get text from response');
|
|
console.log(error);
|
|
});
|
|
}
|
|
}).catch((error) => {
|
|
console.log('failed to get response');
|
|
console.log(error);
|
|
});
|
|
});
|
|
</script>
|