X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleOpenIndy.java;h=9e7f5be470c6e1f08e5f01bb40f647e032dfd80c;hb=386e5efa787066632dabe1965c7272146ac72b63;hp=ff2935447e49d1e4f25d42116fac358ed6ea1872;hpb=baf56cc3d324ffa8715509e559bbe049739f32f3;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index ff293544..9e7f5be4 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -1,29 +1,119 @@ +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, The Mir-coders gives permission to link + * the code of this program with any library licensed under the Apache Software License, + * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library + * (or with modified versions of the above that use the same license as the above), + * and distribute linked combinations including the two. You must obey the + * GNU General Public License in all respects for all of the code used other than + * the above mentioned libraries. If you modify this file, you may extend this + * exception to your version of the file, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your version. + */ + package mircoders.servlet; -import java.io.*; -import java.lang.*; -import java.sql.*; -import java.util.*; -import java.net.*; -import java.lang.reflect.*; -import javax.servlet.*; -import javax.servlet.http.*; - -import freemarker.template.*; -import com.oreilly.servlet.multipart.*; -import com.oreilly.servlet.*; - -import mir.servlet.*; -import mir.module.*; -import mir.misc.*; -import mir.entity.*; -import mir.storage.*; -import mir.media.*; - -import mircoders.entity.*; -import mircoders.storage.*; -import mircoders.module.*; -import mircoders.producer.*; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +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.Enumeration; +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 java.util.Vector; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpUtils; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.net.smtp.SMTPClient; +import org.apache.commons.net.smtp.SMTPReply; +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.queryParser.QueryParser; +import org.apache.lucene.search.Hits; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.Searcher; +import org.apache.struts.util.MessageResources; +import gnu.regexp.RE; +import gnu.regexp.REMatch; + +import mir.entity.Entity; +import mir.generator.Generator; +import mir.log.LoggerWrapper; +import mir.misc.StringUtil; +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.UploadedFile; +import mir.storage.StorageObjectFailure; +import mir.util.ExceptionFunctions; +import mir.util.HTTPParsedRequest; +import mir.util.HTTPRequestParser; +import mir.util.StringRoutines; +import mircoders.entity.EntityComment; +import mircoders.entity.EntityContent; +import mircoders.global.MirGlobal; +import mircoders.media.MediaUploadProcessor; +import mircoders.module.ModuleComment; +import mircoders.module.ModuleContent; +import mircoders.module.ModuleImages; +import mircoders.module.ModuleMediaType; +import mircoders.module.ModuleTopics; +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.TopicSearchTerm; +import mircoders.search.UnIndexedSearchTerm; +import mircoders.search.VideoSearchTerm; +import mircoders.storage.DatabaseComment; +import mircoders.storage.DatabaseContent; +import mircoders.storage.DatabaseContentToMedia; +import mircoders.storage.DatabaseContentToTopics; +import mircoders.storage.DatabaseImages; +import mircoders.storage.DatabaseLanguage; +import mircoders.storage.DatabaseTopics; /* * ServletModuleOpenIndy - @@ -31,72 +121,110 @@ import mircoders.producer.*; * adding comments to articles & * open-postings to the newswire * - * @author RK + * @author mir-coders group + * @version $Id: ServletModuleOpenIndy.java,v 1.84 2003/04/29 02:36:50 zapata Exp $ + * */ public class ServletModuleOpenIndy extends ServletModule { - private ModuleContent contentModule; - private ModuleImages imageModule; - private ModuleTopics themenModule; - - //config values - private static String commentFormTemplate = "open/comment.template"; - private static String commentFormDoneTemplate = "open/comment_done.template"; - private static String commentFormDupeTemplate = "open/comment_dupe.template"; - private static String postingFormTemplate = "open/posting.template"; - private static String postingFormDoneTemplate = "open/posting_done.template"; - private static String postingFormDupeTemplate = "open/posting_dupe.template"; - private static boolean directOp = true; + private String commentFormTemplate, commentFormDoneTemplate, commentFormDupeTemplate; + private String postingFormTemplate, postingFormDoneTemplate, postingFormDupeTemplate; + private String searchResultsTemplate; + private String prepareMailTemplate,sentMailTemplate; + private ModuleContent contentModule; + private ModuleComment commentModule; + private ModuleImages imageModule; + private ModuleTopics topicsModule; + private String directOp ="yes"; // Singelton / Kontruktor private static ServletModuleOpenIndy instance = new ServletModuleOpenIndy(); public static ServletModule getInstance() { return instance; } - public static void setDirectOp(boolean v) { - directOp=v; - } - -// public static setCommentFormTemplate(String template) throws { - // if - private ServletModuleOpenIndy() { + super(); try { - theLog = Logfile.getInstance(this.getClass().getName()); - //commentFormTemplate = MirConfig.getProp("ServletModule.OpenIndy.CommentTemplate"); - //commentFormDoneTemplate = MirConfig.getProp("ServletModule.OpenIndy.CommentDoneTemplate"); - //commentFormDupeTemplate = MirConfig.getProp("ServletModule.OpenIndy.CommentDupeTemplate"); - //postingFormTemplate = MirConfig.getProp("ServletModule.OpenIndy.PostingTemplate"); - //postingFormDoneTemplate = MirConfig.getProp("ServletModule.OpenIndy.PostingDoneTemplate"); - //postingFormDupeTemplate = MirConfig.getProp("ServletModule.OpenIndy.PostingDupeTemplate"); - //directOp = MirConfig.getProp("DirectOpenposting").toLowerCase(); - mainModule = new ModuleComment(DatabaseComment.getInstance()); + logger = new LoggerWrapper("ServletModule.OpenIndy"); + + commentFormTemplate = configuration.getString("ServletModule.OpenIndy.CommentTemplate"); + commentFormDoneTemplate = configuration.getString("ServletModule.OpenIndy.CommentDoneTemplate"); + commentFormDupeTemplate = configuration.getString("ServletModule.OpenIndy.CommentDupeTemplate"); + + postingFormTemplate = configuration.getString("ServletModule.OpenIndy.PostingTemplate"); + postingFormDoneTemplate = configuration.getString("ServletModule.OpenIndy.PostingDoneTemplate"); + postingFormDupeTemplate = configuration.getString("ServletModule.OpenIndy.PostingDupeTemplate"); + + searchResultsTemplate = configuration.getString("ServletModule.OpenIndy.SearchResultsTemplate"); + prepareMailTemplate = configuration.getString("ServletModule.OpenIndy.PrepareMailTemplate"); + sentMailTemplate = configuration.getString("ServletModule.OpenIndy.SentMailTemplate"); + directOp = configuration.getString("DirectOpenposting").toLowerCase(); + commentModule = new ModuleComment(DatabaseComment.getInstance()); + mainModule = commentModule; contentModule = new ModuleContent(DatabaseContent.getInstance()); - themenModule = new ModuleTopics(DatabaseTopics.getInstance()); + topicsModule = new ModuleTopics(DatabaseTopics.getInstance()); imageModule = new ModuleImages(DatabaseImages.getInstance()); defaultAction="addposting"; } - catch (StorageObjectException e) { - theLog.printError("servletmoduleopenindy could not be initialized"); + catch (StorageObjectFailure e) { + logger.error("servletmoduleopenindy could not be initialized: " + e.getMessage()); } } + /** + * Method to return an "apology" 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, (Map) null, null, + configuration.getString("ServletModule.OpenIndy.PostingDisabledTemplate")); + } /** * Method for making a comment */ - public void addcomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException - { + public void addcomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + if (MirGlobal.abuse().getOpenPostingDisabled()) { + openPostingDisabled(req, res); + + return; + } + String aid = req.getParameter("aid"); // the article id the comment will belong to - if (aid!=null && !aid.equals("")) - { - SimpleHash mergeData = new SimpleHash(); - // ok, article - mergeData.put("aid", aid); - deliver(req, res, mergeData, commentFormTemplate); + + if (aid != null && !aid.equals("")) { + try { + Map mergeData = new HashMap(); + + // onetimepasswd + if (MirGlobal.abuse().getOpenPostingPassword()) { + String passwd = this.createOneTimePasswd(); + HttpSession session = req.getSession(false); + session.setAttribute("passwd", passwd); + mergeData.put("passwd", passwd); + } + else { + mergeData.put("passwd", (String)null); + } + mergeData.put("aid", aid); + + Map extraInfo = new HashMap(); + extraInfo.put("languagePopUpData", DatabaseLanguage.getInstance().getPopupData()); + + deliver(req, res, mergeData, extraInfo, commentFormTemplate); + } + catch (Throwable t) { + throw new ServletModuleFailure("ServletModuleOpenIndy.addcomment: " + t.getMessage(), t); + } } - else throw new ServletModuleException("aid not set!"); + else + throw new ServletModuleExc("aid not set!"); } /** @@ -104,49 +232,76 @@ public class ServletModuleOpenIndy extends ServletModule * the commentDone Page */ - public void inscomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException - { + public void inscomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + if (MirGlobal.abuse().getOpenPostingDisabled()) { + openPostingDisabled(req, res); + + return; + } + String aid = req.getParameter("to_media"); // the article id the comment will belong to - if (aid!=null && !aid.equals("")) - { + if (aid != null && !aid.equals("")) { // ok, collecting data from form try { - HashMap withValues = getIntersectingValues(req, DatabaseComment.getInstance()); - + Map withValues = getIntersectingValues(req, DatabaseComment.getInstance()); + //no html in comments(for now) - for (Iterator i=withValues.keySet().iterator(); i.hasNext(); ){ - String k=(String)i.next(); - String v=(String)withValues.get(k); - - withValues.put(k,StringUtil.removeHTMLTags(v)); + for (Iterator i = withValues.keySet().iterator(); i.hasNext(); ) { + String k = (String) i.next(); + String v = (String) withValues.get(k); + + withValues.put(k, StringUtil.removeHTMLTags(v)); + } + withValues.put("is_published", "1"); + withValues.put("to_comment_status", "1"); + withValues.put("is_html", "0"); + + //checking the onetimepasswd + HttpSession session = req.getSession(false); + String sessionPasswd = (String) session.getAttribute("passwd"); + if (sessionPasswd != null) { + String passwd = req.getParameter("passwd"); + if (passwd == null || passwd.length() == 0) { + throw new ServletModuleUserExc("comment.error.missingpassword", new String[] {}); + } + if (!sessionPasswd.equals(passwd)) { + throw new ServletModuleUserExc("comment.error.invalidpassword", new String[] {}); + } + session.invalidate(); } - withValues.put("is_published","1"); - // inserting into database String id = mainModule.add(withValues); - theLog.printDebugInfo("id: "+id); - //insert was not successfull - if(id==null){ - deliver(req, res, new SimpleHash(), commentFormDupeTemplate); + + SimpleResponse response = new SimpleResponse(); + response.setResponseGenerator(commentFormDoneTemplate); + + if (id == null) { + deliver(req, res, (Map)null, null, commentFormDupeTemplate); } - - // producing new page - new ProducerContent().handle(null, null, true, false, aid); + else { + DatabaseContent.getInstance().setUnproduced("id=" + aid); - // sync the server - int exitValue = Helper.rsync(); - theLog.printDebugInfo("rsync:"+exitValue); + try { + EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); + MirGlobal.localizer().openPostings().afterCommentPosting(comment); + MirGlobal.abuse().checkComment( + comment, new HTTPAdapters.HTTPRequestAdapter(req), res); + } + catch (Throwable t) { + throw new ServletModuleExc(t.getMessage()); + } + } // redirecting to url // should implement back to article - SimpleHash mergeData = new SimpleHash(); - deliver(req, res, mergeData, commentFormDoneTemplate); + deliver(req, res, response.getResponseValues(), null, response.getResponseGenerator()); + } + catch (Throwable e) { + throw new ServletModuleFailure(e); } - catch (StorageObjectException e) { throw new ServletModuleException(e.toString());} - catch (ModuleException e) { throw new ServletModuleException(e.toString());} - } - else throw new ServletModuleException("aid not set!"); + else + throw new ServletModuleExc("aid not set!"); } @@ -154,32 +309,60 @@ public class ServletModuleOpenIndy extends ServletModule * Method for delivering the form-Page for open posting */ - public void addposting(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException + public void addposting(HttpServletRequest req, HttpServletResponse res) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { - SimpleHash mergeData = new SimpleHash(); - String numOfMedia = req.getParameter("medianum"); - if(numOfMedia==null||numOfMedia.equals("")){ - numOfMedia="1"; - } - - int mediaNum = Integer.parseInt(numOfMedia); - SimpleList mediaFields = new SimpleList(); - for(int i =0; i Integer.parseInt(maxMedia)) { + numOfMedia = maxMedia; + } + + int mediaNum = Integer.parseInt(numOfMedia); + List mediaFields = new Vector(); + for (int i = 0; i < mediaNum; i++) { + Integer mNum = new Integer(i + 1); + mediaFields.add(mNum.toString()); + } + mergeData.put("medianum", numOfMedia); + mergeData.put("mediafields", mediaFields); + mergeData.put("to_topic", null); + + Map extraInfo = new HashMap(); + extraInfo.put("languagePopUpData", DatabaseLanguage.getInstance().getPopupData()); + extraInfo.put("themenPopupData", topicsModule.getTopicsAsSimpleList()); + + extraInfo.put("topics", topicsModule.getTopicsList()); + deliver(req, res, mergeData, extraInfo, postingFormTemplate); } - mergeData.put("medianum",numOfMedia); - mergeData.put("mediafields",mediaFields); - mergeData.put("themenPopupData", themenModule.getTopicsAsSimpleList()); - - - /** @todo popups missing */ - try{ - mergeData.put("languagePopUpData",DatabaseLanguage.getInstance().getPopupData()); - } catch (Exception e) { - theLog.printError("languagePopUpData failed"); + catch (Throwable t) { + throw new ServletModuleFailure(t); } - deliver(req, res, mergeData, postingFormTemplate); } /** @@ -187,216 +370,754 @@ public class ServletModuleOpenIndy extends ServletModule * the postingDone Page */ - public void insposting(HttpServletRequest req, HttpServletResponse res) - throws ServletModuleException - { - SimpleHash mergeData = new SimpleHash(); - boolean setMedia=false; + public void insposting(HttpServletRequest aRequest, HttpServletResponse aResponse) throws + ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + if (MirGlobal.abuse().getOpenPostingDisabled()) { + openPostingDisabled(aRequest, aResponse); + + return; + } try { - WebdbMultipartRequest mp = new WebdbMultipartRequest(req); - - HashMap withValues = mp.getParameters(); - - // call the routines that escape html - - for (Iterator i=withValues.keySet().iterator(); i.hasNext(); ){ - String k=(String)i.next(); - String v=(String)withValues.get(k); - - if (k.equals("content_data")){ + HTTPParsedRequest parsedRequest = new HTTPParsedRequest( + aRequest, + configuration.getString("Mir.DefaultEncoding"), + configuration.getInt("MaxMediaUploadSize")*1024, + configuration.getString("TempDir")); + + Map mergeData = new HashMap(); + + HttpSession session = aRequest.getSession(false); + String sessionPasswd = (String) session.getAttribute("passwd"); + if (sessionPasswd != null) { + String passwd = (String) parsedRequest.getParameter("passwd"); + + if (passwd == null || passwd.length() == 0) { + throw new ServletModuleUserExc("posting.error.missingpassword", new String[] {}); + } + if (!sessionPasswd.equals(passwd)) { + throw new ServletModuleUserExc("posting.error.invalidpassword", new String[] {}); + } + session.invalidate(); + } + + if ((((String) parsedRequest.getParameter("title")).length() == 0) || + (((String) parsedRequest.getParameter("description")).length() == 0) || + (((String) parsedRequest.getParameter("content_data")).length() == 0)) + throw new ServletModuleUserExc("posting.error.missingfield", new String[] {}); + + List mediaList = new Vector(); + Iterator i = parsedRequest.getFiles().iterator(); + + while (i.hasNext()) { + UploadedFile file = new mir.session.CommonsUploadedFileAdapter((FileItem) i.next()); + Map mediaValues = new HashMap(); + + String suffix = file.getFieldName().substring(5); // media${m} + logger.debug("media_title" + suffix); + String title = parsedRequest.getParameter("media_title" + suffix); + + mediaValues.put("title", StringUtil.removeHTMLTags(title)); + mediaValues.put("creator", StringUtil.removeHTMLTags(parsedRequest.getParameter("creator"))); + mediaValues.put("to_publisher", "0"); + mediaValues.put("is_published", "1"); + mediaValues.put("to_media_folder", "7"); + + mediaList.add(MediaUploadProcessor.processMediaUpload(file, mediaValues)); + } + + Map withValues = new HashMap(); + i = DatabaseContent.getInstance().getFields().iterator(); + while (i.hasNext()) { + String field = (String) i.next(); + String value = parsedRequest.getParameter(field); + if (value!=null) + withValues.put(field, value); + } + + + for (i = withValues.keySet().iterator(); i.hasNext(); ) { + String k = (String) i.next(); + String v = (String) withValues.get(k); + + if (k.equals("content_data")) { //this doesn't quite work yet, so for now, all html goes //withValues.put(k,StringUtil.approveHTMLTags(v)); - //withValues.put(k,StringUtil.removeHTMLTags(v)); - } else { - withValues.put(k,StringUtil.removeHTMLTags(v)); + withValues.put(k, StringUtil.deleteForbiddenTags(v)); + } + else if (k.equals("description")) { + String tmp = StringUtil.deleteForbiddenTags(v); + withValues.put(k, StringUtil.deleteHTMLTableTags(tmp)); + } + else { + withValues.put(k, StringUtil.removeHTMLTags(v)); } - } withValues.put("date", StringUtil.date2webdbDate(new GregorianCalendar())); - withValues.put("publish_path", StringUtil.webdbDate2path((String)withValues.get("date"))); + withValues.put("publish_path", + StringUtil.webdbDate2path( (String) withValues.get("date"))); withValues.put("is_produced", "0"); - // op-articles are immediatly published - withValues.put("is_published","1"); - // if op direct article-type == newswire - if (directOp) withValues.put("to_article_type","1"); - - // owner is openposting user - withValues.put("to_publisher","1"); - if (withValues.get("creator").toString().equals("")) - withValues.put("creator","Anonym"); + withValues.put("is_published", "1"); + if (directOp.equals("yes")) + withValues.put("to_article_type", "1"); + + withValues.put("to_publisher", "1"); // inserting content into database String cid = contentModule.add(withValues); - theLog.printDebugInfo("id: "+cid); + logger.debug("id: " + cid); //insert was not successfull - if(cid==null){ - //How do we know that it was not succesful cause of a - //dupe, what if it failed cause of "No space left on device"? - //Or is there something I am missing? Wouldn't it be better - //to have an explicit dupe check and then insert? I have no - //idea what I am talking about. this comment is in case - //I forget to explicitely ask. -mh - deliver(req, res, mergeData, postingFormDupeTemplate); - } - - String[] to_topicsArr = mp.getParameterValues("to_topic"); - if (to_topicsArr != null && to_topicsArr.length > 0) { - try{ - DatabaseContentToTopics.getInstance().setTopics(cid,to_topicsArr); - theLog.printError("setting content_x_topic success"); - } catch (Exception e) { - theLog.printError("setting content_x_topic failed"); - } //end try - } //end if - - // if op contains uploaddata - String mediaId=null; - int i=1; - for(Iterator it = mp.requestList.iterator(); it.hasNext();){ - MpRequest mpReq = (MpRequest)it.next(); - String fileName = mpReq.getFilename(); - - //get the content-type from what the client browser - //sends us. (the "Oreilly method") - String contentType = mpReq.getContentType(); - - theLog.printError("FROM BROWSER: "+contentType); - - //if the client browser sent us unknown (text/plain is default) - //or if we got application/octet-stream, it's possible that - //the browser is in error, better check against the file extension - if (contentType.equals("text/plain") || - contentType.equals("application/octet-stream")) { - /** - * This is just a temporary way to get the content-type via - * the .extension , we could maybe use a magic method, by looking - * at the header (first few bytes) of the file. (like the file(1) - * command). - * The Oreilly method relies on the content-type that the client - * browser sends and that sometimes is application-octet stream with - * broken/mis-configured browsers. - * - * The map file should be Mir/content-types.properties, it's the - * default Sun Java file with some additional entries that it did - * not have. So if you support a new media type you have to make - * sure that it is in this file -mh - */ - contentType = FileUtil.guessContentTypeFromName(fileName); - theLog.printError("tYPE: "+contentType); - if (contentType==null) - contentType = "text/plain"; // rfc1867 says this is the default + if (cid == null) { + deliver(aRequest, aResponse, mergeData, null, postingFormDupeTemplate); + return; + } + + List topics = parsedRequest.getParameterList("to_topic"); + if (topics.size() > 0) { + try { + DatabaseContentToTopics.getInstance().setTopics(cid, topics); } - HashMap mediaValues = new HashMap(); + catch (Throwable e) { + logger.error("setting content_x_topic failed"); + contentModule.deleteById(cid); + throw new ServletModuleFailure( + "smod - openindy :: insposting: setting content_x_topic failed: " + + e.toString(), e); + } + } + + i = mediaList.iterator(); + while (i.hasNext()) { + Entity mediaEnt = (Entity) i.next(); + DatabaseContentToMedia.getInstance().addMedia(cid, mediaEnt.getId()); + } + + EntityContent article = (EntityContent) contentModule.getById(cid); + try { + MirGlobal.abuse().checkArticle( + article, new HTTPAdapters.HTTPRequestAdapter(aRequest), aResponse); + MirGlobal.localizer().openPostings().afterContentPosting(article); + } + catch (Throwable t) { + logger.error("Error while post-processing article: " + t.getMessage()); + } + deliver(aRequest, aResponse, mergeData, null, postingFormDoneTemplate); + } + catch (Throwable e) { + e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); + Throwable cause = ExceptionFunctions.traceCauseException(e); + + if (cause instanceof ModuleMediaType.UnsupportedMimeTypeExc) { + throw new ServletModuleUserExc("media.unsupportedformat", new String[] {}); + } + throw new ServletModuleFailure(e); + } + } + + /** + * Due to a serious shortcoming of Tomcat 3.3, an extra sessionid parameter is + * generated into open session urls. Tomcat 3.3 makes it impossible to + * distinguish between sessions that are identified using a url and those + * that are identified using cookies: if both a sessionid cookie and a sessionid + * url are available, tomcat 3.3 pretends the url wasn't there... + */ + private static final String SESSION_REQUEST_KEY="sessionid"; + + /** + * Dispatch method for open sessions: a flexible extensible and customizable way + * for open access. Can be used for postings, but also for lots of other stuff. + * + * @param aRequest + * @param aResponse + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure + */ + + public void opensession(HttpServletRequest aRequest, HttpServletResponse aResponse) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + + try { + Request request = + new HTTPAdapters.HTTPParsedRequestAdapter(new HTTPParsedRequest(aRequest, + configuration.getString("Mir.DefaultEncoding"), + configuration.getInt("MaxMediaUploadSize")*1024, + configuration.getString("TempDir"))); + + if (aRequest.isRequestedSessionIdValid() && !aRequest.isRequestedSessionIdFromURL() && + !aRequest.getRequestedSessionId().equals(aRequest.getParameter(SESSION_REQUEST_KEY))) + aRequest.getSession().invalidate(); + + Session session = new HTTPAdapters.HTTPSessionAdapter(aRequest.getSession()); + + SimpleResponse response = new SimpleResponse( + ServletHelper.makeGenerationData(new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)}, + "bundles.open")); + + response.setResponseValue("actionURL", aResponse.encodeURL(HttpUtils.getRequestURL(aRequest).toString())+"?"+SESSION_REQUEST_KEY+"="+aRequest.getSession().getId()); + + SessionHandler handler = MirGlobal.localizer().openPostings().getOpenSessionHandler(request, session); + + handler.processRequest(request, session, response); + ServletHelper.generateOpenPostingResponse(aResponse.getWriter(), response.getResponseValues(), response.getResponseGenerator()); + } + catch (Throwable t) { + logger.error(t.toString()); + t.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); + + throw new ServletModuleFailure(t); + } + } + + /** + * Method for preparing and sending a content as an email message + */ + + public void mail(HttpServletRequest req, HttpServletResponse res) + throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure + { + String aid = req.getParameter("mail_aid"); + if (aid == null){ + throw new ServletModuleExc("An article id must be specified in requests to email an article. Something therefore went badly wrong...."); + } + + String to = req.getParameter("mail_to"); + String from = req.getParameter("mail_from"); + String from_name = req.getParameter("mail_from_name"); + String comment = req.getParameter("mail_comment"); + String mail_language = req.getParameter("mail_language"); + + Map mergeData = new HashMap(); - theLog.printError("CONTENT TYPE IS: "+contentType); - - if (contentType.equals("text/plain") || - contentType.equals("application/octet-stream")) { - throw new ServletModuleException("ModuleException: One or more files of unrecognized types"); + if (to == null || from == null || from_name == null|| to.equals("") || from.equals("") || from_name.equals("") || mail_language == null || mail_language.equals("")){ + + for (Enumeration theParams = req.getParameterNames(); theParams.hasMoreElements() ;) { + String pName=(String)theParams.nextElement(); + if (pName.startsWith("mail_")){ + mergeData.put( pName,req.getParameter(pName) ); } + } + + deliver(req, res, mergeData, null, prepareMailTemplate); + } + else { + //run checks on to and from and mail_language to make sure no monkey business occurring + if (mail_language.indexOf('.') != -1 || mail_language.indexOf('/') != -1 ) { + throw new ServletModuleExc("Invalid language"); + } + if (to.indexOf('\n') != -1 + || to.indexOf('\r') != -1 + || to.indexOf(',') != -1) { + throw new ServletModuleUserExc("email.error.invalidtoaddress", new String[] {to}); + } + if (from.indexOf('\n') != -1 || from.indexOf('\r') != -1 || from.indexOf(',') != -1 ) { + throw new ServletModuleUserExc("email.error.invalidfromaddress", new String[] {from}); + } + - String mediaTitle=(String)withValues.get("media_title"+i); - i++; - - if (mediaTitle==null) - mediaTitle = (String)withValues.get("title"); - - mediaValues.put("title", mediaTitle); - mediaValues.put("date", StringUtil.date2webdbDate(new GregorianCalendar())); - mediaValues.put("to_publisher", "1"); // op user - mediaValues.put("to_media_folder", "7"); // op media_folder - mediaValues.put("is_produced", "0"); - mediaValues.put("is_published","1"); - - //the where clause to find the media_type entry - //from the content-type. - //we use the media type entry to lookup the - //media Handler/Storage classes - String wc = " mime_type='"+contentType+"'"; - - EntityList mediaTypesList = DatabaseMediaType.getInstance().selectByWhereClause(wc); - - String mediaTypeId = null; - String mediaStorageName = null; - String mediaHandlerName = null; - - //if we found an entry matching the - //content-type int the table. - if (mediaTypesList.size() > 0) { - //get the class names from the media_type table. - mediaTypeId = mediaTypesList.elementAt(0).getId(); - mediaStorageName = mediaTypesList.elementAt(0).getValue("tablename"); - mediaHandlerName = mediaTypesList.elementAt(0).getValue("classname"); - mediaValues.put("to_media_type",mediaTypeId); - - //load the classes via reflection - String MediaId; + EntityContent contentEnt; + try{ + contentEnt = (EntityContent)contentModule.getById(aid); + } + catch (Throwable e){ + throw new ServletModuleFailure("Couldn't get content for article "+aid + ": " + e.getMessage(), e); + } + String producerStorageRoot=configuration.getString("Producer.StorageRoot"); + String producerDocRoot=configuration.getString("Producer.DocRoot"); + String publishPath = contentEnt.getValue("publish_path"); + String txtFilePath = producerStorageRoot + producerDocRoot + "/" + mail_language + + publishPath + "/" + aid + ".txt"; + + + File inputFile = new File(txtFilePath); + String content; + + try{ + FileReader in = new FileReader(inputFile); + StringWriter out = new StringWriter(); + int c; + while ((c = in.read()) != -1) + out.write(c); + in.close(); + content= out.toString(); + } + catch (FileNotFoundException e){ + throw new ServletModuleFailure("No text file found in " + txtFilePath, e); + } + catch (IOException e){ + throw new ServletModuleFailure("Problem reading file in " + txtFilePath, e); + } + // add some headers + content = "To: " + to + "\nReply-To: "+ from + "\n" + content; + // put in the comment where it should go + if (comment != null) { + String commentTextToInsert = "\n\nAttached comment from " + from_name + ":\n" + comment; + try { + content=StringRoutines.performRegularExpressionReplacement(content,"!COMMENT!",commentTextToInsert); + } + catch (Throwable e){ + throw new ServletModuleFailure("Problem doing regular expression replacement " + e.toString(), e); + } + } + else{ + try { + content=StringRoutines.performRegularExpressionReplacement(content,"!COMMENT!",""); + } + catch (Throwable e){ + throw new ServletModuleFailure("Problem doing regular expression replacement " + e.toString(), e); + } + } + + SMTPClient client=new SMTPClient(); + try { + int reply; + client.connect(configuration.getString("ServletModule.OpenIndy.SMTPServer")); + + reply = client.getReplyCode(); + + if (!SMTPReply.isPositiveCompletion(reply)) { + client.disconnect(); + throw new ServletModuleExc("SMTP server refused connection."); + } + + client.sendSimpleMessage(configuration.getString("ServletModule.OpenIndy.EmailIsFrom"), to, content); + + client.disconnect(); + //mission accomplished + deliver(req, res, mergeData, null, sentMailTemplate); + } + catch(IOException e) { + if(client.isConnected()) { try { - Class mediaStorageClass = Class.forName("mircoders.storage.Database"+mediaStorageName); - Method m = mediaStorageClass.getMethod("getInstance", null); - Database mediaStorage = (Database)m.invoke(null, null); - Entity mediaEnt = (Entity)mediaStorage.getEntityClass().newInstance(); - mediaEnt.setStorage(mediaStorage); - mediaEnt.setValues(mediaValues); - mediaId = mediaEnt.insert(); - - Class mediaHandlerClass = Class.forName("mir.media.MediaHandler"+mediaHandlerName); - MirMedia mediaHandler = (MirMedia)mediaHandlerClass.newInstance(); - //save and store the media data/metadata - mediaHandler.set(mpReq.getMedia(), mediaEnt,mediaTypesList.elementAt(0)); - - //were done with mpReq at this point, dereference it. - //as it contains mucho mem. -mh 01.10.2001 - mpReq=null; - - if(mediaId!=null){ - new ProducerMedia().handle(null, null, false, false, mediaId); + client.disconnect(); + } catch(IOException f) { + // do nothing + } + } + throw new ServletModuleFailure(e); + } + } + } + + + + /** + * Method for querying a lucene index + * + * @param req + * @param res + * @throws ServletModuleExc + * @throws ServletModuleUserExc + * @throws ServletModuleFailure + */ + + public void search(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + try { + final String[] search_variables = { + "search_content", "search_boolean", "search_creator", + "search_topic", "search_hasImages", "search_hasAudio", "search_hasVideo", "search_sort", + "search_submit", "search_back", "search_forward"}; + HTTPRequestParser requestParser = new HTTPRequestParser(req); + + int increment = 10; + + HttpSession session = req.getSession(false); + + String queryString = ""; + + Map mergeData = new HashMap(); + + KeywordSearchTerm dateTerm = new KeywordSearchTerm("date_formatted", "search_date", "webdb_create_formatted", "webdb_create_formatted", "webdb_create_formatted"); + UnIndexedSearchTerm whereTerm = new UnIndexedSearchTerm("", "", "", "where", "where"); + TextSearchTerm creatorTerm = new TextSearchTerm("creator", "search_creator", "creator", "creator", "creator"); + TextSearchTerm titleTerm = new TextSearchTerm("title", "search_content", "title", "title", "title"); + TextSearchTerm descriptionTerm = new TextSearchTerm("description", "search_content", "description", "description", "description"); + ContentSearchTerm contentTerm = new ContentSearchTerm("content_data", "search_content", "content", "", ""); + TopicSearchTerm topicTerm = new TopicSearchTerm(); + ImagesSearchTerm imagesTerm = new ImagesSearchTerm(); + AudioSearchTerm audioTerm = new AudioSearchTerm(); + VideoSearchTerm videoTerm = new VideoSearchTerm(); + + //make the query available to subsequent iterations + + Iterator j = Arrays.asList(search_variables).iterator(); + while (j.hasNext()) { + String variable = (String) j.next(); + + mergeData.put(variable, requestParser.getParameter(variable)); + } + + try { + mergeData.put("topics", topicsModule.getTopicsAsSimpleList()); + } + catch (Throwable e) { + logger.debug("Can't get topics: " + e.toString()); + } + + String searchBackValue = req.getParameter("search_back"); + String searchForwardValue = req.getParameter("search_forward"); + + if (searchBackValue != null) { + int totalHits = ( (Integer) session.getAttribute("numberOfHits")).intValue(); + int newPosition = ( (Integer) session.getAttribute("positionInResults")).intValue() - increment; + if (newPosition < 0) + newPosition = 0; + if (newPosition >= totalHits) + newPosition = totalHits - 1; + session.setAttribute("positionInResults", new Integer(newPosition)); + } + else { + if (searchForwardValue != null) { + int totalHits = ( (Integer) session.getAttribute("numberOfHits")).intValue(); + int newPosition = ( (Integer) session.getAttribute("positionInResults")).intValue() + increment; + if (newPosition < 0) + newPosition = 0; + if (newPosition >= totalHits) + newPosition = totalHits - 1; + + session.setAttribute("positionInResults", new Integer(newPosition)); + } + else { + String indexPath = configuration.getString("IndexPath"); + + String creatorFragment = creatorTerm.makeTerm(req); + if (creatorFragment != null) { + queryString = queryString + " +" + creatorFragment; + } + + // search title, description, and content for something + // the contentTerm uses param "search_boolean" to combine its terms + String contentFragment = contentTerm.makeTerm(req); + if (contentFragment != null) { + logger.debug("contentFragment: " + contentFragment); + queryString = queryString + " +" + contentFragment; + } + + String topicFragment = topicTerm.makeTerm(req); + if (topicFragment != null) { + queryString = queryString + " +" + topicFragment; + } + + String imagesFragment = imagesTerm.makeTerm(req); + if (imagesFragment != null) { + queryString = queryString + " +" + imagesFragment; + } + + String audioFragment = audioTerm.makeTerm(req); + if (audioFragment != null) { + queryString = queryString + " +" + audioFragment; + } + + String videoFragment = videoTerm.makeTerm(req); + if (videoFragment != null) { + queryString = queryString + " +" + videoFragment; + } + + if (queryString == null || queryString == "") { + queryString = ""; + } + else { + try { + Searcher searcher = null; + try { + searcher = new IndexSearcher(indexPath); + } + catch (IOException e) { + logger.debug("Can't open indexPath: " + indexPath); + throw new ServletModuleExc("Problem with Search Index! : " + e.toString()); + } + + Query query = null; + try { + query = QueryParser.parse(queryString, "content", new StandardAnalyzer()); + } + catch (Exception e) { + searcher.close(); + logger.debug("Query don't parse: " + queryString); + throw new ServletModuleExc("Problem with Query String! (was '" + queryString + "')"); + } + + Hits hits = null; + try { + hits = searcher.search(query); + } + catch (IOException e) { + searcher.close(); + logger.debug("Can't get hits: " + e.toString()); + throw new ServletModuleExc("Problem getting hits!"); } - } catch (Exception e) { - theLog.printError("setting uploaded_media failed: "+e.toString()); - } //end try-catch - - //we got this far, associate the media to the article - try{ - DatabaseContentToMedia.getInstance().addMedia(cid,mediaId); - theLog.printError("setting content_x_media success"); - } catch (Exception e) { - theLog.printError("setting content_x_media failed"); + + int start = 0; + int end = hits.length(); + + String sortBy = req.getParameter("search_sort"); + if (sortBy == null || sortBy.equals("")) { + throw new ServletModuleExc("Please let me sort by something!(missing search_sort)"); + } + + // here is where the documents will go for storage across sessions + ArrayList theDocumentsSorted = new ArrayList(); + + if (sortBy.equals("score")) { + for (int i = start; i < end; i++) { + theDocumentsSorted.add(hits.doc(i)); + } + } + else { + // then we'll sort by date! + Map dateToPosition = new HashMap(end, 1.0F); //we know how big it will be + for (int i = start; i < end; i++) { + String creationDate = (hits.doc(i)).get("creationDate"); + // do a little dance in case two contents created at the same second! + if (dateToPosition.containsKey(creationDate)) { + ( (ArrayList) (dateToPosition.get(creationDate))).add(new Integer(i)); + } + else { + ArrayList thePositions = new ArrayList(); + thePositions.add(new Integer(i)); + dateToPosition.put(creationDate, thePositions); + } + } + Set keys = dateToPosition.keySet(); + ArrayList keyList = new ArrayList(keys); + Collections.sort(keyList); + if (sortBy.equals("date_desc")) { + Collections.reverse(keyList); + } + else { + if (!sortBy.equals("date_asc")) { + throw new ServletModuleExc("don't know how to sort by: " + sortBy); + } + } + ListIterator keyTraverser = keyList.listIterator(); + while (keyTraverser.hasNext()) { + ArrayList positions = (ArrayList) dateToPosition.get( (keyTraverser.next())); + ListIterator positionsTraverser = positions.listIterator(); + while (positionsTraverser.hasNext()) { + theDocumentsSorted.add(hits.doc( ( (Integer) (positionsTraverser.next())).intValue())); + } + } + } + + try { + searcher.close(); + } + catch (IOException e) { + logger.debug("Can't close searcher: " + e.toString()); + throw new ServletModuleFailure("Problem closing searcher(normal):" + e.getMessage(), e); + } + + session.removeAttribute("numberOfHits"); + session.removeAttribute("theDocumentsSorted"); + session.removeAttribute("positionInResults"); + + session.setAttribute("numberOfHits", new Integer(end)); + session.setAttribute("theDocumentsSorted", theDocumentsSorted); + session.setAttribute("positionInResults", new Integer(0)); + + } + catch (IOException e) { + logger.debug("Can't close searcher: " + e.toString()); + throw new ServletModuleFailure("Problem closing searcher: " + e.getMessage(), e); + } } + } + } + + try { + ArrayList theDocs = (ArrayList) session.getAttribute("theDocumentsSorted"); + if (theDocs != null) { - } else { - theLog.printDebugInfo("Wrong file uploaded!: " + fileName); - throw new ServletModuleException("ModuleException: One or more files of unrecognized types"); - } // end if-else mediaTypesList.size() > 0 - - } //end for Iterator... - - //dereference mp. -mh - mp=null; - - // producing openpostinglist - new ProducerOpenPosting().handle(null,null,false,false); - // producing new page - new ProducerContent().handle(null, null, false, false,cid); - //if direct op producing startpage - if (directOp) new ProducerStartPage().handle(null,null); - - // sync the server - //should be configureable - int exitValue = Helper.rsync(); - theLog.printDebugInfo("rsync: "+exitValue); + mergeData.put("numberOfHits", ( (Integer) session.getAttribute("numberOfHits")).toString()); + List theHits = new Vector(); + int pIR = ( (Integer) session.getAttribute("positionInResults")).intValue(); + int terminus; + int numHits = ( (Integer) session.getAttribute("numberOfHits")).intValue(); + + if (! (pIR + increment >= numHits)) { + mergeData.put("hasNext", "y"); + } + else { + mergeData.put("hasNext", null); + } + if (pIR > 0) { + mergeData.put("hasPrevious", "y"); + } + else { + mergeData.put("hasPrevious", null); + } + if ( (pIR + increment) > numHits) { + terminus = numHits; + } + else { + terminus = pIR + increment; + } + for (int i = pIR; i < terminus; i++) { + Map h = new HashMap(); + Document theHit = (Document) theDocs.get(i); + whereTerm.returnMeta(h, theHit); + creatorTerm.returnMeta(h, theHit); + titleTerm.returnMeta(h, theHit); + descriptionTerm.returnMeta(h, theHit); + dateTerm.returnMeta(h, theHit); + imagesTerm.returnMeta(h, theHit); + audioTerm.returnMeta(h, theHit); + videoTerm.returnMeta(h, theHit); + theHits.add(h); + } + mergeData.put("hits", theHits); + } + } + catch (Throwable e) { + logger.error("Can't iterate over hits: " + e.toString()); + + throw new ServletModuleFailure("Problem getting hits: " + e.getMessage(), e); + } + + mergeData.put("queryString", queryString); + + deliver(req, res, mergeData, null, searchResultsTemplate); + } + catch (NullPointerException n) { + throw new ServletModuleFailure("Null Pointer: " + n.toString(), n); + } + } + + /* + * Method for dynamically generating a pdf using iText + */ + + public void getpdf(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure { + String ID_REQUEST_PARAM = "id"; + try { + String idParam = req.getParameter(ID_REQUEST_PARAM); + if (idParam != null) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PDFGenerator pdfMaker = new PDFGenerator(out); + + RE re = new RE("[0-9]+"); + + REMatch[] idMatches = re.getAllMatches(idParam); + + if (idMatches.length > 1) { + pdfMaker.addLine(); + for (int i = 0; i < idMatches.length; i++) { + REMatch aMatch = idMatches[i]; + String id = aMatch.toString(); + EntityContent contentEnt = (EntityContent) contentModule.getById(id); + pdfMaker.addIndexItem(contentEnt); + + } + } + + for (int i = 0; i < idMatches.length; i++) { + REMatch aMatch = idMatches[i]; + + String id = aMatch.toString(); + + EntityContent contentEnt = (EntityContent) contentModule.getById(id); + pdfMaker.add(contentEnt); + + } + + pdfMaker.stop(); + res.setContentType("application/pdf"); + byte[] content = out.toByteArray(); + res.setContentLength(content.length); + res.getOutputStream().write(content); + res.getOutputStream().flush(); + + } + else { + throw new ServletModuleExc("Missing id."); + } + } + catch (Throwable t) { + logger.error(t.toString()); + throw new ServletModuleFailure(t); } - catch (IOException e) { throw new ServletModuleException("IOException: "+ e.toString());} - catch (StorageObjectException e) { throw new ServletModuleException("StorageObjectException" + e.toString());} - catch (ModuleException e) { throw new ServletModuleException("ModuleException"+e.toString());} - deliver(req, res, mergeData, postingFormDoneTemplate); - //System.gc(); } -} + public String generateOnetimePassword() { + Random r = new Random(); + int random = r.nextInt(); + + long l = System.currentTimeMillis(); + + l = (l * l * l * l) / random; + if (l < 0) + l = l * -1; + String returnString = "" + l; + return returnString.substring(5); + } + + public void deliver(HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) throws ServletModuleFailure { + try { + deliver(aResponse.getWriter(), aRequest, aResponse, aData, anExtra, aGenerator); + } + catch (Throwable t) { + throw new ServletModuleFailure(t); + } + } + + public void deliver(PrintWriter anOutputWriter, HttpServletRequest aRequest, HttpServletResponse aResponse, Map aData, Map anExtra, String aGenerator) + throws ServletModuleFailure { + try { + Map responseData = ServletHelper.makeGenerationData(new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)}, "bundles.open"); + responseData.put("data", aData); + responseData.put("extra", anExtra); + + + Generator generator = MirGlobal.localizer().generators().makeOpenPostingGeneratorLibrary().makeGenerator(aGenerator); + generator.generate(anOutputWriter, responseData, logger); + + anOutputWriter.close(); + } + catch (Throwable e) { + logger.error("Error while generating " + aGenerator + ": " + e.getMessage()); + + throw new ServletModuleFailure(e); + } + } + + public void handleError(HttpServletRequest aRequest, HttpServletResponse aResponse,PrintWriter out, Throwable anException) { + try { + logger.error("error: " + anException); + Map data = new HashMap(); + + data.put("errorstring", anException.getMessage()); + data.put("date", StringUtil.date2readableDateTime(new GregorianCalendar())); + + deliver(out, aRequest, aResponse, data, null, configuration.getString("ServletModule.OpenIndy.ErrorTemplate")); + } + catch (Throwable e) { + throw new ServletModuleFailure(e); + } + } + + public void handleUserError(HttpServletRequest aRequest, HttpServletResponse aResponse, + PrintWriter out, ServletModuleUserExc anException) { + try { + logger.warn("user error: " + anException.getMessage()); + Map data = new HashMap(); + + MessageResources messages = MessageResources.getMessageResources("bundles.open"); + data.put("errorstring", messages.getMessage(getLocale(aRequest), anException.getMessage(), anException.getParameters())); + data.put("date", StringUtil.date2readableDateTime(new GregorianCalendar())); + + deliver(out, aRequest, aResponse, data, null, configuration.getString("ServletModule.OpenIndy.UserErrorTemplate")); + } + catch (Throwable e) { + throw new ServletModuleFailure(e); + } + } + + private String createOneTimePasswd() { + return ""; + } +}