diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2012-08-21 17:40:47 +1200 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2012-08-21 17:40:47 +1200 |
commit | 909b576f956fd36ff50e8ee500dac04ff074c34b (patch) | |
tree | e55bfb8cd1f395ab6d668e5cda7b7b674577f8bf | |
parent | 40e9874b5ce72d9de46f5a18251bfe283a76df13 (diff) | |
download | lightdm-909b576f956fd36ff50e8ee500dac04ff074c34b.tar.gz |
Add some tests and more work on remote sessions
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/greeter.c | 11 | ||||
-rw-r--r-- | src/lightdm.c | 10 | ||||
-rw-r--r-- | tests/Makefile.am | 8 | ||||
-rw-r--r-- | tests/data/remote-sessions/test-remote.desktop | 5 | ||||
-rw-r--r-- | tests/scripts/login-remote-session.conf | 43 | ||||
-rw-r--r-- | tests/src/libsystem.c | 67 | ||||
-rw-r--r-- | tests/src/test-gobject-greeter.c | 5 | ||||
-rwxr-xr-x | tests/src/test-python-greeter | 4 | ||||
-rw-r--r-- | tests/src/test-qt-greeter.cpp | 5 | ||||
-rw-r--r-- | tests/src/test-runner.c | 3 | ||||
-rwxr-xr-x | tests/test-login-gobject-remote-session | 2 | ||||
-rwxr-xr-x | tests/test-login-python-remote-session | 2 | ||||
-rwxr-xr-x | tests/test-login-qt-remote-session | 2 |
14 files changed, 161 insertions, 7 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 4cf2863a..d34c8269 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -86,6 +86,7 @@ lightdm_CFLAGS = \ -DRUN_DIR=\"$(localstatedir)/run/lightdm\" \ -DCACHE_DIR=\"$(localstatedir)/cache/lightdm\" \ -DXSESSIONS_DIR=\"$(datadir)/xsessions\" \ + -DREMOTE_SESSIONS_DIR=\"$(datadir)/remote-sessions\" \ -DXGREETERS_DIR=\"$(datadir)/xgreeters\" lightdm_LDADD = \ diff --git a/src/greeter.c b/src/greeter.c index ad0cf557..00303ac0 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -18,6 +18,7 @@ #include "greeter.h" #include "ldm-marshal.h" +#include "configuration.h" enum { CONNECTED, @@ -357,7 +358,7 @@ get_remote_session_service (const gchar *session_name) GKeyFile *session_desktop_file; gboolean result; const gchar *c; - gchar *filename, *path, *service = NULL; + gchar *remote_sessions_dir, *filename, *path, *service = NULL; GError *error = NULL; /* Validate session name doesn't contain directory separators */ @@ -370,12 +371,14 @@ get_remote_session_service (const gchar *session_name) /* Load the session file */ session_desktop_file = g_key_file_new (); filename = g_strdup_printf ("%s.desktop", session_name); - path = g_build_filename (REMOTE_SESSION_DIR, filename); + remote_sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory"); + path = g_build_filename (remote_sessions_dir, filename, NULL); + g_free (remote_sessions_dir); g_free (filename); result = g_key_file_load_from_file (session_desktop_file, path, G_KEY_FILE_NONE, &error); - g_free (path); if (error) - g_debug ("Failed to load session file %s: %s", filename, error->message); + g_debug ("Failed to load session file %s: %s", path, error->message); + g_free (path); g_clear_error (&error); if (result) service = g_key_file_get_string (session_desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-PAM-Service", NULL); diff --git a/src/lightdm.c b/src/lightdm.c index dce89f54..04fb59ef 100644 --- a/src/lightdm.c +++ b/src/lightdm.c @@ -817,6 +817,7 @@ main (int argc, char **argv) gboolean test_mode = FALSE; gchar *pid_path = "/var/run/lightdm.pid"; gchar *xsessions_dir = NULL; + gchar *remote_sessions_dir = NULL; gchar *xgreeters_dir = NULL; gchar *config_dir; gchar *log_dir = NULL; @@ -843,6 +844,9 @@ main (int argc, char **argv) { "xsessions-dir", 0, 0, G_OPTION_ARG_STRING, &xsessions_dir, /* Help string for command line --xsessions-dir flag */ N_("Directory to load X sessions from"), "DIRECTORY" }, + { "remote-sessions-dir", 0, 0, G_OPTION_ARG_STRING, &remote_sessions_dir, + /* Help string for command line --remote-sessions-dir flag */ + N_("Directory to load remote sessions from"), "DIRECTORY" }, { "xgreeters-dir", 0, 0, G_OPTION_ARG_STRING, &xgreeters_dir, /* Help string for command line --xgreeters-dir flag */ N_("Directory to load X greeters from"), "DIRECTORY" }, @@ -952,6 +956,7 @@ main (int argc, char **argv) /* Always use absolute directories as child processes may run from different locations */ xsessions_dir = path_make_absolute (xsessions_dir); + remote_sessions_dir = path_make_absolute (remote_sessions_dir); xgreeters_dir = path_make_absolute (xgreeters_dir); /* If not running as root write output to directories we control */ @@ -1019,6 +1024,8 @@ main (int argc, char **argv) g_free (default_cache_dir); if (!config_has_key (config_get_instance (), "LightDM", "xsessions-directory")) config_set_string (config_get_instance (), "LightDM", "xsessions-directory", XSESSIONS_DIR); + if (!config_has_key (config_get_instance (), "LightDM", "remote-sessions-directory")) + config_set_string (config_get_instance (), "LightDM", "remote-sessions-directory", REMOTE_SESSIONS_DIR); if (!config_has_key (config_get_instance (), "LightDM", "xgreeters-directory")) config_set_string (config_get_instance (), "LightDM", "xgreeters-directory", XGREETERS_DIR); @@ -1035,6 +1042,9 @@ main (int argc, char **argv) if (xsessions_dir) config_set_string (config_get_instance (), "LightDM", "xsessions-directory", xsessions_dir); g_free (xsessions_dir); + if (remote_sessions_dir) + config_set_string (config_get_instance (), "LightDM", "remote-sessions-directory", remote_sessions_dir); + g_free (remote_sessions_dir); if (xgreeters_dir) config_set_string (config_get_instance (), "LightDM", "xgreeters-directory", xgreeters_dir); g_free (xgreeters_dir); diff --git a/tests/Makefile.am b/tests/Makefile.am index 7d87c3ab..9e41117e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -70,6 +70,7 @@ TESTS = \ test-login-gobject-guest-no-setup-script \ test-login-gobject-guest-fail-setup-script \ test-login-gobject-guest-logout \ + test-login-gobject-remote-session \ test-login-python \ test-login-python-manual \ test-login-python-manual-previous-session \ @@ -91,6 +92,7 @@ TESTS = \ test-login-python-guest-no-setup-script \ test-login-python-guest-fail-setup-script \ test-login-python-guest-logout \ + test-login-python-remote-session \ test-login-session-crash \ test-login-xserver-crash \ test-home-dir-on-authenticate \ @@ -147,7 +149,8 @@ TESTS += \ test-login-qt-guest-disabled \ test-login-qt-guest-no-setup-script \ test-login-qt-guest-fail-setup-script \ - test-login-qt-guest-logout + test-login-qt-guest-logout \ + test-login-qt-remote-session endif EXTRA_DIST = \ @@ -214,8 +217,9 @@ EXTRA_DIST = \ scripts/login-pam.conf \ scripts/login-pick-session.conf \ scripts/login-previous-session.conf \ - scripts/login-two-factor.conf \ + scripts/login-remote-session.conf \ scripts/login-session-crash.conf \ + scripts/login-two-factor.conf \ scripts/login-wrong-password.conf \ scripts/login-xserver-crash.conf \ scripts/no-accounts-service.conf \ diff --git a/tests/data/remote-sessions/test-remote.desktop b/tests/data/remote-sessions/test-remote.desktop new file mode 100644 index 00000000..4d486335 --- /dev/null +++ b/tests/data/remote-sessions/test-remote.desktop @@ -0,0 +1,5 @@ +[Desktop Entry] +Name=Test Remote Session +Comment=LightDM remote test session +Exec=test-remote +X-LightDM-PAM-Service=test-remote diff --git a/tests/scripts/login-remote-session.conf b/tests/scripts/login-remote-session.conf new file mode 100644 index 00000000..6b9b67a8 --- /dev/null +++ b/tests/scripts/login-remote-session.conf @@ -0,0 +1,43 @@ +# +# Check can login without a username, and is prompted for one +# + +[LightDM] +minimum-display-number=50 + +#?RUNNER DAEMON-START + +# X server starts +#?XSERVER :50 START +#?XSERVER :50 INDICATE-READY + +# LightDM connects to X server +#?XSERVER :50 ACCEPT-CONNECT + +# Greeter starts +#?GREETER :50 START +#?XSERVER :50 ACCEPT-CONNECT +#?GREETER :50 CONNECT-XSERVER +#?GREETER :50 CONNECT-TO-DAEMON +#?GREETER :50 CONNECTED-TO-DAEMON + +#?*GREETER :50 AUTHENTICATE-REMOTE SESSION=test-remote +#?GREETER :50 SHOW-PROMPT TEXT="remote-login:" +#?*GREETER :50 RESPOND TEXT="remote-user" +#?GREETER :50 SHOW-PROMPT TEXT="remote-password:" +#?*GREETER :50 RESPOND TEXT="password" +#?GREETER :50 AUTHENTICATION-COMPLETE USERNAME=remote-user AUTHENTICATED=TRUE +#?*GREETER :50 START-SESSION +#?GREETER :50 TERMINATE SIGNAL=15 + +# Session starts +#?SESSION :50 START USER=remote-user +#?XSERVER :50 ACCEPT-CONNECT +#?SESSION :50 CONNECT-XSERVER + +# Cleanup +#?*STOP-DAEMON +# Don't know what order they will terminate +#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) +#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) +#?RUNNER DAEMON-EXIT STATUS=0 diff --git a/tests/src/libsystem.c b/tests/src/libsystem.c index 855f668b..e6038d42 100644 --- a/tests/src/libsystem.c +++ b/tests/src/libsystem.c @@ -26,6 +26,7 @@ struct pam_handle { char *service_name; char *user; + char *ruser; char *tty; char **envlist; struct pam_conv conversation; @@ -473,6 +474,64 @@ pam_authenticate (pam_handle_t *pamh, int flags) if (pamh == NULL) return PAM_SYSTEM_ERR; + + if (strcmp (pamh->service_name, "test-remote") == 0) + { + int result; + struct pam_message **msg; + struct pam_response *resp = NULL; + + msg = malloc (sizeof (struct pam_message *) * 1); + msg[0] = malloc (sizeof (struct pam_message)); + msg[0]->msg_style = PAM_PROMPT_ECHO_ON; + msg[0]->msg = "remote-login:"; + result = pamh->conversation.conv (1, (const struct pam_message **) msg, &resp, pamh->conversation.appdata_ptr); + free (msg[0]); + free (msg); + if (result != PAM_SUCCESS) + return result; + + if (resp == NULL) + return PAM_CONV_ERR; + if (resp[0].resp == NULL) + { + free (resp); + return PAM_CONV_ERR; + } + + if (pamh->ruser) + free (pamh->ruser); + pamh->ruser = strdup (resp[0].resp); + free (resp[0].resp); + free (resp); + + msg = malloc (sizeof (struct pam_message *) * 1); + msg[0] = malloc (sizeof (struct pam_message)); + msg[0]->msg_style = PAM_PROMPT_ECHO_OFF; + msg[0]->msg = "remote-password:"; + result = pamh->conversation.conv (1, (const struct pam_message **) msg, &resp, pamh->conversation.appdata_ptr); + free (msg[0]); + free (msg); + if (result != PAM_SUCCESS) + return result; + + if (resp == NULL) + return PAM_CONV_ERR; + if (resp[0].resp == NULL) + { + free (resp); + return PAM_CONV_ERR; + } + + password_matches = strcmp (pamh->ruser, "remote-user") == 0 && strcmp (resp[0].resp, "password") == 0; + free (resp[0].resp); + free (resp); + + if (password_matches) + return PAM_SUCCESS; + else + return PAM_AUTH_ERR; + } /* Prompt for username */ if (pamh->user == NULL) @@ -738,7 +797,11 @@ pam_get_item (const pam_handle_t *pamh, int item_type, const void **item) case PAM_USER: *item = pamh->user; return PAM_SUCCESS; - + + case PAM_RUSER: + *item = pamh->ruser; + return PAM_SUCCESS; + case PAM_USER_PROMPT: *item = LOGIN_PROMPT; return PAM_SUCCESS; @@ -911,6 +974,8 @@ pam_end (pam_handle_t *pamh, int pam_status) free (pamh->service_name); if (pamh->user) free (pamh->user); + if (pamh->ruser) + free (pamh->ruser); if (pamh->tty) free (pamh->tty); free (pamh); diff --git a/tests/src/test-gobject-greeter.c b/tests/src/test-gobject-greeter.c index f5057cfb..e114dd18 100644 --- a/tests/src/test-gobject-greeter.c +++ b/tests/src/test-gobject-greeter.c @@ -65,6 +65,11 @@ request_cb (const gchar *request) lightdm_greeter_authenticate_as_guest (greeter); g_free (r); + r = g_strdup_printf ("GREETER %s AUTHENTICATE-REMOTE SESSION=", getenv ("DISPLAY")); + if (g_str_has_prefix (request, r)) + lightdm_greeter_authenticate_remote (greeter, request + strlen (r), NULL); + g_free (r); + r = g_strdup_printf ("GREETER %s RESPOND TEXT=\"", getenv ("DISPLAY")); if (g_str_has_prefix (request, r)) { diff --git a/tests/src/test-python-greeter b/tests/src/test-python-greeter index fe26af39..87aa6c7a 100755 --- a/tests/src/test-python-greeter +++ b/tests/src/test-python-greeter @@ -45,6 +45,10 @@ def request_cb (channel, condition): if request.startswith (r): greeter.authenticate (request[len(r):]) + r = 'GREETER %s AUTHENTICATE-REMOTE SESSION=' % os.getenv ('DISPLAY') + if request.startswith (r): + greeter.authenticate_remote (request[len(r):], None) + r = 'GREETER %s AUTHENTICATE-GUEST' % os.getenv ('DISPLAY') if request == r: greeter.authenticate_as_guest () diff --git a/tests/src/test-qt-greeter.cpp b/tests/src/test-qt-greeter.cpp index 49b42e08..1019a6ab 100644 --- a/tests/src/test-qt-greeter.cpp +++ b/tests/src/test-qt-greeter.cpp @@ -68,6 +68,11 @@ request_cb (const gchar *request) greeter->authenticateAsGuest (); g_free (r); + r = g_strdup_printf ("GREETER %s AUTHENTICATE-REMOTE SESSION=", getenv ("DISPLAY")); + if (g_str_has_prefix (request, r)) + greeter->authenticateRemote (request + strlen (r), NULL); + g_free (r); + r = g_strdup_printf ("GREETER %s RESPOND TEXT=\"", getenv ("DISPLAY")); if (g_str_has_prefix (request, r)) { diff --git a/tests/src/test-runner.c b/tests/src/test-runner.c index 516a6788..80560158 100644 --- a/tests/src/test-runner.c +++ b/tests/src/test-runner.c @@ -1138,6 +1138,7 @@ run_lightdm () g_string_append (command_line, " --debug"); g_string_append_printf (command_line, " --cache-dir %s/cache", temp_dir); g_string_append_printf (command_line, " --xsessions-dir=%s/usr/share/xsessions", temp_dir); + g_string_append_printf (command_line, " --remote-sessions-dir=%s/usr/share/remote-sessions", temp_dir); g_string_append_printf (command_line, " --xgreeters-dir=%s/usr/share/xgreeters", temp_dir); 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", @@ -1302,6 +1303,8 @@ main (int argc, char **argv) /* Copy over the greeter files */ if (system (g_strdup_printf ("cp -r %s/xsessions %s/usr/share", DATADIR, temp_dir))) perror ("Failed to copy xsessions"); + if (system (g_strdup_printf ("cp -r %s/remote-sessions %s/usr/share", DATADIR, temp_dir))) + perror ("Failed to copy remote sessions"); if (system (g_strdup_printf ("cp -r %s/xgreeters %s/usr/share", DATADIR, temp_dir))) perror ("Failed to copy xgreeters"); diff --git a/tests/test-login-gobject-remote-session b/tests/test-login-gobject-remote-session new file mode 100755 index 00000000..833ca04c --- /dev/null +++ b/tests/test-login-gobject-remote-session @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner login-remote-session test-gobject-greeter diff --git a/tests/test-login-python-remote-session b/tests/test-login-python-remote-session new file mode 100755 index 00000000..4ac1a6f6 --- /dev/null +++ b/tests/test-login-python-remote-session @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner login-remote-session test-python-greeter diff --git a/tests/test-login-qt-remote-session b/tests/test-login-qt-remote-session new file mode 100755 index 00000000..427afe47 --- /dev/null +++ b/tests/test-login-qt-remote-session @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner login-remote-session test-qt-greeter |