pam_radius feature request: configurable password prompt (with patch)
David Richardson
david.richardson at utah.edu
Wed Aug 15 10:49:55 CEST 2012
Hi,
In my environment, I need to change the password prompt pam_radius gives
(I have two different pam modules using "Password: " as their prompt; it's
rather confusing).
I would like to make a feature request to allow configuration of the
password prompt via a config file.
I have attached a patch providing this feature (via the parameter
"password_prompt" in the pam config).
This patch is against pam_radius 1.3.17. It compiles and works on CentOS 6
x86_64.
Thanks,
DR
--
David Richardson <david.richardson at utah.edu>
Center for High Performance Computing at the University of Utah
-------------- next part --------------
diff -rupN pam_radius-1.3.17/pam_radius_auth.c pam_radius-1.3.17.password_prompt/pam_radius_auth.c
--- pam_radius-1.3.17/pam_radius_auth.c 2007-03-26 03:36:13.000000000 -0600
+++ pam_radius-1.3.17.password_prompt/pam_radius_auth.c 2012-08-15 02:29:43.000000000 -0600
@@ -69,6 +69,7 @@
/* internal data */
static CONST char *pam_module_name = "pam_radius_auth";
static char conf_file[BUFFER_SIZE]; /* configuration file */
+static char password_prompt[BUFFER_SIZE]; /* password prompt */
/* we need to save these from open_session to close_session, since
* when close_session will be called we won't be root anymore and
@@ -98,6 +99,7 @@ static int _pam_parse(int argc, CONST ch
memset(conf, 0, sizeof(radius_conf_t)); /* ensure it's initialized */
strcpy(conf_file, CONF_FILE);
+ strcpy(password_prompt, PASSWORD_PROMPT);
/*
* If either is not there, then we can't parse anything.
@@ -125,6 +127,52 @@ static int _pam_parse(int argc, CONST ch
} else if (!strncmp(*argv, "retry=", 6)) {
conf->retries = atoi(*argv+6);
+ } else if (!strncmp(*argv, "password_prompt=", 16)) {
+
+ /* There's three possibilities for the format of password_quote.
+ 1: Naked string. Save it for later display.
+ 2: Quoted single-word string. Trim quotes and save it.
+ 3: Quoted multi-word string. Trim opening quote. Append
+ spaces and additional arguments until we find closing quote.
+ */
+
+ if (strncmp(*argv+16,"\"",1)) {
+ /* No quotes found. We're done. */
+ strcpy(password_prompt,*argv+16);
+ } else {
+ /* Found an opening quote. Skip it. */
+ strcpy(password_prompt,*argv+17);
+
+ if (strchr(password_prompt, (int) '\"')) {
+ /* We found the closing quote. Remove it and go on. */
+ password_prompt[strlen(password_prompt)-1] = '\0';
+
+ } else {
+ /* If the current arg doesn't end with closing quote, we need to keep
+ appending argv to password_prompt until we find a closing quote.
+ Once we find it, strip it and go on.
+ */
+ int found=0;
+ while (!found) {
+ strcat(password_prompt, " ");
+ argc--; argv++;
+ strcat(password_prompt, *argv);
+
+ /* If entire arg is a close quote, the user wanted a trailing space */
+ if (!strcmp(*argv, "\"")) {
+ strcat(password_prompt, " ");
+ }
+
+ /* Trim trailing quotes */
+ while (strchr(password_prompt, (int) '\"')) {
+ password_prompt[strlen(password_prompt)-1] = '\0';
+ found=1;
+ }
+ }
+ }
+ }
+ DPRINT(LOG_DEBUG, "DEBUG: password_prompt specified: \"%s\"\n", password_prompt);
+
} else if (!strcmp(*argv, "localifdown")) {
conf->localifdown = 1;
@@ -1149,7 +1197,7 @@ pam_sm_authenticate(pam_handle_t *pamh,i
/* check to see if we send a NULL password the first time around */
if (!(ctrl & PAM_SKIP_PASSWD)) {
- retval = rad_converse(pamh, PAM_PROMPT_ECHO_OFF, "Password: ", &password);
+ retval = rad_converse(pamh, PAM_PROMPT_ECHO_OFF, password_prompt, &password);
PAM_FAIL_CHECK;
}
@@ -1446,7 +1494,7 @@ pam_sm_chauthtok(pam_handle_t *pamh, int
/* preliminary password change checks. */
if (flags & PAM_PRELIM_CHECK) {
if (!password) { /* no previous password: ask for one */
- retval = rad_converse(pamh, PAM_PROMPT_ECHO_OFF, "Password: ", &password);
+ retval = rad_converse(pamh, PAM_PROMPT_ECHO_OFF, password_prompt, &password);
PAM_FAIL_CHECK;
}
diff -rupN pam_radius-1.3.17/pam_radius_auth.h pam_radius-1.3.17.password_prompt/pam_radius_auth.h
--- pam_radius-1.3.17/pam_radius_auth.h 2007-03-25 23:35:31.000000000 -0600
+++ pam_radius-1.3.17.password_prompt/pam_radius_auth.h 2012-08-14 23:45:34.000000000 -0600
@@ -99,6 +99,7 @@ typedef struct radius_conf_t {
#ifndef CONF_FILE /* the configuration file holding the server secret */
#define CONF_FILE "/etc/raddb/server"
#endif /* CONF_FILE */
+#define PASSWORD_PROMPT "Password: "
#ifndef FALSE
#define FALSE 0
More information about the Freeradius-Devel
mailing list