From d356c2696c3044d4b81690830558a3ecd0f3427c Mon Sep 17 00:00:00 2001 From: Thorsten Kukuk Date: Wed, 19 Nov 2008 15:03:53 +0000 Subject: Relevant BUGIDs: Purpose of commit: fix Commit summary: --------------- Revert wrong commitment --- modules/pam_env/pam_env.c | 150 ++++++++++++++++++++-------------------------- 1 file changed, 64 insertions(+), 86 deletions(-) (limited to 'modules') diff --git a/modules/pam_env/pam_env.c b/modules/pam_env/pam_env.c index 4d81f1c4..80a20cd6 100644 --- a/modules/pam_env/pam_env.c +++ b/modules/pam_env/pam_env.c @@ -11,9 +11,6 @@ #define DEFAULT_ETC_ENVFILE "/etc/environment" #define DEFAULT_READ_ENVFILE 1 -#define DEFAULT_USER_ENVFILE ".environment" -#define DEFAULT_USER_READ_ENVFILE 1 - #include "config.h" #include @@ -78,19 +75,16 @@ static char quote='Z'; /* argument parsing */ #define PAM_DEBUG_ARG 0x01 +#define PAM_NEW_CONF_FILE 0x02 +#define PAM_ENV_SILENT 0x04 +#define PAM_NEW_ENV_FILE 0x10 static int _pam_parse (const pam_handle_t *pamh, int argc, const char **argv, - char **conffile, char **envfile, int *readenv, - char **user_envfile, int *user_readenv) + const char **conffile, const char **envfile, int *readenv) { int ctrl=0; - *user_envfile = strdup (DEFAULT_USER_ENVFILE); - *envfile = strdup (DEFAULT_ETC_ENVFILE); - *readenv = DEFAULT_READ_ENVFILE; - *user_readenv = DEFAULT_USER_READ_ENVFILE; - *conffile = strdup (DEFAULT_CONF_FILE); /* step through arguments */ for (; argc-- > 0; ++argv) { @@ -100,54 +94,49 @@ _pam_parse (const pam_handle_t *pamh, int argc, const char **argv, if (!strcmp(*argv,"debug")) ctrl |= PAM_DEBUG_ARG; else if (!strncmp(*argv,"conffile=",9)) { - if (*argv+9 == '\0') { - pam_syslog(pamh, LOG_ERR, - "conffile= specification missing argument - ignored"); - } else { - free(*conffile); - *conffile = x_strdup(9+*argv); - D(("new Configuration File: %s", *conffile)); - } + *conffile = 9 + *argv; + if (**conffile != '\0') { + D(("new Configuration File: %s", *conffile)); + ctrl |= PAM_NEW_CONF_FILE; + } else { + pam_syslog(pamh, LOG_ERR, + "conffile= specification missing argument - ignored"); + } } else if (!strncmp(*argv,"envfile=",8)) { - if (*argv+8 == '\0') { - pam_syslog (pamh, LOG_ERR, - "envfile= specification missing argument - ignored"); - } else { - free(*envfile); - *envfile = x_strdup(8+*argv); - D(("new Env File: %s", *envfile)); - } - } else if (!strncmp(*argv,"user_envfile=",13)) { - if (*argv+13 == '\0') { - pam_syslog (pamh, LOG_ERR, - "user_envfile= specification missing argument - ignored"); - } else { - free(*user_envfile); - *user_envfile = x_strdup(13+*argv); - D(("new User Env File: %s", *user_env_file)); - } + *envfile = 8 + *argv; + if (**envfile != '\0') { + D(("new Env File: %s", *envfile)); + ctrl |= PAM_NEW_ENV_FILE; + } else { + pam_syslog (pamh, LOG_ERR, + "envfile= specification missing argument - ignored"); + } } else if (!strncmp(*argv,"readenv=",8)) - *readenv = atoi(8+*argv); - else if (!strncmp(*argv,"user_readenv=",13)) - *user_readenv = atoi(13+*argv); + *readenv = atoi(8+*argv); else - pam_syslog(pamh, LOG_ERR, "unknown option: %s", *argv); + pam_syslog(pamh, LOG_ERR, "unknown option: %s", *argv); } return ctrl; } static int -_parse_config_file(pam_handle_t *pamh, char *file) +_parse_config_file(pam_handle_t *pamh, int ctrl, const char *conffile) { int retval; + const char *file; char buffer[BUF_SIZE]; FILE *conf; VAR Var, *var=&Var; + var->name=NULL; var->defval=NULL; var->override=NULL; D(("Called.")); - var->name=NULL; var->defval=NULL; var->override=NULL; + if (ctrl & PAM_NEW_CONF_FILE) { + file = conffile; + } else { + file = DEFAULT_CONF_FILE; + } D(("Config file name is: %s", file)); @@ -195,12 +184,18 @@ _parse_config_file(pam_handle_t *pamh, char *file) } static int -_parse_env_file(pam_handle_t *pamh, char *file) +_parse_env_file(pam_handle_t *pamh, int ctrl, const char *env_file) { int retval=PAM_SUCCESS, i, t; + const char *file; char buffer[BUF_SIZE], *key, *mark; FILE *conf; + if (ctrl & PAM_NEW_ENV_FILE) + file = env_file; + else + file = DEFAULT_ETC_ENVFILE; + D(("Env file name is: %s", file)); if ((conf = fopen(file,"r")) == NULL) { @@ -707,7 +702,7 @@ static int _define_var(pam_handle_t *pamh, VAR *var) pam_syslog(pamh, LOG_ERR, "out of memory"); return PAM_BUF_ERR; } - + retval = pam_putenv(pamh, envvar); _pam_drop(envvar); D(("Exit.")); @@ -756,60 +751,24 @@ pam_sm_setcred (pam_handle_t *pamh, int flags UNUSED, int argc, const char **argv) { int retval, ctrl, readenv=DEFAULT_READ_ENVFILE; - int user_readenv = DEFAULT_USER_READ_ENVFILE; - char *conf_file = NULL, *env_file = NULL, *user_env_file = NULL; - + const char *conf_file = NULL, *env_file = NULL; /* * this module sets environment variables read in from a file */ D(("Called.")); - ctrl = _pam_parse(pamh, argc, argv, &conf_file, &env_file, - &readenv, &user_env_file, &user_readenv); + ctrl = _pam_parse(pamh, argc, argv, &conf_file, &env_file, &readenv); - retval = _parse_config_file(pamh, conf_file); + retval = _parse_config_file(pamh, ctrl, conf_file); if(readenv && retval == PAM_SUCCESS) { - retval = _parse_env_file(pamh, env_file); + retval = _parse_env_file(pamh, ctrl, env_file); if (retval == PAM_IGNORE) retval = PAM_SUCCESS; } - if(user_readenv && retval == PAM_SUCCESS) { - char *envpath = NULL; - struct passwd *user_entry; - const char *username; - struct stat statbuf; - - username = _pam_get_item_byname(pamh, "PAM_USER"); - - user_entry = getpwnam(username); - if (!user_entry) { - pam_syslog(pamh, LOG_ERR, "No such user!?"); - } - else { - if (asprintf(&envpath, "%s/%s", user_entry->pw_dir, user_env_file) < 0) - { - pam_syslog(pamh, LOG_ERR, "Out of memory"); - free (conf_file); - free (env_file); - free (user_env_file); - return PAM_BUF_ERR; - } - if (stat(envpath, &statbuf) == 0) { - retval = _parse_config_file(pamh, envpath); - if (retval == PAM_IGNORE) - retval = PAM_SUCCESS; - } - free(envpath); - } - } - /* indicate success or failure */ - free (conf_file); - free (env_file); - free (user_env_file); D(("Exit.")); return retval; @@ -827,9 +786,28 @@ PAM_EXTERN int pam_sm_open_session (pam_handle_t *pamh, int flags UNUSED, int argc, const char **argv) { - /* Function was identical to pam_sm_setcred, so call it instead */ - D(("Called -- calling pam_sm_setcred instead...")); - return pam_sm_setcred(pamh, flags, argc, argv); + int retval, ctrl, readenv=DEFAULT_READ_ENVFILE; + const char *conf_file = NULL, *env_file = NULL; + + /* + * this module sets environment variables read in from a file + */ + + D(("Called.")); + ctrl = _pam_parse(pamh, argc, argv, &conf_file, &env_file, &readenv); + + retval = _parse_config_file(pamh, ctrl, conf_file); + + if(readenv && retval == PAM_SUCCESS) { + retval = _parse_env_file(pamh, ctrl, env_file); + if (retval == PAM_IGNORE) + retval = PAM_SUCCESS; + } + + /* indicate success or failure */ + + D(("Exit.")); + return retval; } PAM_EXTERN int -- cgit v1.2.3