Fix for Chrome double submit issue, #3738

Ylian Saint-Hilaire committed Mar 5, 2022 at 12:26 UTC 4a4eacf025ffc8d703aa60569d189f7011a6db13
1 file changed +21 -16
views/login2.handlebars
+21 -16
@@ -61,7 +61,7 @@
61 <img id="loginPicture" />
62 <div style="font-size:46px;font-family:Arial,Helvetica,sans-serif;font-weight:bold;padding-bottom:10px;color:#c8c8c8;text-shadow: 2px 2px 2px #000;">{{{title1}}}<sup style="font-size:20px"> {{{title2}}}</sup></div>
63 <div id=loginpanel style="display:none;box-shadow:1px 1px 4px #000">
64 - <form method=post>
64 + <form id=loginpanelform method=post>
65 <input type=hidden name=action value=login />
66 <div id=message1></div>
67 <div id="loginuserpassdiv" style="display:none">
@@ -83,7 +83,7 @@
83 </tr>
84 <tr>
85 <td>
86 - <input id=loginButton style="box-sizing:border-box;width:280px;border:0;border-radius:4px;padding:6px" type=submit value="Log In" disabled="disabled" />
86 + <input id=loginButton style="box-sizing:border-box;width:280px;border:0;border-radius:4px;padding:6px" onclick="submitButtonClicked('loginpanelform')" type=button value="Log In" disabled="disabled" />
87 </td>
88 </tr>
89 </table>
@@ -111,7 +111,7 @@
111 </form>
112 </div>
113 <div id=createpanel style="display:none;position:relative">
114 - <form method=post>
114 + <form id=createpanelform method=post>
115 <input type=hidden name=action value=createaccount />
116 <div id=message2></div>
117 <div>
@@ -145,7 +145,7 @@
145 </tr>
146 <tr>
147 <td colspan=2>
148 - <div style=float:right><input id=createButton type=submit value="Create Account" disabled="disabled" /></div>
148 + <div style=float:right><input id=createButton type="button" onclick="submitButtonClicked('createpanelform')" value="Create Account" disabled="disabled" /></div>
149 <div id=passWarning style="padding-top:6px"></div>
150 </td>
151 </tr>
@@ -155,7 +155,7 @@
155 </form>
156 </div>
157 <div id=resetpanel style="display:none">
158 - <form method=post>
158 + <form id=resetpanelform method=post>
159 <input type=hidden name=action value=resetaccount />
160 <div id=message3></div>
161 <div>
@@ -169,7 +169,7 @@
169 </tr>
170 <tr>
171 <td>
172 - <input id=eresetButton style="box-sizing:border-box;width:280px;border:0;border-radius:4px;padding:6px" type=submit value="Reset Account" disabled="disabled" />
172 + <input id=eresetButton style="box-sizing:border-box;width:280px;border:0;border-radius:4px;padding:6px" type="button" onclick="submitButtonClicked('resetpanelform')" value="Reset Account" disabled="disabled" />
173 </td>
174 </tr>
175 </table>
@@ -178,7 +178,7 @@
178 </form>
179 </div>
180 <div id=tokenpanel style="display:none">
181 - <form method=post {{{autocomplete}}}=off>
181 + <form id=tokenpanelform method=post {{{autocomplete}}}=off>
182 <input type=hidden name=action value=tokenlogin />
183 <input type=hidden name=hwstate value="{{{hwstate}}}" />
184 <div id=message4></div>
@@ -192,7 +192,7 @@
192 <tr>
193 <td>
194 <div>
195 - <input id=tokenOkButton style="box-sizing:border-box;width:280px;border:0;border-radius:4px;padding:6px" type=submit value="Log In" disabled="disabled" />
195 + <input id=tokenOkButton style="box-sizing:border-box;width:280px;border:0;border-radius:4px;padding:6px" type="button" onclick="submitButtonClicked('tokenpanelform')" value="Log In" disabled="disabled" />
196 </div>
197 </td>
198 </tr>
@@ -218,7 +218,7 @@
218 </form>
219 </div>
220 <div id=resettokenpanel style="display:none">
221 - <form method=post>
221 + <form id=resettokenpanelform method=post>
222 <input type=hidden name=action value=resetaccount />
223 <div id=message5></div>
224 <table style="width:100%">
@@ -231,7 +231,7 @@
231 <tr>
232 <td>
233 <div>
234 - <input id=resetTokenOkButton style="box-sizing:border-box;width:280px;border:0;border-radius:4px;padding:6px" type=submit value="Log In" disabled="disabled" />
234 + <input id=resetTokenOkButton style="box-sizing:border-box;width:280px;border:0;border-radius:4px;padding:6px" type="button" onclick="submitButtonClicked('resetpanelform')" value="Log In" disabled="disabled" />
235 </div>
236 </td>
237 </tr>
@@ -252,7 +252,7 @@
252 </form>
253 </div>
254 <div id=resetpasswordpanel style="display:none;position:relative">
255 - <form method=post>
255 + <form id=resetpasswordpanelform method=post>
256 <input type=hidden name=action value=resetpassword />
257 <div id=message6></div>
258 <div id="rpasswordPolicyCallout" style="display:none"></div>
@@ -271,7 +271,7 @@
271 </tr>
272 <tr>
273 <td colspan=2>
274 - <div style=float:right><input id=resetPassButton type=submit value="Reset Password" disabled="disabled" /></div>
274 + <div style=float:right><input id=resetPassButton type="button" onclick="submitButtonClicked('resetpasswordpanel')" value="Reset Password" disabled="disabled" /></div>
275 <div id=rpassWarning style="padding-top:6px"></div>
276 </td>
277 </tr>
@@ -281,7 +281,7 @@
281 </form>
282 </div>
283 <div id=checkemailpanel style="display:none;position:relative">
284 - <form method=post>
284 + <form id=checkemailpanelform method=post>
285 <input type=hidden name=action value=checkemail />
286 <div id=message7></div>
287 <table id="checkCheckOperations" style="width:100%;display:none">
@@ -295,7 +295,7 @@
295 <div>
296 <input id=changeEmailButton type=button value="Change Email Address" onclick="changeEmailAddress()" />
297 <input id=checkEmailButton2 type=button value="Resend Confirmation Email" onclick="resentEmailConfirmation()" />
298 - <input id=checkEmailButton type=submit style="display:none" />
298 + <input id=checkEmailButton type="button" onclick="submitButtonClicked('checkemailpanelform')" style="display:none" />
299 <input id=checkEmailVal name=email type="hidden" value="" />
300 </div>
301 </td>
@@ -306,7 +306,7 @@
306 </form>
307 </div>
308 <div id=waitpushpanel style="display:none">
309 - <form method=post>
309 + <form id=waitpushpanelform method=post>
310 <input type=hidden name=action value=pushlogin />
311 <div id=message8></div>
312 <table style="width:100%">
@@ -324,7 +324,7 @@
324 <hr /><a onclick="return xgo(1,event);" href="#" style=cursor:pointer>Back to login</a>
325 <input id=pushtokenformargs name="urlargs" type="hidden" value="" />
326 <input id=pushtokenInput name="hwstate" type="hidden" value="" />
327 - <input id=pushOkButton type=submit style="display:none" />
327 + <input id=pushOkButton onclick="submitButtonClicked('waitpushpanelform')" style="display:none" />
328 </form>
329 </div>
330 </td>
@@ -383,6 +383,7 @@
383 var authStrategies = '{{{authStrategies}}}'.split(',');
384 var tokenTimeout = parseInt('{{{tokenTimeout}}}');
385 var websocket = null;
386 + var formSubmitted = false;
387
388 function startup() {
389 if (decodeURIComponent('{{{loginpicture}}}') == 'true') { Q('loginPicture').src = "loginlogo.png"; }
@@ -685,6 +686,10 @@
686 }
687 }
688
689 + function submitButtonClicked(v) {
690 + if (!formSubmitted) { formSubmitted = true; document.getElementById(v).submit(); }
691 + }
692 +
693 function validateLogin(box, e) {
694 var ok = ((Q('username').value.length > 0) && (Q('username').value.indexOf(' ') == -1) && (Q('password').value.length > 0));
695 QE('loginButton', ok);