@@ -50,7 +50,7 @@ Showable {
51 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
51 property int maxFailedLogins: -1 // disabled by default for now, will enable via settings in future
52 property int failedLoginsDelayAttempts: 7 // number of failed logins
52 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
55 signal tease()
55 signal tease()
56 signal sessionStarted()
56 signal sessionStarted()
@@ -109,7 +109,6 @@ Showable {
110 readonly property bool multiUser: LightDM.Users.count > 1
110 readonly property bool multiUser: LightDM.Users.count > 1
111 property int currentIndex
111 property int currentIndex
112− property int delayMinutes
113 property bool waiting
112 property bool waiting
115 // We want 'launcherOffset' to animate down to zero. But not to animate
114 // We want 'launcherOffset' to animate down to zero. But not to animate
@@ -180,13 +179,29 @@ Showable {
182 id: forcedDelayTimer
181 id: forcedDelayTimer
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.
183− interval: 1000 * 60
186+ interval: 500
188+ property var delayTarget;
189+ property int delayMinutes;
191+ function forceDelay(delay /* in minutes */) {
192+ delayTarget = new Date();
193+ delayTarget.setTime(delayTarget.getTime() + delay * 60000);
194+ delayMinutes = Math.ceil(delay);
184 onTriggered: {
198 onTriggered: {
185− if (d.delayMinutes > 0) {
199+ var diff = delayTarget - new Date();
186− d.delayMinutes -= 1;
201+ delayMinutes = Math.ceil(diff / 60000);
187− if (d.delayMinutes > 0) {
188− start(); // go again
202+ start(); // go again
@@ -257,7 +272,7 @@ Showable {
257 Binding {
272 Binding {
258 target: loader.item
273 target: loader.item
259 property: "delayMinutes"
274 property: "delayMinutes"
260− value: d.delayMinutes
275+ value: forcedDelayTimer.delayMinutes
263 Binding {
278 Binding {
@@ -358,9 +373,10 @@ Showable {
360 // Check if we should initiate a forced login delay
375 // Check if we should initiate a forced login delay
376+ if (failedLoginsDelayAttempts > 0
377+ && AccountsService.failedLogins > 0
361− if (failedLoginsDelayAttempts > 0 && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
378+ && AccountsService.failedLogins % failedLoginsDelayAttempts == 0) {
362− d.delayMinutes = failedLoginsDelayMinutes;
379+ forcedDelayTimer.forceDelay(failedLoginsDelayMinutes);
363− forcedDelayTimer.start();
366 loader.item.notifyAuthenticationFailed();
382 loader.item.notifyAuthenticationFailed();