Merge lp:~jgonzalezdr/lightdm/double-lock-bug-fix into lp:lightdm

Proposed by Jesús González
Status: Merged
Merged at revision: 2210
Proposed branch: lp:~jgonzalezdr/lightdm/double-lock-bug-fix
Merge into: lp:lightdm
Diff against target: 365 lines (+225/-20)
7 files modified
src/seat.c (+55/-8)
tests/Makefile.am (+4/-0)
tests/scripts/lock-seat-after-vt-switch.conf (+10/-12)
tests/scripts/lock-seat-twice.conf (+75/-0)
tests/scripts/lock-session-twice.conf (+77/-0)
tests/test-lock-seat-twice (+2/-0)
tests/test-lock-session-twice (+2/-0)
To merge this branch: bzr merge lp:~jgonzalezdr/lightdm/double-lock-bug-fix
Reviewer Review Type Date Requested Status
LightDM Development Team Pending
Review via email: mp+245606@code.launchpad.net

Description of the change

When locking a session, if an existing greeter can't be reused, then it's stopped and its display server is reused with a new greeter.

Fixes bug #1403273

To post a comment you must log in.
Revision history for this message
Jesús González (jgonzalezdr) :
2109. By Jesús González

Merged changes from parent branch.

2110. By Jesús González

Merged parent branch

Revision history for this message
Robert Ancell (robert-ancell) wrote :

So sorry for the delay - I had missed this merge proposal. I've committed this with the small changes given in the review. Thanks for working on this!

Revision history for this message
Robert Ancell (robert-ancell) wrote :

Feel free to email / IRC me if you think I've missed a change like this. Thanks again! :)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/seat.c'
2--- src/seat.c 2015-04-08 12:56:19 +0000
3+++ src/seat.c 2015-06-01 21:14:25 +0000
4@@ -65,6 +65,9 @@
5
6 /* TRUE if stopped */
7 gboolean stopped;
8+
9+ /* The greeter to be started to replace the current one */
10+ Greeter *replacement_greeter;
11 };
12
13 static void seat_logger_iface_init (LoggerInterface *iface);
14@@ -790,9 +793,28 @@
15 g_object_unref (session);
16 return;
17 }
18+
19+ /* If there is a pending replacement greeter, start it */
20+ if (IS_GREETER (session) && seat->priv->replacement_greeter)
21+ {
22+ Session *s = SESSION(seat->priv->replacement_greeter);
23+ seat->priv->replacement_greeter = NULL;
24+ g_object_unref(s);
25+
26+ if (session_get_is_authenticated (s))
27+ {
28+ l_debug (seat, "Greeter stopped, running session");
29+ run_session (seat, s);
30+ }
31+ else
32+ {
33+ l_debug (seat, "Greeter stopped, starting session authentication");
34+ start_session (seat, s);
35+ }
36
37+ }
38 /* If this is the greeter session then re-use this display server */
39- if (IS_GREETER (session) &&
40+ else if (IS_GREETER (session) &&
41 can_share_display_server (seat, display_server) &&
42 greeter_get_start_session (GREETER (session)))
43 {
44@@ -1582,14 +1604,17 @@
45 seat_lock (Seat *seat, const gchar *username)
46 {
47 Greeter *greeter_session;
48- DisplayServer *display_server;
49- gboolean existing = FALSE;
50+ DisplayServer *display_server = NULL;
51+ gboolean reset_existing = FALSE;
52+ gboolean reuse_xserver = FALSE;
53
54 g_return_val_if_fail (seat != NULL, FALSE);
55
56 if (!seat_get_can_switch (seat))
57 return FALSE;
58
59+ // FIXME: If already locked then don't bother...
60+
61 l_debug (seat, "Locking");
62
63 /* Switch to greeter we can reuse */
64@@ -1598,10 +1623,23 @@
65 {
66 l_debug (seat, "Switching to existing greeter");
67 set_greeter_hints (seat, greeter_session);
68- existing = TRUE;
69+ reset_existing = TRUE;
70 }
71 else
72 {
73+ /* If the existing greeter can't be reused, stop it and reuse its display server */
74+ greeter_session = find_greeter_session (seat);
75+ if (greeter_session)
76+ {
77+ display_server = session_get_display_server (SESSION (greeter_session));
78+ if (!session_get_is_stopping (SESSION (greeter_session)))
79+ {
80+ l_debug (seat, "Stopping session");
81+ session_stop (SESSION (greeter_session));
82+ }
83+ reuse_xserver = TRUE;
84+ }
85+
86 greeter_session = create_greeter_session (seat);
87 if (!greeter_session)
88 return FALSE;
89@@ -1611,7 +1649,7 @@
90 if (username)
91 greeter_set_hint (greeter_session, "select-user", username);
92
93- if (existing)
94+ if (reset_existing)
95 {
96 greeter_reset (greeter_session);
97 seat_set_active_session (seat, SESSION (greeter_session));
98@@ -1619,14 +1657,23 @@
99 }
100 else
101 {
102- display_server = create_display_server (seat, SESSION (greeter_session));
103+ if (!reuse_xserver)
104+ display_server = create_display_server (seat, SESSION (greeter_session));
105+ session_set_display_server (SESSION (greeter_session), display_server);
106
107 if (seat->priv->session_to_activate)
108 g_object_unref (seat->priv->session_to_activate);
109 seat->priv->session_to_activate = g_object_ref (greeter_session);
110- session_set_display_server (SESSION (greeter_session), display_server);
111
112- return display_server_start (display_server);
113+ if (reuse_xserver)
114+ {
115+ if (seat->priv->replacement_greeter)
116+ g_object_unref (seat->priv->replacement_greeter);
117+ seat->priv->replacement_greeter = g_object_ref (greeter_session);
118+ return TRUE;
119+ }
120+ else
121+ return display_server_start (display_server);
122 }
123 }
124
125
126=== modified file 'tests/Makefile.am'
127--- tests/Makefile.am 2015-05-14 04:12:06 +0000
128+++ tests/Makefile.am 2015-06-01 21:14:25 +0000
129@@ -130,9 +130,11 @@
130 test-dbus \
131 test-lock-seat \
132 test-lock-seat-after-vt-switch \
133+ test-lock-seat-twice \
134 test-lock-seat-resettable \
135 test-lock-seat-return-session \
136 test-lock-session \
137+ test-lock-session-twice \
138 test-lock-session-no-password \
139 test-lock-session-resettable \
140 test-lock-session-return-session \
141@@ -418,10 +420,12 @@
142 scripts/lock-seat-resettable.conf \
143 scripts/lock-seat-return-session.conf \
144 scripts/lock-seat-return-session-console-kit.conf \
145+ scripts/lock-seat-twice.conf \
146 scripts/lock-session.conf \
147 scripts/lock-session-no-password.conf \
148 scripts/lock-session-resettable.conf \
149 scripts/lock-session-return-session.conf \
150+ scripts/lock-session-twice.conf \
151 scripts/login.conf \
152 scripts/login-crash-authenticate.conf \
153 scripts/login-guest.conf \
154
155=== modified file 'tests/scripts/lock-seat-after-vt-switch.conf'
156--- tests/scripts/lock-seat-after-vt-switch.conf 2015-04-15 10:55:10 +0000
157+++ tests/scripts/lock-seat-after-vt-switch.conf 2015-06-01 21:14:25 +0000
158@@ -61,21 +61,19 @@
159 # Lock the seat again
160 #?*SESSION-X-0 LOCK-SEAT
161 #?SESSION-X-0 LOCK-SEAT
162-
163-# New X server starts (this is a "bug")
164-#?XSERVER-2 START VT=9 SEAT=seat0
165-#?*XSERVER-2 INDICATE-READY
166-#?XSERVER-2 INDICATE-READY
167-#?XSERVER-2 ACCEPT-CONNECT
168-
169-# Session is locked
170 #?LOGIN1 LOCK-SESSION SESSION=c0
171
172-# Session is switched to greeter
173-#?LOGIN1 ACTIVATE-SESSION SESSION=c1
174+# Old greeter is stopped
175+#?GREETER-X-1 TERMINATE SIGNAL=15
176
177-# The unnecessary X server is killed
178-#?XSERVER-2 TERMINATE SIGNAL=15
179+# A new greeter is started and activated on the same X server
180+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
181+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
182+#?XSERVER-1 ACCEPT-CONNECT
183+#?GREETER-X-1 CONNECT-XSERVER
184+#?GREETER-X-1 CONNECT-TO-DAEMON
185+#?GREETER-X-1 CONNECTED-TO-DAEMON
186+#?GREETER-X-1 LOCK-HINT
187
188 # Cleanup
189 #?*STOP-DAEMON
190
191=== added file 'tests/scripts/lock-seat-twice.conf'
192--- tests/scripts/lock-seat-twice.conf 1970-01-01 00:00:00 +0000
193+++ tests/scripts/lock-seat-twice.conf 2015-06-01 21:14:25 +0000
194@@ -0,0 +1,75 @@
195+#
196+# Check locking a seat twice doesn't spawn two greeters
197+#
198+
199+[SeatDefaults]
200+autologin-user=have-password1
201+user-session=default
202+
203+#?*START-DAEMON
204+#?RUNNER DAEMON-START
205+
206+# X server starts
207+#?XSERVER-0 START VT=7 SEAT=seat0
208+
209+# Daemon connects when X server is ready
210+#?*XSERVER-0 INDICATE-READY
211+#?XSERVER-0 INDICATE-READY
212+#?XSERVER-0 ACCEPT-CONNECT
213+
214+# Session starts
215+#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1
216+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
217+#?XSERVER-0 ACCEPT-CONNECT
218+#?SESSION-X-0 CONNECT-XSERVER
219+
220+# Lock the seat
221+#?*SESSION-X-0 LOCK-SEAT
222+#?SESSION-X-0 LOCK-SEAT
223+
224+# New X server starts
225+#?XSERVER-1 START VT=8 SEAT=seat0
226+
227+# Daemon connects when X server is ready
228+#?*XSERVER-1 INDICATE-READY
229+#?XSERVER-1 INDICATE-READY
230+#?XSERVER-1 ACCEPT-CONNECT
231+
232+# Session is locked
233+#?LOGIN1 LOCK-SESSION SESSION=c0
234+
235+# Greeter starts
236+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
237+#?XSERVER-1 ACCEPT-CONNECT
238+#?GREETER-X-1 CONNECT-XSERVER
239+#?GREETER-X-1 CONNECT-TO-DAEMON
240+#?GREETER-X-1 CONNECTED-TO-DAEMON
241+#?GREETER-X-1 LOCK-HINT
242+
243+# Switch to greeter
244+#?LOGIN1 ACTIVATE-SESSION SESSION=c1
245+#?VT ACTIVATE VT=8
246+
247+# Lock the seat again
248+#?*SESSION-X-0 LOCK-SEAT
249+#?SESSION-X-0 LOCK-SEAT
250+
251+# Old greeter is stopped
252+#?GREETER-X-1 TERMINATE SIGNAL=15
253+
254+# A new greeter is started and activated on the same X server
255+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
256+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
257+#?XSERVER-1 ACCEPT-CONNECT
258+#?GREETER-X-1 CONNECT-XSERVER
259+#?GREETER-X-1 CONNECT-TO-DAEMON
260+#?GREETER-X-1 CONNECTED-TO-DAEMON
261+#?GREETER-X-1 LOCK-HINT
262+
263+# Cleanup
264+#?*STOP-DAEMON
265+#?SESSION-X-0 TERMINATE SIGNAL=15
266+#?XSERVER-0 TERMINATE SIGNAL=15
267+#?GREETER-X-1 TERMINATE SIGNAL=15
268+#?XSERVER-1 TERMINATE SIGNAL=15
269+#?RUNNER DAEMON-EXIT STATUS=0
270
271=== added file 'tests/scripts/lock-session-twice.conf'
272--- tests/scripts/lock-session-twice.conf 1970-01-01 00:00:00 +0000
273+++ tests/scripts/lock-session-twice.conf 2015-06-01 21:14:25 +0000
274@@ -0,0 +1,77 @@
275+#
276+# Check locking a session twice doesn't spawn two greeters
277+#
278+
279+[SeatDefaults]
280+autologin-user=have-password1
281+user-session=default
282+
283+#?*START-DAEMON
284+#?RUNNER DAEMON-START
285+
286+# X server starts
287+#?XSERVER-0 START VT=7 SEAT=seat0
288+
289+# Daemon connects when X server is ready
290+#?*XSERVER-0 INDICATE-READY
291+#?XSERVER-0 INDICATE-READY
292+#?XSERVER-0 ACCEPT-CONNECT
293+
294+# Session starts
295+#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1
296+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
297+#?XSERVER-0 ACCEPT-CONNECT
298+#?SESSION-X-0 CONNECT-XSERVER
299+
300+# Lock the session
301+#?*SESSION-X-0 LOCK-SESSION
302+#?SESSION-X-0 LOCK-SESSION
303+
304+# New X server starts
305+#?XSERVER-1 START VT=8 SEAT=seat0
306+
307+# Daemon connects when X server is ready
308+#?*XSERVER-1 INDICATE-READY
309+#?XSERVER-1 INDICATE-READY
310+#?XSERVER-1 ACCEPT-CONNECT
311+
312+# Session is locked
313+#?LOGIN1 LOCK-SESSION SESSION=c0
314+
315+# Greeter starts with session user selected
316+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
317+#?XSERVER-1 ACCEPT-CONNECT
318+#?GREETER-X-1 CONNECT-XSERVER
319+#?GREETER-X-1 CONNECT-TO-DAEMON
320+#?GREETER-X-1 CONNECTED-TO-DAEMON
321+#?GREETER-X-1 SELECT-USER-HINT USERNAME=have-password1
322+#?GREETER-X-1 LOCK-HINT
323+
324+# Switch to greeter
325+#?LOGIN1 ACTIVATE-SESSION SESSION=c1
326+#?VT ACTIVATE VT=8
327+
328+# Lock the session again
329+#?*SESSION-X-0 LOCK-SESSION
330+#?SESSION-X-0 LOCK-SESSION
331+
332+# Old greeter is stopped
333+#?GREETER-X-1 TERMINATE SIGNAL=15
334+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
335+
336+# A new greeter is started and activated on the same X server
337+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
338+#?XSERVER-1 ACCEPT-CONNECT
339+#?GREETER-X-1 CONNECT-XSERVER
340+#?GREETER-X-1 CONNECT-TO-DAEMON
341+#?GREETER-X-1 CONNECTED-TO-DAEMON
342+#?GREETER-X-1 SELECT-USER-HINT USERNAME=have-password1
343+#?GREETER-X-1 LOCK-HINT
344+
345+# Cleanup
346+#?*STOP-DAEMON
347+#?SESSION-X-0 TERMINATE SIGNAL=15
348+#?XSERVER-0 TERMINATE SIGNAL=15
349+#?GREETER-X-1 TERMINATE SIGNAL=15
350+#?XSERVER-1 TERMINATE SIGNAL=15
351+#?RUNNER DAEMON-EXIT STATUS=0
352
353=== added file 'tests/test-lock-seat-twice'
354--- tests/test-lock-seat-twice 1970-01-01 00:00:00 +0000
355+++ tests/test-lock-seat-twice 2015-06-01 21:14:25 +0000
356@@ -0,0 +1,2 @@
357+#!/bin/sh
358+./src/dbus-env ./src/test-runner lock-seat-twice test-gobject-greeter
359
360=== added file 'tests/test-lock-session-twice'
361--- tests/test-lock-session-twice 1970-01-01 00:00:00 +0000
362+++ tests/test-lock-session-twice 2015-06-01 21:14:25 +0000
363@@ -0,0 +1,2 @@
364+#!/bin/sh
365+./src/dbus-env ./src/test-runner lock-session-twice test-gobject-greeter

Subscribers

People subscribed via source and target branches