#include "define.h" #include "struct.h" const char** badname_array = NULL; int max_badname = 0; class ban_data { public: ban_data* next; char* name; ban_data( ); ~ban_data( ); }; ban_data* ban_list = NULL; ban_data :: ban_data( ) { name = empty_string; record_new( sizeof( ban_data ), MEM_BAN ); append( ban_list, this ); }; ban_data :: ~ban_data( ) { free_string( name, MEM_BAN ); record_delete( sizeof( ban_data ), MEM_BAN ); remove( ban_list, this ); }; /* * BAN/ALLOW ROUTINES */ void do_ban( char_data* ch, char* argument ) { account_data* account; ban_data* ban; pfile_data* pfile = NULL; int flags; int i; bool first = TRUE; const char* name; player_data* victim; if( !get_flags( ch, argument, &flags, "srn", "Ban" ) ) return; if( is_set( &flags, 2 ) ) { if( *argument == '\0' ) { if( badname_array == NULL ) { send( ch, "The badname array is empty.\r\n" ); } else { display_array( ch, "Bad Name Array", &badname_array[0], &badname_array[1], max_badname ); } return; } i = pntr_search( badname_array, max_badname, argument ); if( is_set( &flags, 1 ) ) { if( i < 0 ) { send( ch, "The name '%s' wasn't in the badname array.\r\n", argument ); } else { record_delete( sizeof( char* ), MEM_BADNAME ); remove( badname_array, max_badname, i ); send( ch, "Name removed from badname array.\r\n" ); save_badname( ); } } else { if( i > 0 ) { send( ch, "The name '%s' is already in the badname array.\r\n", argument ); } else if( check_parse_name( ch->link, argument ) ) { i = -i-1; record_new( sizeof( char* ), MEM_BADNAME ); name = alloc_string( argument, MEM_BADNAME ); insert( badname_array, max_badname, name, i ); send( ch, "The name '%s' is added to the badname array.\r\n", name ); save_badname( ); } } return; } if( is_set( &flags, 0 ) ) { if( *argument == '\0' ) { page_title( ch, "Banned Sites" ); for( ban = ban_list; ban != NULL; ban = ban->next ) page( ch, "%s\r\n", ban->name ); return; } if( !is_set( &flags, 1 ) ) { for( ban = ban_list; ban != NULL; ban = ban->next ) { if( !strcasecmp( argument, ban->name ) ) { send( "That site is already banned!\r\n", ch ); return; } } ban = new ban_data; ban->name = alloc_string( argument, MEM_BAN ); save_banned( ); send( ch, "Ok.\r\n" ); } else { for( ban = ban_list; ban != NULL; ban = ban->next ) { if( !strcasecmp( argument, ban->name ) ) { delete ban; save_banned(); send( ch, "Ok.\r\n" ); return; } } send( ch, "Site is not banned.\r\n" ); } return; } if( *argument == '\0' ) { page_title( ch, "Banned Accounts" ); for( i = 0; i < max_account; i++ ) if( account_list[i]->banned != -1 ) display_account( ch, account_list[i], first ); return; } if( ( account = account_arg( argument ) ) == NULL ) { if( ( pfile = player_arg( argument ) ) == NULL ) { send( ch, "No such account or player.\r\n" ); return; } if( ( account = pfile->account ) == NULL ) { send( ch, "That player doesn't have an account which makes banning\ it difficult.\r\n" ); return; } } if( is_set( &flags, 1 ) ) { if( account->banned == -1 ) { send( ch, "That account was not banned.\r\n" ); } else { send( ch, "Ban lifted.\r\n" ); account->banned = -1; save_accounts( ); } return; } if( ch->pcdata->pfile->account == account ) { send( ch, "Banning yourself is rather phulish.\r\n" ); return; } for( i = 0; i < max_pfile; i++ ) if( pfile_list[i]->account == account && pfile_list[i]->trust >= ch->pcdata->trust ) { send( ch, "You do not have permission to ban that account.\r\n" ); return; } if( *argument == '\0' ) { send( ch, "For how what time period?\r\n" ); return; } if( ( i = time_arg( argument, ch ) ) == -1 ) return; if( i == 0 ) { account->banned = 0; send( ch, "Account %s banned forever.\r\n", account->name ); } else { account->banned = current_time+i; send( ch, "Account %s banned until %s.\r\n", account->name, ltime( account->banned )+4 ); } save_accounts( ); for( i = 0; i < player_list; i++ ) { victim = player_list[i]; if( victim->Is_Valid( ) && victim->pcdata->pfile->account == account ) { send( victim, "-- You have been banned. --\r\n" ); forced_quit( victim ); } } return; } /* * IS_BANNED ROUTINE */ bool is_banned( const char* host ) { ban_data* ban; int host_len = strlen( host ); int ban_len; for( ban = ban_list; ban != NULL; ban = ban->next ) { ban_len = strlen( ban->name ); if( ban_len <= host_len && !strcasecmp( &host[host_len-ban_len], ban->name ) ) break; } return( ban != NULL ); } bool is_banned( account_data* account, link_data* link ) { if( account == NULL || account->banned == -1 ) return FALSE; if( account->banned != 0 && account->banned < current_time ) { account->banned = -1; return FALSE; } help_link( link, "Banned_Acnt" ); if( account->banned != 0 ) send( link, "Ban Expires: %s\r\n", ltime( account->banned ) ); close_socket( link, TRUE ); return TRUE; } /* * READ/WRITE BADNAME */ void load_badname( void ) { FILE* fp; const char* name; printf( "Loading Bad Names...\r\n" ); if( ( fp = fopen( BADNAME_FILE, "r" ) ) == NULL ) { perror( BADNAME_FILE ); exit( 1 ); } if( strcmp( fread_word( fp ), "#BADNAME" ) ) panic( "Load_badname: missing header" ); for( ; ; ) { name = fread_string( fp, MEM_BADNAME ); if( *name == '$' ) break; record_new( sizeof( char* ), MEM_BADNAME ); insert( badname_array, max_badname, name, max_badname ); } free_string( (char *) name, MEM_BADNAME ); fclose( fp ); return; } void save_badname( void ) { FILE* fp; int i; if( ( fp = fopen( BADNAME_FILE, "w" ) ) == NULL ) { bug( "Save_badname: fopen" ); return; } fprintf( fp, "#BADNAME\n\n" ); for( i = 0; i < max_badname; i++ ) fprintf( fp, "%s~\n", badname_array[i] ); fprintf( fp, "$~\n" ); fclose( fp ); return; } /* * READ/WRITE BANNED */ void load_banned( void ) { ban_data* ban; char* name; FILE* fp; printf( "Loading Banned Sites...\r\n" ); if( ( fp = fopen( BANNED_FILE, "r" ) ) == NULL ) { perror( BANNED_FILE ); exit( 1 ); } if( strcmp( fread_word( fp ), "#BANNED" ) ) panic( "Load_banned: missing header" ); for( ; ; ) { name = fread_string( fp, MEM_BAN ); if( *name == '$' ) break; ban = new ban_data; ban->name = name; } free_string( name, MEM_BAN ); fclose( fp ); return; } void save_banned( ) { ban_data* ban; FILE* fp; fp = open_file( BANNED_FILE, "w" ); fprintf( fp, "#BANNED\n\n" ); for( ban = ban_list; ban != NULL; ban = ban->next ) fprintf( fp, "%s~\n", ban->name ); fprintf( fp, "$~\n" ); fclose( fp ); return; }