diff options
Diffstat (limited to 'EssentialsServerlist/src/net/mcserverlist/bukkit/Whitelist.java')
-rw-r--r-- | EssentialsServerlist/src/net/mcserverlist/bukkit/Whitelist.java | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/EssentialsServerlist/src/net/mcserverlist/bukkit/Whitelist.java b/EssentialsServerlist/src/net/mcserverlist/bukkit/Whitelist.java new file mode 100644 index 000000000..96a96ecbc --- /dev/null +++ b/EssentialsServerlist/src/net/mcserverlist/bukkit/Whitelist.java @@ -0,0 +1,107 @@ +package net.mcserverlist.bukkit; + +import com.earth2me.essentials.Essentials; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.Server; + + +public class Whitelist +{ + private static final Logger logger = Logger.getLogger("Minecraft"); + private List<String> allowed = new ArrayList<String>(); + private final Object allowedLock = new Object(); + private Server server; + + public Whitelist(Server server) + { + this.server = server; + } + + public void update() + { + Thread thread = new Thread(new UpdateRunnable()); + thread.setDaemon(true); + thread.start(); + } + + public boolean isAllowed(String player) + { + String p = player.toLowerCase(); + synchronized (allowedLock) + { + return allowed.contains(p); + } + } + + private class UpdateRunnable implements Runnable + { + @SuppressWarnings("CallToThreadDumpStack") + public void run() + { + // Check that we aren't receiving an event inappropriately + if (Essentials.getSettings().getMcslKey() == null || Essentials.getSettings().getMcslKey().equals("")) return; + + try + { + OutputStreamWriter tx = null; + BufferedReader rx = null; + try + { + // Send GET request + URL url = new URL("http://mcserverlist.net/api/whitelist"); + // Swap line for testing purposes + //URL url = new URL("http://localhost/mcsl/whitelist.php"); + HttpURLConnection http = (HttpURLConnection)url.openConnection(); + http.setRequestMethod("POST"); + http.setUseCaches(false); + http.setConnectTimeout(1000); + http.setAllowUserInteraction(false); + http.setInstanceFollowRedirects(true); + http.setRequestProperty("User-Agent", "Java;Mcsl"); + http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); + http.setRequestProperty("X-Mcsl-Key", Essentials.getSettings().getMcslKey()); + http.setRequestProperty("X-Minecraft-Name", URLEncoder.encode(server.getName(), "UTF-8")); + http.setRequestProperty("X-Minecraft-Version", server.getVersion()); + http.setDoInput(true); + http.setDoOutput(false); + + // Get the HTTP response + rx = new BufferedReader(new InputStreamReader(http.getInputStream())); + List<String> allowed = new ArrayList<String>(); + for (String l = ""; rx.ready(); l = rx.readLine()) + { + if ("".equals(l)) continue; + else if (l.startsWith("i:")) logger.info(l.substring(2)); + else if (l.startsWith("w:")) logger.warning(l.substring(2)); + else allowed.add(l.toLowerCase()); // Add to whitelist + } + + synchronized (Whitelist.this.allowedLock) + { + Whitelist.this.allowed = allowed; + allowed = null; // Remove our reference so that we don't accidentally use it + } + } + finally + { + if (tx != null) tx.close(); + if (rx != null) rx.close(); + } + } + catch (Exception ex) + { + logger.log(Level.WARNING, "Error communication with MCServerlist.", ex); + ex.printStackTrace(); + } + } + } +} |