on xenial help sign in
merge prereq
commit7ed41fe0c00d764262208359848290106fcf1e14 authorJosh Arenson <joshua.arenson@canonical.com> dateMon 13 Jun 2016, 13:08 (10 years ago) parentef88cac1716eeb
17 files changed+142−71
data/51-unity8-greeter.conf−3 data/unity8-greeter.desktop.in+1−1 data/unity8-greeter.pkla+44 debian/unity8-greeter.install+1 plugins/LightDM/Greeter.cpp+6 plugins/LightDM/Greeter.h+2 plugins/Unity/Indicators/indicatorsmanager.cpp+1−1 qml/Greeter/Greeter.qml+19−10 qml/Shell.qml+8−3 qml/Stages/ShimStage.qml−43 tests/mocks/LightDM/IntegratedLightDM/MockGreeter.cpp+16 tests/mocks/LightDM/IntegratedLightDM/MockGreeter.h+5 tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.cpp+8−1 tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.h+1 tests/mocks/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.h+1 tests/qmltests/Greeter/TestView.qml+2 tests/qmltests/Greeter/tst_Greeter.qml+27−9
data/51-unity8-greeter.conf−3
@@ -1,5 +1,2 @@
11[Seat:*]
22greeter-session=unity8-greeter
3−
4−# When unity8 can be run under mir on the desktop, change this to unity.
5−type=unity
data/unity8-greeter.desktop.in+1−1
@@ -2,6 +2,6 @@
22Type=Application
33Name=Unity 8 Greeter
44Comment=The converged Unity shell's Greeter
5−Exec=/usr/bin/unity8-greeter-wrapper /usr/bin/unity8 --mode=greeter
5+Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8-greeter-wrapper @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8 --mode=greeter
66X-LightDM-Session-Type=mir
77X-Ubuntu-Touch=true
data/unity8-greeter.pklanew file+44
@@ -0,0 +1,44 @@
1+# DO NOT EDIT THIS FILE, it will be overwritten on update
2+# Place your local configurations under /etc/polkit-1/localauthority/
3+
4+[Disable Controlling of Network Devices]
5+Identity=unix-user:lightdm
6+Action=org.freedesktop.NetworkManager.enable-disable-network;org.freedesktop.NetworkManager.enable-disable-wifi;org.freedesktop.NetworkManager.enable-disable-wwan;org.freedesktop.NetworkManager.enable-disable-wimax;
7+ResultActive=no
8+ResultInactive=no
9+ResultsAny=no
10+
11+[Disable Sleep and Wake]
12+Identity=unix-user:lightdm
13+Action=org.freedesktop.NetworkManager.sleep-wake
14+ResultActive=no
15+ResultInactive=no
16+ResultsAny=no
17+
18+[Disable WiFi Sharing]
19+Identity=unix-user:lightdm
20+Action=org.freedesktop.NetworkManager.wifi.share.protected;org.freedesktop.NetworkManager.wifi.share.open
21+ResultActive=no
22+ResultInactive=no
23+ResultsAny=no
24+
25+[Disable Settings Modifications]
26+Identity=unix-user:lightdm
27+Action=org.freedesktop.NetworkManager.settings.modify.own;org.freedesktop.NetworkManager.settings.modify.system;org.freedesktop.NetworkManager.settings.modify.hostname
28+ResultActive=no
29+ResultInactive=no
30+ResultsAny=no
31+
32+[Disable User Connections]
33+Identity=unix-user:lightdm
34+Action=org.freedesktop.NetworkManager.use-user-connections
35+ResultActive=no
36+ResultInactive=no
37+ResultsAny=no
38+
39+[Enable Controlling of Network Connections]
40+Identity=unix-user:lightdm
41+Action=org.freedesktop.NetworkManager.network-control
42+ResultActive=yes
43+ResultInactive=no
44+ResultsAny=no
debian/unity8-greeter.install+1
@@ -1,4 +1,5 @@
11data/unity8-greeter-wrapper usr/bin/
22data/unity8-greeter-init.conf usr/share/upstart/sessions/
3+data/unity8-greeter.pkla /var/lib/polkit-1/localauthority/10-vendor.d/
34usr/share/lightdm/greeters/unity8-greeter.desktop
45usr/share/lightdm/lightdm.conf.d/51-unity8-greeter.conf
plugins/LightDM/Greeter.cpp+6
@@ -83,6 +83,12 @@ bool Greeter::promptless() const
8383 return d->promptless;
8484}
8585
86+QString Greeter::selectUser() const
87+{
88+ Q_D(const Greeter);
89+ return d->m_greeter->selectUserHint();
90+}
91+
8692void Greeter::authenticate(const QString &username)
8793{
8894 Q_D(Greeter);
plugins/LightDM/Greeter.h+2
@@ -38,6 +38,7 @@ class Greeter : public QObject
3838 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
3939 Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
4040 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
41+ Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
4142
4243public:
4344 explicit Greeter(QObject* parent=0);
@@ -47,6 +48,7 @@ public:
4748 QString authenticationUser() const;
4849 QString defaultSessionHint() const;
4950 bool promptless() const;
51+ QString selectUser() const;
5052
5153public Q_SLOTS:
5254 void authenticate(const QString &username=QString());
plugins/Unity/Indicators/indicatorsmanager.cpp+1−1
@@ -291,7 +291,7 @@ Indicator::Ptr IndicatorsManager::indicator(const QString& indicator_name)
291291 // The rest of the indicators respect their default profile (which is "phone", even on desktop PCs)
292292 if ((new_indicator->identifier() == QStringLiteral("indicator-session"))
293293 || (new_indicator->identifier() == QStringLiteral("indicator-power") && m_platform.isPC())) {
294− new_indicator->setProfile(QStringLiteral("desktop"));
294+ new_indicator->setProfile(m_profile.replace(QStringLiteral("phone"), QStringLiteral("desktop")));
295295 } else {
296296 new_indicator->setProfile(m_profile);
297297 }
qml/Greeter/Greeter.qml+19−10
@@ -114,7 +114,8 @@ Showable {
114114 id: d
115115
116116 readonly property bool multiUser: LightDMService.users.count > 1
117− property int currentIndex
117+ readonly property int selectUserIndex: d.getUserIndex(LightDMService.greeter.selectUser)
118+ property int currentIndex: Math.max(selectUserIndex, 0)
118119 property bool waiting
119120
120121 // We want 'launcherOffset' to animate down to zero. But not to animate
@@ -131,7 +132,23 @@ Showable {
131132 UbuntuNumberAnimation {}
132133 }
133134
135+ function getUserIndex(username) {
136+ if (username === "")
137+ return -1;
138+
139+ // Find index for requested user, if it exists
140+ for (var i = 0; i < LightDMService.users.count; i++) {
141+ if (username === LightDMService.users.data(i, LightDMService.userRoles.NameRole)) {
142+ return i;
143+ }
144+ }
145+
146+ return -1;
147+ }
148+
134149 function selectUser(uid, reset) {
150+ if (uid < 0)
151+ return;
135152 d.waiting = true;
136153 if (reset) {
137154 loader.item.reset();
@@ -440,15 +457,7 @@ Showable {
440457 }
441458 }
442459
443− onRequestAuthenticationUser: {
444− // Find index for requested user, if it exists
445− for (var i = 0; i < LightDMService.users.count; i++) {
446− if (user === LightDMService.users.data(i, LightDMService.userRoles.NameRole)) {
447− d.selectUser(i, true);
448− return;
449− }
450− }
451− }
460+ onRequestAuthenticationUser: d.selectUser(d.getUserIndex(user), true)
452461 }
453462
454463 Connections {
qml/Shell.qml+8−3
@@ -259,8 +259,8 @@ StyledItem {
259259 ? "phone"
260260 : shell.usageScenario
261261 readonly property string qmlComponent: {
262− if(shell.mode === "greeter") {
263− return "Stages/ShimStage.qml"
262+ if (shell.mode === "greeter") {
263+ return "Stages/AbstractStage.qml"
264264 } else if (applicationsDisplayLoader.usageScenario === "phone") {
265265 return "Stages/PhoneStage.qml";
266266 } else if (applicationsDisplayLoader.usageScenario === "tablet") {
@@ -531,7 +531,12 @@ StyledItem {
531531
532532 indicatorsModel: Indicators.IndicatorsModel {
533533 // tablet and phone both use the same profile
534− profile: "phone"
534+ // FIXME: use just "phone" for greeter too, but first fix
535+ // greeter app launching to either load the app inside the
536+ // greeter or tell the session to load the app. This will
537+ // involve taking the url-dispatcher dbus name and using
538+ // SessionBroadcast to tell the session.
539+ profile: shell.mode === "greeter" ? "desktop_greeter" : "phone"
535540 Component.onCompleted: load();
536541 }
537542 }
qml/Stages/ShimStage.qmldeleted−43
@@ -1,43 +0,0 @@
1−/*
2− * Copyright (C) 2015 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.4
18−import Ubuntu.Components 1.3
19−
20−AbstractStage {
21− id: shimStage
22−
23− anchors.fill: parent
24−
25− Text {
26− id: greeterModeText
27−
28− anchors.horizontalCenter: parent.horizontalCenter
29− anchors.top: parent.top
30− anchors.topMargin: units.gu(10)
31− font.bold: true
32− horizontalAlignment: Text.AlignHCenter
33− text: "Shell is in \"greeter\" mode"
34− }
35−
36− Text {
37− anchors.centerIn: parent
38− color: UbuntuColors.orange
39− font.pointSize: units.gu(8)
40− horizontalAlignment: Text.AlignHCenter
41− text: "Shim \nStage"
42− }
43−}
tests/mocks/LightDM/IntegratedLightDM/MockGreeter.cpp+16
@@ -33,3 +33,19 @@ void MockGreeter::setMockMode(QString mockMode)
3333 Q_EMIT mockModeChanged(mockMode);
3434 }
3535}
36+
37+QString MockGreeter::selectUserHint() const
38+{
39+ Q_D(const Greeter);
40+ return d->m_greeter->selectUserHint();
41+}
42+
43+void MockGreeter::setSelectUserHint(const QString &selectUserHint)
44+{
45+ Q_D(Greeter);
46+
47+ if (d->m_greeter->selectUserHint() != selectUserHint) {
48+ d->m_greeter->setSelectUserHint(selectUserHint);
49+ Q_EMIT selectUserHintChanged();
50+ }
51+}
tests/mocks/LightDM/IntegratedLightDM/MockGreeter.h+5
@@ -25,13 +25,18 @@ class MockGreeter : public Greeter {
2525 Q_OBJECT
2626
2727 Q_PROPERTY(QString mockMode READ mockMode WRITE setMockMode NOTIFY mockModeChanged)
28+ Q_PROPERTY(QString selectUser READ selectUserHint WRITE setSelectUserHint NOTIFY selectUserHintChanged)
2829
2930public:
3031 QString mockMode() const;
3132 void setMockMode(QString mockMode);
3233
34+ QString selectUserHint() const;
35+ void setSelectUserHint(const QString &selectUserHint);
36+
3337Q_SIGNALS:
3438 void mockModeChanged(QString mode);
39+ void selectUserHintChanged();
3540};
3641
3742#endif // MOCK_UNITY_GREETER_H
tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.cpp+8−1
@@ -76,7 +76,14 @@ bool Greeter::lockHint () const
7676
7777QString Greeter::selectUserHint() const
7878{
79− return "";
79+ Q_D(const Greeter);
80+ return d->selectUserHint;
81+}
82+
83+void Greeter::setSelectUserHint(const QString &selectUserHint)
84+{
85+ Q_D(Greeter);
86+ d->selectUserHint = selectUserHint;
8087}
8188
8289bool Greeter::selectGuestHint() const
tests/mocks/LightDM/IntegratedLightDM/liblightdm/Greeter.h+1
@@ -70,6 +70,7 @@ public:
7070 bool lockHint () const;
7171 bool hasGuestAccountHint() const;
7272 QString selectUserHint() const;
73+ void setSelectUserHint(const QString &selectUserHint); // only in mock
7374 bool selectGuestHint() const;
7475 QString autologinUserHint() const;
7576 bool autologinGuestHint() const;
tests/mocks/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.h+1
@@ -34,6 +34,7 @@ public:
3434 bool authenticated;
3535 QString authenticationUser;
3636 bool twoFactorDone;
37+ QString selectUserHint;
3738
3839 QString mockMode;
3940
tests/qmltests/Greeter/TestView.qml+2
@@ -33,6 +33,7 @@ Item {
3333 property var infographicModel
3434 readonly property bool fullyShown: _fullyShown
3535 readonly property bool required: _required
36+ readonly property bool animating: false
3637
3738 property bool _fullyShown: true
3839 property bool _required: true
@@ -41,6 +42,7 @@ Item {
4142 signal responded(string response)
4243 signal tease()
4344 signal emergencyCall()
45+ signal promptlessLogin()
4446
4547 signal _showMessageCalled(string html)
4648 signal _showPromptCalled(string text, bool isSecret, bool isDefaultPrompt)
tests/qmltests/Greeter/tst_Greeter.qml+27−9
@@ -139,7 +139,9 @@ Item {
139139
140140 function init() {
141141 greeterSettings.lockedOutTime = 0;
142− resetLoader();
142+ LightDM.Greeter.selectUser = "";
143+ greeter.failedLoginsDelayAttempts = 7;
144+ greeter.failedLoginsDelayMinutes = 5;
143145 teaseSpy.clear();
144146 sessionStartedSpy.clear();
145147 activeChangedSpy.clear();
@@ -151,11 +153,7 @@ Item {
151153 viewAuthenticationFailedSpy.clear();
152154 viewResetSpy.clear();
153155 viewTryToUnlockSpy.clear();
154− tryCompare(greeter, "waiting", false);
155− view = findChild(greeter, "testView");
156− verifySelected(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
157− greeter.failedLoginsDelayAttempts = 7;
158− greeter.failedLoginsDelayMinutes = 5;
156+ resetLoader();
159157 }
160158
161159 function resetLoader() {
@@ -167,6 +165,8 @@ Item {
167165 loader.active = true;
168166 tryCompare(loader, "status", Loader.Ready);
169167 removeTimeConstraintsFromSwipeAreas(loader.item);
168+ tryCompare(greeter, "waiting", false);
169+ view = findChild(greeter, "testView");
170170 }
171171
172172 function getIndexOf(name) {
@@ -191,6 +191,7 @@ Item {
191191 compare(view.currentIndex, i);
192192 compare(AccountsService.user, name);
193193 compare(LightDM.Greeter.authenticationUser, name);
194+ return i;
194195 }
195196
196197 function verifyLoggedIn() {
@@ -229,11 +230,9 @@ Item {
229230
230231 function test_promptless() {
231232 selectUser("no-password");
232− tryCompare(viewAuthenticationSucceededSpy, "count", 1);
233− compare(sessionStartedSpy.count, 1);
233+ tryCompare(view, "locked", false);
234234 compare(viewShowPromptSpy.count, 0);
235235 compare(viewHideSpy.count, 0);
236− compare(view.locked, false);
237236 }
238237
239238 function test_twoFactorPass() {
@@ -553,5 +552,24 @@ Item {
553552 compare(viewResetSpy.count, 1);
554553 tryCompare(viewShowPromptSpy, "count", 1);
555554 }
555+
556+ function test_selectUserHint() {
557+ LightDM.Greeter.selectUser = "info-prompt";
558+ resetLoader();
559+ var i = verifySelected("info-prompt");
560+ verify(i != 0); // sanity-check that info-prompt isn't default 0 answer
561+ }
562+
563+ function test_selectUserHintUnset() {
564+ LightDM.Greeter.selectUser = "";
565+ resetLoader();
566+ verifySelected(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
567+ }
568+
569+ function test_selectUserHintInvalid() {
570+ LightDM.Greeter.selectUser = "not-a-real-user";
571+ resetLoader();
572+ verifySelected(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
573+ }
556574 }
557575}