summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2012-08-21 17:40:47 +1200
committerRobert Ancell <robert.ancell@canonical.com>2012-08-21 17:40:47 +1200
commit909b576f956fd36ff50e8ee500dac04ff074c34b (patch)
treee55bfb8cd1f395ab6d668e5cda7b7b674577f8bf
parent40e9874b5ce72d9de46f5a18251bfe283a76df13 (diff)
downloadlightdm-909b576f956fd36ff50e8ee500dac04ff074c34b.tar.gz
Add some tests and more work on remote sessions
-rw-r--r--src/Makefile.am1
-rw-r--r--src/greeter.c11
-rw-r--r--src/lightdm.c10
-rw-r--r--tests/Makefile.am8
-rw-r--r--tests/data/remote-sessions/test-remote.desktop5
-rw-r--r--tests/scripts/login-remote-session.conf43
-rw-r--r--tests/src/libsystem.c67
-rw-r--r--tests/src/test-gobject-greeter.c5
-rwxr-xr-xtests/src/test-python-greeter4
-rw-r--r--tests/src/test-qt-greeter.cpp5
-rw-r--r--tests/src/test-runner.c3
-rwxr-xr-xtests/test-login-gobject-remote-session2
-rwxr-xr-xtests/test-login-python-remote-session2
-rwxr-xr-xtests/test-login-qt-remote-session2
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