on xenial help sign in
Guard against a couple odd timing scenarios for the too-many-failed-login-attempts lockout screen.

Approved by: Michael Zanetti

commita037f1ddc631d139d4b0dd21e51b25b07dd91883 authorMichael Terry <michael.terry@canonical.com> dateMon 11 Jan 2016, 17:36 (11 years ago) parent70ae746fc3f23e
2 files changed+20−3
qml/Greeter/Greeter.qml+6−3 tests/qmltests/Greeter/tst_Greeter.qml+14
qml/Greeter/Greeter.qml+6−3
@@ -226,14 +226,17 @@ Showable {
226226 }
227227
228228 function checkForForcedDelay() {
229+ if (greeterSettings.lockedOutTime === 0) {
230+ return;
231+ }
232+
229233 var now = new Date();
230− delayTarget = now;
231− delayTarget.setTime(greeterSettings.lockedOutTime + failedLoginsDelayMinutes * 60000);
234+ delayTarget = new Date(greeterSettings.lockedOutTime + failedLoginsDelayMinutes * 60000);
232235
233236 // If tooEarly is true, something went very wrong. Bug or NTP
234237 // misconfiguration maybe?
235238 var tooEarly = now.getTime() < greeterSettings.lockedOutTime;
236− var tooLate = now > delayTarget;
239+ var tooLate = now >= delayTarget;
237240
238241 // Compare stored time to system time. If a malicious actor is
239242 // able to manipulate time to avoid our lockout, they already have
tests/qmltests/Greeter/tst_Greeter.qml+14
@@ -458,6 +458,20 @@ Item {
458458 compare(view.delayMinutes, greeter.failedLoginsDelayMinutes);
459459 }
460460
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+
461475 function test_forcedDelayRoundTrip() {
462476 greeter.failedLoginsDelayAttempts = 1;
463477 greeter.failedLoginsDelayMinutes = 0.001; // make delay very short