From 38e997cf377da883eb3cadffce4a89495be88c8d Mon Sep 17 00:00:00 2001 From: FrozenCow Date: Tue, 15 Mar 2011 22:43:48 +0100 Subject: [PATCH] Added webchat-interval for anti-spam webmessaging. --- configuration.txt | 3 +- src/main/java/org/dynmap/DynmapPlugin.java | 17 ++++--- .../web/handlers/SendMessageHandler.java | 46 ++++++++++++++++++- 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/configuration.txt b/configuration.txt index 8b7fbc11..4b4b7b70 100644 --- a/configuration.txt +++ b/configuration.txt @@ -71,7 +71,8 @@ web: focuschatballoons: false showchatwindow: true - allowwebchat: true + allowwebchat: true + webchat-interval: 1000 messagettl: 15000 showplayerfacesonmap: true diff --git a/src/main/java/org/dynmap/DynmapPlugin.java b/src/main/java/org/dynmap/DynmapPlugin.java index 6eb5e23f..9d4b4756 100644 --- a/src/main/java/org/dynmap/DynmapPlugin.java +++ b/src/main/java/org/dynmap/DynmapPlugin.java @@ -144,13 +144,16 @@ public class DynmapPlugin extends JavaPlugin { webServer.handlers.put("/up/configuration", new ClientConfigurationHandler((Map) configuration.getProperty("web"))); if (configuration.getNode("web").getBoolean("allowwebchat", false)) { - SendMessageHandler messageHandler = new SendMessageHandler(); - messageHandler.onMessageReceived.addListener(new Listener() { - @Override - public void triggered(Message t) { - webChat(t.name, t.message); - } - }); + SendMessageHandler messageHandler = new SendMessageHandler() {{ + maximumMessageInterval = configuration.getNode("web").getInt("webchat-interval", 1000); + onMessageReceived.addListener(new Listener() { + @Override + public void triggered(Message t) { + webChat(t.name, t.message); + } + }); + }}; + webServer.handlers.put("/up/sendmessage", messageHandler); } diff --git a/src/main/java/org/dynmap/web/handlers/SendMessageHandler.java b/src/main/java/org/dynmap/web/handlers/SendMessageHandler.java index 27e77562..2825bfaf 100644 --- a/src/main/java/org/dynmap/web/handlers/SendMessageHandler.java +++ b/src/main/java/org/dynmap/web/handlers/SendMessageHandler.java @@ -1,6 +1,9 @@ package org.dynmap.web.handlers; import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; import java.util.logging.Logger; import org.dynmap.Event; @@ -18,6 +21,12 @@ public class SendMessageHandler implements HttpHandler { private static final JSONParser parser = new JSONParser(); public Event onMessageReceived = new Event(); + + public int maximumMessageInterval = 1000; + private HashMap disallowedUsers = new HashMap(); + private LinkedList disallowedUserQueue = new LinkedList(); + private Object disallowedUsersLock = new Object(); + @Override public void handle(String path, HttpRequest request, HttpResponse response) throws Exception { if (!request.method.equals(HttpMethod.Post)) { @@ -29,9 +38,39 @@ public class SendMessageHandler implements HttpHandler { InputStreamReader reader = new InputStreamReader(request.body); JSONObject o = (JSONObject)parser.parse(reader); - Message message = new Message(); + final Message message = new Message(); message.name = String.valueOf(o.get("name")); message.message = String.valueOf(o.get("message")); + + final long now = System.currentTimeMillis(); + + synchronized(disallowedUsersLock) { + // Allow users that user that are now allowed to send messages. + while (!disallowedUserQueue.isEmpty()) { + WebUser wu = disallowedUserQueue.getFirst(); + if (now >= wu.nextMessageTime) { + disallowedUserQueue.remove(); + disallowedUsers.remove(wu.name); + } else { + break; + } + } + + WebUser user = disallowedUsers.get(message.name); + if (user == null) { + user = new WebUser() {{ + name = message.name; + nextMessageTime = now+maximumMessageInterval; + }}; + disallowedUsers.put(user.name, user); + disallowedUserQueue.add(user); + } else { + response.fields.put(HttpField.ContentLength, "0"); + response.status = HttpStatus.Forbidden; + response.getBody(); + return; + } + } onMessageReceived.trigger(message); @@ -39,8 +78,13 @@ public class SendMessageHandler implements HttpHandler { response.status = HttpStatus.OK; response.getBody(); } + public static class Message { public String name; public String message; } + public static class WebUser { + public long nextMessageTime; + public String name; + } }