X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fservlet%2FServletModuleOpenIndy.java;h=4d275ceccba11f122ad03bb41ec5a16d25a73b47;hb=c214e75a013df44fb221f5e1a2d4c072247b87ed;hp=3c218d51d0e30ed1565163bb8e27c26fb3ed306f;hpb=10f8008d76b07f1e6d2ed16c391d3411f0abf184;p=mir.git diff --git a/source/mircoders/servlet/ServletModuleOpenIndy.java b/source/mircoders/servlet/ServletModuleOpenIndy.java index 3c218d51..4d275cec 100755 --- a/source/mircoders/servlet/ServletModuleOpenIndy.java +++ b/source/mircoders/servlet/ServletModuleOpenIndy.java @@ -1,8 +1,11 @@ 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.*; @@ -15,11 +18,14 @@ 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 mircoders.global.*; +import mircoders.localizer.*; /* * ServletModuleOpenIndy - @@ -33,29 +39,37 @@ import mircoders.producer.*; public class ServletModuleOpenIndy extends ServletModule { - private String commentFormTemplate, commentFormDoneTemplate; - private String postingFormTemplate, postingFormDoneTemplate; - private ModuleContent contentModule; - private ModuleImages imageModule; - private String directOp ="yes"; - + private String commentFormTemplate, commentFormDoneTemplate, + commentFormDupeTemplate; + private String postingFormTemplate, postingFormDoneTemplate, + postingFormDupeTemplate; + private ModuleContent contentModule; + private ModuleComment commentModule; + private ModuleImages imageModule; + private ModuleTopics themenModule; + private String directOp ="yes"; + private String passwdProtection ="yes"; // Singelton / Kontruktor private static ServletModuleOpenIndy instance = new ServletModuleOpenIndy(); public static ServletModule getInstance() { return instance; } private ServletModuleOpenIndy() { try { - theLog = Logfile.getInstance(Configuration.getProperty("Home") + Configuration.getProperty("ServletModule.OpenIndy.Logfile")); - commentFormTemplate = Configuration.getProperty("ServletModule.OpenIndy.CommentTemplate"); - commentFormDoneTemplate = Configuration.getProperty("ServletModule.OpenIndy.CommentDoneTemplate"); - postingFormTemplate = Configuration.getProperty("ServletModule.OpenIndy.PostingTemplate"); - postingFormDoneTemplate = Configuration.getProperty("ServletModule.OpenIndy.PostingDoneTemplate"); - directOp = Configuration.getProperty("DirectOpenposting").toLowerCase(); - //directOp="yes"; + theLog = Logfile.getInstance(MirConfig.getProp("Home") + MirConfig.getProp("ServletModule.OpenIndy.Logfile")); + 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(); + passwdProtection = MirConfig.getProp("PasswdProtection").toLowerCase(); mainModule = new ModuleComment(DatabaseComment.getInstance()); contentModule = new ModuleContent(DatabaseContent.getInstance()); + themenModule = new ModuleTopics(DatabaseTopics.getInstance()); imageModule = new ModuleImages(DatabaseImages.getInstance()); defaultAction="addposting"; + } catch (StorageObjectException e) { theLog.printError("servletmoduleopenindy could not be initialized"); @@ -70,10 +84,27 @@ public class ServletModuleOpenIndy extends ServletModule public void addcomment(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException { String aid = req.getParameter("aid"); // the article id the comment will belong to + String language = req.getParameter("language"); + if (aid!=null && !aid.equals("")) { SimpleHash mergeData = new SimpleHash(); - // ok, article + + // onetimepasswd + if(passwdProtection.equals("yes")){ + String passwd = this.createOneTimePasswd(); + System.out.println(passwd); + HttpSession session = req.getSession(false); + session.setAttribute("passwd",passwd); + mergeData.put("passwd", passwd); + } + + if (language!=null) { + HttpSession session = req.getSession(false); + session.setAttribute("Locale", new Locale(language, "")); + session.setAttribute("passwd",language); + } + mergeData.put("aid", aid); deliver(req, res, mergeData, commentFormTemplate); } @@ -85,7 +116,8 @@ 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 ServletModuleException,ServletModuleUserException { String aid = req.getParameter("to_media"); // the article id the comment will belong to if (aid!=null && !aid.equals("")) @@ -93,16 +125,45 @@ public class ServletModuleOpenIndy extends ServletModule // ok, collecting data from form try { HashMap 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)); + } withValues.put("is_published","1"); + //checking the onetimepasswd + if(passwdProtection.equals("yes")){ + HttpSession session = req.getSession(false); + String sessionPasswd = (String)session.getAttribute("passwd"); + if ( sessionPasswd == null){ + throw new ServletModuleUserException("Lost password"); + } + String passwd = req.getParameter("passwd"); + if ( passwd == null || (!sessionPasswd.equals(passwd))) { + throw new ServletModuleUserException("Missing password"); + } + session.invalidate(); + } + // inserting into database String id = mainModule.add(withValues); - - // producing new page - new ProducerContent().handle(null, null, true, false, aid); - - // sync the server - int exitValue = Helper.rsync(); + theLog.printDebugInfo("id: "+id); + //insert was not successfull + if(id==null){ + deliver(req, res, new SimpleHash(), commentFormDupeTemplate); + } + else { + DatabaseContent.getInstance().setUnproduced("id="+aid); + + EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(id); + + MirGlobal.localizer().openPostings().afterCommentPosting(comment); + + } // redirecting to url // should implement back to article @@ -121,16 +182,59 @@ 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 ServletModuleException { SimpleHash mergeData = new SimpleHash(); - /** @todo popups missing */ + + // onetimepasswd + if(passwdProtection.equals("yes")){ + String passwd = this.createOneTimePasswd(); + System.out.println(passwd); + HttpSession session = req.getSession(false); + session.setAttribute("passwd",passwd); + mergeData.put("passwd", passwd); + } + + String maxMedia = MirConfig.getProp("ServletModule.OpenIndy.MaxMediaUploadItems"); + String numOfMedia = req.getParameter("medianum"); + if(numOfMedia==null||numOfMedia.equals("")){ + numOfMedia="1"; + } else if(Integer.parseInt(numOfMedia) > Integer.parseInt(maxMedia)) { + numOfMedia = maxMedia; + } + + int mediaNum = Integer.parseInt(numOfMedia); + SimpleList mediaFields = new SimpleList(); + for(int i =0; i=0) { - entImage.setImage(mediaData, fileType); - setMedia=true; - } - else - theLog.printDebugInfo("Wrong file uploaded!" + fileName); + String passwd = (String)withValues.get("passwd"); + if ( passwd == null || (!sessionPasswd.equals(passwd))) { + throw new ServletModuleUserException("Missing password"); + } + session.invalidate(); + } + + if ((((String)withValues.get("title")).length() == 0) || + (((String)withValues.get("description")).length() == 0) || + (((String)withValues.get("content_data")).length() == 0)) + throw new ServletModuleUserException("Missing field"); + + // 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")){ + //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("date", StringUtil.date2webdbDate(new GregorianCalendar())); 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"); + // op-articles are not immediatly published + // we don't know that all is good yet (media, title is present, etc..) + withValues.put("is_published","0"); // if op direct article-type == newswire if (directOp.equals("yes")) withValues.put("to_article_type","1"); - theLog.printDebugInfo("direct op: "+directOp); - - // owner is openposting user + withValues.put("to_publisher","1"); - if (withValues.get("creator").toString().equals("")) - withValues.put("creator","Anonym"); + + // owner is openposting user +// ML: this is not multi-language friendly and this can be done in a template +// if (withValues.get("creator").toString().equals("")) +// withValues.put("creator","Anonym"); // inserting content into database - String id = contentModule.add(withValues); - - // inserting content and media id in table content_x_media - try{ - DatabaseContentToMedia.getInstance().setMedia(id,mediaId); - theLog.printError("setting content_x_topic success"); - } catch (Exception e) { - theLog.printError("setting content_x_topic failed"); + String cid = contentModule.add(withValues); + theLog.printDebugInfo("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); + setTopic = true; + } catch (Exception e) { + theLog.printError("setting content_x_topic failed"); + contentModule.deleteById(cid); + throw new ServletModuleException("smod - openindy :: insposting: setting content_x_topic failed: "+e.toString()); + } //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.printInfo("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")) { + /** + * Fallback to finding the mime-type through the standard ServletApi + * ServletContext getMimeType() method. + * + * This is a way to get the content-type via the .extension, + * we could maybe use a magic method as an additional method of + * figuring out the content-type, by looking at the header (first + * few bytes) of the file. (like the file(1) command). We could + * also call the "file" command through Runtime. This is an + * option that I almost prefer as it is already implemented and + * exists with an up-to-date map on most modern Unix like systems. + * I haven't found a really nice implementation of the magic method + * in pure java yet. + * + * The first method we try thought is the "Oreilly method". It + * 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 we use for the extensions is the standard web-app + * deployment descriptor file (web.xml). See Mir's web.xml or see + * your Servlet containers (most likely Tomcat) documentation. + * So if you support a new media type you have to make sure that + * it is in this file -mh + */ + ServletContext ctx = + (ServletContext)MirConfig.getPropAsObject("ServletContext"); + contentType = ctx.getMimeType(fileName); + if (contentType==null) + contentType = "text/plain"; // rfc1867 says this is the default + } + HashMap mediaValues = new HashMap(); + + theLog.printInfo("CONTENT TYPE IS: "+contentType); + + if (contentType.equals("text/plain") || + contentType.equals("application/octet-stream")) { + contentModule.deleteById(cid); + _throwBadContentType(fileName, contentType); + } + + 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","0"); + + // @todo this should probably be moved to DatabaseMediaType -mh + String[] cTypeSplit = StringUtil.split(contentType, "/"); + String wc = " mime_type LIKE '"+cTypeSplit[0]+"%'"; + + DatabaseMediaType mediaTypeStor = DatabaseMediaType.getInstance(); + EntityList mediaTypesList = mediaTypeStor.selectByWhereClause(wc); + + String mediaTypeId = null; + MirMedia mediaHandler; + Database mediaStorage; +// ProducerMedia mediaProducer; + + //if we didn't find an entry matching the + //content-type int the table. + if (mediaTypesList.size() == 0) { + contentModule.deleteById(cid); + _throwBadContentType(fileName, contentType); + } + + Entity mediaType = null; + Entity mediaType2 = null; + + // find out if we an exact content-type match if so take it. + // otherwise try to match majortype/* + // @todo this should probably be moved to DatabaseMediaType -mh + for(int j=0;j