on xenial help sign in
Guard against a couple odd timing scenarios for the too-many-failed-login-attempts lockout screen.
a037f1dMichael Terry
qml/Greeter/Greeter.qml+6−3
@@ -226,14 +226,17 @@ Showable {
226 }
226 }
227
227
228 function checkForForcedDelay() {
228 function checkForForcedDelay() {
229+ if (greeterSettings.lockedOutTime === 0) {
230+ return;
231+ }
232+
229 var now = new Date();
233 var now = new Date();
230− delayTarget = now;
231− delayTarget.setTime(greeterSettings.lockedOutTime + failedLoginsDelayMinutes * 60000);
234+ delayTarget = new Date(greeterSettings.lockedOutTime + failedLoginsDelayMinutes * 60000);
232
235
233 // If tooEarly is true, something went very wrong. Bug or NTP
236 // If tooEarly is true, something went very wrong. Bug or NTP
234 // misconfiguration maybe?
237 // misconfiguration maybe?
235 var tooEarly = now.getTime() < greeterSettings.lockedOutTime;
238 var tooEarly = now.getTime() < greeterSettings.lockedOutTime;
236− var tooLate = now > delayTarget;
239+ var tooLate = now >= delayTarget;
237
240
238 // Compare stored time to system time. If a malicious actor is
241 // Compare stored time to system time. If a malicious actor is
239 // able to manipulate time to avoid our lockout, they already have
242 // able to manipulate time to avoid our lockout, they already have
tests/qmltests/Greeter/tst_Greeter.qml+14
@@ -458,6 +458,20 @@ Item {
458 compare(view.delayMinutes, greeter.failedLoginsDelayMinutes);
458 compare(view.delayMinutes, greeter.failedLoginsDelayMinutes);
459 }
459 }
460
460
461+ function test_forcedDelayOnConstructionIgnoredIfInFuture() {
462+ greeterSettings.lockedOutTime = new Date().getTime() + greeter.failedLoginsDelayMinutes * 60000 + 1;
463+ resetLoader();
464+ view = findChild(greeter, "testView");
465+ compare(view.delayMinutes, 0);
466+ }
467+
468+ function test_forcedDelayOnConstructionIgnoredIfInPast() {
469+ greeterSettings.lockedOutTime = new Date().getTime() - greeter.failedLoginsDelayMinutes * 60000 - 1;
470+ resetLoader();
471+ view = findChild(greeter, "testView");
472+ compare(view.delayMinutes, 0);
473+ }
474+
461 function test_forcedDelayRoundTrip() {
475 function test_forcedDelayRoundTrip() {
462 greeter.failedLoginsDelayAttempts = 1;
476 greeter.failedLoginsDelayAttempts = 1;
463 greeter.failedLoginsDelayMinutes = 0.001; // make delay very short
477 greeter.failedLoginsDelayMinutes = 0.001; // make delay very short