/* Copyright (c) 2010, Dirk Krause All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above opyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Dirk Krause nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @file uaconf.c Useraud configuration reading. */ /** In the uaconf module. */ #define UACONF_C 1 #include "useraudi.h" $(trace-include) /** Data for one backend. */ typedef struct { char *name; /**< Backend type name. */ int type; /**< Backend type numeric. */ ua_be_fct_t *f; /**< Backend function. */ } USERAUD_BACKEND_DESCRIPTION; /** Backends available. */ static USERAUD_BACKEND_DESCRIPTION backends[] = { { "system", USERAUD_BE_SYS, uabesys } /* +++++ Insert further backends here. +++++ */ }; /** Number of backends in the \a backends array. */ static size_t n_backends = sizeof(backends)/sizeof(USERAUD_BACKEND_DESCRIPTION); /** @defgroup cmd Commands for configuration file. */ /*@{*/ /** Log file. */ static char *cmd_log_file[] = { "log", "file", NULL }; /** Log file level. */ static char *cmd_log_file_level[] = { "log", "file", "level", NULL }; /** Socket. */ static char *cmd_socket[] = { "socket", NULL }; /** Socket timeout. */ static char *cmd_socket_timeout[] = { "socket", "timeout", NULL }; /** Database. */ static char *cmd_database[] = { "database", NULL }; /** Cleanup interval. */ static char *cmd_cleanup_interval[] = { "cleanup", "interval", NULL }; /** Hash types. */ static char *cmd_hash_types[] = { "hash", "types", NULL }; /** Cookie time to live. */ static char *cmd_cookie_ttl[] = { "cookie", "ttl", NULL }; /** Maximum cookie length. */ static char *cmd_lgt_cookie[] = { "max", "cookie", "length", NULL }; /** Challenge time to live. */ static char *cmd_challenge_ttl[] = { "challenge", "ttl", NULL }; /** Faked user salt time to live. */ static char *cmd_faked_user_salt_ttl[] = { "faked", "user", "salt", "ttl", NULL }; /** Random seed file. */ static char *cmd_random_seed_file[] = { "random", "seed", "file", NULL }; /** Run as user. */ static char *cmd_run_as_user[] = { "run", "as", "user", NULL }; /** Run as group. */ static char *cmd_run_as_group[] = { "run", "as", "group", NULL }; /** Syslog level. */ static char *cmd_syslog_level[] = { "syslog", "level", NULL }; /** Report "no such user". */ static char *cmd_report_no_such_user[] = { "report", "no", "such", "user", NULL }; /** Password hash type. */ static char *cmd_password_hash_type[] = { "password", "hash", "type", NULL }; /** Exclude user. */ static char *cmd_exclude_user[] = { "exclude", "user", NULL }; /** Allow. */ static char *cmd_allow[] = { "allow", NULL }; /** Add attribute. */ static char *cmd_add_attribute[] = { "add", "attribute", NULL }; /** Map attribute. */ static char *cmd_map_attribute[] = { "map", "attribute", NULL }; /** Local user name test. */ static char *cmd_local_user_name_test[] = { "local", "user", "name", "test", NULL }; /** Net user name test. */ static char *cmd_net_user_name_test[] = { "net", "user", "name", "test", NULL }; /** Commands for options section. */ static char **cmds_options[] = { /* 0 */ cmd_log_file, /* 1 */ cmd_log_file_level, /* 2 */ cmd_socket, /* 3 */ cmd_socket_timeout, /* 4 */ cmd_database, /* 5 */ cmd_cleanup_interval, /* 6 */ cmd_hash_types, /* 7 */ cmd_cookie_ttl, /* 8 */ cmd_challenge_ttl, /* 9 */ cmd_faked_user_salt_ttl, /* 10 */ cmd_random_seed_file, /* 11 */ cmd_run_as_user, /* 12 */ cmd_run_as_group, /* 13 */ cmd_syslog_level, /* 14 */ cmd_report_no_such_user, /* 15 */ cmd_allow, /* 16 */ cmd_lgt_cookie, /* 17 */ cmd_local_user_name_test, /* 18 */ cmd_net_user_name_test, NULL }; /** Commands for backends section. */ static char **cmds_backend[] = { /* 0 */ cmd_password_hash_type, /* 1 */ cmd_exclude_user, /* 2 */ cmd_add_attribute, /* 3 */ cmd_map_attribute, NULL }; /** Section titles. */ static char *section_titles[] = { "options", "backend", NULL }; /*@}*/ /** Log levels. */ static char *log_levels[] = { "none", "panic", "fatal", "error", "warning", "info", "progress", "debug", NULL }; /** Hash types. */ static char *hash_types[] = { "sha-512", "sha-384", "sha-256", "sha-224", "ripemd-160", "sha-1", "md5", "crypt", NULL }; /** Subtypes for crypt hash. */ static char *crypt_hash_sub_types[] = { /* 0 */ "des", /* 1 */ "big", /* 2 */ "bigcrypt", /* 3 */ "md5", /* 4 */ "$1$", /* 5 */ "blowfish", /* 6 */ "$2a$", /* 7 */ "sha-256", /* 8 */ "$5$", /* 9 */ "sha-512", /* 10 */ "$6$", NULL }; void uac_close DK_P1(UAC *,u) { UAB *b; UAPEER *p; $? "+ uac_close" if(u) { if(u->s_allow) { if(u->i_allow) { dksto_it_reset(u->i_allow); while((p = (UAPEER *)dksto_it_next(u->i_allow)) != NULL) { $? ". delete peer %08lx/%08lx", ntohl(p->ip), ntohl(p->mask) dk_delete(p); } dksto_it_close(u->i_allow); } dksto_close(u->s_allow); } u->s_allow = NULL; u->i_allow = NULL; if(u->s_be) { if(u->i_be) { dksto_it_reset(u->i_be); while((b = dksto_it_next(u->i_be)) != NULL) { $? ". delete backend %d", b->bet uab_delete(u, b); } dksto_it_close(u->i_be); } dksto_close(u->s_be); } u->s_be = NULL; u->i_be = NULL; if(u->sockname) { dk_delete(u->sockname); } u->sockname = NULL; if(u->logname) { dk_delete(u->logname); } u->logname = NULL; if(u->dbname) { dk_delete(u->dbname); } u->dbname = NULL; if(u->seedname) { dk_delete(u->seedname); } u->seedname = NULL; if(u->run_as_user) { dk_delete(u->run_as_user); } u->run_as_user = NULL; if(u->run_as_group) { dk_delete(u->run_as_group); } u->run_as_group = NULL; dk_delete(u); } $? "- uac_close" } /** Initialize UAC structure. @param u Structure to initialize. */ static void uac__init DK_P1(UAC *,u) { $? "= uac__init" u->sockname = NULL; u->logname = NULL; u->dbname = NULL; u->seedname = NULL; u->run_as_user = NULL; u->run_as_group = NULL; u->s_be = NULL; u->i_be = NULL; u->s_allow = NULL; u->i_allow = NULL; u->ttl_challenge = 300UL; u->ttl_cookie = 300UL; u->ttl_salt = 31536000UL; u->sec_cleanup = 86400UL; u->to_socket = 5UL; u->last_cleanup = (time_t)0UL; u->ll_file = DK_LOG_LEVEL_INFO; u->ll_syslog = DK_LOG_LEVEL_ERROR; u->username_test = 0; u->hash_types = 0 #if DK_HAVE_OPENSSL_SHA_H && DK_HAVE_SHA512 | USERAUD_HASH_SHA512 #endif #if DK_HAVE_OPENSSL_SHA_H && DK_HAVE_SHA384 | USERAUD_HASH_SHA384 #endif #if DK_HAVE_OPENSSL_SHA_H && DK_HAVE_SHA256 | USERAUD_HASH_SHA256 #endif #if DK_HAVE_OPENSSL_SHA_H && DK_HAVE_SHA224 | USERAUD_HASH_SHA224 #endif #if DK_HAVE_OPENSSL_RIPEMD_H | USERAUD_HASH_RIPEMD160 #endif #if DK_HAVE_OPENSSL_SHA_H | USERAUD_HASH_SHA1 #endif #if DK_HAVE_OPENSSL_MD5_H | USERAUD_HASH_MD5 #endif #if DK_HAVE_CRYPT_H | USERAUD_HASH_CRYPT #endif ; u->f_no_such = 0x00; } UAC * uac_open DK_P2(char *,fn, int,tp) { UAC *back = NULL; /* Function result. */ UAB *uab = NULL; /* Current backend to modify. */ FILE *fipo = NULL; /* Configuration file. */ int st = 0; /* Current section type. */ int so = 0; /* Flag: Syntax ok. */ int have_error = 0; /* Flag: Error occured. */ int ac = 0; /* Action to take. */ unsigned long lineno; /* Line number in file. */ char *p1; /* Start of string. */ char *p2; /* Start of value. */ char *p3; /* Next part of value. */ char *p4; /* Copy of user name to exclude. */ char *parts[16]; /* Parts of the key. */ size_t n_p; /* Number of parts in parts. */ int have_sll = 0; /* Flag: Have syslog level. */ int have_rns = 0; /* Flag: Have report no such user. */ int have_ll_f = 0; /* Flag: Have file log level. */ int have_fus = 0; /* Flag: Have faked user salt ttl. */ int have_cli = 0; /* Flag: Have cleanup interval. */ int have_cttl = 0; /* Flag: Have cookie ttl. */ int have_mcl = 0; /* Flag: Have max cookie length. */ int have_cht = 0; /* Flag: Have challenge ttl. */ int have_sot = 0; /* Flag: Have socket timeout. */ int ll = 0; /* Log level. */ unsigned nb = 0; /* Number of backends. */ unsigned long ul; /* Processing of configuration entries. */ UAB_API uabapi; /* Communication with backends. */ int backend_found; /* Number of backends found. */ UAP *uap; /* User authentication property. */ char buffer[USERAUD_LINESIZE]; $? "+ uac_open \"%s\" %d", TR_STR(fn), tp if(fn) { $? ". fn ok" lineno = 0UL; back = dk_new(UAC,1); if(back) { $? ". back ok" uac__init(back); fipo = fopen(fn, "r"); if(fipo) { $? ". fopen ok" lineno = 0UL; while((!(have_error)) && fgets(buffer, sizeof(buffer), fipo)) { lineno++; p1 = dkstr_start(buffer, NULL); if(p1) { dkstr_chomp(p1, NULL); $? ". line %lu \"%s\"", lineno, p1 if(*p1 != '#') { so = 0; if(*p1 == '[') { $? ". start of section" st = 0; uab = NULL; p2 = dkstr_chr(p1, ']'); if(p2) { $? ". ok" *p2 = '\0'; p1++; p1 = dkstr_start(p1, NULL); if(p1) { $? ". section name ok" p2 = dkstr_next(p1, NULL); if(p2) { $? ". argument after name" if(strcmp(p1, section_titles[1]) == 0) { so = 1; st = 1; $? ". backend" if(tp == 1) { size_t i; ua_be_fct_t *fptr; USERAUD_BACKEND_DESCRIPTION *beptr; $? ". searching for backend \"%s\"", p2 beptr = backends; fptr = NULL; tp = -1; for(i = 0; ((i < n_backends) && (fptr == NULL)); i++) { if(strcmp(beptr->name, p2) == 0) { fptr = beptr->f; tp = beptr->type; i = n_backends; } beptr++; } if((fptr != NULL) && (tp > -1)) { if(!(back->s_be)) { back->s_be = dksto_open(0); if(back->s_be) { back->i_be = dksto_it_open(back->s_be); if(!(back->i_be)) { have_error = 1; $? "! memory" dksto_close(back->s_be); back->s_be = NULL; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { $? "! memory" have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } if((back->s_be) && (back->i_be)) { uab = uab_new(back, nb, tp, fptr, fn, lineno); if(uab) { if(!dksto_add(back->s_be, (void *)uab)) { uab_delete(back, uab); uab = NULL; have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { $? "! memory" have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { $? "! backend \"%s\" not found", p2 so = 0; } } } else { $? "! unknown section type" } } else { $? ". no argument after name" if(strcmp(p1, section_titles[0]) == 0) { so = 1; st = 0; $? ". options section" } else { $? "! unknown section type" } } } else { $? "! missing section name" have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 12 ); } } else { $? "! syntax error" have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 12 ); } } else { $? ". section contents" p2 = dkstr_chr(p1, '='); if(p2) { $? ". value" *(p2++) = '\0'; p2 = dkstr_start(p2, NULL); if(p2) { $? ". value" dkstr_chomp(p1, NULL); dkstr_chomp(p2, NULL); for(n_p = 0; n_p < 16; n_p++) { parts[n_p] = NULL; } n_p = dkstr_explode(parts, 15, p1, NULL); if(n_p > 0) { $? ". key has text" switch(st) { case 1: { $? ". backend line" if(tp == 1) { if(uab) { ac = dkstr_find_multi_part_cmd(parts,cmds_backend,0); if(ac >= 0) { $? ". action found" so = 1; switch(ac) { case 0: { $? ". hash type" p3 = dkstr_next(p2, NULL); switch(dkstr_array_index(hash_types, p2, 0)) { case 0: { uab->ht = USERAUD_HASH_SHA512; } break; case 1: { uab->ht = USERAUD_HASH_SHA384; } break; case 2: { uab->ht = USERAUD_HASH_SHA256; } break; case 3: { uab->ht = USERAUD_HASH_SHA224; } break; case 4: { uab->ht = USERAUD_HASH_RIPEMD160; } break; case 5: { uab->ht = USERAUD_HASH_SHA1; } break; case 6: { uab->ht = USERAUD_HASH_MD5; } break; case 7: { uab->ht = USERAUD_HASH_CRYPT; uab->st = 0; if(p3) { int action; action = dkstr_array_index( crypt_hash_sub_types, p3, 0 ); switch(action) { case 0: { uab->st = USERAUD_HASHSUB_CRYPT_DES; } break; case 1: case 2: { uab->st = USERAUD_HASHSUB_CRYPT_BIG; } break; case 3: case 4: { uab->st = USERAUD_HASHSUB_CRYPT_MD5; } break; case 5: case 6: { uab->st = USERAUD_HASHSUB_CRYPT_BLOWFISH; } break; case 7: case 8: { uab->st = USERAUD_HASHSUB_CRYPT_SHA256; } break; case 9: case 10: { uab->st = USERAUD_HASHSUB_CRYPT_SHA512; } break; default: { so = 0; } break; } } } break; default: { $? "! unknown hash type" so = 0; } break; } } break; case 1: { $? ". exclude user" while(p2) { p3 = dkstr_next(p2, NULL); p4 = dkstr_dup(p2); if(p4) { if(!dksto_add(uab->s_ex, (void *)p4)) { dk_delete(p4); have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } p2 = p3; } } break; case 2: { int maj, min; if(!(uab->s_a)) { uab->s_a = dksto_open(0); if(uab->s_a) { uab->i_a = dksto_it_open(uab->s_a); } } if((uab->s_a) && (uab->i_a)) { p3 = dkstr_next(p2, NULL); if(p3) { p4 = dkstr_next(p3, NULL); if(p4) { if(sscanf(p2, "%d", &maj) == 1) { if(sscanf(p3, "%d", &min) == 1) { uap = uau_property_new(maj, min, p4); if(uap) { if(!dksto_add(uab->s_a,(void *)uap)) { uau_property_delete(uap); have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { have_error = 1; so = 0; } } else { have_error = 1; so = 0; } } else { have_error = 1; so = 0; } } else { have_error = 1; so = 0; } } else { have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } break; case 3: { int maj, min; if(!(uab->s_m)) { uab->s_m = dksto_open(0); if(uab->s_m) { uab->i_m = dksto_it_open(uab->s_m); } } if((uab->s_m) && (uab->i_m)) { p3 = dkstr_next(p2, NULL); if(p3) { p4 = dkstr_next(p3, NULL); if(p4) { if(sscanf(p2, "%d", &maj) == 1) { if(sscanf(p3, "%d", &min) == 1) { uap = uau_property_new(maj, min, p4); if(uap) { if(!dksto_add(uab->s_m, (void *)uap)) { have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { so = 0; have_error = 1; } } else { so = 0; have_error = 1; } } else { so = 0; have_error = 1; } } else { so = 0; have_error = 1; } } else { have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } break; } } else { $? ". probably backend-specific line" if(uab->f) { uabapi.a.c = UA_API_CONFLINE; uabapi.a.t = parts; uabapi.a.v = p2; (*(uab->f))(back, (void *)uab, &uabapi); if(uabapi.r.s) { so = 1; } else { have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 22 ); } } } } } else { $? ". useraudi does not care about be" so = 1; } } break; default: { $? ". options line" ac = dkstr_find_multi_part_cmd(parts,cmds_options,0); if(ac >= 0) { $? ". action found" so = 1; switch(ac) { case 0: { // log file if(tp == 1) { if(back->logname) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { back->logname = dkstr_dup(p2); if(!(back->logname)) { have_error = 1; $? "! memory" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } } } break; case 1: { // log file level int ll; if(tp == 1) { if(have_ll_f) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { ll = dkstr_array_index(log_levels, p2, 0); if(ll > -1) { back->ll_file = ll; } else { so = 0; } have_ll_f = 1; } } } break; case 2: { // socket if(back->sockname) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { back->sockname = dkstr_dup(p2); if(!(back->sockname)) { have_error = 1; $? "! memory" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } } break; case 3: { // socket timeout if(tp == 1) { if(have_sot) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { have_sot = 1; if(sscanf(p2, "%lu", &ul) == 1) { back->to_socket = ul; } else { so = 0; $? "! syntax" } } } } break; case 4: { // database if(tp == 1) { if(back->dbname) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { back->dbname = dkstr_dup(p2); if(!(back->dbname)) { have_error = 1; $? "! memory" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } } } break; case 5: { // cleanup interval if(tp == 1) { if(have_cli) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { have_cli = 1; if(sscanf(p2, "%lu", &ul) == 1) { back->sec_cleanup = ul; } else { so = 0; $? "! syntax" } } } } break; case 6: { // hash types back->hash_types = 0; while(p2) { p3 = dkstr_next(p2, NULL); switch(dkstr_array_index(hash_types, p2, 0)) { case 0: { #if DK_HAVE_OPENSSL_SHA_H && DK_HAVE_SHA512 back->hash_types |= USERAUD_HASH_SHA512; #endif } break; case 1: { #if DK_HAVE_OPENSSL_SHA_H && DK_HAVE_SHA384 back->hash_types |= USERAUD_HASH_SHA384; #endif } break; case 2: { #if DK_HAVE_OPENSSL_SHA_H && DK_HAVE_SHA256 back->hash_types |= USERAUD_HASH_SHA256; #endif } break; case 3: { #if DK_HAVE_OPENSSL_SHA_H && DK_HAVE_SHA224 back->hash_types |= USERAUD_HASH_SHA224; #endif } break; case 4: { #if DK_HAVE_OPENSSL_RIPEMD_H back->hash_types |= USERAUD_HASH_RIPEMD160; #endif } break; case 5: { #if DK_HAVE_OPENSSL_SHA_H back->hash_types |= USERAUD_HASH_SHA1; #endif } break; case 6: { #if DK_HAVE_OPENSSL_MD5_H back->hash_types |= USERAUD_HASH_MD5; #endif } break; case 7: { #if DK_HAVE_CRYPT_H back->hash_types |= USERAUD_HASH_CRYPT; #endif } break; } p2 = p3; } } break; case 7: { // cookie ttl if(tp == 1) { if(have_cttl) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { if(sscanf(p2, "%lu", &ul) == 1) { back->ttl_cookie = ul; } else { so = 0; $? "! syntax" } have_cttl = 1; } } } break; case 8: { // challenge ttl if(tp == 1) { if(have_cht) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { have_cht = 1; if(sscanf(p2, "%lu", &ul) == 1) { back->ttl_challenge = ul; } else { so = 0; $? "! syntax" } } } } break; case 9: { // faked user salt ttl if(tp == 1) { if(have_fus) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { if(sscanf(p2, "%lu", &ul) == 1) { back->ttl_salt = ul; } else { so = 0; $? "! not a number" } have_fus = 1; } } } break; case 10: { // random seed file if(tp == 1) { if(back->seedname) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { back->seedname = dkstr_dup(p2); if(!(back->seedname)) { have_error = 1; $? "! memory" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } } } break; case 11: { // run as user if(tp == 1) { if(back->run_as_user) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { back->run_as_user = dkstr_dup(p2); if(!(back->run_as_user)) { have_error = 1; $? "! memory" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } } } break; case 12: { // run as group if(tp == 1) { if(back->run_as_group) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { back->run_as_group = dkstr_dup(p2); if(!(back->run_as_group)) { have_error = 1; $? "! memory" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } } } break; case 13: { // syslog level if(have_sll) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { ll = dkstr_array_index(log_levels, p2, 0); if(ll > -1) { back->ll_syslog = ll; } else { so = 0; $? "! log level" } have_sll = 1; } } break; case 14: { // report no such user if(tp == 1) { if(have_rns) { have_error = 1; $? "! redefined" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { have_rns = 1; if(dkstr_is_on(p2)) { back->f_no_such = 0x01; } else { back->f_no_such = 0x00; } if(!dkstr_is_bool(p2)) { so = 0; $? "! not a bool" } } } } break; case 15: { // allow if(tp == 0) { unsigned long i, m, n; int j; m = 0xFFFFFFFFUL; p3 = dkstr_chr(p2, '/'); if(p3) { *(p3++) = '\0'; i = uatcs_dotted_string_to_ip(p2); p3 = dkstr_start(p3, NULL); if(p3) { if(dkstr_chr(p3, '.')) { m = uatcs_dotted_string_to_ip(p3); } else { if(sscanf(p3, "%d", &j) == 1) { if(j >= 0) { if(j <= 32) { m = 0UL; n = 0x80000000UL; while(j-- > 0) { m |= n; n = n / 2UL; } } else { so = 0; } } else { so = 0; } } else { so = 0; } } } else { so = 0; } } if(so) { i = uatcs_dotted_string_to_ip(p2); UAPEER *p; if(!(back->s_allow)) { back->s_allow = dksto_open(0); if(back->s_allow) { back->i_allow = dksto_it_open( back->s_allow ); if(!(back->i_allow)) { have_error = 1; $? "! memory" dksto_close(back->s_allow); back->s_allow = NULL; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { have_error = 1; $? "! memory" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } if((back->s_allow) && (back->i_allow)) { p = dk_new(UAPEER,1); if(p) { i = htonl(i); m = htonl(m); p->ip = i; p->mask = m; if(!dksto_add(back->s_allow, (void *)p)) { have_error = 1; $? "! memory" dk_delete(p); ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { $? "! memory" have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } } } } break; case 16: { if(tp == 1) { if(have_mcl) { have_error = 1; ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 13 ); } else { if(sscanf(p2, "%lu", &ul) == 1) { back->lgt_cookie = ul; } else { so = 0; $? "! syntax" } have_mcl = 1; } } } break; case 17: { if(tp == 1) { if(dkstr_is_on(p2)) { back->username_test = 1; } else { back->username_test = 0; if(!dkstr_is_bool(p2)) { so = 1; } } } } break; case 18: { // Nothing to do } break; } } else { $? "! illegal key" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 53 ); } } break; } } else { $? "! no text in key" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 54 ); } } else { $? "! missing value" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 55 ); } } else { $? "! missing value" ualog_file_lineno_1(back, DK_LOG_LEVEL_ERROR, fn, lineno, 55); } } if(!so) { $? "! Syntax error" have_error = 1; ualog_file_lineno_1(back, DK_LOG_LEVEL_ERROR, fn, lineno, 12); } } } } fclose(fipo); switch(tp) { case 1: { // useraud if(!(back->logname)) { ualog_1(back, DK_LOG_LEVEL_WARNING, 17); back->logname = dkstr_dup( uatcs_get_default_log_file_name() ); if(!(back->logname)) { ualog_1(back, DK_LOG_LEVEL_WARNING, 14); } } if(!(back->sockname)) { ualog_1(back, DK_LOG_LEVEL_WARNING, 16); back->sockname = dkstr_dup( uatcs_get_default_socket_name() ); if(!(back->sockname)) { ualog_1(back, DK_LOG_LEVEL_ERROR, 14); have_error = 1; } } if(!(back->dbname)) { ualog_1(back, DK_LOG_LEVEL_WARNING, 18); back->dbname = dkstr_dup( uatcs_get_default_database_name() ); if(!(back->dbname)) { ualog_1(back, DK_LOG_LEVEL_ERROR, 14); have_error = 1; } } if(!(back->seedname)) { ualog_1(back, DK_LOG_LEVEL_WARNING, 19); back->seedname = dkstr_dup( uatcs_get_default_random_seed() ); if(!(back->seedname)) { ualog_1(back, DK_LOG_LEVEL_WARNING, 14); } } backend_found = 0; if((back->s_be) && (back->i_be)) { dksto_it_reset(back->i_be); while((uab = (UAB *)dksto_it_next(back->i_be)) != NULL) { if(uab->f) { uabapi.a.c = UA_API_CHECK_CONFIG; uabapi.a.f = 0; uabapi.a.t = NULL; uabapi.a.v = NULL; uabapi.a.i = NULL; (*(uab->f))(back, (void *)uab, &uabapi); if(uabapi.r.s) { backend_found++; } else { have_error = 1; ualog_1(back, DK_LOG_LEVEL_ERROR, 23); } } else { have_error = 1; ualog_1(back, DK_LOG_LEVEL_ERROR, 24); } } } if(!backend_found) { have_error = 1; ualog_1(back, DK_LOG_LEVEL_ERROR, 25); } } break; default: { // useraudi if(!(back->sockname)) { ualog_1(back, DK_LOG_LEVEL_WARNING, 16); back->sockname = dkstr_dup( uatcs_get_default_socket_name() ); if(!(back->sockname)) { ualog_1(back, DK_LOG_LEVEL_ERROR, 14); have_error = 1; } } } break; } } else { $? "! fopen" } if(have_error) { ualog_3(back, DK_LOG_LEVEL_ERROR, 10, 11, fn); uac_close(back); back = NULL; } } else { $? "! memory" ualog_file_lineno_1( back, DK_LOG_LEVEL_ERROR, fn, lineno, 14 ); } } else { $? "! fn" } if(back) { ualog_3(back, DK_LOG_LEVEL_INFO, 8, 9, fn); } $? "- uac_close %s", TR_PTR(back) return back; }