on xenial help sign in
Fix not being locked out after a reboot
commitb2372a501deee31e2529aca8e1a07a066b8aa224 authorMichael Terry <michael.terry@canonical.com> dateWed 19 Aug 2015, 11:17 (11 years ago) parent2ef5ca5
5 files changed+95−5
data/com.canonical.Unity8.gschema.xml+8 qml/Greeter/Greeter.qml+20−4 tests/mocks/GSettings.1.0/fake_gsettings.cpp+31 tests/mocks/GSettings.1.0/fake_gsettings.h+9 tests/qmltests/Greeter/tst_Greeter.qml+27−1
data/com.canonical.Unity8.gschema.xml+8
@@ -12,4 +12,12 @@
1212 <description>The usage mode chosen will affect the Window Management behaviour.</description>
1313 </key>
1414 </schema>
15+
16+ <schema path="/com/canonical/unity8/greeter/" id="com.canonical.Unity8.Greeter" gettext-domain="unity8">
17+ <key type="t" name="locked-out-until">
18+ <default>0</default>
19+ <summary>When the greeter will no longer be locked.</summary>
20+ <description>If too many unsuccessful login attempts have been made in a row, the greeter locks you out for a while. This unix timestamp indicates when you will be able to log back in.</description>
21+ </key>
22+ </schema>
1523</schemalist>
qml/Greeter/Greeter.qml+20−4
@@ -181,6 +181,11 @@ Showable {
181181 }
182182 }
183183
184+ GSettings {
185+ id: greeterSettings
186+ schema.id: "com.canonical.Unity8.Greeter"
187+ }
188+
184189 Timer {
185190 id: forcedDelayTimer
186191
@@ -193,10 +198,9 @@ Showable {
193198 property int delayMinutes;
194199
195200 function forceDelay(delay /* in minutes */) {
196− delayTarget = new Date();
197− delayTarget.setTime(delayTarget.getTime() + delay * 60000);
198− delayMinutes = Math.ceil(delay);
199− start();
201+ var when = new Date().getTime() + delay * 60000;
202+ greeterSettings.lockedOutUntil = when;
203+ // code below that watches GSettings will pick up the change
200204 }
201205
202206 onTriggered: {
@@ -208,6 +212,18 @@ Showable {
208212 delayMinutes = 0;
209213 }
210214 }
215+
216+ function checkForForcedDelay() {
217+ delayTarget = new Date();
218+ delayTarget.setTime(greeterSettings.lockedOutUntil);
219+ trigger();
220+ }
221+
222+ Connections {
223+ target: greeterSettings
224+ onLockedOutUntilChanged: checkForForcedDelay()
225+ }
226+ Component.onCompleted: checkForForcedDelay()
211227 }
212228
213229 // event eater
tests/mocks/GSettings.1.0/fake_gsettings.cpp+31
@@ -62,6 +62,19 @@ void GSettingsControllerQml::setUsageMode(const QString &usageMode)
6262 }
6363}
6464
65+quint64 GSettingsControllerQml::lockedOutUntil() const
66+{
67+ return m_lockedOutUntil;
68+}
69+
70+void GSettingsControllerQml::setLockedOutUntil(quint64 timestamp)
71+{
72+ if (m_lockedOutUntil != timestamp) {
73+ m_lockedOutUntil = timestamp;
74+ Q_EMIT lockedOutUntilChanged(m_lockedOutUntil);
75+ }
76+}
77+
6578GSettingsSchemaQml::GSettingsSchemaQml(QObject *parent): QObject(parent) {
6679}
6780
@@ -99,6 +112,8 @@ GSettingsQml::GSettingsQml(QObject *parent)
99112 this, SIGNAL(pictureUriChanged(const QString &)));
100113 connect(GSettingsControllerQml::instance(), SIGNAL(usageModeChanged(const QString &)),
101114 this, SIGNAL(usageModeChanged(const QString &)));
115+ connect(GSettingsControllerQml::instance(), SIGNAL(lockedOutUntilChanged(quint64)),
116+ this, SIGNAL(lockedOutUntilChanged(quint64)));
102117}
103118
104119GSettingsSchemaQml * GSettingsQml::schema() const {
@@ -136,3 +151,19 @@ void GSettingsQml::setUsageMode(const QString &usageMode)
136151 GSettingsControllerQml::instance()->setUsageMode(usageMode);
137152 }
138153}
154+
155+quint64 GSettingsQml::lockedOutUntil() const
156+{
157+ if (m_schema->id() == "com.canonical.Unity8.Greeter") {
158+ return GSettingsControllerQml::instance()->lockedOutUntil();
159+ } else {
160+ return 0;
161+ }
162+}
163+
164+void GSettingsQml::setLockedOutUntil(quint64 timestamp)
165+{
166+ if (m_schema->id() == "com.canonical.Unity8.Greeter") {
167+ GSettingsControllerQml::instance()->setLockedOutUntil(timestamp);
168+ }
169+}
tests/mocks/GSettings.1.0/fake_gsettings.h+9
@@ -47,6 +47,7 @@ class GSettingsQml: public QObject
4747 Q_PROPERTY(GSettingsSchemaQml* schema READ schema NOTIFY schemaChanged)
4848 Q_PROPERTY(QString pictureUri READ pictureUri WRITE setPictureUri NOTIFY pictureUriChanged)
4949 Q_PROPERTY(QString usageMode READ usageMode WRITE setUsageMode NOTIFY usageModeChanged)
50+ Q_PROPERTY(quint64 lockedOutUntil READ lockedOutUntil WRITE setLockedOutUntil NOTIFY lockedOutUntilChanged)
5051
5152public:
5253 GSettingsQml(QObject *parent = nullptr);
@@ -54,14 +55,17 @@ public:
5455 GSettingsSchemaQml * schema() const;
5556 QString pictureUri() const;
5657 QString usageMode() const;
58+ quint64 lockedOutUntil() const;
5759
5860 void setPictureUri(const QString &str);
5961 void setUsageMode(const QString &usageMode);
62+ void setLockedOutUntil(quint64 timestamp);
6063
6164Q_SIGNALS:
6265 void schemaChanged();
6366 void pictureUriChanged(const QString&);
6467 void usageModeChanged(const QString&);
68+ void lockedOutUntilChanged(quint64);
6569
6670private:
6771 GSettingsSchemaQml* m_schema;
@@ -83,15 +87,20 @@ public:
8387 QString usageMode() const;
8488 Q_INVOKABLE void setUsageMode(const QString &usageMode);
8589
90+ quint64 lockedOutUntil() const;
91+ Q_INVOKABLE void setLockedOutUntil(quint64 timestamp);
92+
8693Q_SIGNALS:
8794 void pictureUriChanged(const QString&);
8895 void usageModeChanged(const QString&);
96+ void lockedOutUntilChanged(quint64 timestamp);
8997
9098private:
9199 GSettingsControllerQml();
92100
93101 QString m_pictureUri;
94102 QString m_usageMode;
103+ quint64 m_lockedOutUntil;
95104
96105 static GSettingsControllerQml* s_controllerInstance;
97106 QList<GSettingsQml *> m_registeredGSettings;
tests/qmltests/Greeter/tst_Greeter.qml+27−1
@@ -431,7 +431,33 @@ Item {
431431 compare(LightDM.Infographic.username, "has-password");
432432 }
433433
434− function test_forcedDelay() {
434+ function test_forcedDelayIntoGSettings() {
435+ greeter.failedLoginsDelayAttempts = 1;
436+ greeter.failedLoginsDelayMinutes = 1;
437+ selectUser("has-password");
438+ tryCompare(viewShowPromptSpy, "count", 1);
439+ view.responded("wr0ng p4ssw0rd");
440+
441+ var timestamp = new Date().getTime() + 60000;
442+ compare(GSettingsController.lockedOutUntil, timestamp);
443+ }
444+
445+ function test_forcedDelayFromGSettings() {
446+ compare(view.delayMinutes, 0);
447+ var timestamp = new Date().getTime() + 30; // in 30 seconds
448+ GSettingsController.lockedOutUntil = timestamp;
449+ tryCompare(view, "delayMinutes", 1);
450+ }
451+
452+ function test_forcedDelayOnConstruction() {
453+ var timestamp = new Date().getTime() + 30; // in 30 seconds
454+ GSettingsController.lockedOutUntil = timestamp;
455+ cleanup();
456+ init();
457+ tryCompare(view, "delayMinutes", 1);
458+ }
459+
460+ function test_forcedDelayRoundTrip() {
435461 greeter.failedLoginsDelayAttempts = 1;
436462 greeter.failedLoginsDelayMinutes = 0.001; // make delay very short
437463