X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Facl%2Fldap_config.c;h=9bf01c1818f4c8f403865ffb6790dec8c248408f;hb=6821c9c1b67181b020f375bab7ac8061b0dcbec2;hp=da37fb97027638370904806aba70aeef27003061;hpb=99080678c43ac3ebf2076598884a3e472697fe6b;p=netatalk.git diff --git a/libatalk/acl/ldap_config.c b/libatalk/acl/ldap_config.c index da37fb97..9bf01c18 100644 --- a/libatalk/acl/ldap_config.c +++ b/libatalk/acl/ldap_config.c @@ -25,106 +25,63 @@ #include #include +#include #include #include +#include -#define LINESIZE 1024 - -/* Parse one line. Return result in pref and val */ -static int getpref(char *buf, char **R_pref, char **R_val) +void acl_ldap_freeconfig(void) { - char *p, *pref, *val; - - /* a little pre-processing to get rid of spaces and end-of-lines */ - p = buf; - while (p && isspace(*p)) - p++; - if (!p || (*p == '\0')) - return -1; - - if ((val = strchr(p, '=')) == NULL) - return -1; - while ((*val == '=') || (*val == ' ')) - val++; - if ((val = strtok(val, " \n")) == NULL) - return -1; - if ((val = strdup(val)) == NULL) - return -1; - if ((pref = strtok(p, " =")) == NULL) - return -1; - - *R_pref = pref; - *R_val = val; - return 0; + for (int i = 0; ldap_prefs[i].name != NULL; i++) { + if (ldap_prefs[i].intfromarray == 0 && ldap_prefs[i].strorint == 0) { + free(*((char **)(ldap_prefs[i].pref))); + *((char **)(ldap_prefs[i].pref)) = NULL; + } + ldap_prefs[i].valid = ldap_prefs[i].valid_save; + } } -/* Parse the afp_ldap.conf file */ -int acl_ldap_readconfig(char *name) +int acl_ldap_readconfig(dictionary *iniconfig) { int i, j; - FILE *f; - char buf[LINESIZE]; - char *pref, *val; + const char *val; - f = fopen(name,"r"); - if (!f) { - perror("fopen"); - return -1; + i = 0; + /* now see if its a correct pref */ + for (i = 0; ldap_prefs[i].name != NULL; i++) { + if ((val = atalk_iniparser_getstring(iniconfig, INISEC_GLOBAL, ldap_prefs[i].name, NULL))) { + /* check if we have pre-defined values */ + if (ldap_prefs[i].intfromarray == 0) { + /* no, its just a string */ + ldap_prefs[i].valid = 0; + if (ldap_prefs[i].strorint) + /* store as int */ + *((int *)(ldap_prefs[i].pref)) = atoi(val); + else + /* store string as string */ + *((const char **)(ldap_prefs[i].pref)) = strdup(val); + } else { + /* ok, we have string to int mapping for this pref + eg. "none", "simple", "sasl" map to 0, 128, 129 */ + for (j = 0; prefs_array[j].pref != NULL; j++) { + if ((strcmp(prefs_array[j].pref, ldap_prefs[i].name) == 0) + && (strcmp(prefs_array[j].valuestring, val) == 0)) { + ldap_prefs[i].valid = 0; + *((int *)(ldap_prefs[i].pref)) = prefs_array[j].value; + break; + } + } + } + } } - while (!feof(f)) { - /* read a line from file */ - if (!fgets(buf, LINESIZE, f) || buf[0] == '#') - continue; - - /* parse and return pref and value */ - if ((getpref(buf, &pref, &val)) != 0) - continue; - - i = 0; - /* now see if its a correct pref */ - while(ldap_prefs[i].pref != NULL) { - if ((strcmp(ldap_prefs[i].name, pref)) == 0) { - /* ok, found a valid pref */ - - /* check if we have pre-defined values */ - if (0 == ldap_prefs[i].intfromarray) { - /* no, its just a string */ - ldap_prefs[i].valid = 0; - if (0 == ldap_prefs[i].strorint) - /* store string as string */ - *((char **)(ldap_prefs[i].pref)) = val; - else - /* store as int */ - *((int *)(ldap_prefs[i].pref)) = atoi(val); - } else { - /* ok, we have string to int mapping for this pref - eg. "none", "simple", "sasl" map to 0, 128, 129 */ - j = 0; - while(prefs_array[j].pref != NULL) { - if (((strcmp(prefs_array[j].pref, pref)) == 0) && - ((strcmp(prefs_array[j].valuestring, val)) == 0)) { - ldap_prefs[i].valid = 0; - *((int *)(ldap_prefs[i].pref)) = prefs_array[j].value; - } - j++; - } /* while j*/ - } /* if else 0 == ldap_prefs*/ - break; - } /* if strcmp */ - i++; - } /* while i */ - if (ldap_prefs[i].pref == NULL) - LOG(log_error, logtype_afpd,"afp_ldap.conf: Unknown option: \"%s\"", pref); - } /* EOF */ - /* check if the config is sane and complete */ i = 0; ldap_config_valid = 1; while(ldap_prefs[i].pref != NULL) { if ( ldap_prefs[i].valid != 0) { - LOG(log_debug, logtype_afpd,"afp_ldap.conf: Missing option: \"%s\"", ldap_prefs[i].name); + LOG(log_debug, logtype_afpd,"LDAP: Missing option: \"%s\"", ldap_prefs[i].name); ldap_config_valid = 0; break; } @@ -133,16 +90,15 @@ int acl_ldap_readconfig(char *name) if (ldap_config_valid) { if (ldap_auth_method == LDAP_AUTH_NONE) - LOG(log_debug, logtype_afpd,"afp_ldap.conf: Using anonymous bind."); + LOG(log_debug, logtype_afpd,"LDAP: Using anonymous bind."); else if (ldap_auth_method == LDAP_AUTH_SIMPLE) - LOG(log_debug, logtype_afpd,"afp_ldap.conf: Using simple bind."); + LOG(log_debug, logtype_afpd,"LDAP: Using simple bind."); else { ldap_config_valid = 0; - LOG(log_error, logtype_afpd,"afp_ldap.conf: SASL not yet supported."); + LOG(log_error, logtype_afpd,"LDAP: SASL not yet supported."); } } else - LOG(log_info, logtype_afpd,"afp_ldap.conf: not used"); - fclose(f); + LOG(log_info, logtype_afpd,"LDAP: not used"); return 0; } #endif /* HAVE_LDAP */