struct s_auth *init_userdb(void) { FILE *fp = open_config_file(cs_user); if (!fp) return NULL; struct s_auth *authptr = NULL; int32_t tag = 0, nr = 0, expired = 0, disabled = 0; char *token; struct s_auth *account = NULL; struct s_auth *probe = NULL; if (!cs_malloc(&token, MAXLINESIZE)) return NULL; while (fgets(token, MAXLINESIZE, fp)) { int32_t l; void *ptr; if ((l=strlen(trim(token))) < 3) continue; if (token[0] == '[' && token[l-1] == ']') { token[l - 1] = 0; tag = streq("account", strtolower(token + 1)); if (!cs_malloc(&ptr, sizeof(struct s_auth))) break; if (account) account->next = ptr; else authptr = ptr; account = ptr; account_set_defaults(account); nr++; continue; } if (!tag) continue; char *value = strchr(token, '='); if (!value) continue; *value++ = '\0'; // check for duplicate useraccounts and make the name unique if (streq(trim(strtolower(token)), "user")) { for(probe = authptr; probe; probe = probe->next){ if (!strcmp(probe->usr, trim(value))){ fprintf(stderr, "Warning: duplicate account '%s'\n", value); strncat(value, "_x", sizeof(probe->usr) - strlen(value) - 1); } } } chk_account(trim(strtolower(token)), trim(value), account); } free(token); fclose(fp); for(account = authptr; account; account = account->next){ if(account->expirationdate && account->expirationdate < time(NULL)) ++expired; if(account->disabled) ++disabled; } cs_log("userdb reloaded: %d accounts loaded, %d expired, %d disabled", nr, expired, disabled); return authptr; }
static void monitor_set_account(char *args){ struct s_auth *account; char delimiter[] = " ="; char *ptr, *saveptr1 = NULL; int32_t argidx, i, found; char *argarray[3]; static const char *token[]={"au", "sleep", "uniq", "monlevel", "group", "services", "betatunnel", "ident", "caid", "chid", "class", "hostname", "expdate", "keepalive", "disabled"}; int32_t tokencnt = sizeof(token)/sizeof(char *); char buf[256], tmp[64]; argidx = 0; found = 0; snprintf(tmp, sizeof(tmp), "%s",args); snprintf(buf, sizeof(buf), "[S-0000]setuser: %s check\n", tmp); monitor_send_info(buf, 0); ptr = strtok_r(args, delimiter, &saveptr1); // resolve arguments while(ptr != NULL) { argarray[argidx]=trim(ptr); ptr = strtok_r(NULL, delimiter, &saveptr1); argidx++; } if(argidx != 3) { snprintf(buf, sizeof(buf), "[S-0000]setuser: %s failed - wrong number of parameters (%d)\n",tmp, argidx); monitor_send_info(buf, 0); snprintf(buf, sizeof(buf), "[S-0000]setuser: %s end\n", tmp); monitor_send_info(buf, 1); return; } //search account for (account=cfg.account; (account) ; account=account->next){ if (!strcmp(argarray[0], account->usr)){ found = 1; break; } } if (found != 1){ snprintf(buf, sizeof(buf), "[S-0000]setuser: %s failed - user %s not found\n",tmp , argarray[0]); monitor_send_info(buf, 0); snprintf(buf, sizeof(buf), "[S-0000]setuser: %s end\n", tmp); monitor_send_info(buf, 1); return; } found = -1; for (i = 0; i < tokencnt; i++){ if (!strcmp(argarray[1], token[i])){ // preparing the parameters before re-load switch(i) { case 6: clear_tuntab(&account->ttab); break; //betatunnel case 8: clear_caidtab(&account->ctab); break; //Caid } found = i; } } if (found < 0){ snprintf(buf, sizeof(buf), "[S-0000]setuser: parameter %s not exist. possible values:\n", argarray[1]); monitor_send_info(buf, 0); for (i = 0; i < tokencnt; i++){ snprintf(buf, sizeof(buf), "[S-0000]%s\n", token[i]); monitor_send_info(buf, 0); } snprintf(buf, sizeof(buf),"[S-0000]setuser: %s end\n", tmp); monitor_send_info(buf, 1); return; } else { chk_account(token[found], argarray[2], account); } if (write_userdb()==0) cs_reinit_clients(cfg.account); snprintf(buf, sizeof(buf),"[S-0000]setuser: %s done - param %s set to %s\n", tmp, argarray[1], argarray[2]); monitor_send_info(buf, 1); }