diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 8 | ||||
-rw-r--r-- | tests/data/remote-sessions/test-remote.desktop | 5 | ||||
-rw-r--r-- | tests/scripts/autologin-guest-logout.conf | 6 | ||||
-rw-r--r-- | tests/scripts/login-guest-logout.conf | 6 | ||||
-rw-r--r-- | tests/scripts/login-remote-session.conf | 50 | ||||
-rw-r--r-- | tests/src/libsystem.c | 80 | ||||
-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 |
13 files changed, 169 insertions, 9 deletions
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..60829d44 --- /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-session +X-LightDM-PAM-Service=test-remote diff --git a/tests/scripts/autologin-guest-logout.conf b/tests/scripts/autologin-guest-logout.conf index cb1146b5..51a6b9ac 100644 --- a/tests/scripts/autologin-guest-logout.conf +++ b/tests/scripts/autologin-guest-logout.conf @@ -28,12 +28,12 @@ autologin-guest=true # Logout of session #?*SESSION :50 LOGOUT -# Guest account removed -#?GUEST-ACCOUNT REMOVE USERNAME=guest-.* - # X server stops #?XSERVER :50 TERMINATE SIGNAL=15 +# Guest account removed +#?GUEST-ACCOUNT REMOVE USERNAME=guest-.* + # X server starts #?XSERVER :50 START #?XSERVER :50 INDICATE-READY diff --git a/tests/scripts/login-guest-logout.conf b/tests/scripts/login-guest-logout.conf index 27723626..1dcf3ceb 100644 --- a/tests/scripts/login-guest-logout.conf +++ b/tests/scripts/login-guest-logout.conf @@ -38,12 +38,12 @@ minimum-display-number=50 # Logout of session #?*SESSION :50 LOGOUT -# Guest account removed -#?GUEST-ACCOUNT REMOVE USERNAME=guest-.* - # X server stops #?XSERVER :50 TERMINATE SIGNAL=15 +# Guest account removed +#?GUEST-ACCOUNT REMOVE USERNAME=guest-.* + # X server starts #?XSERVER :50 START #?XSERVER :50 INDICATE-READY diff --git a/tests/scripts/login-remote-session.conf b/tests/scripts/login-remote-session.conf new file mode 100644 index 00000000..b24a89f8 --- /dev/null +++ b/tests/scripts/login-remote-session.conf @@ -0,0 +1,50 @@ +# +# 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 + +# Start remote authentication +#?*GREETER :50 AUTHENTICATE-REMOTE SESSION=test-remote + +# Guest account created +#?GUEST-ACCOUNT ADD USERNAME=guest-.* + +# Get remote credentials +#?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=guest-.* AUTHENTICATED=TRUE +#?*GREETER :50 START-SESSION +#?GREETER :50 TERMINATE SIGNAL=15 + +# Session starts +#?SESSION :50 START USER=guest-.* +#?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|GUEST-ACCOUNT REMOVE USERNAME=guest-.*) +#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GUEST-ACCOUNT REMOVE USERNAME=guest-.*) +#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GUEST-ACCOUNT REMOVE USERNAME=guest-.*) +#?RUNNER DAEMON-EXIT STATUS=0 diff --git a/tests/src/libsystem.c b/tests/src/libsystem.c index 855f668b..9e137339 100644 --- a/tests/src/libsystem.c +++ b/tests/src/libsystem.c @@ -26,6 +26,8 @@ struct pam_handle { char *service_name; char *user; + char *authtok; + char *ruser; char *tty; char **envlist; struct pam_conv conversation; @@ -435,6 +437,8 @@ pam_start (const char *service_name, const char *user, const struct pam_conv *co handle->service_name = strdup (service_name); handle->user = user ? strdup (user) : NULL; + handle->authtok = NULL; + handle->ruser = NULL; handle->tty = NULL; handle->conversation.conv = conversation->conv; handle->conversation.appdata_ptr = conversation->appdata_ptr; @@ -473,6 +477,68 @@ 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; + } + + if (pamh->authtok) + free (pamh->authtok); + pamh->authtok = strdup (resp[0].resp); + free (resp[0].resp); + free (resp); + + password_matches = strcmp (pamh->ruser, "remote-user") == 0 && strcmp (pamh->authtok, "password") == 0; + + if (password_matches) + return PAM_SUCCESS; + else + return PAM_AUTH_ERR; + } /* Prompt for username */ if (pamh->user == NULL) @@ -738,7 +804,15 @@ 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_AUTHTOK: + *item = pamh->authtok; + return PAM_SUCCESS; + + case PAM_RUSER: + *item = pamh->ruser; + return PAM_SUCCESS; + case PAM_USER_PROMPT: *item = LOGIN_PROMPT; return PAM_SUCCESS; @@ -911,6 +985,10 @@ pam_end (pam_handle_t *pamh, int pam_status) free (pamh->service_name); if (pamh->user) free (pamh->user); + if (pamh->authtok) + free (pamh->authtok); + 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 |