on xenial help sign in
Merge
commit3c4cfa8b8b35bce20078f4c39a24479572b318fc authorAlbert Astals <albert.astals@canonical.com> dateFri 29 Aug 2014, 09:35 (12 years ago) parent42fd6f6f9648cc
13 files changed+139−24
debian/changelog+15 debian/control+1−1 plugins/AccountsService/AccountsService.cpp+38 plugins/AccountsService/AccountsService.h+14 plugins/LightDM/DBusGreeter.cpp+5 plugins/LightDM/DBusGreeter.h+1 plugins/LightDM/Greeter.h+1 qml/Shell.qml+3−3 tests/mocks/AccountsService/AccountsService.cpp+24 tests/mocks/AccountsService/AccountsService.h+16 tests/qmltests/tst_Shell.qml+3−2 tests/qmltests/tst_ShellWithPin.qml+10−5 tools/unlock-device+8−13
debian/changelog+15
@@ -1,3 +1,18 @@
1+unity8 (8.00+14.10.20140828.1-0ubuntu1) utopic; urgency=low
2+
3+ [ Michael Terry ]
4+ * Reverse default for the user option "allow launcher/panel in greeter
5+ when locked." And allow that property to be controlled by an
6+ AccountsService property. (LP: #1358340) (LP: #1358340)
7+ * With recent password support, we want to be able to unlock the
8+ device even with a password set. And we need to be able to do this
9+ once the new adbd lands. So I've added a DBus command to hide the
10+ greeter. This should be secure because all apps are constrained and
11+ if you're on the local session bus unconstrained, you already have
12+ access to anything you want.
13+
14+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 28 Aug 2014 20:06:41 +0000
15+
116unity8 (8.00+14.10.20140827.2-0ubuntu1) utopic; urgency=low
217
318 [ Michał Sawicz ]
debian/control+1−1
@@ -169,7 +169,7 @@ Package: unity8-private
169169Architecture: any
170170Multi-Arch: same
171171Pre-Depends: ${misc:Pre-Depends},
172−Depends: accountsservice-ubuntu-schemas,
172+Depends: accountsservice-ubuntu-schemas (>= 0.0.3),
173173 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
174174 libhardware2,
175175 libunity-core-6.0-9,
plugins/AccountsService/AccountsService.cpp+38
@@ -26,6 +26,8 @@ AccountsService::AccountsService(QObject* parent)
2626 m_service(new AccountsServiceDBusAdaptor(this)),
2727 m_user(qgetenv("USER")),
2828 m_demoEdges(false),
29+ m_enableLauncherWhileLocked(false),
30+ m_enableIndicatorsWhileLocked(false),
2931 m_statsWelcomeScreen(false),
3032 m_passwordDisplayHint(Keyboard),
3133 m_failedLogins(0)
@@ -47,6 +49,8 @@ void AccountsService::setUser(const QString &user)
4749 Q_EMIT userChanged();
4850
4951 updateDemoEdges();
52+ updateEnableLauncherWhileLocked();
53+ updateEnableIndicatorsWhileLocked();
5054 updateBackgroundFile();
5155 updateStatsWelcomeScreen();
5256 updatePasswordDisplayHint();
@@ -64,6 +68,16 @@ void AccountsService::setDemoEdges(bool demoEdges)
6468 m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges", demoEdges);
6569}
6670
71+bool AccountsService::enableLauncherWhileLocked() const
72+{
73+ return m_enableLauncherWhileLocked;
74+}
75+
76+bool AccountsService::enableIndicatorsWhileLocked() const
77+{
78+ return m_enableIndicatorsWhileLocked;
79+}
80+
6781QString AccountsService::backgroundFile() const
6882{
6983 return m_backgroundFile;
@@ -88,6 +102,24 @@ void AccountsService::updateDemoEdges()
88102 }
89103}
90104
105+void AccountsService::updateEnableLauncherWhileLocked()
106+{
107+ auto enableLauncherWhileLocked = m_service->getUserProperty(m_user, "com.ubuntu.AccountsService.SecurityPrivacy", "EnableLauncherWhileLocked").toBool();
108+ if (m_enableLauncherWhileLocked != enableLauncherWhileLocked) {
109+ m_enableLauncherWhileLocked = enableLauncherWhileLocked;
110+ Q_EMIT enableLauncherWhileLockedChanged();
111+ }
112+}
113+
114+void AccountsService::updateEnableIndicatorsWhileLocked()
115+{
116+ auto enableIndicatorsWhileLocked = m_service->getUserProperty(m_user, "com.ubuntu.AccountsService.SecurityPrivacy", "EnableIndicatorsWhileLocked").toBool();
117+ if (m_enableIndicatorsWhileLocked != enableIndicatorsWhileLocked) {
118+ m_enableIndicatorsWhileLocked = enableIndicatorsWhileLocked;
119+ Q_EMIT enableIndicatorsWhileLockedChanged();
120+ }
121+}
122+
91123void AccountsService::updateBackgroundFile()
92124{
93125 auto backgroundFile = m_service->getUserProperty(m_user, "org.freedesktop.Accounts.User", "BackgroundFile").toString();
@@ -157,6 +189,12 @@ void AccountsService::propertiesChanged(const QString &user, const QString &inte
157189 if (changed.contains("PasswordDisplayHint")) {
158190 updatePasswordDisplayHint();
159191 }
192+ if (changed.contains("EnableLauncherWhileLocked")) {
193+ updateEnableLauncherWhileLocked();
194+ }
195+ if (changed.contains("EnableIndicatorsWhileLocked")) {
196+ updateEnableIndicatorsWhileLocked();
197+ }
160198 }
161199}
162200
plugins/AccountsService/AccountsService.h+14
@@ -36,6 +36,12 @@ class AccountsService: public QObject
3636 READ demoEdges
3737 WRITE setDemoEdges
3838 NOTIFY demoEdgesChanged)
39+ Q_PROPERTY (bool enableLauncherWhileLocked
40+ READ enableLauncherWhileLocked
41+ NOTIFY enableLauncherWhileLockedChanged)
42+ Q_PROPERTY (bool enableIndicatorsWhileLocked
43+ READ enableIndicatorsWhileLocked
44+ NOTIFY enableIndicatorsWhileLockedChanged)
3945 Q_PROPERTY (QString backgroundFile
4046 READ backgroundFile
4147 NOTIFY backgroundFileChanged)
@@ -62,6 +68,8 @@ public:
6268 void setUser(const QString &user);
6369 bool demoEdges() const;
6470 void setDemoEdges(bool demoEdges);
71+ bool enableLauncherWhileLocked() const;
72+ bool enableIndicatorsWhileLocked() const;
6573 QString backgroundFile() const;
6674 bool statsWelcomeScreen() const;
6775 PasswordDisplayHint passwordDisplayHint() const;
@@ -71,6 +79,8 @@ public:
7179Q_SIGNALS:
7280 void userChanged();
7381 void demoEdgesChanged();
82+ void enableLauncherWhileLockedChanged();
83+ void enableIndicatorsWhileLockedChanged();
7484 void backgroundFileChanged();
7585 void statsWelcomeScreenChanged();
7686 void passwordDisplayHintChanged();
@@ -82,6 +92,8 @@ private Q_SLOTS:
8292
8393private:
8494 void updateDemoEdges();
95+ void updateEnableLauncherWhileLocked();
96+ void updateEnableIndicatorsWhileLocked();
8597 void updateBackgroundFile();
8698 void updateStatsWelcomeScreen();
8799 void updatePasswordDisplayHint();
@@ -90,6 +102,8 @@ private:
90102 AccountsServiceDBusAdaptor *m_service;
91103 QString m_user;
92104 bool m_demoEdges;
105+ bool m_enableLauncherWhileLocked;
106+ bool m_enableIndicatorsWhileLocked;
93107 QString m_backgroundFile;
94108 bool m_statsWelcomeScreen;
95109 PasswordDisplayHint m_passwordDisplayHint;
plugins/LightDM/DBusGreeter.cpp+5
@@ -39,6 +39,11 @@ void DBusGreeter::ShowGreeter()
3939 return Q_EMIT m_greeter->showGreeter();
4040}
4141
42+void DBusGreeter::HideGreeter()
43+{
44+ return Q_EMIT m_greeter->hideGreeter();
45+}
46+
4247void DBusGreeter::isActiveChangedHandler()
4348{
4449 notifyPropertyChanged("IsActive", isActive());
plugins/LightDM/DBusGreeter.h+1
@@ -38,6 +38,7 @@ public:
3838
3939 bool isActive() const;
4040 Q_SCRIPTABLE void ShowGreeter(); // temporary, until we split the greeter again
41+ Q_SCRIPTABLE void HideGreeter(); // temporary, until we split the greeter again
4142
4243Q_SIGNALS:
4344 void isActiveChanged();
plugins/LightDM/Greeter.h+1
@@ -62,6 +62,7 @@ Q_SIGNALS:
6262 void isAuthenticatedChanged();
6363 void promptlessChanged();
6464 void showGreeter();
65+ void hideGreeter();
6566
6667 // This signal is emitted by external agents like indicators, and the UI
6768 // should switch to this user if possible.
qml/Shell.qml+3−3
@@ -271,6 +271,7 @@ Item {
271271 target: LightDM.Greeter
272272
273273 onShowGreeter: greeter.show()
274+ onHideGreeter: greeter.login()
274275
275276 onShowPrompt: {
276277 if (greeter.narrowMode) {
@@ -313,7 +314,6 @@ Item {
313314 }
314315
315316 if (LightDM.Greeter.authenticated) {
316− lockscreen.hide();
317317 greeter.login();
318318 } else {
319319 AccountsService.failedLogins++
@@ -506,7 +506,7 @@ Item {
506506 anchors.fill: parent //because this draws indicator menus
507507 indicators {
508508 hides: [launcher]
509− available: edgeDemo.panelEnabled && !shell.locked
509+ available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && greeter.fakeActiveForApp === ""
510510 contentEnabled: edgeDemo.panelContentEnabled
511511 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
512512 panelHeight: units.gu(3)
@@ -530,7 +530,7 @@ Item {
530530 anchors.bottom: parent.bottom
531531 width: parent.width
532532 dragAreaWidth: shell.edgeSize
533− available: edgeDemo.launcherEnabled && !shell.locked
533+ available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && greeter.fakeActiveForApp === ""
534534
535535 onShowDashHome: showHome()
536536 onDash: showDash()
tests/mocks/AccountsService/AccountsService.cpp+24
@@ -22,6 +22,8 @@
2222
2323AccountsService::AccountsService(QObject* parent)
2424 : QObject(parent),
25+ m_enableLauncherWhileLocked(true),
26+ m_enableIndicatorsWhileLocked(true),
2527 m_backgroundFile(qmlDirectory() + "graphics/phone_background.jpg"),
2628 m_statsWelcomeScreen(true),
2729 m_failedLogins(0)
@@ -50,6 +52,28 @@ void AccountsService::setDemoEdges(bool demoEdges)
5052 Q_UNUSED(demoEdges)
5153}
5254
55+bool AccountsService::enableLauncherWhileLocked() const
56+{
57+ return m_enableLauncherWhileLocked;
58+}
59+
60+void AccountsService::setEnableLauncherWhileLocked(bool enableLauncherWhileLocked)
61+{
62+ m_enableLauncherWhileLocked = enableLauncherWhileLocked;
63+ Q_EMIT enableLauncherWhileLockedChanged();
64+}
65+
66+bool AccountsService::enableIndicatorsWhileLocked() const
67+{
68+ return m_enableIndicatorsWhileLocked;
69+}
70+
71+void AccountsService::setEnableIndicatorsWhileLocked(bool enableIndicatorsWhileLocked)
72+{
73+ m_enableIndicatorsWhileLocked = enableIndicatorsWhileLocked;
74+ Q_EMIT enableIndicatorsWhileLockedChanged();
75+}
76+
5377QString AccountsService::backgroundFile() const
5478{
5579 return m_backgroundFile;
tests/mocks/AccountsService/AccountsService.h+16
@@ -36,6 +36,14 @@ class AccountsService: public QObject
3636 READ demoEdges
3737 WRITE setDemoEdges
3838 NOTIFY demoEdgesChanged)
39+ Q_PROPERTY (bool enableLauncherWhileLocked
40+ READ enableLauncherWhileLocked
41+ WRITE setEnableLauncherWhileLocked // only available in mock
42+ NOTIFY enableLauncherWhileLockedChanged)
43+ Q_PROPERTY (bool enableIndicatorsWhileLocked
44+ READ enableIndicatorsWhileLocked
45+ WRITE setEnableIndicatorsWhileLocked // only available in mock
46+ NOTIFY enableIndicatorsWhileLockedChanged)
3947 Q_PROPERTY (QString backgroundFile
4048 READ backgroundFile
4149 WRITE setBackgroundFile // only available in mock
@@ -64,6 +72,10 @@ public:
6472 void setUser(const QString &user);
6573 bool demoEdges() const;
6674 void setDemoEdges(bool demoEdges);
75+ bool enableLauncherWhileLocked() const;
76+ void setEnableLauncherWhileLocked(bool enableLauncherWhileLocked);
77+ bool enableIndicatorsWhileLocked() const;
78+ void setEnableIndicatorsWhileLocked(bool enableIndicatorsWhileLocked);
6779 QString backgroundFile() const;
6880 void setBackgroundFile(const QString &backgroundFile);
6981 bool statsWelcomeScreen() const;
@@ -75,12 +87,16 @@ public:
7587Q_SIGNALS:
7688 void userChanged();
7789 void demoEdgesChanged();
90+ void enableLauncherWhileLockedChanged();
91+ void enableIndicatorsWhileLockedChanged();
7892 void backgroundFileChanged();
7993 void statsWelcomeScreenChanged();
8094 void passwordDisplayHintChanged();
8195 void failedLoginsChanged();
8296
8397private:
98+ bool m_enableLauncherWhileLocked;
99+ bool m_enableIndicatorsWhileLocked;
84100 QString m_backgroundFile;
85101 QString m_user;
86102 bool m_statsWelcomeScreen;
tests/qmltests/tst_Shell.qml+3−2
@@ -389,13 +389,14 @@ Item {
389389 tryCompare(indicators, "fullyClosed", true);
390390 }
391391
392−
393− function test_showGreeterDBusCall() {
392+ function test_showAndHideGreeterDBusCalls() {
394393 var greeter = findChild(shell, "greeter")
395394 tryCompare(greeter, "showProgress", 0)
396395 waitForRendering(greeter);
397396 LightDM.Greeter.showGreeter()
398397 tryCompare(greeter, "showProgress", 1)
398+ LightDM.Greeter.hideGreeter()
399+ tryCompare(greeter, "showProgress", 0)
399400 }
400401
401402 function test_login() {
tests/qmltests/tst_ShellWithPin.qml+10−5
@@ -90,6 +90,8 @@ Item {
9090 swipeAwayGreeter()
9191 shell.failedLoginsDelayAttempts = -1
9292 maxRetriesTextField.text = "-1"
93+ AccountsService.enableLauncherWhileLocked = true
94+ AccountsService.enableIndicatorsWhileLocked = true
9395 }
9496
9597 function cleanup() {
@@ -145,9 +147,13 @@ Item {
145147
146148 function test_disabledEdges() {
147149 var launcher = findChild(shell, "launcher")
150+ tryCompare(launcher, "available", true)
151+ AccountsService.enableLauncherWhileLocked = false
148152 tryCompare(launcher, "available", false)
149153
150154 var indicators = findChild(shell, "indicators")
155+ tryCompare(indicators, "available", true)
156+ AccountsService.enableIndicatorsWhileLocked = false
151157 tryCompare(indicators, "available", false)
152158 }
153159
@@ -165,12 +171,9 @@ Item {
165171 tryCompare(greeter, "fakeActiveForApp", "dialer-app")
166172 tryCompare(lockscreen, "shown", false)
167173 tryCompare(panel, "fullscreenMode", true)
168− tryCompare(stage, "spreadEnabled", false)
169−
170− // These are normally false anyway, but confirm they remain so in
171− // emergency mode.
172− tryCompare(launcher, "available", false)
173174 tryCompare(indicators, "available", false)
175+ tryCompare(launcher, "available", false)
176+ tryCompare(stage, "spreadEnabled", false)
174177
175178 // Cancel emergency mode, and go back to normal
176179 waitForRendering(greeter)
@@ -180,6 +183,8 @@ Item {
180183 tryCompare(greeter, "fakeActiveForApp", "")
181184 tryCompare(lockscreen, "shown", true)
182185 tryCompare(panel, "fullscreenMode", false)
186+ tryCompare(indicators, "available", true)
187+ tryCompare(launcher, "available", true)
183188 tryCompare(stage, "spreadEnabled", true)
184189 }
185190
tools/unlock-device+8−13
@@ -4,7 +4,7 @@
44# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
55# This will include a reboot.
66
7−WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device; sleep 20"
7+WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device"
88
99while getopts s:w: opt; do
1010 case $opt in
@@ -17,20 +17,15 @@ while getopts s:w: opt; do
1717 esac
1818done
1919
20−UNLOCK_SCRIPT='
21−import dbus, logging;
22−from unity8 import process_helpers as helpers;
23−logging.basicConfig(level=logging.INFO);
24−bus = dbus.SystemBus().get_object("com.canonical.powerd", "/com/canonical/powerd");
25−cookie = bus.requestSysState("unlock-device-hold", 1, dbus_interface="com.canonical.powerd");
26−helpers.restart_unity_with_testability();
27−bus.clearSysState(cookie, dbus_interface="com.canonical.powerd");
28−helpers.unlock_unity()
29−'
30−
3120eval "$WAIT_COMMAND"
3221
33−UNLOCK_OUTPUT=$(adb shell "sudo -u phablet -i python3 -c '$UNLOCK_SCRIPT'" 2>&1)
22+# Force a sleep of twenty no matter what, since we may need to wait for unity8
23+# to finish coming up (it's hard to tell when the greeter is actually rendered)
24+sleep 20
25+
26+GDBUS_CMD="gdbus call --session --dest com.canonical.UnityGreeter --object-path / --method com.canonical.UnityGreeter.HideGreeter && echo Greeter unlocked"
27+
28+UNLOCK_OUTPUT=$(adb shell "if [ \"\$(id -u)\" = 0 ]; then sudo -u phablet -i $GDBUS_CMD; else $GDBUS_CMD; fi" 2>&1)
3429if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
3530 echo "I: Unlock passed"
3631 exit 0