aboutsummaryrefslogtreecommitdiff
path: root/pam_sql
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2012-05-13 09:48:57 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2012-05-13 09:48:57 +0000
commit1a80b647d6d40f7ce39afb2575ea5d8f9766f9da (patch)
tree1b3b70b849f27b102623b29e0f71381c4ca67312 /pam_sql
parent993eff136613ba7964bd3747630cf06ced3d940c (diff)
downloadpam-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.c169
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;
}

Return to:

Send suggestions and report system problems to the System administrator.