test-login-gobject-manual \
test-login-gobject-manual-previous-session \
test-login-gobject-no-password \
+ test-login-gobject-new-authtok \
test-login-gobject-pick-session \
test-login-gobject-previous-session \
test-login-gobject-wrong-password \
test-login-python-manual \
test-login-python-manual-previous-session \
test-login-python-no-password \
+ test-login-python-new-authtok \
test-login-python-previous-session \
test-login-python-wrong-password \
test-login-python-invalid-user \
test-login-qt-manual \
test-login-qt-manual-previous-session \
test-login-qt-no-password \
+ test-login-qt-new-authtok \
test-login-qt-previous-session \
test-login-qt-wrong-password \
test-login-qt-invalid-user \
scripts/login-logout.conf \
scripts/login-manual.conf \
scripts/login-manual-previous-session.conf \
+ scripts/login-new-authtok.conf \
scripts/login-no-password.conf \
scripts/login-pick-session.conf \
scripts/login-previous-session.conf \
--- /dev/null
+#
+# Check prompted to change password
+#
+
+[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
+
+# Log into account that requires as password change
+#?*GREETER :50 AUTHENTICATE USERNAME=new-authtok
+#?GREETER :50 SHOW-PROMPT TEXT="Enter new password:"
+#?*GREETER :50 RESPOND TEXT="New password"
+#?GREETER :50 AUTHENTICATION-COMPLETE USERNAME=new-authtok AUTHENTICATED=TRUE
+#?*GREETER :50 START-SESSION
+#?GREETER :50 TERMINATE SIGNAL=15
+
+# Session starts
+#?SESSION :50 START USER=new-authtok
+#?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
return PAM_PERM_DENIED;
if (strcmp (pamh->user, "expired") == 0)
return PAM_ACCT_EXPIRED;
+ if (strcmp (pamh->user, "new-authtok") == 0)
+ return PAM_NEW_AUTHTOK_REQD;
return PAM_SUCCESS;
}
int
pam_chauthtok (pam_handle_t *pamh, int flags)
{
+ struct passwd *entry;
+ int result;
+ struct pam_message **msg;
+ struct pam_response *resp = NULL;
+
if (pamh == NULL)
return PAM_SYSTEM_ERR;
+ 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 = "Enter new 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;
+ }
+
+ /* Update password database */
+ entry = getpwnam (pamh->user);
+ free (entry->pw_passwd);
+ entry->pw_passwd = resp[0].resp;
+ free (resp);
+
return PAM_SUCCESS;
}
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner login-new-authtok test-gobject-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner login-new-authtok test-python-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner login-new-authtok test-qt-greeter