Merge lp:~robert-ancell/lightdm/remote-sessions into lp:lightdm
- remote-sessions
- Merge into trunk
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 |
| Related bugs: |
| Reviewer | Review Type | Date Requested | Status |
|---|---|---|---|
| Michael Terry | 2012-08-29 | Approve on 2012-08-29 | |
|
Review via email:
|
|||
Commit Message
Description of the Change
To post a comment you must log in.
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 |

Sure, looks fine.