on xenial help sign in
Merge
3c4cfa8Albert Astals
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+
1unity8 (8.00+14.10.20140827.2-0ubuntu1) utopic; urgency=low
16unity8 (8.00+14.10.20140827.2-0ubuntu1) utopic; urgency=low
2
17
3 [ Michał Sawicz ]
18 [ Michał Sawicz ]
debian/control+1−1
@@ -169,7 +169,7 @@ Package: unity8-private
169Architecture: any
169Architecture: any
170Multi-Arch: same
170Multi-Arch: same
171Pre-Depends: ${misc:Pre-Depends},
171Pre-Depends: ${misc:Pre-Depends},
172−Depends: accountsservice-ubuntu-schemas,
172+Depends: accountsservice-ubuntu-schemas (>= 0.0.3),
173 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
173 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
174 libhardware2,
174 libhardware2,
175 libunity-core-6.0-9,
175 libunity-core-6.0-9,
plugins/AccountsService/AccountsService.cpp+38
@@ -26,6 +26,8 @@ AccountsService::AccountsService(QObject* parent)
26 m_service(new AccountsServiceDBusAdaptor(this)),
26 m_service(new AccountsServiceDBusAdaptor(this)),
27 m_user(qgetenv("USER")),
27 m_user(qgetenv("USER")),
28 m_demoEdges(false),
28 m_demoEdges(false),
29+ m_enableLauncherWhileLocked(false),
30+ m_enableIndicatorsWhileLocked(false),
29 m_statsWelcomeScreen(false),
31 m_statsWelcomeScreen(false),
30 m_passwordDisplayHint(Keyboard),
32 m_passwordDisplayHint(Keyboard),
31 m_failedLogins(0)
33 m_failedLogins(0)
@@ -47,6 +49,8 @@ void AccountsService::setUser(const QString &user)
47 Q_EMIT userChanged();
49 Q_EMIT userChanged();
48
50
49 updateDemoEdges();
51 updateDemoEdges();
52+ updateEnableLauncherWhileLocked();
53+ updateEnableIndicatorsWhileLocked();
50 updateBackgroundFile();
54 updateBackgroundFile();
51 updateStatsWelcomeScreen();
55 updateStatsWelcomeScreen();
52 updatePasswordDisplayHint();
56 updatePasswordDisplayHint();
@@ -64,6 +68,16 @@ void AccountsService::setDemoEdges(bool demoEdges)
64 m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges", demoEdges);
68 m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges", demoEdges);
65}
69}
66
70
71+bool AccountsService::enableLauncherWhileLocked() const
72+{
73+ return m_enableLauncherWhileLocked;
74+}
75+
76+bool AccountsService::enableIndicatorsWhileLocked() const
77+{
78+ return m_enableIndicatorsWhileLocked;
79+}
80+
67QString AccountsService::backgroundFile() const
81QString AccountsService::backgroundFile() const
68{
82{
69 return m_backgroundFile;
83 return m_backgroundFile;
@@ -88,6 +102,24 @@ void AccountsService::updateDemoEdges()
88 }
102 }
89}
103}
90
104
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+
91void AccountsService::updateBackgroundFile()
123void AccountsService::updateBackgroundFile()
92{
124{
93 auto backgroundFile = m_service->getUserProperty(m_user, "org.freedesktop.Accounts.User", "BackgroundFile").toString();
125 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
157 if (changed.contains("PasswordDisplayHint")) {
189 if (changed.contains("PasswordDisplayHint")) {
158 updatePasswordDisplayHint();
190 updatePasswordDisplayHint();
159 }
191 }
192+ if (changed.contains("EnableLauncherWhileLocked")) {
193+ updateEnableLauncherWhileLocked();
194+ }
195+ if (changed.contains("EnableIndicatorsWhileLocked")) {
196+ updateEnableIndicatorsWhileLocked();
197+ }
160 }
198 }
161}
199}
162
200
plugins/AccountsService/AccountsService.h+14
@@ -36,6 +36,12 @@ class AccountsService: public QObject
36 READ demoEdges
36 READ demoEdges
37 WRITE setDemoEdges
37 WRITE setDemoEdges
38 NOTIFY demoEdgesChanged)
38 NOTIFY demoEdgesChanged)
39+ Q_PROPERTY (bool enableLauncherWhileLocked
40+ READ enableLauncherWhileLocked
41+ NOTIFY enableLauncherWhileLockedChanged)
42+ Q_PROPERTY (bool enableIndicatorsWhileLocked
43+ READ enableIndicatorsWhileLocked
44+ NOTIFY enableIndicatorsWhileLockedChanged)
39 Q_PROPERTY (QString backgroundFile
45 Q_PROPERTY (QString backgroundFile
40 READ backgroundFile
46 READ backgroundFile
41 NOTIFY backgroundFileChanged)
47 NOTIFY backgroundFileChanged)
@@ -62,6 +68,8 @@ public:
62 void setUser(const QString &user);
68 void setUser(const QString &user);
63 bool demoEdges() const;
69 bool demoEdges() const;
64 void setDemoEdges(bool demoEdges);
70 void setDemoEdges(bool demoEdges);
71+ bool enableLauncherWhileLocked() const;
72+ bool enableIndicatorsWhileLocked() const;
65 QString backgroundFile() const;
73 QString backgroundFile() const;
66 bool statsWelcomeScreen() const;
74 bool statsWelcomeScreen() const;
67 PasswordDisplayHint passwordDisplayHint() const;
75 PasswordDisplayHint passwordDisplayHint() const;
@@ -71,6 +79,8 @@ public:
71Q_SIGNALS:
79Q_SIGNALS:
72 void userChanged();
80 void userChanged();
73 void demoEdgesChanged();
81 void demoEdgesChanged();
82+ void enableLauncherWhileLockedChanged();
83+ void enableIndicatorsWhileLockedChanged();
74 void backgroundFileChanged();
84 void backgroundFileChanged();
75 void statsWelcomeScreenChanged();
85 void statsWelcomeScreenChanged();
76 void passwordDisplayHintChanged();
86 void passwordDisplayHintChanged();
@@ -82,6 +92,8 @@ private Q_SLOTS:
82
92
83private:
93private:
84 void updateDemoEdges();
94 void updateDemoEdges();
95+ void updateEnableLauncherWhileLocked();
96+ void updateEnableIndicatorsWhileLocked();
85 void updateBackgroundFile();
97 void updateBackgroundFile();
86 void updateStatsWelcomeScreen();
98 void updateStatsWelcomeScreen();
87 void updatePasswordDisplayHint();
99 void updatePasswordDisplayHint();
@@ -90,6 +102,8 @@ private:
90 AccountsServiceDBusAdaptor *m_service;
102 AccountsServiceDBusAdaptor *m_service;
91 QString m_user;
103 QString m_user;
92 bool m_demoEdges;
104 bool m_demoEdges;
105+ bool m_enableLauncherWhileLocked;
106+ bool m_enableIndicatorsWhileLocked;
93 QString m_backgroundFile;
107 QString m_backgroundFile;
94 bool m_statsWelcomeScreen;
108 bool m_statsWelcomeScreen;
95 PasswordDisplayHint m_passwordDisplayHint;
109 PasswordDisplayHint m_passwordDisplayHint;
plugins/LightDM/DBusGreeter.cpp+5
@@ -39,6 +39,11 @@ void DBusGreeter::ShowGreeter()
39 return Q_EMIT m_greeter->showGreeter();
39 return Q_EMIT m_greeter->showGreeter();
40}
40}
41
41
42+void DBusGreeter::HideGreeter()
43+{
44+ return Q_EMIT m_greeter->hideGreeter();
45+}
46+
42void DBusGreeter::isActiveChangedHandler()
47void DBusGreeter::isActiveChangedHandler()
43{
48{
44 notifyPropertyChanged("IsActive", isActive());
49 notifyPropertyChanged("IsActive", isActive());
plugins/LightDM/DBusGreeter.h+1
@@ -38,6 +38,7 @@ public:
38
38
39 bool isActive() const;
39 bool isActive() const;
40 Q_SCRIPTABLE void ShowGreeter(); // temporary, until we split the greeter again
40 Q_SCRIPTABLE void ShowGreeter(); // temporary, until we split the greeter again
41+ Q_SCRIPTABLE void HideGreeter(); // temporary, until we split the greeter again
41
42
42Q_SIGNALS:
43Q_SIGNALS:
43 void isActiveChanged();
44 void isActiveChanged();
plugins/LightDM/Greeter.h+1
@@ -62,6 +62,7 @@ Q_SIGNALS:
62 void isAuthenticatedChanged();
62 void isAuthenticatedChanged();
63 void promptlessChanged();
63 void promptlessChanged();
64 void showGreeter();
64 void showGreeter();
65+ void hideGreeter();
65
66
66 // This signal is emitted by external agents like indicators, and the UI
67 // This signal is emitted by external agents like indicators, and the UI
67 // should switch to this user if possible.
68 // should switch to this user if possible.
qml/Shell.qml+3−3
@@ -271,6 +271,7 @@ Item {
271 target: LightDM.Greeter
271 target: LightDM.Greeter
272
272
273 onShowGreeter: greeter.show()
273 onShowGreeter: greeter.show()
274+ onHideGreeter: greeter.login()
274
275
275 onShowPrompt: {
276 onShowPrompt: {
276 if (greeter.narrowMode) {
277 if (greeter.narrowMode) {
@@ -313,7 +314,6 @@ Item {
313 }
314 }
314
315
315 if (LightDM.Greeter.authenticated) {
316 if (LightDM.Greeter.authenticated) {
316− lockscreen.hide();
317 greeter.login();
317 greeter.login();
318 } else {
318 } else {
319 AccountsService.failedLogins++
319 AccountsService.failedLogins++
@@ -506,7 +506,7 @@ Item {
506 anchors.fill: parent //because this draws indicator menus
506 anchors.fill: parent //because this draws indicator menus
507 indicators {
507 indicators {
508 hides: [launcher]
508 hides: [launcher]
509− available: edgeDemo.panelEnabled && !shell.locked
509+ available: edgeDemo.panelEnabled && (!shell.locked || AccountsService.enableIndicatorsWhileLocked) && greeter.fakeActiveForApp === ""
510 contentEnabled: edgeDemo.panelContentEnabled
510 contentEnabled: edgeDemo.panelContentEnabled
511 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
511 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
512 panelHeight: units.gu(3)
512 panelHeight: units.gu(3)
@@ -530,7 +530,7 @@ Item {
530 anchors.bottom: parent.bottom
530 anchors.bottom: parent.bottom
531 width: parent.width
531 width: parent.width
532 dragAreaWidth: shell.edgeSize
532 dragAreaWidth: shell.edgeSize
533− available: edgeDemo.launcherEnabled && !shell.locked
533+ available: edgeDemo.launcherEnabled && (!shell.locked || AccountsService.enableLauncherWhileLocked) && greeter.fakeActiveForApp === ""
534
534
535 onShowDashHome: showHome()
535 onShowDashHome: showHome()
536 onDash: showDash()
536 onDash: showDash()
tests/mocks/AccountsService/AccountsService.cpp+24
@@ -22,6 +22,8 @@
22
22
23AccountsService::AccountsService(QObject* parent)
23AccountsService::AccountsService(QObject* parent)
24 : QObject(parent),
24 : QObject(parent),
25+ m_enableLauncherWhileLocked(true),
26+ m_enableIndicatorsWhileLocked(true),
25 m_backgroundFile(qmlDirectory() + "graphics/phone_background.jpg"),
27 m_backgroundFile(qmlDirectory() + "graphics/phone_background.jpg"),
26 m_statsWelcomeScreen(true),
28 m_statsWelcomeScreen(true),
27 m_failedLogins(0)
29 m_failedLogins(0)
@@ -50,6 +52,28 @@ void AccountsService::setDemoEdges(bool demoEdges)
50 Q_UNUSED(demoEdges)
52 Q_UNUSED(demoEdges)
51}
53}
52
54
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+
53QString AccountsService::backgroundFile() const
77QString AccountsService::backgroundFile() const
54{
78{
55 return m_backgroundFile;
79 return m_backgroundFile;
tests/mocks/AccountsService/AccountsService.h+16
@@ -36,6 +36,14 @@ class AccountsService: public QObject
36 READ demoEdges
36 READ demoEdges
37 WRITE setDemoEdges
37 WRITE setDemoEdges
38 NOTIFY demoEdgesChanged)
38 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)
39 Q_PROPERTY (QString backgroundFile
47 Q_PROPERTY (QString backgroundFile
40 READ backgroundFile
48 READ backgroundFile
41 WRITE setBackgroundFile // only available in mock
49 WRITE setBackgroundFile // only available in mock
@@ -64,6 +72,10 @@ public:
64 void setUser(const QString &user);
72 void setUser(const QString &user);
65 bool demoEdges() const;
73 bool demoEdges() const;
66 void setDemoEdges(bool demoEdges);
74 void setDemoEdges(bool demoEdges);
75+ bool enableLauncherWhileLocked() const;
76+ void setEnableLauncherWhileLocked(bool enableLauncherWhileLocked);
77+ bool enableIndicatorsWhileLocked() const;
78+ void setEnableIndicatorsWhileLocked(bool enableIndicatorsWhileLocked);
67 QString backgroundFile() const;
79 QString backgroundFile() const;
68 void setBackgroundFile(const QString &backgroundFile);
80 void setBackgroundFile(const QString &backgroundFile);
69 bool statsWelcomeScreen() const;
81 bool statsWelcomeScreen() const;
@@ -75,12 +87,16 @@ public:
75Q_SIGNALS:
87Q_SIGNALS:
76 void userChanged();
88 void userChanged();
77 void demoEdgesChanged();
89 void demoEdgesChanged();
90+ void enableLauncherWhileLockedChanged();
91+ void enableIndicatorsWhileLockedChanged();
78 void backgroundFileChanged();
92 void backgroundFileChanged();
79 void statsWelcomeScreenChanged();
93 void statsWelcomeScreenChanged();
80 void passwordDisplayHintChanged();
94 void passwordDisplayHintChanged();
81 void failedLoginsChanged();
95 void failedLoginsChanged();
82
96
83private:
97private:
98+ bool m_enableLauncherWhileLocked;
99+ bool m_enableIndicatorsWhileLocked;
84 QString m_backgroundFile;
100 QString m_backgroundFile;
85 QString m_user;
101 QString m_user;
86 bool m_statsWelcomeScreen;
102 bool m_statsWelcomeScreen;
tests/qmltests/tst_Shell.qml+3−2
@@ -389,13 +389,14 @@ Item {
389 tryCompare(indicators, "fullyClosed", true);
389 tryCompare(indicators, "fullyClosed", true);
390 }
390 }
391
391
392−
392+ function test_showAndHideGreeterDBusCalls() {
393− function test_showGreeterDBusCall() {
394 var greeter = findChild(shell, "greeter")
393 var greeter = findChild(shell, "greeter")
395 tryCompare(greeter, "showProgress", 0)
394 tryCompare(greeter, "showProgress", 0)
396 waitForRendering(greeter);
395 waitForRendering(greeter);
397 LightDM.Greeter.showGreeter()
396 LightDM.Greeter.showGreeter()
398 tryCompare(greeter, "showProgress", 1)
397 tryCompare(greeter, "showProgress", 1)
398+ LightDM.Greeter.hideGreeter()
399+ tryCompare(greeter, "showProgress", 0)
399 }
400 }
400
401
401 function test_login() {
402 function test_login() {
tests/qmltests/tst_ShellWithPin.qml+10−5
@@ -90,6 +90,8 @@ Item {
90 swipeAwayGreeter()
90 swipeAwayGreeter()
91 shell.failedLoginsDelayAttempts = -1
91 shell.failedLoginsDelayAttempts = -1
92 maxRetriesTextField.text = "-1"
92 maxRetriesTextField.text = "-1"
93+ AccountsService.enableLauncherWhileLocked = true
94+ AccountsService.enableIndicatorsWhileLocked = true
93 }
95 }
94
96
95 function cleanup() {
97 function cleanup() {
@@ -145,9 +147,13 @@ Item {
145
147
146 function test_disabledEdges() {
148 function test_disabledEdges() {
147 var launcher = findChild(shell, "launcher")
149 var launcher = findChild(shell, "launcher")
150+ tryCompare(launcher, "available", true)
151+ AccountsService.enableLauncherWhileLocked = false
148 tryCompare(launcher, "available", false)
152 tryCompare(launcher, "available", false)
149
153
150 var indicators = findChild(shell, "indicators")
154 var indicators = findChild(shell, "indicators")
155+ tryCompare(indicators, "available", true)
156+ AccountsService.enableIndicatorsWhileLocked = false
151 tryCompare(indicators, "available", false)
157 tryCompare(indicators, "available", false)
152 }
158 }
153
159
@@ -165,12 +171,9 @@ Item {
165 tryCompare(greeter, "fakeActiveForApp", "dialer-app")
171 tryCompare(greeter, "fakeActiveForApp", "dialer-app")
166 tryCompare(lockscreen, "shown", false)
172 tryCompare(lockscreen, "shown", false)
167 tryCompare(panel, "fullscreenMode", true)
173 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)
173 tryCompare(indicators, "available", false)
174 tryCompare(indicators, "available", false)
175+ tryCompare(launcher, "available", false)
176+ tryCompare(stage, "spreadEnabled", false)
174
177
175 // Cancel emergency mode, and go back to normal
178 // Cancel emergency mode, and go back to normal
176 waitForRendering(greeter)
179 waitForRendering(greeter)
@@ -180,6 +183,8 @@ Item {
180 tryCompare(greeter, "fakeActiveForApp", "")
183 tryCompare(greeter, "fakeActiveForApp", "")
181 tryCompare(lockscreen, "shown", true)
184 tryCompare(lockscreen, "shown", true)
182 tryCompare(panel, "fullscreenMode", false)
185 tryCompare(panel, "fullscreenMode", false)
186+ tryCompare(indicators, "available", true)
187+ tryCompare(launcher, "available", true)
183 tryCompare(stage, "spreadEnabled", true)
188 tryCompare(stage, "spreadEnabled", true)
184 }
189 }
185
190
tools/unlock-device+8−13
@@ -4,7 +4,7 @@
4# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
4# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
5# This will include a reboot.
5# This will include a reboot.
6
6
7−WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device; sleep 20"
7+WAIT_COMMAND="adb reboot; sleep 5; adb wait-for-device"
8
8
9while getopts s:w: opt; do
9while getopts s:w: opt; do
10 case $opt in
10 case $opt in
@@ -17,20 +17,15 @@ while getopts s:w: opt; do
17 esac
17 esac
18done
18done
19
19
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−
31eval "$WAIT_COMMAND"
20eval "$WAIT_COMMAND"
32
21
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+
33−UNLOCK_OUTPUT=$(adb shell "sudo -u phablet -i python3 -c '$UNLOCK_SCRIPT'" 2>&1)
28+UNLOCK_OUTPUT=$(adb shell "if [ \"\$(id -u)\" = 0 ]; then sudo -u phablet -i $GDBUS_CMD; else $GDBUS_CMD; fi" 2>&1)
34if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
29if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
35 echo "I: Unlock passed"
30 echo "I: Unlock passed"
36 exit 0
31 exit 0