void load_bans(void) { FILE *fp; BAN_DATA *ban_last; strcat(boot_buf,"ators.\n\r Le"); if ( ( fp = fopen( BAN_FILE, "r" ) ) == NULL ) return; ban_last = NULL; for ( ; ; ) { BAN_DATA *pban; if ( feof(fp) ) { fclose( 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; } }
void auto_ban_ip(int site) { char name [ MAX_STRING_LENGTH ]; BAN_DATA *pban; int decA = ( site >> 24 ) & 0xFF; int decB = ( site >> 16 ) & 0xFF; int decC = ( site >> 8 ) & 0xFF; int decD = ( site ) & 0xFF; if(decA == 127 && decB == 0 && decB == 0 && decD == 1) { return; /* Localhost is OK for right now */ } sprintf(name,"%d.%d.%d.", decA, decB, decC); pban = new_ban(); pban->name = str_dup(name); pban->level = 105; SET_BIT(pban->ban_flags,BAN_SUFFIX); SET_BIT(pban->ban_flags,BAN_PERMANENT); pban->next = ban_list; ban_list = pban; save_bans(); log_f("%s has been automatically banned.\n\r",pban->name); return; }
/** * Handle a player ban request. * * @param data the request packet * @param len the length of data * @param cli_addr the address of the sender * @param cli_len the length of cli_addr */ void *c_req_ban(char *data, unsigned int len, struct player *pl) { uint32_t ban_id; struct player *target; char *reason, *ptr; uint16_t duration; struct server *s = pl->in_chan->in_server; ptr = data + 24; ban_id = ru32(&ptr); duration = ru16(&ptr); target = get_player_by_public_id(s, ban_id); if (target != NULL) { send_acknowledge(pl); /* ACK */ if(player_has_privilege(pl, SP_ADM_BAN_IP, target->in_chan)) { reason = rstaticstring(29, &ptr); add_ban(s, new_ban(0, target->cli_addr->sin_addr, reason)); logger(LOG_INFO, "Reason for banning player %s : %s", target->name, reason); s_notify_ban(pl, target, duration, reason); remove_player(s, target); free(reason); } } return NULL; }
/* * Loads the ban file from the system directory. */ void load_bans(void) { FILE *fp; BAN_DATA *ban_last; if ((fp = fopen(BAN_FILE, "r")) == NULL) { global.last_boot_result = MISSING; log_string("STATUS: No ban file available to load in the system directory."); return; } ban_last = NULL; for (;;) { BAN_DATA *pban; if (feof(fp)) { if (global.last_boot_result == UNKNOWN) { global.last_boot_result = SUCCESS; } fclose(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; } if (global.last_boot_result == UNKNOWN) global.last_boot_result = SUCCESS; } // end load_bans
void load_bans( void ) { FILE * fp; BAN_DATA *ban_last; char * site; if ( ( fp = fopen( BAN_FILE, "r" ) ) == NULL ) return ; ban_last = NULL; for ( ; ; ) { BAN_DATA *pban; if ( feof( fp ) ) { fclose( fp ); return ; } pban = new_ban(); site = fread_word( fp ); if ( !str_cmp( site, "#" ) ) { fclose( fp ); return ; } pban->site = str_dup( site ); pban->ban_flags = fread_flag( fp ); pban->person = str_dup( fread_word( fp ) ); pban->date_stamp = fread_long_number( fp ); pban->period = fread_number( fp ); pban->reason = fread_string_eol( fp ); if ( pban->period > 0 && pban->date_stamp + ( pban->period * 24 * 3600 ) <= current_time ) { free_ban( pban ); continue; } if ( ban_list == NULL ) ban_list = pban; else ban_last->next = pban; ban_last = pban; } }
/** * Handles a request to add an IP ban. * * @param data the request packet * @param len the length of data * @param cli_addr the address of the sender * @param cli_len the length of cli_addr */ void *c_req_ip_ban(char *data, unsigned int len, struct player *pl) { struct in_addr ip; uint16_t duration; struct server *s = pl->in_chan->in_server; char *ptr; if(player_has_privilege(pl, SP_ADM_BAN_IP, NULL)) { send_acknowledge(pl); /* ACK */ ptr = data + 24; duration = ru16(&ptr); inet_aton(ptr, &ip); add_ban(s, new_ban(duration, ip, "IP BAN")); } return NULL; }
void ban_site( CHAR_DATA *ch, char *argument ) { char date[ 50 ]; struct tm *btime; char buf[ MAX_STRING_LENGTH ], buf2[ MAX_STRING_LENGTH ], buf3[ MAX_STRING_LENGTH ]; char arg1[ MAX_INPUT_LENGTH ], arg2[ MAX_INPUT_LENGTH ], arg3[ 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 ); argument = one_argument( argument, arg3 ); if ( arg1[ 0 ] == '\0' ) { if ( ban_list == NULL ) { send_to_char( "Nie ma ¿adnych banów.\n\r", ch ); return ; } buffer = new_buf(); add_buf( buffer, "{CAdres Kto Typ{x\n\r" ); for ( pban = ban_list;pban != NULL;pban = pban->next ) { sprintf( buf2, "%s%s%s", IS_SET( pban->ban_flags, BAN_PREFIX ) ? "*" : "", pban->site, IS_SET( pban->ban_flags, BAN_SUFFIX ) ? "*" : "" ); btime = localtime( &pban->date_stamp ); strftime( date, 20, "%d-%m-%Y %H:%M:%S", btime ); if ( pban->period <= 0 ) sprintf( buf3, "od %s na sta³e", date ); else if ( pban->period == 1 ) sprintf( buf3, "od %s na 1 dzieñ", date ); else sprintf( buf3, "od %s na %d dni", date, pban->period ); sprintf( buf, "{Y%-40s{x %-10s %-7s\n\r{CCzas{x: %s\n\r{CPowód{x: %s\n\r", buf2, pban->person, IS_SET( pban->ban_flags, BAN_NEWBIES ) ? "newbies" : IS_SET( pban->ban_flags, BAN_PERMIT ) ? "permit" : IS_SET( pban->ban_flags, BAN_ALL ) ? "all" : "", buf3, IS_NULLSTR(pban->reason) ? "nie podano" : pban->reason ); add_buf( buffer, buf ); if ( pban->next ) add_buf( buffer, "\n\r" ); } add_buf( buffer, "\n\rDodanie nowego bana:\n\r" ); add_buf( buffer, "permban [*]<adres>[*] all|newbies|permit <ile dni> [<powod>]\n\r" ); add_buf( buffer, "- podanie 0 przy liczbie dni oznacza ban na sta³e\n\r" ); page_to_char( buf_string( buffer ), ch ); free_buf( buffer ); return ; } /* find out what type of ban */ if ( !str_prefix( arg2, "permit" ) ) type = BAN_PERMIT; else if ( !str_prefix( arg2, "newbies" ) ) type = BAN_NEWBIES; else if ( !str_prefix( arg2, "all" ) ) type = BAN_ALL; else { send_to_char( "Dopuszczalne typy bana to: all, newbies, 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( "Nie poda³e¶ adresu do zbanowania.\n\r", ch ); return ; } if ( arg3[0] == '\0' || !is_number( arg3 ) ) { send_to_char( "Podaj liczbê dni przez jak± ma trwaæ ban (0 - ca³y czas).\n\r", ch ); return; } prev = NULL; for ( pban = ban_list; pban != NULL; prev = pban, pban = pban->next ) { if ( !str_cmp( name, pban->site ) ) { if ( prev == NULL ) ban_list = pban->next; else prev->next = pban->next; free_ban( pban ); } } pban = new_ban(); pban->site = str_dup( name ); pban->person = str_dup( ch->name ); pban->date_stamp = current_time; pban->period = UMAX( 0, atoi( arg3 ) ); pban->reason = str_dup( argument ); /* 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 ); pban->next = ban_list; ban_list = pban; save_bans(); sprintf( buf, "Adres %s zosta³ dodany do listy banów.\n\r", pban->site ); send_to_char( buf, ch ); return ; }
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_MULTI) ? "multi" : 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,"multi")) type = BAN_MULTI; else if (!str_prefix(arg2,"permit")) type = BAN_PERMIT; else { send_to_char("Acceptable ban types are all, newbies, and permit, and multi.\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; }