@@ -50,7 +50,7 @@ Showable {
5050
5151 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
5252 property int failedLoginsDelayAttempts: 7 // number of failed logins
53− property int failedLoginsDelayMinutes: 5 // minutes of forced waiting
53+ property real failedLoginsDelayMinutes: 5 // minutes of forced waiting
5454
5555 signal tease()
5656 signal sessionStarted()
@@ -109,7 +109,6 @@ Showable {
109109
110110 readonly property bool multiUser: LightDM.Users.count > 1
111111 property int currentIndex
112− property int delayMinutes
113112 property bool waiting
114113
115114 // We want 'launcherOffset' to animate down to zero. But not to animate
@@ -180,13 +179,29 @@ Showable {
180179
181180 Timer {
182181 id: forcedDelayTimer
183− interval: 1000 * 60
182+
183+ // We use a short interval and check against the system wall clock
184+ // because we have to consider the case that the system is suspended
185+ // for a few minutes. When we wake up, we want to quickly be correct.
186+ interval: 500
187+
188+ property var delayTarget;
189+ property int delayMinutes;
190+
191+ function forceDelay(delay /* in minutes */) {
192+ delayTarget = new Date();
193+ delayTarget.setTime(delayTarget.getTime() + delay * 60000);
194+ delayMinutes = Math.ceil(delay);
195+ start();
196+ }
197+
184198 onTriggered: {
185− if (d.delayMinutes > 0) {
186− d.delayMinutes -= 1;
187− if (d.delayMinutes > 0) {
188− start(); // go again
189− }
199+ var diff = delayTarget - new Date();
200+ if (diff > 0) {
201+ delayMinutes = Math.ceil(diff / 60000);
202+ start(); // go again
203+ } else {
204+ delayMinutes = 0;
190205 }
191206 }
192207 }
@@ -257,7 +272,7 @@ Showable {
257272 Binding {
258273 target: loader.item
259274 property: "delayMinutes"
260− value: d.delayMinutes
275+ value: forcedDelayTimer.delayMinutes
261276 }
262277
263278 Binding {
@@ -358,9 +373,10 @@ Showable {
358373 }
359374
360375 // Check if we should initiate a forced login delay
361− if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
362− d.delayMinutes = failedLoginsDelayMinutes;
363− forcedDelayTimer.start();
376+ if (failedLoginsDelayAttempts > 0
377+ && AccountsService.failedLogins > 0
378+ && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
379+ forcedDelayTimer.forceDelay(failedLoginsDelayMinutes);
364380 }
365381
366382 loader.item.notifyAuthenticationFailed();