Merge lp:~robert-ancell/lightdm/remote-sessions into lp:lightdm

Proposed by Robert Ancell on 2012-08-29
Status: Merged
Approved by: Michael Terry on 2012-08-29
Approved revision: 1545
Merged at revision: 1537
Proposed branch: lp:~robert-ancell/lightdm/remote-sessions
Merge into: lp:lightdm
Diff against target: 1277 lines (+473/-89)
32 files modified
data/lightdm.conf (+2/-0)
liblightdm-gobject/Makefile.am (+2/-1)
liblightdm-gobject/greeter.c (+42/-2)
liblightdm-gobject/liblightdm-gobject-1.vapi (+2/-0)
liblightdm-gobject/lightdm/greeter.h (+3/-1)
liblightdm-gobject/lightdm/session.h (+2/-0)
liblightdm-gobject/session.c (+79/-38)
liblightdm-qt/QLightDM/greeter.h (+1/-0)
liblightdm-qt/greeter.cpp (+6/-1)
src/Makefile.am (+1/-0)
src/display.c (+21/-23)
src/display.h (+1/-1)
src/greeter.c (+107/-7)
src/greeter.h (+1/-1)
src/ldm-marshal.list (+1/-1)
src/lightdm.c (+10/-0)
src/seat.c (+1/-2)
src/session.c (+15/-1)
src/session.h (+7/-1)
tests/Makefile.am (+6/-2)
tests/data/remote-sessions/test-remote.desktop (+5/-0)
tests/scripts/autologin-guest-logout.conf (+3/-3)
tests/scripts/login-guest-logout.conf (+3/-3)
tests/scripts/login-remote-session.conf (+50/-0)
tests/src/libsystem.c (+79/-1)
tests/src/test-gobject-greeter.c (+5/-0)
tests/src/test-python-greeter (+4/-0)
tests/src/test-qt-greeter.cpp (+5/-0)
tests/src/test-runner.c (+3/-0)
tests/test-login-gobject-remote-session (+2/-0)
tests/test-login-python-remote-session (+2/-0)
tests/test-login-qt-remote-session (+2/-0)
To merge this branch: bzr merge lp:~robert-ancell/lightdm/remote-sessions
Reviewer Review Type Date Requested Status
Michael Terry 2012-08-29 Approve on 2012-08-29
Review via email: mp+121948@code.launchpad.net
To post a comment you must log in.
Michael Terry (mterry) wrote :

Sure, looks fine.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'data/lightdm.conf'
2--- data/lightdm.conf 2012-07-02 22:32:50 +0000
3+++ data/lightdm.conf 2012-08-29 21:17:17 +0000
4@@ -12,6 +12,7 @@
5 # run-directory = Directory to put running state in
6 # cache-directory = Directory to cache to
7 # xsessions-directory = Directory to find X sessions
8+# remote-sessions-directory = Directory to find remote sessions
9 # xgreeters-directory = Directory to find X greeters
10 #
11 [LightDM]
12@@ -26,6 +27,7 @@
13 #run-directory=/var/run/lightdm
14 #cache-directory=/var/cache/lightdm
15 #xsessions-directory=/usr/share/xsessions
16+#remote-sessions-directory=/usr/share/lightdm/remote-sessions
17 #xgreeters-directory=/usr/share/xgreeters
18
19 #
20
21=== modified file 'liblightdm-gobject/Makefile.am'
22--- liblightdm-gobject/Makefile.am 2012-06-13 21:53:38 +0000
23+++ liblightdm-gobject/Makefile.am 2012-08-29 21:17:17 +0000
24@@ -5,7 +5,8 @@
25 liblightdm_gobject_1_la_CFLAGS = $(LIBLIGHTDM_GOBJECT_CFLAGS) \
26 $(WARN_CFLAGS) \
27 -DCONFIG_DIR=\"$(sysconfdir)/lightdm\" \
28- -DXSESSIONS_DIR=\"$(datadir)/xsessions\"
29+ -DXSESSIONS_DIR=\"$(datadir)/xsessions\" \
30+ -DREMOTE_SESSIONS_DIR=\"$(pkgdatadir)/remote-sessions\"
31
32 mainheader_HEADERS = lightdm.h
33 mainheaderdir=$(includedir)/lightdm-gobject-1
34
35=== modified file 'liblightdm-gobject/greeter.c'
36--- liblightdm-gobject/greeter.c 2012-08-17 18:38:21 +0000
37+++ liblightdm-gobject/greeter.c 2012-08-29 21:17:17 +0000
38@@ -80,7 +80,8 @@
39 GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
40 GREETER_MESSAGE_START_SESSION,
41 GREETER_MESSAGE_CANCEL_AUTHENTICATION,
42- GREETER_MESSAGE_SET_LANGUAGE
43+ GREETER_MESSAGE_SET_LANGUAGE,
44+ GREETER_MESSAGE_AUTHENTICATE_REMOTE
45 } GreeterMessage;
46
47 /* Messages from the server to the greeter */
48@@ -770,7 +771,7 @@
49 * Starts the authentication procedure for a user.
50 **/
51 void
52-lightdm_greeter_authenticate (LightDMGreeter *greeter, const char *username)
53+lightdm_greeter_authenticate (LightDMGreeter *greeter, const gchar *username)
54 {
55 LightDMGreeterPrivate *priv;
56 guint8 message[MAX_MESSAGE_LENGTH];
57@@ -832,6 +833,45 @@
58 }
59
60 /**
61+ * lightdm_greeter_authenticate_remote:
62+ * @greeter: A #LightDMGreeter
63+ * @session: The name of a remote session
64+ * @username: (allow-none): A username of #NULL to prompt for a username.
65+ *
66+ * Start authentication for a remote session type.
67+ **/
68+void
69+lightdm_greeter_authenticate_remote (LightDMGreeter *greeter, const gchar *session, const gchar *username)
70+{
71+ LightDMGreeterPrivate *priv;
72+ guint8 message[MAX_MESSAGE_LENGTH];
73+ gsize offset = 0;
74+
75+ g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
76+
77+ priv = GET_PRIVATE (greeter);
78+
79+ g_return_if_fail (priv->connected);
80+
81+ priv->cancelling_authentication = FALSE;
82+ priv->authenticate_sequence_number++;
83+ priv->in_authentication = TRUE;
84+ priv->is_authenticated = FALSE;
85+ g_free (priv->authentication_user);
86+ priv->authentication_user = NULL;
87+
88+ if (username)
89+ g_debug ("Starting authentication for remote session %s as user %s...", session, username);
90+ else
91+ g_debug ("Starting authentication for remote session %s...", session);
92+ write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_REMOTE, int_length () + string_length (session) + string_length (username), &offset);
93+ write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
94+ write_string (message, MAX_MESSAGE_LENGTH, session, &offset);
95+ write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
96+ write_message (greeter, message, offset);
97+}
98+
99+/**
100 * lightdm_greeter_respond:
101 * @greeter: A #LightDMGreeter
102 * @response: Response to a prompt
103
104=== modified file 'liblightdm-gobject/liblightdm-gobject-1.vapi'
105--- liblightdm-gobject/liblightdm-gobject-1.vapi 2012-03-08 04:57:58 +0000
106+++ liblightdm-gobject/liblightdm-gobject-1.vapi 2012-08-29 21:17:17 +0000
107@@ -4,6 +4,7 @@
108 public static unowned GLib.List<weak LightDM.Session> get_sessions ();
109 public static unowned GLib.List<weak LightDM.Language> get_languages ();
110 public static unowned GLib.List<weak LightDM.Layout> get_layouts ();
111+ public static unowned GLib.List<weak LightDM.Session> get_remote_sessions ();
112 public static unowned Language get_language ();
113 public static void set_layout (Layout layout);
114 public static unowned Layout get_layout ();
115@@ -38,6 +39,7 @@
116 public void cancel_autologin ();
117 public void authenticate (string? username = null);
118 public void authenticate_as_guest ();
119+ public void authenticate_remote (string session, string? username);
120 public void respond (string response);
121 public void cancel_authentication ();
122 public bool in_authentication { get; }
123
124=== modified file 'liblightdm-gobject/lightdm/greeter.h'
125--- liblightdm-gobject/lightdm/greeter.h 2012-03-08 04:57:58 +0000
126+++ liblightdm-gobject/lightdm/greeter.h 2012-08-29 21:17:17 +0000
127@@ -98,10 +98,12 @@
128
129 void lightdm_greeter_cancel_autologin (LightDMGreeter *greeter);
130
131-void lightdm_greeter_authenticate (LightDMGreeter *greeter, const char *username);
132+void lightdm_greeter_authenticate (LightDMGreeter *greeter, const gchar *username);
133
134 void lightdm_greeter_authenticate_as_guest (LightDMGreeter *greeter);
135
136+void lightdm_greeter_authenticate_remote (LightDMGreeter *greeter, const gchar *session, const gchar *username);
137+
138 void lightdm_greeter_respond (LightDMGreeter *greeter, const gchar *response);
139
140 void lightdm_greeter_cancel_authentication (LightDMGreeter *greeter);
141
142=== modified file 'liblightdm-gobject/lightdm/session.h'
143--- liblightdm-gobject/lightdm/session.h 2011-07-22 02:55:15 +0000
144+++ liblightdm-gobject/lightdm/session.h 2012-08-29 21:17:17 +0000
145@@ -45,6 +45,8 @@
146
147 GList *lightdm_get_sessions (void);
148
149+GList *lightdm_get_remote_sessions (void);
150+
151 const gchar *lightdm_session_get_key (LightDMSession *session);
152
153 const gchar *lightdm_session_get_name (LightDMSession *session);
154
155=== modified file 'liblightdm-gobject/session.c'
156--- liblightdm-gobject/session.c 2012-06-14 04:37:36 +0000
157+++ liblightdm-gobject/session.c 2012-08-29 21:17:17 +0000
158@@ -33,7 +33,8 @@
159 #define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_SESSION, LightDMSessionPrivate)
160
161 static gboolean have_sessions = FALSE;
162-static GList *sessions = NULL;
163+static GList *local_sessions = NULL;
164+static GList *remote_sessions = NULL;
165
166 static gint
167 compare_session (gconstpointer a, gconstpointer b)
168@@ -99,54 +100,24 @@
169 if (!priv->comment)
170 priv->comment = g_strdup ("");
171
172- sessions = g_list_insert_sorted (sessions, session, compare_session);
173-
174 g_free (domain);
175
176 return session;
177 }
178
179-static void
180-update_sessions (void)
181+static GList *
182+load_sessions (const gchar *sessions_dir)
183 {
184 GDir *directory;
185- gboolean result;
186+ GList *sessions = NULL;
187 GError *error = NULL;
188
189- GKeyFile *config_key_file = NULL;
190- gchar *config_path = NULL;
191- gchar *xsessions_dir = g_strdup (XSESSIONS_DIR);
192-
193- if (have_sessions)
194- return;
195-
196- config_path = g_build_filename (CONFIG_DIR, "lightdm.conf", NULL);
197- config_key_file = g_key_file_new ();
198- result = g_key_file_load_from_file (config_key_file, config_path, G_KEY_FILE_NONE, &error);
199- if (error)
200- g_warning ("Failed to open configuration file: %s", error->message);
201- g_clear_error (&error);
202- if (result)
203- {
204- gchar *xd_value = g_key_file_get_string (config_key_file, "LightDM", "xsessions-directory", NULL);
205- if (xd_value)
206- {
207- g_free (xsessions_dir);
208- xsessions_dir = xd_value;
209- }
210- }
211- g_key_file_free (config_key_file);
212- g_free (config_path);
213-
214- directory = g_dir_open (xsessions_dir, 0, &error);
215+ directory = g_dir_open (sessions_dir, 0, &error);
216 if (error)
217 g_warning ("Failed to open sessions directory: %s", error->message);
218 g_clear_error (&error);
219 if (!directory)
220- {
221- g_free (xsessions_dir);
222- return;
223- }
224+ return NULL;
225
226 while (TRUE)
227 {
228@@ -162,7 +133,7 @@
229 if (!g_str_has_suffix (filename, ".desktop"))
230 continue;
231
232- path = g_build_filename (xsessions_dir, filename, NULL);
233+ path = g_build_filename (sessions_dir, filename, NULL);
234
235 key_file = g_key_file_new ();
236 result = g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error);
237@@ -178,7 +149,10 @@
238 key = g_strndup (filename, strlen (filename) - strlen (".desktop"));
239 session = load_session (key_file, key);
240 if (session)
241+ {
242 g_debug ("Loaded session %s (%s, %s)", path, GET_PRIVATE (session)->name, GET_PRIVATE (session)->comment);
243+ sessions = g_list_insert_sorted (sessions, session, compare_session);
244+ }
245 else
246 g_debug ("Ignoring session %s", path);
247 g_free (key);
248@@ -189,7 +163,60 @@
249 }
250
251 g_dir_close (directory);
252+
253+ return sessions;
254+}
255+
256+static void
257+update_sessions (void)
258+{
259+ GKeyFile *config_key_file = NULL;
260+ gchar *config_path = NULL;
261+ gchar *xsessions_dir;
262+ gchar *remote_sessions_dir;
263+ gboolean result;
264+ GError *error = NULL;
265+
266+ if (have_sessions)
267+ return;
268+
269+ xsessions_dir = g_strdup (XSESSIONS_DIR);
270+ remote_sessions_dir = g_strdup (REMOTE_SESSIONS_DIR);
271+
272+ /* Use session directory from configuration */
273+ /* FIXME: This should be sent in the greeter connection */
274+ config_path = g_build_filename (CONFIG_DIR, "lightdm.conf", NULL);
275+ config_key_file = g_key_file_new ();
276+ result = g_key_file_load_from_file (config_key_file, config_path, G_KEY_FILE_NONE, &error);
277+ if (error)
278+ g_warning ("Failed to open configuration file: %s", error->message);
279+ g_clear_error (&error);
280+ if (result)
281+ {
282+ gchar *value;
283+
284+ value = g_key_file_get_string (config_key_file, "LightDM", "xsessions-directory", NULL);
285+ if (value)
286+ {
287+ g_free (xsessions_dir);
288+ xsessions_dir = value;
289+ }
290+
291+ value = g_key_file_get_string (config_key_file, "LightDM", "remote-sessions-directory", NULL);
292+ if (value)
293+ {
294+ g_free (remote_sessions_dir);
295+ remote_sessions_dir = value;
296+ }
297+ }
298+ g_key_file_free (config_key_file);
299+ g_free (config_path);
300+
301+ local_sessions = load_sessions (xsessions_dir);
302+ remote_sessions = load_sessions (remote_sessions_dir);
303+
304 g_free (xsessions_dir);
305+ g_free (remote_sessions_dir);
306
307 have_sessions = TRUE;
308 }
309@@ -205,7 +232,21 @@
310 lightdm_get_sessions (void)
311 {
312 update_sessions ();
313- return sessions;
314+ return local_sessions;
315+}
316+
317+/**
318+ * lightdm_get_remote_sessions:
319+ *
320+ * Get the available remote sessions.
321+ *
322+ * Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession
323+ **/
324+GList *
325+lightdm_get_remote_sessions (void)
326+{
327+ update_sessions ();
328+ return remote_sessions;
329 }
330
331 /**
332
333=== modified file 'liblightdm-qt/QLightDM/greeter.h'
334--- liblightdm-qt/QLightDM/greeter.h 2012-06-22 22:12:12 +0000
335+++ liblightdm-qt/QLightDM/greeter.h 2012-08-29 21:17:17 +0000
336@@ -72,6 +72,7 @@
337 bool connectSync();
338 void authenticate(const QString &username=QString());
339 void authenticateAsGuest();
340+ void authenticateRemote(const QString &session=QString(), const QString &username=QString());
341 void respond(const QString &response);
342 void cancelAuthentication();
343 void setLanguage (const QString &language);
344
345=== modified file 'liblightdm-qt/greeter.cpp'
346--- liblightdm-qt/greeter.cpp 2012-04-24 13:54:28 +0000
347+++ liblightdm-qt/greeter.cpp 2012-08-29 21:17:17 +0000
348@@ -117,7 +117,12 @@
349 {
350 Q_D(Greeter);
351 lightdm_greeter_authenticate_as_guest(d->ldmGreeter);
352-
353+}
354+
355+void Greeter::authenticateRemote(const QString &session, const QString &username)
356+{
357+ Q_D(Greeter);
358+ lightdm_greeter_authenticate_remote(d->ldmGreeter, session.toLocal8Bit().data(), username.toLocal8Bit().data());
359 }
360
361 void Greeter::respond(const QString &response)
362
363=== modified file 'src/Makefile.am'
364--- src/Makefile.am 2012-03-01 03:29:29 +0000
365+++ src/Makefile.am 2012-08-29 21:17:17 +0000
366@@ -86,6 +86,7 @@
367 -DRUN_DIR=\"$(localstatedir)/run/lightdm\" \
368 -DCACHE_DIR=\"$(localstatedir)/cache/lightdm\" \
369 -DXSESSIONS_DIR=\"$(datadir)/xsessions\" \
370+ -DREMOTE_SESSIONS_DIR=\"$(pkgdatadir)/remote-sessions\" \
371 -DXGREETERS_DIR=\"$(datadir)/xgreeters\"
372
373 lightdm_LDADD = \
374
375=== modified file 'src/display.c'
376--- src/display.c 2012-06-12 03:08:14 +0000
377+++ src/display.c 2012-08-29 21:17:17 +0000
378@@ -35,15 +35,6 @@
379 };
380 static guint signals[LAST_SIGNAL] = { 0 };
381
382-typedef enum
383-{
384- SESSION_NONE = 0,
385- SESSION_GREETER_PRE_CONNECT,
386- SESSION_GREETER,
387- SESSION_GREETER_AUTHENTICATED,
388- SESSION_USER
389-} SessionType;
390-
391 struct DisplayPrivate
392 {
393 /* Display server */
394@@ -62,6 +53,7 @@
395 gboolean greeter_is_lock;
396
397 /* Session requested to log into */
398+ SessionType user_session_type;
399 gchar *user_session;
400
401 /* Program to run sessions through */
402@@ -220,10 +212,11 @@
403 }
404
405 void
406-display_set_user_session (Display *display, const gchar *session_name)
407+display_set_user_session (Display *display, SessionType type, const gchar *session_name)
408 {
409 g_return_if_fail (display != NULL);
410 g_free (display->priv->user_session);
411+ display->priv->user_session_type = type;
412 display->priv->user_session = g_strdup (session_name);
413 }
414
415@@ -349,7 +342,7 @@
416 }
417
418 static gboolean
419-greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display *display)
420+greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Display *display)
421 {
422 /* If no session requested, use the previous one */
423 if (!session_name && !greeter_get_guest_authenticated (greeter))
424@@ -357,6 +350,7 @@
425 User *user;
426
427 user = session_get_user (greeter_get_authentication_session (greeter));
428+ type = SESSION_TYPE_LOCAL;
429 session_name = user_get_xsession (user);
430 }
431
432@@ -364,7 +358,7 @@
433 if (session_name)
434 {
435 g_debug ("Using session %s", session_name);
436- display_set_user_session (display, session_name);
437+ display_set_user_session (display, type, session_name);
438 }
439
440 /* Stop this display if that session already exists and can switch to it */
441@@ -474,7 +468,7 @@
442 if (session_name)
443 {
444 g_debug ("Autologin using session %s", session_name);
445- display_set_user_session (display, session_name);
446+ display_set_user_session (display, SESSION_TYPE_LOCAL, session_name);
447 }
448
449 g_signal_emit (display, signals[START_SESSION], 0, &result);
450@@ -493,7 +487,7 @@
451 }
452
453 static gboolean
454-autologin (Display *display, const gchar *username, const gchar *service, gboolean start_greeter_if_fail)
455+autologin (Display *display, const gchar *username, const gchar *service, gboolean start_greeter_if_fail, gboolean is_guest)
456 {
457 display->priv->start_greeter_if_fail = start_greeter_if_fail;
458
459@@ -502,7 +496,7 @@
460 display->priv->session = create_session (display);
461 g_signal_connect (display->priv->session, "authentication-complete", G_CALLBACK (autologin_authentication_complete_cb), display);
462 g_signal_connect_after (display->priv->session, "stopped", G_CALLBACK (user_session_stopped_cb), display);
463- return session_start (display->priv->session, service, username, TRUE, FALSE);
464+ return session_start (display->priv->session, service, username, TRUE, FALSE, is_guest);
465 }
466
467 static gboolean
468@@ -518,7 +512,7 @@
469 return FALSE;
470 }
471
472- result = autologin (display, username, service, start_greeter_if_fail);
473+ result = autologin (display, username, service, start_greeter_if_fail, TRUE);
474 g_free (username);
475
476 return result;
477@@ -700,12 +694,16 @@
478
479 user = session_get_user (display->priv->session);
480
481- /* Store this session name so we automatically use it next time */
482- user_set_xsession (user, display->priv->user_session);
483-
484 /* Find the command to run for the selected session */
485- // FIXME: This is X specific, move into xsession.c
486- sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
487+ if (display->priv->user_session_type == SESSION_TYPE_LOCAL)
488+ {
489+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
490+
491+ /* Store this session name so we automatically use it next time */
492+ user_set_xsession (user, display->priv->user_session);
493+ }
494+ else
495+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory");
496 filename = g_strdup_printf ("%s.desktop", display->priv->user_session);
497 path = g_build_filename (sessions_dir, filename, NULL);
498 g_free (sessions_dir);
499@@ -777,12 +775,12 @@
500 else if (display->priv->autologin_user)
501 {
502 g_debug ("Automatically logging in user %s", display->priv->autologin_user);
503- result = autologin (display, display->priv->autologin_user, AUTOLOGIN_SERVICE, TRUE);
504+ result = autologin (display, display->priv->autologin_user, AUTOLOGIN_SERVICE, TRUE, FALSE);
505 }
506 else if (display->priv->select_user_hint)
507 {
508 g_debug ("Logging in user %s", display->priv->select_user_hint);
509- result = autologin (display, display->priv->select_user_hint, USER_SERVICE, TRUE);
510+ result = autologin (display, display->priv->select_user_hint, USER_SERVICE, TRUE, FALSE);
511 }
512
513 /* If no session started, start a greeter */
514
515=== modified file 'src/display.h'
516--- src/display.h 2012-03-08 04:57:58 +0000
517+++ src/display.h 2012-08-29 21:17:17 +0000
518@@ -76,7 +76,7 @@
519
520 void display_set_lock_hint (Display *display, gboolean is_lock);
521
522-void display_set_user_session (Display *display, const gchar *session_name);
523+void display_set_user_session (Display *display, SessionType type, const gchar *session_name);
524
525 gboolean display_start (Display *display);
526
527
528=== modified file 'src/greeter.c'
529--- src/greeter.c 2012-03-05 00:23:32 +0000
530+++ src/greeter.c 2012-08-29 21:17:17 +0000
531@@ -18,6 +18,7 @@
532
533 #include "greeter.h"
534 #include "ldm-marshal.h"
535+#include "configuration.h"
536
537 enum {
538 CONNECTED,
539@@ -48,6 +49,9 @@
540 /* Sequence number of current PAM session */
541 guint32 authentication_sequence_number;
542
543+ /* Remote session name */
544+ gchar *remote_session;
545+
546 /* PAM session being constructed by the greeter */
547 Session *authentication_session;
548
549@@ -76,7 +80,8 @@
550 GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
551 GREETER_MESSAGE_START_SESSION,
552 GREETER_MESSAGE_CANCEL_AUTHENTICATION,
553- GREETER_MESSAGE_SET_LANGUAGE
554+ GREETER_MESSAGE_SET_LANGUAGE,
555+ GREETER_MESSAGE_AUTHENTICATE_REMOTE
556 } GreeterMessage;
557
558 /* Messages from the server to the greeter */
559@@ -293,6 +298,8 @@
560 static void
561 reset_session (Greeter *greeter)
562 {
563+ g_free (greeter->priv->remote_session);
564+ greeter->priv->remote_session = NULL;
565 if (greeter->priv->authentication_session)
566 {
567 g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter);
568@@ -329,7 +336,7 @@
569 g_signal_connect (G_OBJECT (greeter->priv->authentication_session), "authentication-complete", G_CALLBACK (authentication_complete_cb), greeter);
570
571 /* Run the session process */
572- session_start (greeter->priv->authentication_session, greeter->priv->pam_service, username, TRUE, TRUE);
573+ session_start (greeter->priv->authentication_session, greeter->priv->pam_service, username, TRUE, TRUE, FALSE);
574 }
575
576 static void
577@@ -350,6 +357,84 @@
578 send_end_authentication (greeter, sequence_number, "", PAM_SUCCESS);
579 }
580
581+static gchar *
582+get_remote_session_service (const gchar *session_name)
583+{
584+ GKeyFile *session_desktop_file;
585+ gboolean result;
586+ const gchar *c;
587+ gchar *remote_sessions_dir, *filename, *path, *service = NULL;
588+ GError *error = NULL;
589+
590+ /* Validate session name doesn't contain directory separators */
591+ for (c = session_name; *c; c++)
592+ {
593+ if (*c == '/')
594+ return NULL;
595+ }
596+
597+ /* Load the session file */
598+ session_desktop_file = g_key_file_new ();
599+ filename = g_strdup_printf ("%s.desktop", session_name);
600+ remote_sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory");
601+ path = g_build_filename (remote_sessions_dir, filename, NULL);
602+ g_free (remote_sessions_dir);
603+ g_free (filename);
604+ result = g_key_file_load_from_file (session_desktop_file, path, G_KEY_FILE_NONE, &error);
605+ if (error)
606+ g_debug ("Failed to load session file %s: %s", path, error->message);
607+ g_free (path);
608+ g_clear_error (&error);
609+ if (result)
610+ service = g_key_file_get_string (session_desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-PAM-Service", NULL);
611+ g_key_file_free (session_desktop_file);
612+
613+ return service;
614+}
615+
616+static void
617+handle_login_remote (Greeter *greeter, const gchar *session_name, const gchar *username, guint32 sequence_number)
618+{
619+ gchar *service;
620+
621+ if (username[0] == '\0')
622+ {
623+ g_debug ("Greeter start authentication for remote session %s", session_name);
624+ username = NULL;
625+ }
626+ else
627+ g_debug ("Greeter start authentication for remote session %s as user %s", session_name, username);
628+
629+ reset_session (greeter);
630+
631+ service = get_remote_session_service (session_name);
632+ if (!service)
633+ {
634+ send_end_authentication (greeter, sequence_number, "", PAM_SYSTEM_ERR);
635+ return;
636+ }
637+
638+ greeter->priv->authentication_sequence_number = sequence_number;
639+ greeter->priv->remote_session = g_strdup (session_name);
640+ g_signal_emit (greeter, signals[START_AUTHENTICATION], 0, username, &greeter->priv->authentication_session);
641+ if (greeter->priv->authentication_session)
642+ {
643+ g_signal_connect (G_OBJECT (greeter->priv->authentication_session), "got-messages", G_CALLBACK (pam_messages_cb), greeter);
644+ g_signal_connect (G_OBJECT (greeter->priv->authentication_session), "authentication-complete", G_CALLBACK (authentication_complete_cb), greeter);
645+
646+ /* Run the session process */
647+ session_start (greeter->priv->authentication_session, service, username, TRUE, TRUE, TRUE);
648+ }
649+
650+ g_free (service);
651+
652+ if (!greeter->priv->authentication_session)
653+ {
654+ send_end_authentication (greeter, sequence_number, "", PAM_USER_UNKNOWN);
655+ return;
656+ }
657+}
658+
659 static void
660 handle_continue_authentication (Greeter *greeter, gchar **secrets)
661 {
662@@ -412,10 +497,18 @@
663 gboolean result;
664 guint8 message[MAX_MESSAGE_LENGTH];
665 gsize offset = 0;
666+ SessionType session_type = SESSION_TYPE_LOCAL;
667
668 if (strcmp (session, "") == 0)
669 session = NULL;
670
671+ /* Use session type chosen in remote session */
672+ if (greeter->priv->remote_session)
673+ {
674+ session_type = SESSION_TYPE_REMOTE;
675+ session = greeter->priv->remote_session;
676+ }
677+
678 if (greeter->priv->guest_account_authenticated || session_get_is_authenticated (greeter->priv->authentication_session))
679 {
680 if (session)
681@@ -423,7 +516,7 @@
682 else
683 g_debug ("Greeter requests default session");
684 greeter->priv->start_session = TRUE;
685- g_signal_emit (greeter, signals[START_SESSION], 0, session, &result);
686+ g_signal_emit (greeter, signals[START_SESSION], 0, session_type, session, &result);
687 }
688 else
689 {
690@@ -569,6 +662,12 @@
691 sequence_number = read_int (greeter, &offset);
692 handle_login_as_guest (greeter, sequence_number);
693 break;
694+ case GREETER_MESSAGE_AUTHENTICATE_REMOTE:
695+ sequence_number = read_int (greeter, &offset);
696+ session_name = read_string (greeter, &offset);
697+ username = read_string (greeter, &offset);
698+ handle_login_remote (greeter, session_name, username, sequence_number);
699+ break;
700 case GREETER_MESSAGE_CONTINUE_AUTHENTICATION:
701 n_secrets = read_int (greeter, &offset);
702 secrets = g_malloc (sizeof (gchar *) * (n_secrets + 1));
703@@ -654,7 +753,7 @@
704 fcntl (to_greeter_pipe[1], F_SETFD, FD_CLOEXEC);
705 fcntl (from_greeter_pipe[0], F_SETFD, FD_CLOEXEC);
706
707- result = session_start (greeter->priv->session, service, username, FALSE, FALSE);
708+ result = session_start (greeter->priv->session, service, username, FALSE, FALSE, FALSE);
709
710 /* Close the session ends of the pipe */
711 close (to_greeter_pipe[0]);
712@@ -670,7 +769,7 @@
713 }
714
715 static gboolean
716-greeter_real_start_session (Greeter *greeter, const gchar *session, gboolean is_guest)
717+greeter_real_start_session (Greeter *greeter, SessionType type, const gchar *session)
718 {
719 return FALSE;
720 }
721@@ -695,6 +794,7 @@
722 g_free (self->priv->pam_service);
723 g_free (self->priv->read_buffer);
724 g_hash_table_unref (self->priv->hints);
725+ g_free (self->priv->remote_session);
726 if (self->priv->authentication_session)
727 {
728 g_signal_handlers_disconnect_matched (self->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);
729@@ -743,8 +843,8 @@
730 G_STRUCT_OFFSET (GreeterClass, start_session),
731 g_signal_accumulator_true_handled,
732 NULL,
733- ldm_marshal_BOOLEAN__STRING,
734- G_TYPE_BOOLEAN, 1, G_TYPE_STRING);
735+ ldm_marshal_BOOLEAN__INT_STRING,
736+ G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_STRING);
737
738 g_type_class_add_private (klass, sizeof (GreeterPrivate));
739 }
740
741=== modified file 'src/greeter.h'
742--- src/greeter.h 2012-03-05 00:23:32 +0000
743+++ src/greeter.h 2012-08-29 21:17:17 +0000
744@@ -32,7 +32,7 @@
745 GObjectClass parent_class;
746 void (*connected)(Greeter *greeter);
747 Session *(*start_authentication)(Greeter *greeter, const gchar *username);
748- gboolean (*start_session)(Greeter *greeter, const gchar *session, gboolean is_guest);
749+ gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session);
750 } GreeterClass;
751
752 GType greeter_get_type (void);
753
754=== modified file 'src/ldm-marshal.list'
755--- src/ldm-marshal.list 2011-09-16 02:10:21 +0000
756+++ src/ldm-marshal.list 2012-08-29 21:17:17 +0000
757@@ -1,6 +1,6 @@
758 VOID:INT,POINTER
759 BOOLEAN:VOID
760-BOOLEAN:STRING
761+BOOLEAN:INT,STRING
762 BOOLEAN:OBJECT
763 STRING:VOID
764 OBJECT:VOID
765
766=== modified file 'src/lightdm.c'
767--- src/lightdm.c 2012-05-14 14:52:37 +0000
768+++ src/lightdm.c 2012-08-29 21:17:17 +0000
769@@ -817,6 +817,7 @@
770 gboolean test_mode = FALSE;
771 gchar *pid_path = "/var/run/lightdm.pid";
772 gchar *xsessions_dir = NULL;
773+ gchar *remote_sessions_dir = NULL;
774 gchar *xgreeters_dir = NULL;
775 gchar *config_dir;
776 gchar *log_dir = NULL;
777@@ -843,6 +844,9 @@
778 { "xsessions-dir", 0, 0, G_OPTION_ARG_STRING, &xsessions_dir,
779 /* Help string for command line --xsessions-dir flag */
780 N_("Directory to load X sessions from"), "DIRECTORY" },
781+ { "remote-sessions-dir", 0, 0, G_OPTION_ARG_STRING, &remote_sessions_dir,
782+ /* Help string for command line --remote-sessions-dir flag */
783+ N_("Directory to load remote sessions from"), "DIRECTORY" },
784 { "xgreeters-dir", 0, 0, G_OPTION_ARG_STRING, &xgreeters_dir,
785 /* Help string for command line --xgreeters-dir flag */
786 N_("Directory to load X greeters from"), "DIRECTORY" },
787@@ -952,6 +956,7 @@
788
789 /* Always use absolute directories as child processes may run from different locations */
790 xsessions_dir = path_make_absolute (xsessions_dir);
791+ remote_sessions_dir = path_make_absolute (remote_sessions_dir);
792 xgreeters_dir = path_make_absolute (xgreeters_dir);
793
794 /* If not running as root write output to directories we control */
795@@ -1019,6 +1024,8 @@
796 g_free (default_cache_dir);
797 if (!config_has_key (config_get_instance (), "LightDM", "xsessions-directory"))
798 config_set_string (config_get_instance (), "LightDM", "xsessions-directory", XSESSIONS_DIR);
799+ if (!config_has_key (config_get_instance (), "LightDM", "remote-sessions-directory"))
800+ config_set_string (config_get_instance (), "LightDM", "remote-sessions-directory", REMOTE_SESSIONS_DIR);
801 if (!config_has_key (config_get_instance (), "LightDM", "xgreeters-directory"))
802 config_set_string (config_get_instance (), "LightDM", "xgreeters-directory", XGREETERS_DIR);
803
804@@ -1035,6 +1042,9 @@
805 if (xsessions_dir)
806 config_set_string (config_get_instance (), "LightDM", "xsessions-directory", xsessions_dir);
807 g_free (xsessions_dir);
808+ if (remote_sessions_dir)
809+ config_set_string (config_get_instance (), "LightDM", "remote-sessions-directory", remote_sessions_dir);
810+ g_free (remote_sessions_dir);
811 if (xgreeters_dir)
812 config_set_string (config_get_instance (), "LightDM", "xgreeters-directory", xgreeters_dir);
813 g_free (xgreeters_dir);
814
815=== modified file 'src/seat.c'
816--- src/seat.c 2012-03-20 05:47:56 +0000
817+++ src/seat.c 2012-08-29 21:17:17 +0000
818@@ -390,7 +390,6 @@
819
820 if (seat->priv->guest_username && strcmp (session_get_username (session), seat->priv->guest_username) == 0)
821 {
822- guest_account_cleanup (seat->priv->guest_username);
823 g_free (seat->priv->guest_username);
824 seat->priv->guest_username = NULL;
825 }
826@@ -496,7 +495,7 @@
827 display_set_select_user_hint (display, username, is_guest);
828 if (!session_name)
829 session_name = seat_get_string_property (seat, "user-session");
830- display_set_user_session (display, session_name);
831+ display_set_user_session (display, SESSION_TYPE_LOCAL, session_name);
832
833 seat->priv->displays = g_list_append (seat->priv->displays, display);
834 g_signal_emit (seat, signals[DISPLAY_ADDED], 0, display);
835
836=== modified file 'src/session.c'
837--- src/session.c 2012-08-02 12:17:41 +0000
838+++ src/session.c 2012-08-29 21:17:17 +0000
839@@ -22,6 +22,7 @@
840 #include "session.h"
841 #include "configuration.h"
842 #include "console-kit.h"
843+#include "guest-account.h"
844
845 enum {
846 GOT_MESSAGES,
847@@ -46,6 +47,9 @@
848 /* User to authenticate as */
849 gchar *username;
850
851+ /* TRUE if is a guest account */
852+ gboolean is_guest;
853+
854 /* User object that matches the current username */
855 User *user;
856
857@@ -235,6 +239,10 @@
858
859 g_signal_emit (G_OBJECT (session), signals[STOPPED], 0);
860
861+ /* Delete account if it is a guest one */
862+ if (session->priv->is_guest)
863+ guest_account_cleanup (session->priv->username);
864+
865 /* Drop our reference on the child process, it has terminated */
866 g_object_unref (session);
867 }
868@@ -316,7 +324,7 @@
869 }
870
871 gboolean
872-session_start (Session *session, const gchar *service, const gchar *username, gboolean do_authenticate, gboolean is_interactive)
873+session_start (Session *session, const gchar *service, const gchar *username, gboolean do_authenticate, gboolean is_interactive, gboolean is_guest)
874 {
875 int version;
876 int to_child_pipe[2], from_child_pipe[2];
877@@ -343,6 +351,11 @@
878 fcntl (session->priv->to_child_input, F_SETFD, FD_CLOEXEC);
879 fcntl (session->priv->from_child_output, F_SETFD, FD_CLOEXEC);
880
881+ /* Create the guest account if it is one */
882+ session->priv->is_guest = is_guest;
883+ if (is_guest && username == NULL)
884+ username = guest_account_setup ();
885+
886 /* Remember what username we started with - it will be updated by PAM during authentication */
887 session->priv->username = g_strdup (username);
888
889@@ -353,6 +366,7 @@
890 g_debug ("Failed to fork session child process: %s", strerror (errno));
891 return FALSE;
892 }
893+
894 if (session->priv->pid == 0)
895 {
896 /* Run us again in session child mode */
897
898=== modified file 'src/session.h'
899--- src/session.h 2012-03-01 03:29:29 +0000
900+++ src/session.h 2012-08-29 21:17:17 +0000
901@@ -43,6 +43,12 @@
902 void (*stopped)(Session *session);
903 } SessionClass;
904
905+typedef enum
906+{
907+ SESSION_TYPE_LOCAL,
908+ SESSION_TYPE_REMOTE
909+} SessionType;
910+
911 #define XDG_SESSION_CLASS_USER "user"
912 #define XDG_SESSION_CLASS_GREETER "greeter"
913 #define XDG_SESSION_CLASS_LOCK_SCREEN "lock-screen"
914@@ -66,7 +72,7 @@
915 // FIXME: Remove
916 User *session_get_user (Session *session);
917
918-gboolean session_start (Session *session, const gchar *service, const gchar *username, gboolean do_authenticate, gboolean is_interactive);
919+gboolean session_start (Session *session, const gchar *service, const gchar *username, gboolean do_authenticate, gboolean is_interactive, gboolean is_guest);
920
921 const gchar *session_get_username (Session *session);
922
923
924=== modified file 'tests/Makefile.am'
925--- tests/Makefile.am 2012-08-17 16:13:57 +0000
926+++ tests/Makefile.am 2012-08-29 21:17:17 +0000
927@@ -70,6 +70,7 @@
928 test-login-gobject-guest-no-setup-script \
929 test-login-gobject-guest-fail-setup-script \
930 test-login-gobject-guest-logout \
931+ test-login-gobject-remote-session \
932 test-login-python \
933 test-login-python-manual \
934 test-login-python-manual-previous-session \
935@@ -91,6 +92,7 @@
936 test-login-python-guest-no-setup-script \
937 test-login-python-guest-fail-setup-script \
938 test-login-python-guest-logout \
939+ test-login-python-remote-session \
940 test-login-session-crash \
941 test-login-xserver-crash \
942 test-home-dir-on-authenticate \
943@@ -147,7 +149,8 @@
944 test-login-qt-guest-disabled \
945 test-login-qt-guest-no-setup-script \
946 test-login-qt-guest-fail-setup-script \
947- test-login-qt-guest-logout
948+ test-login-qt-guest-logout \
949+ test-login-qt-remote-session
950 endif
951
952 EXTRA_DIST = \
953@@ -214,8 +217,9 @@
954 scripts/login-pam.conf \
955 scripts/login-pick-session.conf \
956 scripts/login-previous-session.conf \
957+ scripts/login-remote-session.conf \
958+ scripts/login-session-crash.conf \
959 scripts/login-two-factor.conf \
960- scripts/login-session-crash.conf \
961 scripts/login-wrong-password.conf \
962 scripts/login-xserver-crash.conf \
963 scripts/no-accounts-service.conf \
964
965=== added directory 'tests/data/remote-sessions'
966=== added file 'tests/data/remote-sessions/test-remote.desktop'
967--- tests/data/remote-sessions/test-remote.desktop 1970-01-01 00:00:00 +0000
968+++ tests/data/remote-sessions/test-remote.desktop 2012-08-29 21:17:17 +0000
969@@ -0,0 +1,5 @@
970+[Desktop Entry]
971+Name=Test Remote Session
972+Comment=LightDM remote test session
973+Exec=test-session
974+X-LightDM-PAM-Service=test-remote
975
976=== modified file 'tests/scripts/autologin-guest-logout.conf'
977--- tests/scripts/autologin-guest-logout.conf 2012-02-02 07:09:27 +0000
978+++ tests/scripts/autologin-guest-logout.conf 2012-08-29 21:17:17 +0000
979@@ -28,12 +28,12 @@
980 # Logout of session
981 #?*SESSION :50 LOGOUT
982
983+# X server stops
984+#?XSERVER :50 TERMINATE SIGNAL=15
985+
986 # Guest account removed
987 #?GUEST-ACCOUNT REMOVE USERNAME=guest-.*
988
989-# X server stops
990-#?XSERVER :50 TERMINATE SIGNAL=15
991-
992 # X server starts
993 #?XSERVER :50 START
994 #?XSERVER :50 INDICATE-READY
995
996=== modified file 'tests/scripts/login-guest-logout.conf'
997--- tests/scripts/login-guest-logout.conf 2012-02-02 23:40:27 +0000
998+++ tests/scripts/login-guest-logout.conf 2012-08-29 21:17:17 +0000
999@@ -38,12 +38,12 @@
1000 # Logout of session
1001 #?*SESSION :50 LOGOUT
1002
1003+# X server stops
1004+#?XSERVER :50 TERMINATE SIGNAL=15
1005+
1006 # Guest account removed
1007 #?GUEST-ACCOUNT REMOVE USERNAME=guest-.*
1008
1009-# X server stops
1010-#?XSERVER :50 TERMINATE SIGNAL=15
1011-
1012 # X server starts
1013 #?XSERVER :50 START
1014 #?XSERVER :50 INDICATE-READY
1015
1016=== added file 'tests/scripts/login-remote-session.conf'
1017--- tests/scripts/login-remote-session.conf 1970-01-01 00:00:00 +0000
1018+++ tests/scripts/login-remote-session.conf 2012-08-29 21:17:17 +0000
1019@@ -0,0 +1,50 @@
1020+#
1021+# Check can login without a username, and is prompted for one
1022+#
1023+
1024+[LightDM]
1025+minimum-display-number=50
1026+
1027+#?RUNNER DAEMON-START
1028+
1029+# X server starts
1030+#?XSERVER :50 START
1031+#?XSERVER :50 INDICATE-READY
1032+
1033+# LightDM connects to X server
1034+#?XSERVER :50 ACCEPT-CONNECT
1035+
1036+# Greeter starts
1037+#?GREETER :50 START
1038+#?XSERVER :50 ACCEPT-CONNECT
1039+#?GREETER :50 CONNECT-XSERVER
1040+#?GREETER :50 CONNECT-TO-DAEMON
1041+#?GREETER :50 CONNECTED-TO-DAEMON
1042+
1043+# Start remote authentication
1044+#?*GREETER :50 AUTHENTICATE-REMOTE SESSION=test-remote
1045+
1046+# Guest account created
1047+#?GUEST-ACCOUNT ADD USERNAME=guest-.*
1048+
1049+# Get remote credentials
1050+#?GREETER :50 SHOW-PROMPT TEXT="remote-login:"
1051+#?*GREETER :50 RESPOND TEXT="remote-user"
1052+#?GREETER :50 SHOW-PROMPT TEXT="remote-password:"
1053+#?*GREETER :50 RESPOND TEXT="password"
1054+#?GREETER :50 AUTHENTICATION-COMPLETE USERNAME=guest-.* AUTHENTICATED=TRUE
1055+#?*GREETER :50 START-SESSION
1056+#?GREETER :50 TERMINATE SIGNAL=15
1057+
1058+# Session starts
1059+#?SESSION :50 START USER=guest-.*
1060+#?XSERVER :50 ACCEPT-CONNECT
1061+#?SESSION :50 CONNECT-XSERVER
1062+
1063+# Cleanup
1064+#?*STOP-DAEMON
1065+# Don't know what order they will terminate
1066+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GUEST-ACCOUNT REMOVE USERNAME=guest-.*)
1067+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GUEST-ACCOUNT REMOVE USERNAME=guest-.*)
1068+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GUEST-ACCOUNT REMOVE USERNAME=guest-.*)
1069+#?RUNNER DAEMON-EXIT STATUS=0
1070
1071=== modified file 'tests/src/libsystem.c'
1072--- tests/src/libsystem.c 2012-08-17 16:13:57 +0000
1073+++ tests/src/libsystem.c 2012-08-29 21:17:17 +0000
1074@@ -26,6 +26,8 @@
1075 {
1076 char *service_name;
1077 char *user;
1078+ char *authtok;
1079+ char *ruser;
1080 char *tty;
1081 char **envlist;
1082 struct pam_conv conversation;
1083@@ -435,6 +437,8 @@
1084
1085 handle->service_name = strdup (service_name);
1086 handle->user = user ? strdup (user) : NULL;
1087+ handle->authtok = NULL;
1088+ handle->ruser = NULL;
1089 handle->tty = NULL;
1090 handle->conversation.conv = conversation->conv;
1091 handle->conversation.appdata_ptr = conversation->appdata_ptr;
1092@@ -473,6 +477,68 @@
1093
1094 if (pamh == NULL)
1095 return PAM_SYSTEM_ERR;
1096+
1097+ if (strcmp (pamh->service_name, "test-remote") == 0)
1098+ {
1099+ int result;
1100+ struct pam_message **msg;
1101+ struct pam_response *resp = NULL;
1102+
1103+ msg = malloc (sizeof (struct pam_message *) * 1);
1104+ msg[0] = malloc (sizeof (struct pam_message));
1105+ msg[0]->msg_style = PAM_PROMPT_ECHO_ON;
1106+ msg[0]->msg = "remote-login:";
1107+ result = pamh->conversation.conv (1, (const struct pam_message **) msg, &resp, pamh->conversation.appdata_ptr);
1108+ free (msg[0]);
1109+ free (msg);
1110+ if (result != PAM_SUCCESS)
1111+ return result;
1112+
1113+ if (resp == NULL)
1114+ return PAM_CONV_ERR;
1115+ if (resp[0].resp == NULL)
1116+ {
1117+ free (resp);
1118+ return PAM_CONV_ERR;
1119+ }
1120+
1121+ if (pamh->ruser)
1122+ free (pamh->ruser);
1123+ pamh->ruser = strdup (resp[0].resp);
1124+ free (resp[0].resp);
1125+ free (resp);
1126+
1127+ msg = malloc (sizeof (struct pam_message *) * 1);
1128+ msg[0] = malloc (sizeof (struct pam_message));
1129+ msg[0]->msg_style = PAM_PROMPT_ECHO_OFF;
1130+ msg[0]->msg = "remote-password:";
1131+ result = pamh->conversation.conv (1, (const struct pam_message **) msg, &resp, pamh->conversation.appdata_ptr);
1132+ free (msg[0]);
1133+ free (msg);
1134+ if (result != PAM_SUCCESS)
1135+ return result;
1136+
1137+ if (resp == NULL)
1138+ return PAM_CONV_ERR;
1139+ if (resp[0].resp == NULL)
1140+ {
1141+ free (resp);
1142+ return PAM_CONV_ERR;
1143+ }
1144+
1145+ if (pamh->authtok)
1146+ free (pamh->authtok);
1147+ pamh->authtok = strdup (resp[0].resp);
1148+ free (resp[0].resp);
1149+ free (resp);
1150+
1151+ password_matches = strcmp (pamh->ruser, "remote-user") == 0 && strcmp (pamh->authtok, "password") == 0;
1152+
1153+ if (password_matches)
1154+ return PAM_SUCCESS;
1155+ else
1156+ return PAM_AUTH_ERR;
1157+ }
1158
1159 /* Prompt for username */
1160 if (pamh->user == NULL)
1161@@ -738,7 +804,15 @@
1162 case PAM_USER:
1163 *item = pamh->user;
1164 return PAM_SUCCESS;
1165-
1166+
1167+ case PAM_AUTHTOK:
1168+ *item = pamh->authtok;
1169+ return PAM_SUCCESS;
1170+
1171+ case PAM_RUSER:
1172+ *item = pamh->ruser;
1173+ return PAM_SUCCESS;
1174+
1175 case PAM_USER_PROMPT:
1176 *item = LOGIN_PROMPT;
1177 return PAM_SUCCESS;
1178@@ -911,6 +985,10 @@
1179 free (pamh->service_name);
1180 if (pamh->user)
1181 free (pamh->user);
1182+ if (pamh->authtok)
1183+ free (pamh->authtok);
1184+ if (pamh->ruser)
1185+ free (pamh->ruser);
1186 if (pamh->tty)
1187 free (pamh->tty);
1188 free (pamh);
1189
1190=== modified file 'tests/src/test-gobject-greeter.c'
1191--- tests/src/test-gobject-greeter.c 2012-08-17 15:57:54 +0000
1192+++ tests/src/test-gobject-greeter.c 2012-08-29 21:17:17 +0000
1193@@ -65,6 +65,11 @@
1194 lightdm_greeter_authenticate_as_guest (greeter);
1195 g_free (r);
1196
1197+ r = g_strdup_printf ("GREETER %s AUTHENTICATE-REMOTE SESSION=", getenv ("DISPLAY"));
1198+ if (g_str_has_prefix (request, r))
1199+ lightdm_greeter_authenticate_remote (greeter, request + strlen (r), NULL);
1200+ g_free (r);
1201+
1202 r = g_strdup_printf ("GREETER %s RESPOND TEXT=\"", getenv ("DISPLAY"));
1203 if (g_str_has_prefix (request, r))
1204 {
1205
1206=== modified file 'tests/src/test-python-greeter'
1207--- tests/src/test-python-greeter 2012-03-20 05:47:56 +0000
1208+++ tests/src/test-python-greeter 2012-08-29 21:17:17 +0000
1209@@ -45,6 +45,10 @@
1210 if request.startswith (r):
1211 greeter.authenticate (request[len(r):])
1212
1213+ r = 'GREETER %s AUTHENTICATE-REMOTE SESSION=' % os.getenv ('DISPLAY')
1214+ if request.startswith (r):
1215+ greeter.authenticate_remote (request[len(r):], None)
1216+
1217 r = 'GREETER %s AUTHENTICATE-GUEST' % os.getenv ('DISPLAY')
1218 if request == r:
1219 greeter.authenticate_as_guest ()
1220
1221=== modified file 'tests/src/test-qt-greeter.cpp'
1222--- tests/src/test-qt-greeter.cpp 2012-03-20 05:42:02 +0000
1223+++ tests/src/test-qt-greeter.cpp 2012-08-29 21:17:17 +0000
1224@@ -68,6 +68,11 @@
1225 greeter->authenticateAsGuest ();
1226 g_free (r);
1227
1228+ r = g_strdup_printf ("GREETER %s AUTHENTICATE-REMOTE SESSION=", getenv ("DISPLAY"));
1229+ if (g_str_has_prefix (request, r))
1230+ greeter->authenticateRemote (request + strlen (r), NULL);
1231+ g_free (r);
1232+
1233 r = g_strdup_printf ("GREETER %s RESPOND TEXT=\"", getenv ("DISPLAY"));
1234 if (g_str_has_prefix (request, r))
1235 {
1236
1237=== modified file 'tests/src/test-runner.c'
1238--- tests/src/test-runner.c 2012-08-17 18:40:47 +0000
1239+++ tests/src/test-runner.c 2012-08-29 21:17:17 +0000
1240@@ -1138,6 +1138,7 @@
1241 g_string_append (command_line, " --debug");
1242 g_string_append_printf (command_line, " --cache-dir %s/cache", temp_dir);
1243 g_string_append_printf (command_line, " --xsessions-dir=%s/usr/share/xsessions", temp_dir);
1244+ g_string_append_printf (command_line, " --remote-sessions-dir=%s/usr/share/remote-sessions", temp_dir);
1245 g_string_append_printf (command_line, " --xgreeters-dir=%s/usr/share/xgreeters", temp_dir);
1246
1247 g_print ("Start daemon with command: PATH=%s LD_PRELOAD=%s LD_LIBRARY_PATH=%s LIGHTDM_TEST_ROOT=%s DBUS_SESSION_BUS_ADDRESS=%s %s\n",
1248@@ -1302,6 +1303,8 @@
1249 /* Copy over the greeter files */
1250 if (system (g_strdup_printf ("cp -r %s/xsessions %s/usr/share", DATADIR, temp_dir)))
1251 perror ("Failed to copy xsessions");
1252+ if (system (g_strdup_printf ("cp -r %s/remote-sessions %s/usr/share", DATADIR, temp_dir)))
1253+ perror ("Failed to copy remote sessions");
1254 if (system (g_strdup_printf ("cp -r %s/xgreeters %s/usr/share", DATADIR, temp_dir)))
1255 perror ("Failed to copy xgreeters");
1256
1257
1258=== added file 'tests/test-login-gobject-remote-session'
1259--- tests/test-login-gobject-remote-session 1970-01-01 00:00:00 +0000
1260+++ tests/test-login-gobject-remote-session 2012-08-29 21:17:17 +0000
1261@@ -0,0 +1,2 @@
1262+#!/bin/sh
1263+./src/dbus-env ./src/test-runner login-remote-session test-gobject-greeter
1264
1265=== added file 'tests/test-login-python-remote-session'
1266--- tests/test-login-python-remote-session 1970-01-01 00:00:00 +0000
1267+++ tests/test-login-python-remote-session 2012-08-29 21:17:17 +0000
1268@@ -0,0 +1,2 @@
1269+#!/bin/sh
1270+./src/dbus-env ./src/test-runner login-remote-session test-python-greeter
1271
1272=== added file 'tests/test-login-qt-remote-session'
1273--- tests/test-login-qt-remote-session 1970-01-01 00:00:00 +0000
1274+++ tests/test-login-qt-remote-session 2012-08-29 21:17:17 +0000
1275@@ -0,0 +1,2 @@
1276+#!/bin/sh
1277+./src/dbus-env ./src/test-runner login-remote-session test-qt-greeter

Subscribers

People subscribed via source and target branches