summaryrefslogtreecommitdiff
path: root/tests/src/libsystem.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/libsystem.c')
-rw-r--r--tests/src/libsystem.c80
1 files changed, 79 insertions, 1 deletions
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);