#include <stdio.h> #include "externs.h" static char **host_lockouts; void read_host_lockouts(void) { const char *filename = "../config/hosts.lockout"; FILE *fp; char *read; int ctr = 0; host_lockouts = (char **)stack_alloc(sizeof(char *), 1, 0); host_lockouts[0] = NULL; if(!(fp = fopen(filename, "r"))) return; while((read = get_next_line(fp))) { host_lockouts = (char **)stack_realloc(host_lockouts, sizeof(char *)*(ctr+2)); host_lockouts[ctr] = stack_string_alloc(read, 1); host_lockouts[ctr+1] = NULL; } fclose(fp); } void write_host_lockouts(void) { const char *filename = "../config/hosts.lockout"; FILE *fp; int i; if(!(fp = fopen(filename, "w"))) return; fprintf(fp, "# Add a list of IP addresses you want denied access.\n"); fprintf(fp, "# The list should consist of 1 IP per line.\n"); fprintf(fp, "# The address may contain wildcards (i.e. 127.0.0.* or 12.34.5?.78)\n"); for(i = 0;host_lockouts[i];i++) { fprintf(fp, "%s\n", host_lockouts[i]); stack_free(host_lockouts[i]); } stack_free(host_lockouts); fclose(fp); } bool chk_host_lockout(int sock, char *addr) { char *msg = "Sorry, the host you're connecting from has been denied.\r\n"; int i; for(i = 0;host_lockouts[i];i++) if(wildcard_match(host_lockouts[i], addr, NULL)) { write(sock, msg, strlen(msg)); log_io(tprintf("New connection from %s has been denied due to lockout.", addr)); close(sock); return(0); } return(1); } static void do_hostlockout_list(OBJ *player, char *arg) { int i; if(!*host_lockouts) { notify(player, "There are no host lockouts."); return; } notify(player, "|+Y|Host Lockouts|+W|:"); for(i = 0;host_lockouts[i];i++) notify(player, tprintf("|+B| %s", host_lockouts[i])); notify(player, tprintf("|+C|%d |+B|host lockout%s", i, check_plural(i, "", "s"))); } static void do_hostlockout_add(OBJ *player, char *arg) { int i; for(i = 0;host_lockouts[i];++i); /* Whole loop */ host_lockouts = (char **)stack_realloc(host_lockouts, sizeof(char *)*(i+2)); SET(host_lockouts[i], arg); host_lockouts[i+1] = NULL; notify(player, tprintf("Host '%s' has been locked out.", arg)); } static void do_hostlockout_delete(OBJ *player, char *arg) { int i; for(i = 0;host_lockouts[i];++i) if(!strcmp(host_lockouts[i], arg)) break; if(!host_lockouts[i]) { notify(player, tprintf("No host lockout match for '%s'", arg)); return; } stack_free(host_lockouts[i]); while(host_lockouts[i+1]) { host_lockouts[i] = host_lockouts[i+1]; i++; } host_lockouts[i] = NULL; host_lockouts = (char **)stack_realloc(host_lockouts, sizeof(char *)*(i+1)); notify(player, tprintf("Host '%s' is no longer locked out.", arg)); } void do_hostlockout(OBJ *player, char *arg1, char *arg2) { SUBCOMMAND *c, commands[] = { { "list", do_hostlockout_list, 1 }, { "add", do_hostlockout_add, 1 }, { "delete", do_hostlockout_delete, 1 }, { NULL }, }; if(!(c = subcommand_match(player, arg1, commands, NULL))) subcommand_print(player, "+hostlockout", commands); else c->func(player, arg2); }