/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1995 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@pacinfo.com) * * Gabrielle Taylor (gtaylor@pacinfo.com) * * Brian Moore (rom@rom.efn.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * ***************************************************************************/ /*************************************************************************** * ROT 1.4 is copyright 1996-1997 by Russ Walsh * * By using this code, you have agreed to follow the terms of the * * ROT license, in the file doc/rot.license * ***************************************************************************/ #if defined(macintosh) #include <types.h> #include <time.h> #else #include <sys/types.h> #include <sys/time.h> #endif #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include "merc.h" #include "recycle.h" void save_bans ( void ) { BAN_DATA *pban; FILE *fp; bool found = FALSE; if ( ( fp = file_open ( BAN_FILE, "w" ) ) == NULL ) { perror ( BAN_FILE ); } for ( pban = ban_list; pban != NULL; pban = pban->next ) { if ( IS_SET ( pban->ban_flags, BAN_PERMANENT ) ) { found = TRUE; fprintf ( fp, "%-20s %-2d %s\n", pban->name, pban->level, print_flags ( pban->ban_flags ) ); } } file_close ( fp ); if ( !found ) unlink ( BAN_FILE ); } void load_bans ( void ) { FILE *fp; BAN_DATA *ban_last; strcat ( boot_buf, "ators.\n\r Le" ); if ( ( fp = file_open ( BAN_FILE, "r" ) ) == NULL ) return; ban_last = NULL; for ( ;; ) { BAN_DATA *pban; if ( feof ( fp ) ) { file_close ( fp ); return; } pban = new_ban ( ); pban->name = str_dup ( fread_word ( fp ) ); pban->level = fread_number ( fp ); pban->ban_flags = fread_flag ( fp ); fread_to_eol ( fp ); if ( ban_list == NULL ) ban_list = pban; else ban_last->next = pban; ban_last = pban; } } bool check_ban ( char *site, int type ) { BAN_DATA *pban; char host[MAX_STRING_LENGTH]; strcpy ( host, capitalize ( site ) ); host[0] = LOWER ( host[0] ); for ( pban = ban_list; pban != NULL; pban = pban->next ) { if ( !IS_SET ( pban->ban_flags, type ) ) continue; if ( IS_SET ( pban->ban_flags, BAN_PREFIX ) && IS_SET ( pban->ban_flags, BAN_SUFFIX ) && strstr ( pban->name, host ) != NULL ) return TRUE; if ( IS_SET ( pban->ban_flags, BAN_PREFIX ) && !str_suffix ( pban->name, host ) ) return TRUE; if ( IS_SET ( pban->ban_flags, BAN_SUFFIX ) && !str_prefix ( pban->name, host ) ) return TRUE; if ( ( strstr ( pban->name, host ) != NULL ) || !str_suffix ( pban->name, host ) || !str_prefix ( pban->name, host ) ) return TRUE; if ( ( strstr ( pban->name, host ) != NULL ) || !str_suffix ( pban->name, host ) || !str_prefix ( pban->name, host ) ) return TRUE; } return FALSE; } bool check_adr ( char *site, int type ) { char bans[MAX_STRING_LENGTH]; char host[MAX_STRING_LENGTH]; strcpy ( host, capitalize ( site ) ); host[0] = LOWER ( host[0] ); if ( ( strstr ( bans, host ) != NULL ) || !str_suffix ( bans, host ) || !str_prefix ( bans, host ) ) return TRUE; if ( ( strstr ( bans, host ) != NULL ) || !str_suffix ( bans, host ) || !str_prefix ( bans, host ) ) return TRUE; return FALSE; } void ban_site ( CHAR_DATA * ch, char *argument, bool fPerm ) { char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH]; char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH]; char *name; BUFFER *buffer; BAN_DATA *pban, *prev; bool prefix = FALSE, suffix = FALSE; int type; argument = one_argument ( argument, arg1 ); argument = one_argument ( argument, arg2 ); if ( arg1[0] == '\0' ) { if ( ban_list == NULL ) { send_to_char ( "No sites banned at this time.\n\r", ch ); return; } buffer = new_buf ( ); add_buf ( buffer, "Banned sites level type status\n\r" ); for ( pban = ban_list; pban != NULL; pban = pban->next ) { sprintf ( buf2, "%s%s%s", IS_SET ( pban->ban_flags, BAN_PREFIX ) ? "*" : "", pban->name, IS_SET ( pban->ban_flags, BAN_SUFFIX ) ? "*" : "" ); sprintf ( buf, "%-12s %-3d %-7s %s\n\r", buf2, pban->level, IS_SET ( pban->ban_flags, BAN_NEWBIES ) ? "newbies" : IS_SET ( pban-> ban_flags, BAN_PERMIT ) ? "permit" : IS_SET ( pban->ban_flags, BAN_ALL ) ? "all" : "", IS_SET ( pban->ban_flags, BAN_PERMANENT ) ? "perm" : "temp" ); add_buf ( buffer, buf ); } page_to_char ( buf_string ( buffer ), ch ); free_buf ( buffer ); return; } /* find out what type of ban */ if ( arg2[0] == '\0' || !str_prefix ( arg2, "all" ) ) type = BAN_ALL; else if ( !str_prefix ( arg2, "newbies" ) ) type = BAN_NEWBIES; else if ( !str_prefix ( arg2, "permit" ) ) type = BAN_PERMIT; else { send_to_char ( "Acceptable ban types are all, newbies, and permit.\n\r", ch ); return; } name = arg1; if ( name[0] == '*' ) { prefix = TRUE; name++; } if ( name[strlen ( name ) - 1] == '*' ) { suffix = TRUE; name[strlen ( name ) - 1] = '\0'; } if ( strlen ( name ) == 0 ) { send_to_char ( "You have to ban SOMETHING.\n\r", ch ); return; } prev = NULL; for ( pban = ban_list; pban != NULL; prev = pban, pban = pban->next ) { if ( !str_cmp ( name, pban->name ) ) { if ( pban->level > get_trust ( ch ) ) { send_to_char ( "That ban was set by a higher power.\n\r", ch ); return; } else { if ( prev == NULL ) ban_list = pban->next; else prev->next = pban->next; free_ban ( pban ); } } } pban = new_ban ( ); pban->name = str_dup ( name ); pban->level = get_trust ( ch ); /* set ban type */ pban->ban_flags = type; if ( prefix ) SET_BIT ( pban->ban_flags, BAN_PREFIX ); if ( suffix ) SET_BIT ( pban->ban_flags, BAN_SUFFIX ); if ( fPerm ) SET_BIT ( pban->ban_flags, BAN_PERMANENT ); pban->next = ban_list; ban_list = pban; save_bans ( ); sprintf ( buf, "%s has been banned.\n\r", pban->name ); send_to_char ( buf, ch ); return; } CH_CMD ( do_ban ) { ban_site ( ch, argument, FALSE ); } CH_CMD ( do_permban ) { ban_site ( ch, argument, TRUE ); } CH_CMD ( do_allow ) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; BAN_DATA *prev; BAN_DATA *curr; one_argument ( argument, arg ); if ( arg[0] == '\0' ) { send_to_char ( "Remove which site from the ban list?\n\r", ch ); return; } prev = NULL; for ( curr = ban_list; curr != NULL; prev = curr, curr = curr->next ) { if ( !str_cmp ( arg, curr->name ) ) { if ( curr->level > get_trust ( ch ) ) { send_to_char ( "You are not powerful enough to lift that ban.\n\r", ch ); return; } if ( prev == NULL ) ban_list = ban_list->next; else prev->next = curr->next; free_ban ( curr ); sprintf ( buf, "Ban on %s lifted.\n\r", arg ); send_to_char ( buf, ch ); save_bans ( ); return; } } send_to_char ( "Site is not banned.\n\r", ch ); return; }