diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-05-13 09:48:57 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-05-13 09:48:57 +0000 |
commit | 1a80b647d6d40f7ce39afb2575ea5d8f9766f9da (patch) | |
tree | 1b3b70b849f27b102623b29e0f71381c4ca67312 /pam_sql | |
parent | 993eff136613ba7964bd3747630cf06ced3d940c (diff) | |
download | pam-modules-1a80b647d6d40f7ce39afb2575ea5d8f9766f9da.tar.gz pam-modules-1a80b647d6d40f7ce39afb2575ea5d8f9766f9da.tar.bz2 |
Revamp build system. Add pam_ldaphome module.
* configure.ac: Test for ldap.
(AC_OUTPUT): Create pam_ldaphome/Makefile.
* acinclude.m4 (PM_ENABLE): Declare PAM_COND_<item>
conditional in addition to BUILD_PAM_<item> substitution
variable.
* Makefile.am (SUBDIRS): Include most modules via
conditionally defined Makefile variables.
* lib/graypam.h (gray_env): New struct.
(gray_env_get,gray_env_free,gray_env_read)
(gray_boolean_true_p): New protos.
* lib/env.c: New file.
* lib/Makefile.am (libgraypam_la_SOURCES): Add env.c
* pam_fshadow/Makefile.am: Remove BUILD_PAM_FSHADOW
substitution.
* pam_regex/Makefile.am: Remove BUILD_PAM_REGEX
substitution.
* pam_sql/pam_sql.c (free_config, boolean_true_p)
(read_config): Remove. Use gray_env_* functions
instead. All uses updated.
* pam_regex/pam_regex.c: Fix typo.
* pam_ldaphome/Makefile.am: New file.
git-svn-id: file:///svnroot/pam-modules/trunk@118 56984be4-0537-0410-a56c-fcb268c96130
Diffstat (limited to 'pam_sql')
-rw-r--r-- | pam_sql/pam_sql.c | 169 |
1 files changed, 9 insertions, 160 deletions
diff --git a/pam_sql/pam_sql.c b/pam_sql/pam_sql.c index 79aa355..dd136e3 100644 --- a/pam_sql/pam_sql.c +++ b/pam_sql/pam_sql.c @@ -141,44 +141,12 @@ _pam_get_password(pam_handle_t *pamh, char **password, const char *prompt) /* Configuration */ -typedef struct config_env env_t; -struct config_env { - env_t *next; - char *name; - char *value; -}; -static env_t *config_env; +static struct gray_env *config_env; char * gpam_sql_find_config(const char *name) { - env_t *env; - - for (env = config_env; env; env = env->next) - if (strcmp(env->name, name) == 0) - return env->value; - return NULL; -} - -static void -free_config() -{ - env_t *env = config_env; - while (env) { - env_t *next = env->next; - free(env->name); - free(env); - env = next; - } - config_env = NULL; -} - -static int -boolean_true_p(const char *value) -{ - return strcmp(value, "yes") == 0 - || strcmp(value, "true") == 0 - || strcmp(value, "t") == 0; + return gray_env_get(config_env, name); } int @@ -186,130 +154,10 @@ gpam_sql_check_boolean_config(const char *name, int defval) { const char *value = gpam_sql_find_config(name); if (value) - defval = boolean_true_p(value); + defval = gray_boolean_true_p(value); return defval; } -static int -read_config () -{ - FILE *fp; - char *p; - int rc = 0; - int line = 0; - char buf[128]; - gray_slist_t slist = NULL; - - fp = fopen (gpam_sql_config_file, "r"); - if (!fp) { - _pam_log(LOG_ERR, "cannot open configuration file `%s': %s", - gpam_sql_config_file, strerror (errno)); - return 1; - } - - config_env = NULL; - while (p = fgets (buf, sizeof buf, fp)) { - int len; - env_t *env; - - line++; - while (*p && isspace(*p)) - p++; - len = strlen(p); - if (len == 0) - continue; - if (p[len-1] != '\n') { - if (!slist) - slist = gray_slist_create(); - gray_slist_append(slist, p, len); - while (p = fgets(buf, sizeof buf, fp)) { - len = strlen(p); - gray_slist_append(slist, p, len); - if (p[len - 1] == '\n') - break; - } - gray_slist_append_char(slist, 0); - p = gray_slist_finish(slist); - len = strlen(p); - } - - p[len-1] = 0; - len = gray_trim_ws(p); - - if (*p == 0 || *p == '#') - continue; - - if (p[len-1] == '\\') { - int err = 0; - - /* Collect continuation lines */ - if (!slist) - slist = gray_slist_create(); - do { - gray_slist_append(slist, p, len - 1); - p = fgets (buf, sizeof buf, fp); - if (!p) - break; - line++; - len = strlen(p); - if (len == 0) - break; - if (p[len-1] != '\n') { - _pam_log(LOG_EMERG, - "%s:%d: string too long", - gpam_sql_config_file, line); - err = 1; - break; - } - p[len-1] = 0; - len = gray_trim_ws(p); - } while (p[len-1] == '\\'); - if (len) - gray_slist_append(slist, p, len); - gray_slist_append_char(slist, 0); - p = gray_slist_finish(slist); - if (err) - continue; - } - - env = malloc(sizeof *env); - if (!env) { - _pam_log(LOG_EMERG, "not enough memory"); - rc = 1; - break; - } - - env->name = strdup(p); - if (!env->name) { - _pam_log(LOG_EMERG, "not enough memory"); - free(env); - rc = 1; - break; - } - - for (p = env->name; *p && !isspace(*p); p++) - ; - if (*p) - *p++ = 0; - for (; *p && isspace(*p); p++) - ; - if (!*p) { - _pam_log(LOG_EMERG, "%s:%d: not enough fields", - gpam_sql_config_file, line); - free(env->name); - free(env); - continue; - } - env->value = p; - env->next = config_env; - config_env = env; - } - - gray_slist_free(&slist); - fclose(fp); - return rc; -} - const char * gpam_sql_get_query(pam_handle_t *pamh, const char *name, gray_slist_t *pslist, @@ -364,7 +212,6 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) const char *username; char *password; int retval = PAM_AUTH_ERR; - gray_pam_init(PAM_SERVICE_ERR); /* parse arguments */ @@ -386,7 +233,7 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) return PAM_SERVICE_ERR; } - if (read_config()) + if (gray_env_read(gpam_sql_config_file, &config_env)) retval = PAM_SERVICE_ERR; else { gray_slist_t slist; @@ -399,7 +246,8 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) gray_slist_free(&slist); } - free_config(); + gray_env_free(config_env); + config_env = NULL; switch (retval) { case PAM_ACCT_EXPIRED: @@ -433,7 +281,7 @@ sql_session_mgmt(pam_handle_t *pamh, int flags, /* parse arguments */ _pam_parse(argc, argv); - if (read_config()) + if (gray_env_read(gpam_sql_config_file, &config_env)) retval = PAM_SERVICE_ERR; else { gray_slist_t slist; @@ -443,7 +291,8 @@ sql_session_mgmt(pam_handle_t *pamh, int flags, gray_slist_free(&slist); } - free_config(); + gray_env_free(config_env); + config_env = NULL; return retval; } |