diff --git a/code/datums/configuration.dm b/code/datums/configuration.dm index cbfcd3bef13..d62589be825 100644 --- a/code/datums/configuration.dm +++ b/code/datums/configuration.dm @@ -49,6 +49,7 @@ var/usewhitelist = 0 var/kick_inactive = 0 //force disconnect for inactive players var/load_jobs_from_txt = 0 + var/ToRban = 0 var/server var/banappeals @@ -313,6 +314,9 @@ if("humans_need_surnames") humans_need_surnames = 1 + if("tor_ban") + ToRban = 1 + else diary << "Unknown setting in configuration: '[name]'" diff --git a/code/game/algorithm.dm b/code/game/algorithm.dm index 6fb0970dad5..61b0a3bcae6 100644 --- a/code/game/algorithm.dm +++ b/code/game/algorithm.dm @@ -26,8 +26,10 @@ Starting up. [time2text(world.timeofday, "hh:mm.ss")] process_ghost_teleport_locs() //Sets up ghost teleport locations. sleep_offline = 1 - if (config.kick_inactive) - spawn(30) + spawn(3000) //so we aren't adding to the round-start lag + if(config.ToRban) + ToRban_autoupdate() + if(config.kick_inactive) KickInactiveClients() #define INACTIVITY_KICK 6000 //10 minutes in ticks (approx.) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 8b1cc612aa0..dc965873eb8 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -9,6 +9,14 @@ world/IsBanned(key,address,computer_id) message_admins("\blue Failed Login: [key] - Guests not allowed") return list("reason"="guest", "desc"="\nReason: Guests not allowed.brb") + //check if the IP address is a known TOR node + if( config && config.ToRban && ToRban_isbanned(address) ) + log_access("Failed Login: [src] - Banned: ToR - BYOND Version: [byond_version]") + message_admins("\blue Failed Login: [src] - Banned: ToR - BYOND Version: [byond_version]") + //ban their computer_id and ckey for posterity + AddBan(ckey(key), computer_id, "Use of ToR", "Automated Ban", 0, 0) + return list("reason"="Using ToR", "desc"="\nReason: The network you are using to connect has been banned.\nIf you believe this is a mistake, please request help at [config.banappeals]") + //Ban Checking . = CheckBan( ckey(key), computer_id, address ) if(.) diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm new file mode 100644 index 00000000000..5f6dcbe460c --- /dev/null +++ b/code/modules/admin/ToRban.dm @@ -0,0 +1,90 @@ +//By Carnwennan +//fetches an external list and processes it into a list of ip addresses. +//It then stores the processed list into a savefile for later use +#define TORFILE "data/ToR_ban.bdb" +#define TOR_UPDATE_INTERVAL 216000 //~6 hours + +/proc/ToRban_isbanned(var/ip_address) + var/savefile/F = new(TORFILE) + if(F) + if( ip_address in F.dir ) + return 1 + return 0 + +/proc/ToRban_autoupdate() + var/savefile/F = new(TORFILE) + if(F) + var/last_update + F["last_update"] >> last_update + if((last_update + TOR_UPDATE_INTERVAL) < world.realtime) //we haven't updated for a while + ToRban_update() + return + +/proc/ToRban_update() + spawn(0) + diary << "Downloading updated ToR data..." + var/http[] = world.Export("http://exitlist.torproject.org/exit-addresses") + + var/rawtext = file2text(http["CONTENT"]) + if(rawtext) + var/list/rawlist = tg_text2list(rawtext,"\n") + if(rawlist.len) + fdel(TORFILE) + var/savefile/F = new(TORFILE) + for( var/line in rawlist ) + if(!line) continue + if( copytext(line,1,12) == "ExitAddress" ) + var/cleaned = copytext(line,13,length(line)-19) + if(!cleaned) continue + F[cleaned] << 1 + F["last_update"] << world.realtime + diary << "ToR data updated!" + if(usr) usr << "ToRban updated." + return 1 + diary << "ToR data update aborted: no data." + return 0 + +/client/proc/ToRban(task in list("update","toggle","show","remove","remove all","find")) + set name = "ToRban" + set category = "Server" + if(!holder) return + switch(task) + if("update") + ToRban_update() + if("toggle") + if(config) + if(config.ToRban) + config.ToRban = 0 + message_admins("ToR banning disabled.") + else + config.ToRban = 1 + message_admins("ToR banning enabled.") + if("show") + var/savefile/F = new(TORFILE) + var/dat + if( length(F.dir) ) + for( var/i=1, i<=length(F.dir), i++ ) + dat += "