package com.fiftyprojects.abusejet; import java.io.IOException; import java.util.HashSet; import java.util.Map.Entry; import javax.servlet.http.*; import org.apache.commons.lang.StringUtils; import org.yaml.snakeyaml.Yaml; public class AbuseServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { handle(req, resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { handle(req, resp); } public void handle(HttpServletRequest req, HttpServletResponse resp) throws IOException { if(AbuseJet.conf == null){ AbuseJet.initConf(); } resp.setContentType("text/plain"); if(req.getRequestURI().equals("/admin/reload_config")){ AbuseJet.initConf(); Memcache.releaseClient(); resp.getWriter().println("Reloaded Config"); Yaml yaml = new Yaml(); resp.getWriter().println(yaml.dump(AbuseJet.conf)); resp.setStatus(HttpServletResponse.SC_OK); } else if(req.getRequestURI().equals("/admin/alert_report")){ alert_report(resp); } else if(req.getRequestURI().equals("/admin/clear_cache")){ Memcache.flush(); AbuseJet.alertHash.clear(); resp.getWriter().println("Cleared Cache"); resp.setStatus(HttpServletResponse.SC_OK); } else if(req.getRequestURI().equals("/admin/dump_config")){ Yaml yaml = new Yaml(); resp.getWriter().println("Dumping Conf"); resp.getWriter().println(yaml.dump(AbuseJet.conf)); resp.setStatus(HttpServletResponse.SC_OK); } else if(req.getRequestURI().equals("/admin/block")){ String type = req.getParameter("type"); String valueStr = req.getParameter("value"); String action = req.getParameter("action"); String modifier = req.getParameter("modifier"); String ttlStr = req.getParameter("ttl"); int ttl = ttlStr == null ? 0 : Integer.parseInt(ttlStr); int value = valueStr == null ? 0 : Integer.parseInt(valueStr); if(type != null && action != null){ Tracked tracker = AbuseJet.conf.getTracked(type); if(tracker == null){ tracker = new Tracked(type); AbuseJet.conf.getTracked().add(tracker); } tracker.getThresholds().add(new Threshold(action, value, ttl, modifier)); Yaml yaml = new Yaml(); resp.getWriter().println("New Block Added, please add it to the config if you would like it to be persisted."); resp.getWriter().println(yaml.dump(AbuseJet.conf)); resp.setStatus(HttpServletResponse.SC_OK); } else { resp.getWriter().println("Unable to add new block. Please provide a type, value, and action variable"); resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } else { RequestHandler rh = new RequestHandler(req); HashSet<String> actions = rh.MemcacheStore(); resp.getWriter().println(actions.size() > 0 ? StringUtils.join(actions.toArray()," ") : "OK"); for(String action: actions){ if(AbuseJet.conf.getTarpit() && action.startsWith("tarpit-")){ try { Thread.currentThread().sleep(Integer.parseInt(action.substring(7)) * 1000); } catch (NumberFormatException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } else if(AbuseJet.conf.getStatus() && action.startsWith("status-")){ try { resp.setStatus(Integer.parseInt(action.substring(7))); } catch (NumberFormatException e) { e.printStackTrace(); } } } } } private void alert_report(HttpServletResponse resp) throws IOException { resp.getWriter().println("Alert Report"); resp.getWriter().println("Code_action_type_offender_ttl: Val\n"); long curTime = System.currentTimeMillis()/1000; for (Entry<String, ReportingEntry> entry : AbuseJet.alertHash.entrySet()){ if(entry.getValue().getExpiration() < curTime){ AbuseJet.alertHash.remove(entry.getKey()); } else { resp.getWriter().println(entry.getKey()+": "+entry.getValue().getValue()); } } resp.setStatus(HttpServletResponse.SC_OK); } }