X-Git-Url: https://git.sesse.net/?p=itkacl;a=blobdiff_plain;f=itkacl-2.1%2Fitkacl.c;fp=itkacl-2.0%2Fitkacl.c;h=1ebd3a096fec2c24299b3b2f97a24d114ac4b287;hp=e373eb38090370bfc60db65ebe003e115254655e;hb=66f114e2e5b127115cc127ea23865371f1bea90d;hpb=19417083de9c8b30ac8b590690783b11413e2c58 diff --git a/itkacl-2.0/itkacl.c b/itkacl-2.1/itkacl.c similarity index 61% rename from itkacl-2.0/itkacl.c rename to itkacl-2.1/itkacl.c index e373eb3..1ebd3a0 100644 --- a/itkacl-2.0/itkacl.c +++ b/itkacl-2.1/itkacl.c @@ -9,19 +9,101 @@ #include #include #include +#include +#include #include -#define BASE_ZONE "itkacl.samfundet.no" +struct itkacl_config { + char nszone[256]; +}; + +#define CONFIG_FILENAME "/etc/itkacl.conf" + +static int itkacl_read_config(const char * const filename, + struct itkacl_config *config, + char *errmsg, size_t errmsg_size) +{ + FILE *fp; + int lineno = 0; + + strcpy(config->nszone, ""); + + fp = fopen(CONFIG_FILENAME, "r"); + if (fp == NULL) { + if (errmsg) + snprintf(errmsg, errmsg_size, "%s: %s", + CONFIG_FILENAME, strerror(errno)); + return -1; + } + + while (!feof(fp)) { + char line[256], arg[256], *ptr; + + if (fgets(line, sizeof(line), fp) == NULL) { + break; + } + ++lineno; + + /* Remove trailing newlines and then comments. */ + ptr = strchr(line, '\n'); + if (ptr != NULL) + *ptr = 0; + + ptr = strchr(line, '\r'); + if (ptr != NULL) + *ptr = 0; + + ptr = strchr(line, '#'); + if (ptr != NULL) + *ptr = 0; + + /* Remove trailing whitespace, if any. */ + ptr = line + strlen(line) - 1; + while (ptr >= line && isspace(*ptr)) + *ptr-- = 0; + + /* Skip lines that now ended up blank. */ + if (line[0] == 0) + continue; + + if (sscanf(line, "zone %255s", arg) == 1) { + strcpy(config->nszone, arg); + continue; + } + + if (errmsg) + snprintf(errmsg, errmsg_size, "%s: Could not parse line %d", + CONFIG_FILENAME, lineno); + fclose(fp); + return -1; + } + + if (strlen(config->nszone) == 0) { + if (errmsg) + snprintf(errmsg, errmsg_size, "%s: Missing 'zone' directive", + CONFIG_FILENAME); + fclose(fp); + return -1; + } + + fclose(fp); + return 0; +} int itkacl_check(const char * const realm, const char * const user, char *errmsg, size_t errmsg_size) { + struct itkacl_config config; struct hostent he, *he_ptr; int ret, host_errno; const char *ptr; - char nszone[256] = BASE_ZONE; + char nszone[256]; char temp[256], ns_temp[1024]; + if (itkacl_read_config(CONFIG_FILENAME, &config, errmsg, errmsg_size) != 0) { + return -1; + } + if (realm[0] != '/') { if (errmsg) snprintf(errmsg, errmsg_size, "Invalid realm '%s' (missing leading /)", @@ -59,6 +141,7 @@ int itkacl_check(const char * const realm, const char * const user, /* traverse the realm entry by entry from the root, * creating a DNS zone name as we go */ + strcpy(nszone, config.nszone); ptr = realm; while (*ptr) { /* copy all characters to next / or end of string */