Skip to content

Commit 59e55f0

Browse files
committed
Prevent the form being submitted twice
The code insertion from the iOS/macOS keychain immediately submits the form, combined with our code this causes a double submission. This possibly affects other platforms too. `requestSubmit()` works different by simulating what the submit button would do including triggering the `submit` event. See https://www.woltlab.com/community/thread/314276/ See https://www.woltlab.com/community/thread/314872/
1 parent 486af42 commit 59e55f0

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

com.woltlab.wcf/templates/multifactorAuthentication.tpl

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,24 @@
4242

4343
<script data-relocate="true">
4444
{
45-
const code = document.getElementById('code') ?? document.getElementById('onetimecode');
46-
if (code) {
47-
code.addEventListener('input', () => {
48-
if (code.value.length == code.maxLength) {
49-
code.form.submit();
45+
let wasSubmitted = false;
46+
const form = document.getElementById("multifactorAuthentication");
47+
form.addEventListener("submit", () => {
48+
document.getElementById("submitButton").disabled = true;
49+
wasSubmitted = true;
50+
});
51+
const code = document.getElementById("code") ?? document.getElementById("onetimecode");
52+
code?.addEventListener("input", () => {
53+
if (!wasSubmitted && code.value.length === code.maxLength) {
54+
if (form.requestSubmit) {
55+
form.requestSubmit();
56+
} else {
57+
form.submit();
5058
}
51-
});
52-
}
59+
60+
wasSubmitted = true;
61+
}
62+
});
5363
}
5464
</script>
5565

wcfsetup/install/files/acp/templates/multifactorAuthentication.tpl

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,24 @@
4747

4848
<script data-relocate="true">
4949
{
50-
const code = document.getElementById('code') ?? document.getElementById('onetimecode');
51-
if (code) {
52-
code.addEventListener('input', () => {
53-
if (code.value.length == code.maxLength) {
54-
code.form.submit();
50+
let wasSubmitted = false;
51+
const form = document.getElementById("multifactorAuthentication");
52+
form.addEventListener("submit", () => {
53+
document.getElementById("submitButton").disabled = true;
54+
wasSubmitted = true;
55+
});
56+
const code = document.getElementById("code") ?? document.getElementById("onetimecode");
57+
code?.addEventListener("input", () => {
58+
if (!wasSubmitted && code.value.length === code.maxLength) {
59+
if (form.requestSubmit) {
60+
form.requestSubmit();
61+
} else {
62+
form.submit();
5563
}
56-
});
57-
}
64+
65+
wasSubmitted = true;
66+
}
67+
});
5868
}
5969
</script>
6070

0 commit comments

Comments
 (0)