@@ -51,7 +51,7 @@ Showable {
5151
5252 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
5353 property int failedLoginsDelayAttempts: 7 // number of failed logins
54− property int failedLoginsDelayMinutes: 5 // minutes of forced waiting
54+ property real failedLoginsDelayMinutes: 5 // minutes of forced waiting
5555
5656 signal tease()
5757 signal sessionStarted()
@@ -110,7 +110,6 @@ Showable {
110110
111111 readonly property bool multiUser: LightDM.Users.count > 1
112112 property int currentIndex
113− property int delayMinutes
114113 property bool waiting
115114
116115 // We want 'launcherOffset' to animate down to zero. But not to animate
@@ -185,13 +184,31 @@ Showable {
185184
186185 Timer {
187186 id: forcedDelayTimer
188− interval: 1000 * 60
187+
188+ // We use a short interval and check against the system wall clock
189+ // because we have to consider the case that the system is suspended
190+ // for a few minutes. When we wake up, we want to quickly be correct.
191+ interval: 500
192+
193+ property var delayTarget;
194+ property int delayMinutes;
195+
196+ onDelayMinutesChanged: console.log("MIKE delayMinutes", delayMinutes);
197+
198+ function forceDelay(delay /* in minutes */) {
199+ delayTarget = new Date();
200+ delayTarget.setTime(delayTarget.getTime() + delay * 60000);
201+ delayMinutes = Math.ceil(delay);
202+ start();
203+ }
204+
189205 onTriggered: {
190− if (d.delayMinutes > 0) {
191− d.delayMinutes -= 1;
192− if (d.delayMinutes > 0) {
193− start(); // go again
194− }
206+ var diff = delayTarget - new Date();
207+ if (diff > 0) {
208+ delayMinutes = Math.ceil(diff / 60000);
209+ start(); // go again
210+ } else {
211+ delayMinutes = 0;
195212 }
196213 }
197214 }
@@ -262,7 +279,7 @@ Showable {
262279 Binding {
263280 target: loader.item
264281 property: "delayMinutes"
265− value: d.delayMinutes
282+ value: forcedDelayTimer.delayMinutes
266283 }
267284
268285 Binding {
@@ -363,9 +380,10 @@ Showable {
363380 }
364381
365382 // Check if we should initiate a forced login delay
366− if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
367− d.delayMinutes = failedLoginsDelayMinutes;
368− forcedDelayTimer.start();
383+ if (failedLoginsDelayAttempts > 0
384+ && AccountsService.failedLogins > 0
385+ && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
386+ forcedDelayTimer.forceDelay(failedLoginsDelayMinutes);
369387 }
370388
371389 loader.item.notifyAuthenticationFailed();