From 50fd20dc99d0aa10e51fdecd3cbd136d8c44038f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bjo=CC=88rn=20Teichmann?= Date: Fri, 29 Mar 2013 16:30:39 +0100 Subject: [PATCH 1/5] provide pom.xml for maven project import --- pom.xml | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f435c1b --- /dev/null +++ b/pom.xml @@ -0,0 +1,49 @@ + + 4.0.0 + com.mcbans.syamn.bungee + MCBansProxy + 1.3-SNAPSHOT + MCBansProxy + + src + + + src + + **/*.java + + + + + + maven-compiler-plugin + 3.0 + + 1.7 + 1.7 + + + + + + + + sonatype-oss-public + https://oss.sonatype.org/content/groups/public/ + + true + + + true + + + + + + + net.md-5 + bungeecord-proxy + 1.5-SNAPSHOT + + + From 5c39bf56d3d5964fcbc8ac1a8c5745325b75f11f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bjo=CC=88rn=20Teichmann?= Date: Fri, 29 Mar 2013 16:37:22 +0100 Subject: [PATCH 2/5] more flexible checking: * on default it still checks globally on proxy login * when enabling the 'checkForServersOnly' list it will only check if the player tries to connect to one of the servers specified --- .../syamn/bungee/LoginEventHandler.java | 138 ++++-------------- src/com/mcbans/syamn/bungee/MCBansProxy.java | 108 +++++++++++++- src/config.yml | 11 +- 3 files changed, 145 insertions(+), 112 deletions(-) diff --git a/src/com/mcbans/syamn/bungee/LoginEventHandler.java b/src/com/mcbans/syamn/bungee/LoginEventHandler.java index 0698fe4..bac2c7f 100644 --- a/src/com/mcbans/syamn/bungee/LoginEventHandler.java +++ b/src/com/mcbans/syamn/bungee/LoginEventHandler.java @@ -4,16 +4,9 @@ */ package com.mcbans.syamn.bungee; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.SocketTimeoutException; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; - -import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.event.LoginEvent; +import net.md_5.bungee.api.event.ServerConnectEvent; import net.md_5.bungee.api.plugin.Listener; import com.google.common.eventbus.Subscribe; @@ -22,116 +15,45 @@ * LoginEventHandler (LoginEventHandler.java) */ public class LoginEventHandler implements Listener{ - private static final String logPrefix = MCBansProxy.logPrefix; private MCBansProxy plugin; LoginEventHandler(final MCBansProxy plugin){ this.plugin = plugin; } + @Subscribe + public void onServerConnect(ServerConnectEvent event) { + System.out.println("ServerConnectEvent: " + event.getPlayer().getName() + " -> " + event.getTarget().getName()); + if (plugin.checkForServersOnly == null) return; + + String remoteServerName = event.getTarget().getName(); + if (plugin.checkForServersOnly.contains(remoteServerName)) { + System.out.println("ServerConnectEvent: needs check"); + String playerName = event.getPlayer().getName(); + String playerAddress = event.getPlayer().getAddress().getHostName(); + + String cancelReason = plugin.checkMCBansForPlayer(playerName, playerAddress); + System.out.println("ServerConnectEvent - cancelreason: " + cancelReason); + if (cancelReason != null) { + event.getPlayer().disconnect(cancelReason); + } + } + } + @Subscribe public void onLogin(final LoginEvent event){ + if (plugin.checkForServersOnly != null) return; + final PendingConnection pc = event.getConnection(); if (event.isCancelled() || pc == null) return; - - if (!plugin.isValidKey){ - ProxyServer.getInstance().getLogger().warning("Missing or invalid API Key! Please check config.yml and restart proxy!"); - return; - } - - try{ - final String uriStr = "http://api.mcbans.com/v2/" + plugin.apiKey + "/login/" - + URLEncoder.encode(pc.getName(), "UTF-8") + "/" - + URLEncoder.encode(String.valueOf(pc.getAddress().getHostName()), "UTF-8"); - final URLConnection conn = new URL(uriStr).openConnection(); - conn.setConnectTimeout(plugin.timeout * 1000); - conn.setReadTimeout(plugin.timeout * 1000); - conn.setUseCaches(false); - - BufferedReader br = null; - String response = null; - try{ - br = new BufferedReader(new InputStreamReader(conn.getInputStream())); - response = br.readLine(); - }finally{ - if (br != null) br.close(); - } - if (response == null){ - if (plugin.failsafe){ - ProxyServer.getInstance().getLogger().info("Null response! Kicked player: " + pc.getName()); - event.setCancelled(true); - event.setCancelReason("MCBans service unavailable!"); - }else{ - ProxyServer.getInstance().getLogger().info(logPrefix + "Null response! Check passed player: " + pc.getName()); - } - return; - } - - plugin.debug("Response: " + response); - String[] s = response.split(";"); - if (s.length == 6 || s.length == 7) { - // check banned - if (s[0].equals("l") || s[0].equals("g") || s[0].equals("t") || s[0].equals("i") || s[0].equals("s")) { - event.setCancelled(true); - event.setCancelReason(s[1]); - return; - } - // check reputation - else if (plugin.minRep > Double.valueOf(s[2])) { - event.setCancelled(true); - event.setCancelReason(plugin.minRepMsg); - return; - } - // check alternate accounts - else if (plugin.enableMaxAlts && plugin.maxAlts < Integer.valueOf(s[3])) { - event.setCancelled(true); - event.setCancelReason(plugin.maxAltsMsg); - return; - } - // check passed, put data to playerCache - else{ - if(s[0].equals("b")){ - ProxyServer.getInstance().getLogger().info(logPrefix + pc.getName() + " has previous ban(s)!"); - } - if(Integer.parseInt(s[3])>0){ - ProxyServer.getInstance().getLogger().info(logPrefix + pc.getName() + " may has " + s[3] + " alt account(s)![" + s[6] + "]"); - } - if(s[4].equals("y")){ - ProxyServer.getInstance().getLogger().info(logPrefix + pc.getName() + " is an MCBans.com Staff Member!"); - } - if(Integer.parseInt(s[5])>0){ - ProxyServer.getInstance().getLogger().info(logPrefix + s[5] + " open dispute(s)!"); - } - } - plugin.debug(pc.getName() + " authenticated with " + s[2] + " rep"); - }else{ - if (response.toString().contains("Server Disabled")) { - ProxyServer.getInstance().getLogger().info(logPrefix + "This Server Disabled by MCBans Administration!"); - return; - } - if (plugin.failsafe){ - ProxyServer.getInstance().getLogger().info(logPrefix + "Null response! Kicked player: " + pc.getName()); - event.setCancelled(true); - event.setCancelReason(plugin.unavailable); - }else{ - ProxyServer.getInstance().getLogger().info(logPrefix + "Invalid response!(" + s.length + ") Check passed player: " + pc.getName()); - } - ProxyServer.getInstance().getLogger().info(logPrefix + "Response: " + response); - return; - } - }catch (SocketTimeoutException ex){ - ProxyServer.getInstance().getLogger().info(logPrefix + "Cannot connect MCBans API server: timeout"); - if (plugin.failsafe){ - event.setCancelled(true); - event.setCancelReason(plugin.unavailable); - } - }catch (Exception ex){ - ProxyServer.getInstance().getLogger().info(logPrefix + "Cannot connect MCBans API server!"); - if (plugin.failsafe){ - event.setCancelled(true); - event.setCancelReason(plugin.unavailable); - } - if (plugin.isDebug) ex.printStackTrace(); + + System.out.println("LoginEvent: " + pc.getName()); + + String cancelReason = plugin.checkMCBansForPlayer(pc.getName(), pc.getAddress().getHostName()); + System.out.println("LoginEvent - cancelreason: " + cancelReason); + if (cancelReason != null) { + event.setCancelled(true); + event.setCancelReason(cancelReason); } } diff --git a/src/com/mcbans/syamn/bungee/MCBansProxy.java b/src/com/mcbans/syamn/bungee/MCBansProxy.java index 455ed39..aa53855 100644 --- a/src/com/mcbans/syamn/bungee/MCBansProxy.java +++ b/src/com/mcbans/syamn/bungee/MCBansProxy.java @@ -4,12 +4,17 @@ */ package com.mcbans.syamn.bungee; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.util.List; + import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; -//import net.md_5.bungee.plugin.JavaPlugin; -//import net.md_5.bungee.plugin.LoginEvent; - /** * MCBansProxy (MCBansProxy.java) */ @@ -23,6 +28,7 @@ public class MCBansProxy extends Plugin{ String apiKey, minRepMsg, maxAltsMsg, unavailable; int minRep, maxAlts, timeout; boolean failsafe, isDebug, enableMaxAlts; + List checkForServersOnly; @Override public void onEnable(){ @@ -44,6 +50,7 @@ private void getConfigs(){ unavailable = confManager.get("unavailableMessage", "Unavailable MCBans Service! Please try again later!"); isDebug = confManager.get("isDebug", false); failsafe = confManager.get("failsafe", false); + checkForServersOnly = confManager.get("checkForServersOnly", null); // check API key if (apiKey.length() != 40){ @@ -60,4 +67,99 @@ void debug(final String msg){ } } + + public String checkMCBansForPlayer(String playername, String playerHostname) { + + if (!isValidKey){ + ProxyServer.getInstance().getLogger().warning("Missing or invalid API Key! Please check config.yml and restart proxy!"); + return "Server temporarily unavailable. Contact the server administrator."; + } + + try{ + final String uriStr = "http://api.mcbans.com/v2/" + apiKey + "/login/" + + URLEncoder.encode(playername, "UTF-8") + "/" + + URLEncoder.encode(String.valueOf(playerHostname), "UTF-8"); + final URLConnection conn = new URL(uriStr).openConnection(); + conn.setConnectTimeout(timeout * 1000); + conn.setReadTimeout(timeout * 1000); + conn.setUseCaches(false); + + BufferedReader br = null; + String response = null; + try{ + br = new BufferedReader(new InputStreamReader(conn.getInputStream())); + response = br.readLine(); + }finally{ + if (br != null) br.close(); + } + if (response == null){ + if (failsafe){ + ProxyServer.getInstance().getLogger().info("Null response! Kicked player: " + playername); + return "MCBans service unavailable!"; + }else{ + ProxyServer.getInstance().getLogger().info(logPrefix + "Null response! Check passed player: " + playername); + return null; + } + } + + debug("Response: " + response); + String[] s = response.split(";"); + if (s.length == 6 || s.length == 7) { + // check banned + if (s[0].equals("l") || s[0].equals("g") || s[0].equals("t") || s[0].equals("i") || s[0].equals("s")) { + return s[1]; + } + // check reputation + else if (minRep > Double.valueOf(s[2])) { + return minRepMsg; + } + // check alternate accounts + else if (enableMaxAlts && maxAlts < Integer.valueOf(s[3])) { + return maxAltsMsg; + } + // check passed, put data to playerCache + else{ + if(s[0].equals("b")){ + ProxyServer.getInstance().getLogger().info(logPrefix + playername + " has previous ban(s)!"); + } + if(Integer.parseInt(s[3])>0){ + ProxyServer.getInstance().getLogger().info(logPrefix + playername + " may has " + s[3] + " alt account(s)![" + s[6] + "]"); + } + if(s[4].equals("y")){ + ProxyServer.getInstance().getLogger().info(logPrefix + playername + " is an MCBans.com Staff Member!"); + } + if(Integer.parseInt(s[5])>0){ + ProxyServer.getInstance().getLogger().info(logPrefix + s[5] + " open dispute(s)!"); + } + } + debug(playername + " authenticated with " + s[2] + " rep"); + }else{ + if (response.toString().contains("Server Disabled")) { + ProxyServer.getInstance().getLogger().info(logPrefix + "This Server was disabled by MCBans Administration!"); + return null; + } + if (failsafe){ + ProxyServer.getInstance().getLogger().info(logPrefix + "Null response! Kicked player: " + playername); + return unavailable; + }else{ + ProxyServer.getInstance().getLogger().info(logPrefix + "Invalid response!(" + s.length + ") Check passed player: " + playername); + } + ProxyServer.getInstance().getLogger().info(logPrefix + "Response: " + response); + return null; + } + }catch (SocketTimeoutException ex){ + ProxyServer.getInstance().getLogger().info(logPrefix + "Cannot connect MCBans API server: timeout"); + if (failsafe){ + return unavailable; + } + }catch (Exception ex){ + ProxyServer.getInstance().getLogger().info(logPrefix + "Cannot connect MCBans API server!"); + if (failsafe){ + return unavailable; + } + if (isDebug) ex.printStackTrace(); + } + + return null; + } } diff --git a/src/config.yml b/src/config.yml index a74550f..f6cd1b9 100644 --- a/src/config.yml +++ b/src/config.yml @@ -53,4 +53,13 @@ failsafe: false # isDebug: # Enable additional debug messages throughout the plugin # DEFAULT: false -isDebug: false \ No newline at end of file +isDebug: false + +# checkForServersOnly: +# Uncommenting this list and adding the names of servers behind the bungeecord proxy +# disables the global login check and just checks when the user tries to connect to one +# of the specified servers and kicks them if needed. +# DEFAULT: commented out (disabled) +# checkForServersOnly: +# - someRemoteServer +# - someOtherRemoteServer From a2f6a0ed8172f066b058665f780cb2aac63555d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bjo=CC=88rn=20Teichmann?= Date: Sat, 6 Apr 2013 19:44:20 +0200 Subject: [PATCH 3/5] make login/ban checks async, so the whole server won't get stalled when MCBans is offline --- .../syamn/bungee/LoginEventHandler.java | 25 ++++++------- .../mcbans/syamn/bungee/MCBansChecker.java | 35 +++++++++++++++++++ src/com/mcbans/syamn/bungee/MCBansProxy.java | 27 +++++++++++--- 3 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 src/com/mcbans/syamn/bungee/MCBansChecker.java diff --git a/src/com/mcbans/syamn/bungee/LoginEventHandler.java b/src/com/mcbans/syamn/bungee/LoginEventHandler.java index bac2c7f..89662ee 100644 --- a/src/com/mcbans/syamn/bungee/LoginEventHandler.java +++ b/src/com/mcbans/syamn/bungee/LoginEventHandler.java @@ -4,6 +4,7 @@ */ package com.mcbans.syamn.bungee; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.event.LoginEvent; import net.md_5.bungee.api.event.ServerConnectEvent; @@ -28,15 +29,11 @@ public void onServerConnect(ServerConnectEvent event) { String remoteServerName = event.getTarget().getName(); if (plugin.checkForServersOnly.contains(remoteServerName)) { - System.out.println("ServerConnectEvent: needs check"); String playerName = event.getPlayer().getName(); - String playerAddress = event.getPlayer().getAddress().getHostName(); + String playerHost = event.getPlayer().getAddress().getHostName(); - String cancelReason = plugin.checkMCBansForPlayer(playerName, playerAddress); - System.out.println("ServerConnectEvent - cancelreason: " + cancelReason); - if (cancelReason != null) { - event.getPlayer().disconnect(cancelReason); - } + ProxyServer.getInstance().getLogger().info(MCBansProxy.logPrefix + "ServerConnectEvent @ " + remoteServerName + " - Checking login for: " + playerName + " (" + playerHost + ")"); + new MCBansChecker(playerName, playerHost).start(); } } @@ -46,15 +43,13 @@ public void onLogin(final LoginEvent event){ final PendingConnection pc = event.getConnection(); if (event.isCancelled() || pc == null) return; + + String playerName = pc.getName(); + String playerHost = pc.getAddress().getHostName(); - System.out.println("LoginEvent: " + pc.getName()); - - String cancelReason = plugin.checkMCBansForPlayer(pc.getName(), pc.getAddress().getHostName()); - System.out.println("LoginEvent - cancelreason: " + cancelReason); - if (cancelReason != null) { - event.setCancelled(true); - event.setCancelReason(cancelReason); - } + ProxyServer.getInstance().getLogger().info(MCBansProxy.logPrefix + "GlobalConnectEvent - Checking login for: " + playerName + " (" + playerHost + ")"); + new MCBansChecker(playerName, playerHost).start(); } + } diff --git a/src/com/mcbans/syamn/bungee/MCBansChecker.java b/src/com/mcbans/syamn/bungee/MCBansChecker.java new file mode 100644 index 0000000..2dffda2 --- /dev/null +++ b/src/com/mcbans/syamn/bungee/MCBansChecker.java @@ -0,0 +1,35 @@ +package com.mcbans.syamn.bungee; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +public class MCBansChecker extends Thread { + + private String checkPlayerName; + private String checkHostName; + + MCBansChecker(String checkPlayerName, String checkHostName) { + this.checkPlayerName = checkPlayerName; + this.checkHostName = checkHostName; + } + + @Override + public void run() { + if (checkPlayerName == null || checkHostName == null) { + System.out.println("MCBansChecker needs to be innitialized with a playername and hostname"); + return; + } + + String cancelReason = MCBansProxy.checkMCBansForPlayer(checkPlayerName, checkPlayerName); + System.out.println("ServerConnectEvent - cancelreason: " + cancelReason); + if (cancelReason != null) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(checkPlayerName); + if (player != null) { + player.disconnect(cancelReason); + } + + } + + } + +} \ No newline at end of file diff --git a/src/com/mcbans/syamn/bungee/MCBansProxy.java b/src/com/mcbans/syamn/bungee/MCBansProxy.java index aa53855..65635c8 100644 --- a/src/com/mcbans/syamn/bungee/MCBansProxy.java +++ b/src/com/mcbans/syamn/bungee/MCBansProxy.java @@ -30,11 +30,17 @@ public class MCBansProxy extends Plugin{ boolean failsafe, isDebug, enableMaxAlts; List checkForServersOnly; + public static MCBansProxy plugin; + @Override public void onEnable(){ + MCBansProxy.plugin = this; + confManager = new MCBansConfiguration(this); confManager.loadConfig(); + getConfigs(); + ProxyServer.getInstance().getPluginManager().registerListener(this,new LoginEventHandler(this)); ProxyServer.getInstance().getLogger().info(logPrefix + "MCBansProxy plugin enabled!"); } @@ -61,15 +67,28 @@ private void getConfigs(){ } } - void debug(final String msg){ - if (isDebug){ + static void debug(final String msg){ + if (MCBansProxy.plugin.isDebug){ ProxyServer.getInstance().getLogger().info(logPrefix + "[DEBUG] " + msg); } } - public String checkMCBansForPlayer(String playername, String playerHostname) { - + public static String checkMCBansForPlayer(String playername, String playerHostname) { + boolean isValidKey = MCBansProxy.plugin.isValidKey; + boolean failsafe = MCBansProxy.plugin.failsafe; + boolean enableMaxAlts = MCBansProxy.plugin.enableMaxAlts; + boolean isDebug = MCBansProxy.plugin.isDebug; + + int timeout = MCBansProxy.plugin.timeout; + int minRep = MCBansProxy.plugin.minRep; + int maxAlts = MCBansProxy.plugin.maxAlts; + + String apiKey = MCBansProxy.plugin.apiKey; + String minRepMsg = MCBansProxy.plugin.minRepMsg; + String maxAltsMsg = MCBansProxy.plugin.maxAltsMsg; + String unavailable = MCBansProxy.plugin.unavailable; + if (!isValidKey){ ProxyServer.getInstance().getLogger().warning("Missing or invalid API Key! Please check config.yml and restart proxy!"); return "Server temporarily unavailable. Contact the server administrator."; From e71b887aa7ebc1acddd10200fe1a036ce3376674 Mon Sep 17 00:00:00 2001 From: DerFlash Date: Fri, 26 Apr 2013 13:34:50 +0200 Subject: [PATCH 4/5] add a snapshot build for the latest BungeeCord changes (needed recompile because of binary incompatibility) --- releases/MCBansProxy-1.3-SNAPSHOT.jar | Bin 0 -> 13183 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 releases/MCBansProxy-1.3-SNAPSHOT.jar diff --git a/releases/MCBansProxy-1.3-SNAPSHOT.jar b/releases/MCBansProxy-1.3-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..4ee1b7801e4ac96992e34fceac7cf2c43947bd5d GIT binary patch literal 13183 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 literal 0 HcmV?d00001 From 82371b734ff46344a7f9f937e49b8fd774644247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bjo=CC=88rn=20Teichmann?= Date: Sun, 28 Apr 2013 11:00:40 +0200 Subject: [PATCH 5/5] Finally switch dependencies to the BungeeCord API --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f435c1b..e4030b8 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ net.md-5 - bungeecord-proxy + bungeecord-api 1.5-SNAPSHOT