diff --git a/mod_absec.c b/mod_absec.c
index c0bacbe..292f180 100644
--- a/mod_absec.c
+++ b/mod_absec.c
@@ -93,7 +93,76 @@ static int check_autorization(request_rec *r)
/* ToDo prompt user for input */
//};
//struct pam_conv conv = { function_conversation, 0 };
-struct pam_conv conv = { misc_conv, 0 };
+
+struct pam_response *reply;
+
+
+int converse(int n, const struct pam_message **msg,
+ struct pam_response **resp, void *data)
+{
+ *resp = reply;
+ return PAM_SUCCESS;
+
+
+ struct pam_response *aresp;
+ char buf[PAM_MAX_RESP_SIZE];
+ int i;
+
+ data = data;
+ if (n <= 0 || n > PAM_MAX_NUM_MSG)
+ return (PAM_CONV_ERR);
+ if ((aresp = calloc(n, sizeof *aresp)) == NULL)
+ return (PAM_BUF_ERR);
+ for (i = 0; i < n; ++i) {
+ aresp[i].resp_retcode = 0;
+ aresp[i].resp = NULL;
+ switch (msg[i]->msg_style) {
+ case PAM_PROMPT_ECHO_OFF:
+ aresp[i].resp = strdup("jlcyrpass01!");
+ //aresp[i].resp = strdup(getpass(msg[i]->msg));
+ if (aresp[i].resp == NULL)
+ goto fail;
+ break;
+ case PAM_PROMPT_ECHO_ON:
+ fputs(msg[i]->msg, stderr);
+ //if (fgets(buf, sizeof buf, stdin) == NULL)
+ // goto fail;
+ //aresp[i].resp = strdup(buf);
+ aresp[i].resp = strdup("jlcyrpass01!");
+ if (aresp[i].resp == NULL)
+ goto fail;
+ break;
+ case PAM_ERROR_MSG:
+ fputs(msg[i]->msg, stderr);
+ if (strlen(msg[i]->msg) > 0 &&
+ msg[i]->msg[strlen(msg[i]->msg) - 1] != '\n')
+ fputc('\n', stderr);
+ break;
+ case PAM_TEXT_INFO:
+ fputs(msg[i]->msg, stdout);
+ if (strlen(msg[i]->msg) > 0 &&
+ msg[i]->msg[strlen(msg[i]->msg) - 1] != '\n')
+ fputc('\n', stdout);
+ break;
+ default:
+ goto fail;
+ }
+ }
+ *resp = aresp;
+ return (PAM_SUCCESS);
+ fail:
+ for (i = 0; i < n; ++i) {
+ if (aresp[i].resp != NULL) {
+ memset(aresp[i].resp, 0, strlen(aresp[i].resp));
+ free(aresp[i].resp);
+ }
+ }
+ memset(aresp, 0, n * sizeof *aresp);
+ *resp = NULL;
+ return (PAM_CONV_ERR);
+}
+
+struct pam_conv conv = { converse, 0 };
////////////////////////////////////////////////////////////////
/* Main routine */
@@ -187,7 +256,7 @@ static int absec_handler_first(request_rec *r)
ap_rprintf(r, "Url: %s from %s \n
", r->filename, r->uri);
//ap_rprintf(r, "Headers Authorization: %s \n
", auth64);
//ap_rprintf(r, "User/Pass: %s/%s \n
", user, pass);
-
+
////////
// Get UID, GIDs for the user
/* Working example, but just UID not PW */
@@ -253,22 +322,30 @@ static int absec_handler_first(request_rec *r)
printf("Pam start failed\n");
exit(0);
}
- if((rret = pam_set_item( pamh, PAM_AUTHTOK, &pass)) == PAM_BUF_ERR) {
+/* if((rret = pam_set_item( pamh, PAM_AUTHTOK, &pass)) == PAM_BUF_ERR) {
return HTTP_BAD_REQUEST;
}
+*/
+
+ reply = (struct pam_response *)malloc(sizeof(struct pam_response));
+
+ // *** Get the password by any method, or maybe it was passed into this function.
+ reply[0].resp = strdup(pass);
+ reply[0].resp_retcode = 0;
+
+
if((rret = pam_authenticate(pamh, 0)) != PAM_SUCCESS) {
return HTTP_UNAUTHORIZED;
- printf("User auth failed\n"); exit(0);
+ printf("User auth failed\n");
+ exit(0);
}
if(pam_end(pamh, rret) != PAM_SUCCESS) {
//perror("pam_end");
pamh = NULL;
- return HTTP_INTERNAL_SERVER_ERROR;exit(1);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ exit(1);
}
-return HTTP_OK;
-
-
////////
/* Encrypt and compare shadow password */
@@ -303,6 +380,10 @@ return HTTP_OK;
ap_rprintf(r, "Fichier groupe
\r\n");
return (DECLINED);
}
+return HTTP_OK;
+
+
+
////////
/* Check supplemental groups */