support for CAPTCHAs
[mir.git] / source / mircoders / servlet / ServletModuleOpenIndy.java
index 6769e42..0bb03aa 100755 (executable)
 
 package mircoders.servlet;
 
-import gnu.regexp.RE;
-import gnu.regexp.REMatch;
 import mir.bundle.Bundle;
 import mir.generator.Generator;
 import mir.misc.StringUtil;
+import mir.module.ModuleExc;
 import mir.servlet.ServletModule;
 import mir.servlet.ServletModuleExc;
 import mir.servlet.ServletModuleFailure;
 import mir.servlet.ServletModuleUserExc;
-import mir.session.HTTPAdapters;
-import mir.session.Request;
-import mir.session.Session;
-import mir.session.SessionHandler;
-import mir.session.SimpleResponse;
+import mir.session.*;
 import mir.util.FileRoutines;
 import mir.util.HTTPParsedRequest;
 import mir.util.HTTPRequestParser;
 import mir.util.StringRoutines;
-import mir.module.ModuleExc;
 import mircoders.entity.EntityContent;
 import mircoders.global.CacheKey;
 import mircoders.global.MirGlobal;
+import mircoders.localizer.MirLocalizerExc;
+import mircoders.localizer.MirOpenPostingLocalizer;
 import mircoders.module.ModuleContent;
 import mircoders.pdf.PDFGenerator;
-import mircoders.search.AudioSearchTerm;
-import mircoders.search.ContentSearchTerm;
-import mircoders.search.ImagesSearchTerm;
-import mircoders.search.KeywordSearchTerm;
-import mircoders.search.TextSearchTerm;
-import mircoders.search.TopicMatrixSearchTerm;
-import mircoders.search.TopicSearchTerm;
-import mircoders.search.UnIndexedSearchTerm;
-import mircoders.search.VideoSearchTerm;
+import mircoders.search.*;
 import mircoders.storage.DatabaseTopics;
-import mircoders.localizer.MirLocalizerExc;
 import org.apache.commons.net.smtp.SMTPClient;
 import org.apache.commons.net.smtp.SMTPReply;
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
@@ -75,27 +62,17 @@ import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Searcher;
 import org.apache.lucene.store.FSDirectory;
+import org.apache.oro.text.regex.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
+import javax.servlet.ServletOutputStream;
+import java.io.*;
+import java.util.*;
+
+import com.sun.image.codec.jpeg.JPEGCodec;
+import com.sun.image.codec.jpeg.JPEGImageEncoder;
 
 /*
  */
@@ -123,12 +100,6 @@ public class ServletModuleOpenIndy extends ServletModule {
 
   /**
    * Method to return an out of service notice when open postings are disabled
-   *
-   * @param aRequest
-   * @param aResponse
-   * @throws ServletModuleExc
-   * @throws ServletModuleUserExc
-   * @throws ServletModuleFailure
    */
   public void openPostingDisabled(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure {
     deliver(aRequest, aResponse, null, null, getConfiguration().getString("ServletModule.OpenIndy.PostingDisabledTemplate"));
@@ -217,6 +188,33 @@ public class ServletModuleOpenIndy extends ServletModule {
     }
   }
 
+  public void captcha(HttpServletRequest aRequest, HttpServletResponse aResponse)
+          throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure {
+    try {
+      MirOpenPostingLocalizer.Captcha captcha = MirGlobal.localizer().openPostings().generateCaptcha(aRequest.getSession().getId());
+      aRequest.getSession().setAttribute("captcha", captcha);
+
+       // the output stream to render the captcha image as jpeg into
+      ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
+      JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
+      jpegEncoder.encode(captcha.getChallenge());
+
+      aResponse.setHeader("Cache-Control", "no-store");
+      aResponse.setHeader("Pragma", "no-cache");
+      aResponse.setDateHeader("Expires", 0);
+      aResponse.setContentType("image/jpeg");
+
+      ServletOutputStream responseOutputStream = aResponse.getOutputStream();
+
+      responseOutputStream.write(jpegOutputStream.toByteArray());
+      responseOutputStream.flush();
+      responseOutputStream.close();
+    }
+    catch (IOException e) {
+      throw new ServletModuleFailure(e);
+    }
+  }
+
   /**
    * Method for preparing and sending a content as an email message
    */
@@ -481,7 +479,7 @@ public class ServletModuleOpenIndy extends ServletModule {
           }
           else {
             try {
-              Searcher searcher = null;
+              Searcher searcher;
 
               try {
                 searcher = new IndexSearcher(FSDirectory.getDirectory(indexFile,false));
@@ -660,20 +658,19 @@ public class ServletModuleOpenIndy extends ServletModule {
     String ID_REQUEST_PARAM = "id";
     int maxArticlesInNewsleter = 15; // it is nice not to be dos'ed
     try {
-      String idParam = aRequest.getParameter(ID_REQUEST_PARAM);
-      if (idParam != null) {
-        RE re = new RE("[0-9]+");
-
-        REMatch[] idMatches = re.getAllMatches(idParam);
-        String cacheSelector = "";
-
-        for (int i = 0; i < idMatches.length; i++) {
-          cacheSelector = cacheSelector + "," + idMatches[i].toString();
+      String idParameterValue = aRequest.getParameter(ID_REQUEST_PARAM);
+      if (idParameterValue != null) {
+        Pattern idPattern = new Perl5Compiler().compile("[0-9]+");
+        PatternMatcher matcher = new Perl5Matcher();
+        PatternMatcherInput input = new PatternMatcherInput(idParameterValue);
+        List ids = new ArrayList();
+        while (matcher.contains(input, idPattern)) {
+          ids.add(matcher.getMatch().toString());
         }
 
         String cacheType = "pdf";
 
-        CacheKey theCacheKey = new CacheKey(cacheType, cacheSelector);
+        CacheKey theCacheKey = new CacheKey(cacheType, idParameterValue);
 
         byte[] thePDF;
 
@@ -686,22 +683,17 @@ public class ServletModuleOpenIndy extends ServletModule {
           ByteArrayOutputStream out = new ByteArrayOutputStream();
           PDFGenerator pdfMaker = new PDFGenerator(out);
 
-          if (idMatches.length > 1) {
+          if (ids.size() > 1) {
             pdfMaker.addLine();
-            for (int i = 0; i < idMatches.length && i < maxArticlesInNewsleter; i++) {
-              REMatch aMatch = idMatches[i];
-              String id = aMatch.toString();
-              EntityContent contentEnt = (EntityContent) contentModule.getById(id);
-
+            for (int i = 0; i < ids.size() && i < maxArticlesInNewsleter; i++) {
+              EntityContent contentEnt = (EntityContent) contentModule.getById((String) ids.get(i));
 
               pdfMaker.addIndexItem(contentEnt);
             }
           }
 
-          for (int i = 0; i < idMatches.length; i++) {
-            REMatch aMatch = idMatches[i];
-            String id = aMatch.toString();
-            EntityContent article = (EntityContent) contentModule.getById(id);
+          for (int i = 0; i < ids.size(); i++) {
+            EntityContent article = (EntityContent) contentModule.getById((String) ids.get(i));
 
             if (!MirGlobal.localizer().openPostings().allowArticlePublication(article)) {
               throw new ServletModuleExc("Illegal article");