/* ************************************************************************ * File: ban.c Part of CircleMUD * * Usage: banning/unbanning/checking sites and player names * * * * All rights reserved. See license.doc for complete information. * * * * Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University * * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * ************************************************************************ */ #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <time.h> #include <sys/types.h> #include "awake.h" #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" struct ban_list_element *ban_list = NULL; char *ban_types[] = { "no", "new", "select", "all", "ERROR" }; void load_banned(void) { FILE *fl; int i, date; char site_name[BANNED_SITE_LENGTH + 1], ban_type[100]; char name[MAX_NAME_LENGTH + 1]; struct ban_list_element *next_node; ban_list = 0; if (!(fl = fopen(BAN_FILE, "r"))) { perror("Unable to open banfile"); return; } while (fscanf(fl, " %s %s %d %s ", ban_type, site_name, &date, name) == 4) { next_node = new ban_list_element; strncpy(next_node->site, site_name, BANNED_SITE_LENGTH); next_node->site[BANNED_SITE_LENGTH] = '\0'; strncpy(next_node->name, name, MAX_NAME_LENGTH); next_node->name[MAX_NAME_LENGTH] = '\0'; next_node->date = date; for (i = BAN_NOT; i <= BAN_ALL; i++) if (!strcmp(ban_type, ban_types[i])) next_node->type = i; next_node->next = ban_list; ban_list = next_node; } fclose(fl); } int isbanned(char *hostname) { int i; struct ban_list_element *banned_node; char *nextchar; if (!hostname || !*hostname) return (0); i = 0; for (nextchar = hostname; *nextchar; nextchar++) *nextchar = LOWER(*nextchar); for (banned_node = ban_list; banned_node; banned_node = banned_node->next) if (strstr((const char *)hostname, banned_node->site)) /* if hostname is a substring */ i = MAX(i, banned_node->type); return i; } void _write_one_node(FILE * fp, struct ban_list_element * node) { if (node) { _write_one_node(fp, node->next); fprintf(fp, "%s %s %ld %s\n", ban_types[node->type], node->site, (long) node->date, node->name); } } void write_ban_list(void) { FILE *fl; if (!(fl = fopen(BAN_FILE, "w"))) { perror("write_ban_list"); return; } _write_one_node(fl, ban_list);/* recursively write from end to start */ fclose(fl); return; } ACMD(do_ban) { char flag[MAX_INPUT_LENGTH], site[MAX_INPUT_LENGTH], format[MAX_INPUT_LENGTH], *nextchar, *timestr; int i; struct ban_list_element *ban_node; *buf = '\0'; if (!*argument) { if (!ban_list) { send_to_char("No sites are banned.\r\n", ch); return; } strcpy(format, "%-25.25s %-8.8s %-10.10s %-16.16s\r\n"); sprintf(buf, format, "Banned Site Name", "Ban Type", "Banned On", "Banned By"); send_to_char(buf, ch); sprintf(buf, format, "---------------------------------", "---------------------------------", "---------------------------------", "---------------------------------"); send_to_char(buf, ch); for (ban_node = ban_list; ban_node; ban_node = ban_node->next) { if (ban_node->date) { timestr = asctime(localtime(&(ban_node->date))); *(timestr + 10) = 0; strcpy(site, timestr); } else strcpy(site, "Unknown"); sprintf(buf, format, ban_node->site, ban_types[ban_node->type], site, ban_node->name); send_to_char(buf, ch); } return; } two_arguments(argument, flag, site); if (!*site || !*flag) { send_to_char("Usage: ban {all | select | new} site_name\r\n", ch); return; } if (!(!str_cmp(flag, "select") || !str_cmp(flag, "all") || !str_cmp(flag, "new"))) { send_to_char("Flag must be ALL, SELECT, or NEW.\r\n", ch); return; } for (ban_node = ban_list; ban_node; ban_node = ban_node->next) { if (!str_cmp(ban_node->site, site)) { send_to_char("That site has already been banned -- unban it to change the ban type.\r\n", ch); return; } } ban_node = new ban_list_element; strncpy(ban_node->site, site, BANNED_SITE_LENGTH); for (nextchar = ban_node->site; *nextchar; nextchar++) *nextchar = LOWER(*nextchar); ban_node->site[BANNED_SITE_LENGTH] = '\0'; strncpy(ban_node->name, GET_CHAR_NAME(ch), MAX_NAME_LENGTH); ban_node->name[MAX_NAME_LENGTH] = '\0'; ban_node->date = time(0); for (i = BAN_NEW; i <= BAN_ALL; i++) if (!str_cmp(flag, ban_types[i])) ban_node->type = i; ban_node->next = ban_list; ban_list = ban_node; sprintf(buf, "%s has banned %s for %s players.", GET_CHAR_NAME(ch), site, ban_types[ban_node->type]); mudlog(buf, ch, LOG_WIZLOG, TRUE); send_to_char("Site banned.\r\n", ch); write_ban_list(); } ACMD(do_unban) { char site[80]; struct ban_list_element *ban_node, *temp; int found = 0; one_argument(argument, site); if (!*site) { send_to_char("A site to unban might help.\r\n", ch); return; } ban_node = ban_list; while (ban_node && !found) { if (!str_cmp(ban_node->site, site)) found = 1; else ban_node = ban_node->next; } if (!found) { send_to_char("That site is not currently banned.\r\n", ch); return; } REMOVE_FROM_LIST(ban_node, ban_list, next); send_to_char("Site unbanned.\r\n", ch); sprintf(buf, "%s removed the %s-player ban on %s.", GET_CHAR_NAME(ch), ban_types[ban_node->type], ban_node->site); mudlog(buf, ch, LOG_WIZLOG, TRUE); delete ban_node; write_ban_list(); }