@@ -51,7 +51,7 @@ Showable {
52 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
52 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
53 property int failedLoginsDelayAttempts: 7 // number of failed logins
53 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
56 signal tease()
56 signal tease()
57 signal sessionStarted()
57 signal sessionStarted()
@@ -110,7 +110,6 @@ Showable {
111 readonly property bool multiUser: LightDM.Users.count > 1
111 readonly property bool multiUser: LightDM.Users.count > 1
112 property int currentIndex
112 property int currentIndex
113− property int delayMinutes
114 property bool waiting
113 property bool waiting
116 // We want 'launcherOffset' to animate down to zero. But not to animate
115 // We want 'launcherOffset' to animate down to zero. But not to animate
@@ -185,13 +184,31 @@ Showable {
187 id: forcedDelayTimer
186 id: forcedDelayTimer
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.
188− interval: 1000 * 60
191+ interval: 500
193+ property var delayTarget;
194+ property int delayMinutes;
196+ onDelayMinutesChanged: console.log("MIKE delayMinutes", delayMinutes);
198+ function forceDelay(delay /* in minutes */) {
199+ delayTarget = new Date();
200+ delayTarget.setTime(delayTarget.getTime() + delay * 60000);
201+ delayMinutes = Math.ceil(delay);
189 onTriggered: {
205 onTriggered: {
190− if (d.delayMinutes > 0) {
206+ var diff = delayTarget - new Date();
191− d.delayMinutes -= 1;
208+ delayMinutes = Math.ceil(diff / 60000);
192− if (d.delayMinutes > 0) {
193− start(); // go again
209+ start(); // go again
@@ -262,7 +279,7 @@ Showable {
262 Binding {
279 Binding {
263 target: loader.item
280 target: loader.item
264 property: "delayMinutes"
281 property: "delayMinutes"
265− value: d.delayMinutes
282+ value: forcedDelayTimer.delayMinutes
268 Binding {
285 Binding {
@@ -363,9 +380,10 @@ Showable {
365 // Check if we should initiate a forced login delay
382 // Check if we should initiate a forced login delay
383+ if (failedLoginsDelayAttempts > 0
384+ && AccountsService.failedLogins > 0
366− if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
385+ && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
367− d.delayMinutes = failedLoginsDelayMinutes;
386+ forcedDelayTimer.forceDelay(failedLoginsDelayMinutes);
368− forcedDelayTimer.start();
371 loader.item.notifyAuthenticationFailed();
389 loader.item.notifyAuthenticationFailed();