* anti-abuse upgrade: filters now stored in the database (experimental)
[mir.git] / source / mircoders / servlet / ServletModuleAbuse.java
index 8ab8aec..9d017b1 100755 (executable)
 
 package mircoders.servlet;
 
-import java.util.Locale;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import mir.log.LoggerWrapper;
 import mir.servlet.ServletModule;
+import mir.servlet.ServletModuleExc;
 import mir.servlet.ServletModuleFailure;
+import mir.storage.StorageObjectExc;
 import mir.util.HTTPRequestParser;
 import mir.util.URLBuilder;
+import mircoders.abuse.FilterEngine;
 import mircoders.global.MirGlobal;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
 public class ServletModuleAbuse extends ServletModule {
   private static ServletModuleAbuse instance = new ServletModuleAbuse();
+  private String editFilterTemplate;
+  private String listFiltersTemplate;
+  private String editFilterGroupTemplate;
+  private String listFilterGroupsTemplate;
+  private String mainTemplate;
+  private String viewLogTemplate;
+
   public static ServletModule getInstance() { return instance; }
 
   private ServletModuleAbuse() {
     logger = new LoggerWrapper("ServletModule.Abuse");
     defaultAction = "showsettings";
+
+    editFilterTemplate = configuration.getString("ServletModule.Abuse.EditFilter.Template");
+    listFiltersTemplate = configuration.getString("ServletModule.Abuse.ListFilters.Template");
+    editFilterGroupTemplate = configuration.getString("ServletModule.Abuse.EditFilterGroup.Template");
+    listFilterGroupsTemplate = configuration.getString("ServletModule.Abuse.ListFilterGroups.Template");
+    viewLogTemplate = configuration.getString("ServletModule.Abuse.ViewLog.Template");
+    mainTemplate = configuration.getString("ServletModule.Abuse.Main.Template");
   }
 
-  public void editfilter(HttpServletRequest aRequest, HttpServletResponse aResponse) {
+  public void editfilter(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
+    String id=requestParser.getParameterWithDefault("id", "");
+    String groupid=requestParser.getParameterWithDefault("groupid", "");
+
+    FilterEngine.Filter filter = MirGlobal.abuse().getFilterEngine().getFilterForId(groupid, id);
+
+    editfilter(aRequest, aResponse,
+        groupid,
+        id, filter.getType(), filter.getExpression(),
+        filter.getComment(), filter.getTag(), filter.getCommentAction(), filter.getArticleAction(), "");
+  }
+
+  public void addfilter(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
+    String groupid=requestParser.getParameterWithDefault("groupid", "");
+
+    editfilter(aRequest, aResponse, groupid, "", "", "", "", "", "", "", "");
+  }
+
+  public void editfilter(HttpServletRequest aRequest, HttpServletResponse aResponse,
+        String aGroupId, String anId, String aType, String anExpression, String aComments,
+        String aTag,
+        String aCommentAction, String anArticleAction, String anErrorMessage) throws ServletModuleExc {
+    try {
+      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, getLocales(aRequest));
+
+      responseData.put("id", anId);
+      responseData.put("groupid", aGroupId);
+      responseData.put("type", aType);
+      responseData.put("expression", anExpression);
+      responseData.put("comments", aComments);
+      responseData.put("tag", aTag);
+      responseData.put("articleaction", anArticleAction);
+      responseData.put("commentaction", aCommentAction);
+      responseData.put("errormessage", anErrorMessage);
+
+      responseData.put("articleactions", MirGlobal.abuse().getArticleActions());
+      responseData.put("commentactions", MirGlobal.abuse().getCommentActions());
+      responseData.put("filtertypes", MirGlobal.abuse().getFilterEngine().getFilterTypes());
+
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, editFilterTemplate);
+    }
+    catch (Throwable e) {
+      throw new ServletModuleFailure(e);
+    }
+  }
+
+  public void updatefilter(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
 
     String type=requestParser.getParameterWithDefault("type", "");
     String id=requestParser.getParameterWithDefault("id", "");
+    String groupid=requestParser.getParameter("groupid");
     String expression=requestParser.getParameterWithDefault("expression", "");
+    String commentaction=requestParser.getParameterWithDefault("commentaction", "");
+    String articleaction=requestParser.getParameterWithDefault("articleaction", "");
+    String comments=requestParser.getParameterWithDefault("comments", "");
+    String tag=requestParser.getParameterWithDefault("tag", "");
+
+    String errorMessage;
 
-    if (id.equals("")) {
-      MirGlobal.abuse().addFilter(type, expression);
+    try {
+      if (id.equals("")) {
+        errorMessage = MirGlobal.abuse().getFilterEngine().addFilter(
+            groupid, type, expression, comments, tag,
+            articleaction, commentaction);
+        logAdminUsage(aRequest, id, "filter added");
+      }
+      else {
+        errorMessage = MirGlobal.abuse().getFilterEngine().updateFilter(
+            groupid, id, type, expression, comments, tag,
+            articleaction, commentaction);
+        logAdminUsage(aRequest, id, "filter modified");
+      }
+    }
+    catch (StorageObjectExc e) {
+      throw new ServletModuleFailure(e);
+    }
+
+    if (errorMessage!=null) {
+      editfilter(aRequest, aResponse, groupid, id, type,
+          expression, comments, tag, commentaction, articleaction, errorMessage);
     }
     else {
-      MirGlobal.abuse().setFilter(id, type, expression);
+      MirGlobal.abuse().save();
+      listfilters(aRequest, aResponse);
     }
+  }
+
+  public void deletefilter(HttpServletRequest aRequest, HttpServletResponse aResponse) {
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
 
-    MirGlobal.abuse().save();
+    String id=requestParser.getParameter("id");
+    String groupid=requestParser.getParameter("groupid");
+    MirGlobal.abuse().getFilterEngine().deleteFilter(groupid, id);
+    MirGlobal.logAdminUsage(ServletHelper.getUser(aRequest), getOperationModuleName() + ":" + "filter:"+groupid+":"+id, "filter deleted");
 
-    showfilters(aRequest, aResponse);
+    listfilters(aRequest, aResponse);
   }
 
-  public void deletefilter(HttpServletRequest aRequest, HttpServletResponse aResponse) {
+  public void deletefiltergroup(HttpServletRequest aRequest, HttpServletResponse aResponse) {
     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
 
+    String groupid=requestParser.getParameter("groupid");
+    MirGlobal.abuse().getFilterEngine().deleteFilterGroup(groupid);
+
+    MirGlobal.logAdminUsage(ServletHelper.getUser(aRequest), getOperationModuleName() + ":" + "filtergroup:"+groupid, "filter group deleted");
+
+    showfiltergroups(aRequest, aResponse);
+  }
+
+  public void addfiltergroup(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
+    editfiltergroup(aRequest, aResponse, "", "");
+  }
+
+  public void editgroup(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
     String id=requestParser.getParameterWithDefault("id", "");
-    MirGlobal.abuse().deleteFilter(id);
 
-    MirGlobal.abuse().save();
+    FilterEngine.FilterGroup group = MirGlobal.abuse().getFilterEngine().getFilterGroupForId(id);
+
+    editfiltergroup(aRequest, aResponse, id, group.getName());
+  }
+
+  public void editfiltergroup(HttpServletRequest aRequest, HttpServletResponse aResponse,
+        String anId, String aName) throws ServletModuleExc {
+    try {
+      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, getLocales(aRequest));
 
-    showfilters(aRequest, aResponse);
+      responseData.put("id", anId);
+      responseData.put("name", aName);
+
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, editFilterGroupTemplate);
+    }
+    catch (Throwable e) {
+      throw new ServletModuleFailure(e);
+    }
   }
 
-  public void showfilters(HttpServletRequest aRequest, HttpServletResponse aResponse) {
+  public void listfilters(HttpServletRequest aRequest, HttpServletResponse aResponse) {
     URLBuilder urlBuilder = new URLBuilder();
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
+    String groupid=requestParser.getParameterWithDefault("groupid", "");
 
     try {
-      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
+      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, getLocales(aRequest));
 
       urlBuilder.setValue("module", "Abuse");
-      urlBuilder.setValue("do", "showfilters");
+      urlBuilder.setValue("do", "listfilters");
+      urlBuilder.setValue("groupid", groupid);
       responseData.put("thisurl", urlBuilder.getQuery());
+      responseData.put("groupid", groupid);
 
-      responseData.put("filters", MirGlobal.abuse().getFilters());
-      responseData.put("filtertypes", MirGlobal.abuse().getFilterTypes());
+      responseData.put("filters", MirGlobal.abuse().getFilterEngine().getFilters(groupid));
 
-      ServletHelper.generateResponse(aResponse.getWriter(), responseData, "abuse.filters.template");
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, listFiltersTemplate);
     }
     catch (Throwable e) {
       throw new ServletModuleFailure(e);
     }
   }
 
+  public void updatefiltergroup(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
+
+    String name = requestParser.getParameterWithDefault("name", "");
+    String id = requestParser.getParameterWithDefault("id", "");
+
+    try {
+        if (id.equals("")) {
+          MirGlobal.abuse().getFilterEngine().addFilterGroup(name);
+        }
+        else {
+          MirGlobal.abuse().getFilterEngine().updateFilterGroup(id, name);
+        }
+    }
+    catch (StorageObjectExc e) {
+      throw new ServletModuleFailure(e);
+    }
+
+    showfiltergroups(aRequest, aResponse);
+  }
+
+  public void showfiltergroups(HttpServletRequest aRequest, HttpServletResponse aResponse) {
+    URLBuilder urlBuilder = new URLBuilder();
+
+    try {
+      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, getLocales(aRequest));
+
+      urlBuilder.setValue("module", "Abuse");
+      urlBuilder.setValue("do", "showfiltergroups");
+      responseData.put("thisurl", urlBuilder.getQuery());
+
+      responseData.put("filtergroups", MirGlobal.abuse().getFilterEngine().getFilterGroups());
+
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, listFilterGroupsTemplate);
+    }
+    catch (Throwable e) {
+      throw new ServletModuleFailure(e);
+    }
+  }
 
   public void showsettings(HttpServletRequest aRequest, HttpServletResponse aResponse) {
     URLBuilder urlBuilder = new URLBuilder();
 
     try {
-      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
+      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, getLocales(aRequest));
 
       urlBuilder.setValue("module", "Abuse");
       urlBuilder.setValue("do", "showsettings");
@@ -125,7 +292,7 @@ public class ServletModuleAbuse extends ServletModule {
       responseData.put("articleaction", MirGlobal.abuse().getArticleBlockAction());
       responseData.put("commentaction", MirGlobal.abuse().getCommentBlockAction());
 
-      ServletHelper.generateResponse(aResponse.getWriter(), responseData, "abuse.template");
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, mainTemplate);
     }
     catch (Throwable e) {
       throw new ServletModuleFailure(e);
@@ -152,6 +319,7 @@ public class ServletModuleAbuse extends ServletModule {
       MirGlobal.abuse().setCommentBlockAction(parser.getParameter("commentaction"));
 
       MirGlobal.abuse().save();
+      logAdminUsage(aRequest, "settings", "object modified");
 
       showsettings(aRequest, aResponse);
     }
@@ -162,17 +330,16 @@ public class ServletModuleAbuse extends ServletModule {
 
   public void showlog(HttpServletRequest aRequest, HttpServletResponse aResponse) {
     URLBuilder urlBuilder = new URLBuilder();
-    int count;
 
     try {
-      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
+      Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, getLocales(aRequest));
       urlBuilder.setValue("module", "Abuse");
       urlBuilder.setValue("do", "showlog");
       responseData.put("thisurl", urlBuilder.getQuery());
 
       responseData.put("log", MirGlobal.abuse().getLog());
 
-      ServletHelper.generateResponse(aResponse.getWriter(), responseData, "abuse.log.template");
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, viewLogTemplate);
     }
     catch (Throwable e) {
       throw new ServletModuleFailure(e);