]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Add some tests and more work on remote sessions
authorRobert Ancell <robert.ancell@canonical.com>
Tue, 21 Aug 2012 05:40:47 +0000 (17:40 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Tue, 21 Aug 2012 05:40:47 +0000 (17:40 +1200)
14 files changed:
src/Makefile.am
src/greeter.c
src/lightdm.c
tests/Makefile.am
tests/data/remote-sessions/test-remote.desktop [new file with mode: 0644]
tests/scripts/login-remote-session.conf [new file with mode: 0644]
tests/src/libsystem.c
tests/src/test-gobject-greeter.c
tests/src/test-python-greeter
tests/src/test-qt-greeter.cpp
tests/src/test-runner.c
tests/test-login-gobject-remote-session [new file with mode: 0755]
tests/test-login-python-remote-session [new file with mode: 0755]
tests/test-login-qt-remote-session [new file with mode: 0755]

index 4cf2863ab88b94c86d9e3e6ad64576cd81e17496..d34c82691aff4ac586f23a66ad09d43f314e1830 100644 (file)
@@ -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 = \
index ad0cf557789dd26a3411bcd49c2a19c56d24622f..00303ac030d37fc7b85dbcbdc84eca5cc4248a81 100644 (file)
@@ -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);
index dce89f54ee3d90955fe9fdf0889f3d24bbf561df..04fb59ef1152772b5e5e2c43f08370de747ee59f 100644 (file)
@@ -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);
index 7d87c3abe1f7a5bab607f13d6885bc39abe6ce6b..9e41117e57d67104d5e534637e3e6d9f55105c26 100644 (file)
@@ -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 (file)
index 0000000..4d48633
--- /dev/null
@@ -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 (file)
index 0000000..6b9b67a
--- /dev/null
@@ -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
index 855f668b64a2f5f2d0deac63700b1643a834844b..e6038d420feedb5f7a7a5db24d298172dc122d15 100644 (file)
@@ -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);
index f5057cfb9f462e8d636108e81398d0d4907edcea..e114dd18d31d9d6cecb2d0da3f19c520911694f3 100644 (file)
@@ -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))
     {
index fe26af39047cd2f910bdae70919ce1c512e3ef13..87aa6c7a1fc165579b365a4ea77fb20664e53063 100755 (executable)
@@ -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 ()
index 49b42e08544352bc9205ada66af8ed38b03510e1..1019a6ab7e04f98194c3c6fd38f0f844afdb8f9e 100644 (file)
@@ -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))
     {
index 516a67882ff84b0ae6d59ed488d38f126620ee2d..80560158627c7e762de5d8567ae86c6cf78fe99b 100644 (file)
@@ -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 (executable)
index 0000000..833ca04
--- /dev/null
@@ -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 (executable)
index 0000000..4ac1a6f
--- /dev/null
@@ -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 (executable)
index 0000000..427afe4
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner login-remote-session test-qt-greeter