From 87809334c4eaf3955a1cfe609425ad2f07a26351 Mon Sep 17 00:00:00 2001 From: zapata Date: Mon, 21 Apr 2003 02:58:29 +0000 Subject: [PATCH] cos is gone woohee --- lib/cos-05Nov2002.jar | Bin 56411 -> 0 bytes source/Mir.java | 86 ++- source/mir/misc/FileExtFilter.java | 54 -- source/mir/misc/FileHandler.java | 78 -- source/mir/misc/HTMLTemplateProcessor.java | 56 +- source/mir/misc/Helper.java | 82 --- source/mir/misc/ListOfFiles.java | 81 -- source/mir/misc/WebdbMultipartRequest.java | 179 ----- source/mir/session/CommonsUploadedFileAdapter.java | 5 +- source/mir/session/Request.java | 2 +- source/mir/session/SessionHandler.java | 31 + source/mir/session/SimpleResponse.java | 94 ++- source/mir/storage/store/test/TestStore.java | 2 +- source/mir/util/PropertiesManipulator.java | 3 +- source/mircoders/global/Abuse.java | 54 +- .../localizer/MirOpenPostingLocalizer.java | 11 +- .../MirBasicCommentPostingSessionHandler.java | 33 +- .../basic/MirBasicGeneratorLocalizer.java | 2 +- .../basic/MirBasicPostingSessionHandler.java | 372 ++++++++++ source/mircoders/media/MediaRequest.java | 290 -------- source/mircoders/media/MediaUploadProcessor.java | 225 +++--- source/mircoders/servlet/ServletHelper.java | 28 +- .../mircoders/servlet/ServletModuleOpenIndy.java | 20 +- .../servlet/ServletModuleUploadedMedia.java | 817 +++++++++++---------- source/tool/BundleTool.java | 13 +- templates/admin/audio.template | 212 +++--- templates/admin/image.template | 23 +- templates/admin/media.template | 27 +- templates/admin/video.template | 206 +++--- 29 files changed, 1382 insertions(+), 1704 deletions(-) delete mode 100755 lib/cos-05Nov2002.jar delete mode 100755 source/mir/misc/FileExtFilter.java delete mode 100755 source/mir/misc/FileHandler.java delete mode 100755 source/mir/misc/Helper.java delete mode 100755 source/mir/misc/ListOfFiles.java delete mode 100755 source/mir/misc/WebdbMultipartRequest.java create mode 100755 source/mircoders/localizer/basic/MirBasicPostingSessionHandler.java delete mode 100755 source/mircoders/media/MediaRequest.java diff --git a/lib/cos-05Nov2002.jar b/lib/cos-05Nov2002.jar deleted file mode 100755 index a0e34a794fc97360e7c4a91078b74befaff1af44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56411 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%0D;(%{!ylQJ)YXF-Oo@Z;_VAYUp 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 diff --git a/source/Mir.java b/source/Mir.java index ea6a9f35..9a93a655 100755 --- a/source/Mir.java +++ b/source/Mir.java @@ -29,50 +29,48 @@ * not wish to do so, delete this exception statement from your version. */ -import java.io.IOException; -import java.io.PrintWriter; -import java.lang.reflect.Method; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Vector; -import javax.servlet.ServletException; -import javax.servlet.UnavailableException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.apache.struts.util.MessageResources; -import freemarker.template.SimpleHash; -import freemarker.template.SimpleList; -import freemarker.template.SimpleScalar; -import freemarker.template.TemplateModel; -import mir.config.MirPropertiesConfiguration; -import mir.generator.FreemarkerGenerator; -import mir.log.LoggerWrapper; -import mir.misc.HTMLTemplateProcessor; -import mir.misc.StringUtil; -import mir.servlet.AbstractServlet; -import mir.servlet.ServletModule; -import mir.servlet.ServletModuleDispatch; -import mir.servlet.ServletModuleExc; -import mir.servlet.ServletModuleUserExc; -import mir.util.ExceptionFunctions; -import mir.util.StringRoutines; -import mir.util.*; -import mir.entity.*; -import mir.entity.adapter.*; -import mircoders.entity.EntityUsers; -import mircoders.global.MirGlobal; -import mircoders.module.ModuleMessage; -import mircoders.module.ModuleUsers; -import mircoders.storage.DatabaseArticleType; -import mircoders.storage.DatabaseMessages; +import java.io.IOException; +import java.io.PrintWriter; +import java.lang.reflect.Method; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Vector; +import javax.servlet.ServletException; +import javax.servlet.UnavailableException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.struts.util.MessageResources; +import freemarker.template.SimpleHash; +import freemarker.template.SimpleList; +import freemarker.template.SimpleScalar; +import freemarker.template.TemplateModel; + +import mir.config.MirPropertiesConfiguration; +import mir.entity.adapter.EntityIteratorAdapter; +import mir.generator.FreemarkerGenerator; +import mir.log.LoggerWrapper; +import mir.misc.HTMLTemplateProcessor; +import mir.misc.StringUtil; +import mir.servlet.AbstractServlet; +import mir.servlet.ServletModule; +import mir.servlet.ServletModuleDispatch; +import mir.servlet.ServletModuleExc; +import mir.servlet.ServletModuleUserExc; +import mir.util.CachingRewindableIterator; +import mir.util.ExceptionFunctions; +import mir.util.StringRoutines; +import mircoders.entity.EntityUsers; +import mircoders.global.MirGlobal; +import mircoders.module.ModuleMessage; +import mircoders.module.ModuleUsers; +import mircoders.servlet.ServletHelper; import mircoders.storage.DatabaseUsers; -import mircoders.servlet.*; @@ -81,7 +79,7 @@ import mircoders.servlet.*; * Mir.java - main servlet, that dispatches to servletmodules * * @author $Author: zapata $ - * @version $Id: Mir.java,v 1.43 2003/04/12 15:29:43 zapata Exp $ + * @version $Id: Mir.java,v 1.44 2003/04/21 02:58:29 zapata Exp $ * */ public class Mir extends AbstractServlet { diff --git a/source/mir/misc/FileExtFilter.java b/source/mir/misc/FileExtFilter.java deleted file mode 100755 index 5a54ee1e..00000000 --- a/source/mir/misc/FileExtFilter.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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 the com.oreilly.servlet library, 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 mir.misc; - -import java.io.File; -import java.io.FilenameFilter; - - -public class FileExtFilter implements FilenameFilter -{ - - static String _SEP_EXT; - - public FileExtFilter(String ext) { - _SEP_EXT = ext; - } - - public boolean accept(File dir, String name) { - System.out.println("NAME: "+name+" "+_SEP_EXT); - return name.endsWith("."+_SEP_EXT); - } - -} - - diff --git a/source/mir/misc/FileHandler.java b/source/mir/misc/FileHandler.java deleted file mode 100755 index a7a6ec89..00000000 --- a/source/mir/misc/FileHandler.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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 the com.oreilly.servlet library, 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 mir.misc; - -import java.util.Map; - -import multex.Exc; -import multex.Failure; - -import com.oreilly.servlet.multipart.FilePart; - - -/** - * Interface that classes wishing to be used as a callback on FileParts for the - * WebdbMultipartRequest class should implement this interface. - * - * @author mh - * @version $Id: FileHandler.java,v 1.6 2003/03/09 19:14:21 idfx Exp $ - * @see mir.misc.WebdbMultipartRequest - * - */ - -public interface FileHandler { - - public void setFile (FilePart filePart, int fileNum, Map Params) throws FileHandlerExc, FileHandlerFailure; - - public static class FileHandlerExc extends Exc { - public FileHandlerExc(String aMessage) { - - super(aMessage); - } - } - - public static class FileHandlerFailure extends Failure { - - public FileHandlerFailure(String msg, Throwable cause) { - super(msg, cause); - } - - public FileHandlerFailure(Throwable aCause) { - this(aCause.getMessage(), aCause); - } - } - -} - - - - diff --git a/source/mir/misc/HTMLTemplateProcessor.java b/source/mir/misc/HTMLTemplateProcessor.java index 5b842a25..1f40e510 100755 --- a/source/mir/misc/HTMLTemplateProcessor.java +++ b/source/mir/misc/HTMLTemplateProcessor.java @@ -31,35 +31,33 @@ package mir.misc; -import java.io.PrintWriter; -import java.net.URLEncoder; -import java.util.GregorianCalendar; -import java.util.Iterator; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -import javax.servlet.http.HttpServletResponse; - -import org.apache.struts.util.MessageResources; - -import freemarker.template.FileTemplateCache; -import freemarker.template.SimpleHash; -import freemarker.template.SimpleList; -import freemarker.template.SimpleScalar; -import freemarker.template.Template; -import freemarker.template.TemplateModelRoot; - -import mir.config.MirPropertiesConfiguration; -import mir.config.MirPropertiesConfiguration.PropertiesConfigExc; -import mir.entity.Entity; -import mir.entity.EntityList; -import mir.generator.FreemarkerGenerator; -import mir.log.LoggerWrapper; -import mir.storage.StorageObjectFailure; -import mir.util.GeneratorHTMLFunctions; -import mir.util.GeneratorIntegerFunctions; -import mir.util.*; +import java.io.PrintWriter; +import java.net.URLEncoder; +import java.util.GregorianCalendar; +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import javax.servlet.http.HttpServletResponse; + +import org.apache.struts.util.MessageResources; +import freemarker.template.FileTemplateCache; +import freemarker.template.SimpleHash; +import freemarker.template.SimpleList; +import freemarker.template.SimpleScalar; +import freemarker.template.Template; +import freemarker.template.TemplateModelRoot; + +import mir.config.MirPropertiesConfiguration; +import mir.config.MirPropertiesConfiguration$PropertiesConfigExc; +import mir.entity.Entity; +import mir.entity.EntityList; +import mir.generator.FreemarkerGenerator; +import mir.log.LoggerWrapper; +import mir.storage.StorageObjectFailure; +import mir.util.GeneratorHTMLFunctions; +import mir.util.GeneratorIntegerFunctions; +import mir.util.ResourceBundleGeneratorFunction; /** * Hilfsklasse zum Mergen von Template und Daten diff --git a/source/mir/misc/Helper.java b/source/mir/misc/Helper.java deleted file mode 100755 index 9dda35cc..00000000 --- a/source/mir/misc/Helper.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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 the com.oreilly.servlet library, 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 mir.misc; - -import java.io.IOException; - -import mir.config.MirPropertiesConfiguration; -import mir.config.MirPropertiesConfiguration.PropertiesConfigExc; - -/** - * Title: Indy - * Description: This class provides some satic help methods - * Copyright: Copyright (c) 2001 - * Company: indymedia.de - * @author idfx - * @version 1.0 - */ - -public class Helper { - - /** - * rsync the webrepository - * needs a rsyncscript - * returns the exit-code - * returns 255 if rsync should not be used - */ - public static int rsync(){ - MirPropertiesConfiguration configuration = null; - try { - configuration = MirPropertiesConfiguration.instance(); - } catch (PropertiesConfigExc e) { - e.printStackTrace(); - return 255; - } - - if(!configuration.getString("Rsync").toLowerCase().equals("yes")){ - return 255; - } - - Process p; - int returnValue = -1; - try { - Runtime run = Runtime.getRuntime(); - p = run.exec(configuration.getString("Rsync.Script.Path")); - returnValue = p.waitFor(); - } catch (IOException e) { - return returnValue; - } catch (InterruptedException e) { - return returnValue; - } - return returnValue; - } -} diff --git a/source/mir/misc/ListOfFiles.java b/source/mir/misc/ListOfFiles.java deleted file mode 100755 index 35403e9a..00000000 --- a/source/mir/misc/ListOfFiles.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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 the com.oreilly.servlet library, 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. - */ - -/* taken largely from the java tutorial --- pretty much wholesale, - * except modified to take a list rather than an array --jd - */ - -package mir.misc; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.util.Enumeration; -import java.util.LinkedList; -import java.util.ListIterator; -import java.util.NoSuchElementException; - -public class ListOfFiles implements Enumeration { - - private LinkedList listOfFiles; - private ListIterator listOfFilesIterator; - - - public ListOfFiles(LinkedList listOfFiles) { - this.listOfFiles = listOfFiles; - this.listOfFilesIterator = listOfFiles.listIterator(); - } - - public boolean hasMoreElements() { - return listOfFilesIterator.hasNext(); - } - - public Object nextElement() { - InputStream in = null; - - if (!hasMoreElements()) - throw new NoSuchElementException("No more files."); - else { - String nextElement = (String) listOfFilesIterator.next(); - try { - in = new FileInputStream(nextElement); - } catch (FileNotFoundException e) { - System.err.println("ListOfFiles: Can't open " + nextElement); - } - } - return in; - } -} - - - - - diff --git a/source/mir/misc/WebdbMultipartRequest.java b/source/mir/misc/WebdbMultipartRequest.java deleted file mode 100755 index 4be6c031..00000000 --- a/source/mir/misc/WebdbMultipartRequest.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * 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 the com.oreilly.servlet library, 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 mir.misc; - -import java.io.IOException; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; -import java.util.Vector; - -import javax.servlet.http.HttpServletRequest; - -import mir.config.MirPropertiesConfiguration; -import mir.config.MirPropertiesConfiguration.PropertiesConfigExc; - -import com.oreilly.servlet.multipart.FilePart; -import com.oreilly.servlet.multipart.MultipartParser; -import com.oreilly.servlet.multipart.ParamPart; -import com.oreilly.servlet.multipart.Part; - -/** - * Title: - * Description: - * Copyright: Copyright (c) 2001 - * Company: Indymedia - * @author - * @version 1.0 - */ - -public class WebdbMultipartRequest -{ - HttpServletRequest req=null; - Hashtable parameters = new Hashtable(); - MultipartParser mp=null; - FileHandler _fHandler; - - public WebdbMultipartRequest(HttpServletRequest theReq, FileHandler handler) - throws FileHandler.FileHandlerExc, FileHandler.FileHandlerFailure, IOException, PropertiesConfigExc - { - req=theReq; - int maxSize; - try { - maxSize = MirPropertiesConfiguration.instance().getInt("MaxMediaUploadSize"); - } - catch (PropertiesConfigExc e) { - maxSize = 1024; - throw e; - } - mp = new MultipartParser(req, 1024*maxSize); - _fHandler = handler; - _evaluateRequest(); - } - - - /** - * The following comment and some code was adapted from the Oreilley cos.jar - * package. -mh 2001.09.20 - * - * Returns all the parameters as a Map of Strings, any parameter - * that sent without a value will be null. A value - * is guaranteed to be in its normal, decoded form. If A parameter - * has multiple values, only the last one is returned (for backward - * compatibility). For parameters with multiple values, it's possible - * the last "value" may be null. - * - * @return A Map of String representations of the parameter values. - */ - public Map getParameters(){ - Map pHash = new HashMap(); - String value = new String(); - - Enumeration Keys = parameters.keys(); - while(Keys.hasMoreElements()) { - String KeyNm = (String)Keys.nextElement(); - Vector values = (Vector)parameters.get(KeyNm); - - if (values == null || values.size() == 0) { - value = null; - } - else { - value = (String)values.elementAt(values.size() - 1); - } - - pHash.put(KeyNm, value); - } - - return pHash; - } - - /** - * The following code and comment stolen from oreilley cos.jar. - * -mh. 2001.09.20 - * - * Returns the values of the named parameter as a String array, or null if - * the parameter was not sent. The array has one entry for each parameter - * field sent. If any field was sent without a value that entry is stored - * in the array as a null. The values are guaranteed to be in their - * normal, decoded form. A single value is returned as a one-element array. - * - * @param name the parameter name. - * @return the parameter values. - */ - public String[] getParameterValues(String name) { - try { - Vector values = (Vector)parameters.get(name); - if (values == null || values.size() == 0) { - return null; - } - String[] valuesArray = new String[values.size()]; - values.copyInto(valuesArray); - return valuesArray; - } - catch (Exception e) { - return null; - } - } - - private void _evaluateRequest() throws FileHandler.FileHandlerExc, - FileHandler.FileHandlerFailure, IOException { - - Part part; - int i = 1; - while ((part = mp.readNextPart()) != null) { - String name = part.getName(); - if (part.isParam()) { - // It's a parameter part, add it to the vector of values - ParamPart paramPart = (ParamPart) part; - String value = paramPart.getStringValue(); - Vector existingValues = (Vector)parameters.get(name); - if (existingValues == null) { - existingValues = new Vector(); - parameters.put(name, existingValues); - } - existingValues.addElement(value); - } - else if (part.isFile()) { - // nur das erste uploadfile beruecksichtigen - FilePart filePart = (FilePart) part; - String fn = filePart.getFileName(); - if (filePart.getFileName() != null) { - if (_fHandler != null) - _fHandler.setFile(filePart, i, getParameters()); - i++; - } - } - } // while */ - } - -} diff --git a/source/mir/session/CommonsUploadedFileAdapter.java b/source/mir/session/CommonsUploadedFileAdapter.java index 869f7b3d..925e2d8c 100755 --- a/source/mir/session/CommonsUploadedFileAdapter.java +++ b/source/mir/session/CommonsUploadedFileAdapter.java @@ -31,8 +31,9 @@ package mir.session; -import org.apache.commons.fileupload.*; -import java.io.*; +import java.io.InputStream; + +import org.apache.commons.fileupload.FileItem; public class CommonsUploadedFileAdapter implements UploadedFile { private FileItem fileItem; diff --git a/source/mir/session/Request.java b/source/mir/session/Request.java index e0709bd9..16679f8b 100755 --- a/source/mir/session/Request.java +++ b/source/mir/session/Request.java @@ -31,7 +31,7 @@ package mir.session; -import java.util.*; +import java.util.List; public interface Request { public String getParameter(String aName); diff --git a/source/mir/session/SessionHandler.java b/source/mir/session/SessionHandler.java index 87b38013..a7ee1f78 100755 --- a/source/mir/session/SessionHandler.java +++ b/source/mir/session/SessionHandler.java @@ -1,3 +1,34 @@ +/* + * 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 the com.oreilly.servlet library, 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 mir.session; public interface SessionHandler { diff --git a/source/mir/session/SimpleResponse.java b/source/mir/session/SimpleResponse.java index 3dcadf51..85613f9f 100755 --- a/source/mir/session/SimpleResponse.java +++ b/source/mir/session/SimpleResponse.java @@ -1,32 +1,64 @@ -package mir.session; - -import java.util.*; - -public class SimpleResponse implements Response { - private String generator; - private Map values; - - public SimpleResponse() { - values = new HashMap(); - } - - public SimpleResponse(Map aMap) { - values = aMap; - } - - public void setResponseValue(String aName, Object aValue) { - values.put(aName, aValue); - } - - public Map getResponseValues() { - return values; - } - - public void setResponseGenerator(String aGenerator) { - generator = aGenerator; - } - - public String getResponseGenerator() { - return generator; - } +/* + * 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 the com.oreilly.servlet library, 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 mir.session; + +import java.util.HashMap; +import java.util.Map; + +public class SimpleResponse implements Response { + private String generator; + private Map values; + + public SimpleResponse() { + values = new HashMap(); + } + + public SimpleResponse(Map aMap) { + values = aMap; + } + + public void setResponseValue(String aName, Object aValue) { + values.put(aName, aValue); + } + + public Map getResponseValues() { + return values; + } + + public void setResponseGenerator(String aGenerator) { + generator = aGenerator; + } + + public String getResponseGenerator() { + return generator; + } } \ No newline at end of file diff --git a/source/mir/storage/store/test/TestStore.java b/source/mir/storage/store/test/TestStore.java index e9a1e4d1..d10f06be 100755 --- a/source/mir/storage/store/test/TestStore.java +++ b/source/mir/storage/store/test/TestStore.java @@ -42,7 +42,7 @@ package mir.storage.store.test; import mir.storage.store.ObjectStore; import mir.storage.store.StorableObject; -import mir.storage.store.*; +import mir.storage.store.StoreIdentifier; public class TestStore { diff --git a/source/mir/util/PropertiesManipulator.java b/source/mir/util/PropertiesManipulator.java index 194f31b6..daf90ecb 100755 --- a/source/mir/util/PropertiesManipulator.java +++ b/source/mir/util/PropertiesManipulator.java @@ -35,7 +35,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.io.OutputStream; -import java.io.*; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; import java.util.HashMap; import java.util.Iterator; import java.util.List; diff --git a/source/mircoders/global/Abuse.java b/source/mircoders/global/Abuse.java index b3e18550..f67524a6 100755 --- a/source/mircoders/global/Abuse.java +++ b/source/mircoders/global/Abuse.java @@ -31,33 +31,33 @@ package mircoders.global; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Vector; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.collections.ExtendedProperties; - -import gnu.regexp.RE; - -import mir.entity.Entity; -import mir.log.LoggerWrapper; -import mir.util.DateToMapAdapter; -import mir.util.InternetFunctions; -import mir.util.StringRoutines; -import mir.session.*; -import mircoders.entity.EntityComment; -import mircoders.entity.EntityContent; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Vector; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.collections.ExtendedProperties; +import gnu.regexp.RE; + +import mir.entity.Entity; +import mir.log.LoggerWrapper; +import mir.session.HTTPAdapters; +import mir.session.Request; +import mir.util.DateToMapAdapter; +import mir.util.InternetFunctions; +import mir.util.StringRoutines; +import mircoders.entity.EntityComment; +import mircoders.entity.EntityContent; import mircoders.localizer.MirAdminInterfaceLocalizer; diff --git a/source/mircoders/localizer/MirOpenPostingLocalizer.java b/source/mircoders/localizer/MirOpenPostingLocalizer.java index b3232751..6af0292f 100755 --- a/source/mircoders/localizer/MirOpenPostingLocalizer.java +++ b/source/mircoders/localizer/MirOpenPostingLocalizer.java @@ -31,13 +31,10 @@ package mircoders.localizer; -import java.util.Arrays; -import java.util.List; - -import mir.session.Request; -import mir.session.Response; -import mir.session.*; -import mircoders.entity.EntityComment; +import mir.session.Request; +import mir.session.Session; +import mir.session.SessionHandler; +import mircoders.entity.EntityComment; import mircoders.entity.EntityContent; public interface MirOpenPostingLocalizer { diff --git a/source/mircoders/localizer/basic/MirBasicCommentPostingSessionHandler.java b/source/mircoders/localizer/basic/MirBasicCommentPostingSessionHandler.java index 522f1165..0b687368 100755 --- a/source/mircoders/localizer/basic/MirBasicCommentPostingSessionHandler.java +++ b/source/mircoders/localizer/basic/MirBasicCommentPostingSessionHandler.java @@ -31,18 +31,27 @@ package mircoders.localizer.basic; -import java.util.*; -import mir.log.LoggerWrapper; -import mir.session.*; -import mir.config.*; -import mir.util.*; -import mir.entity.*; -import mircoders.storage.*; -import mircoders.global.*; -import mircoders.localizer.*; -import mircoders.entity.*; -import mircoders.module.*; -import mircoders.media.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; + +import mir.entity.Entity; +import mir.session.Request; +import mir.session.Response; +import mir.session.Session; +import mir.session.SessionExc; +import mir.session.SessionFailure; +import mir.session.UploadedFile; +import mir.util.ExceptionFunctions; +import mircoders.entity.EntityComment; +import mircoders.global.MirGlobal; +import mircoders.media.MediaUploadProcessor; +import mircoders.module.ModuleComment; +import mircoders.storage.DatabaseComment; +import mircoders.storage.DatabaseCommentToMedia; +import mircoders.storage.DatabaseContent; /** * diff --git a/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java b/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java index 67d5ca95..666bcf49 100755 --- a/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java +++ b/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java @@ -34,7 +34,7 @@ package mircoders.localizer.basic; import mir.generator.FreemarkerGenerator; import mir.generator.Generator; import mir.generator.GeneratorLibraryRepository; -import mir.generator.*; +import mir.generator.WriterEngine; import mir.log.LoggerWrapper; import mircoders.global.MirGlobal; import mircoders.localizer.MirGeneratorLocalizer; diff --git a/source/mircoders/localizer/basic/MirBasicPostingSessionHandler.java b/source/mircoders/localizer/basic/MirBasicPostingSessionHandler.java new file mode 100755 index 00000000..245e6b3a --- /dev/null +++ b/source/mircoders/localizer/basic/MirBasicPostingSessionHandler.java @@ -0,0 +1,372 @@ +/* + * 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 the com.oreilly.servlet library, 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.localizer.basic; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Vector; + +import mir.config.MirPropertiesConfiguration; +import mir.entity.Entity; +import mir.log.LoggerWrapper; +import mir.session.Request; +import mir.session.Response; +import mir.session.Session; +import mir.session.SessionExc; +import mir.session.SessionFailure; +import mir.session.SessionHandler; +import mir.session.UploadedFile; +import mir.storage.StorageObject; +import mir.util.ExceptionFunctions; +import mircoders.entity.EntityComment; +import mircoders.global.MirGlobal; +import mircoders.media.MediaUploadProcessor; +import mircoders.module.ModuleComment; +import mircoders.storage.DatabaseComment; +import mircoders.storage.DatabaseCommentToMedia; +import mircoders.storage.DatabaseContent; + +/** + * + *

Title: Experimental session handler for comment postings

+ *

Description:

+ *

Copyright: Copyright (c) 2003

+ *

Company:

+ * @author not attributable + * @version 1.0 + */ + +public class MirBasicPostingSessionHandler implements SessionHandler { + protected LoggerWrapper logger; + protected MirPropertiesConfiguration configuration; + protected ModuleComment commentModule; + protected DatabaseCommentToMedia commentToMedia = DatabaseCommentToMedia.getInstance(); + + public MirBasicPostingSessionHandler() { + logger = new LoggerWrapper("Localizer.OpenPosting"); + try { + configuration = MirPropertiesConfiguration.instance(); + } + catch (Throwable t) { + logger.fatal("Cannot load configuration: " + t.toString()); + + throw new RuntimeException("Cannot load configuration: " + t.toString()); + } + commentModule= new ModuleComment(DatabaseComment.getInstance()); + } + + public void processRequest(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure { + if (aSession.getAttribute("initialRequest")==null) { + initialRequest(aRequest, aSession, aResponse); + aSession.setAttribute("initialRequest", "no"); + } + else { + subsequentRequest(aRequest, aSession, aResponse); + } + }; + + protected Map getIntersectingValues(Request aRequest, StorageObject aStorage) throws SessionExc, SessionFailure { + Map result = new HashMap(); + + Iterator i = aStorage.getFields().iterator(); + + while (i.hasNext()) { + String fieldName = (String) i.next(); + Object value = aRequest.getParameter(fieldName); + if (value != null) + result.put(fieldName, value); + } + + return result; + } + + + protected 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); + } + + protected void initializeResponseData(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure { + if (MirGlobal.abuse().getOpenPostingPassword()) { + String password = (String) aSession.getAttribute("password"); + if (password==null) { + password = generateOnetimePassword(); + aSession.setAttribute("password", password); + } + aResponse.setResponseValue("password", password); + } + else { + aResponse.setResponseValue("password", null); + aSession.deleteAttribute("password"); + } + + aResponse.setResponseValue("errors", null); + }; + + protected void initialRequest(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure{ + Iterator i = DatabaseComment.getInstance().getFields().iterator(); + while (i.hasNext()) { + aResponse.setResponseValue( (String) i.next(), null); + } + + String articleId = aRequest.getParameter("to_media"); + + if (articleId == null) + throw new SessionExc("MirBasicPostingSessionHandler.initialRequest: article id not set!"); + + aSession.setAttribute("to_media", articleId); + + initializeResponseData(aRequest, aSession, aResponse); + + try { + aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate")); + } + catch (Throwable e) { + throw new SessionFailure("Can't get configuration: " + e.getMessage(), e); + } + + } + + protected boolean testFieldEntered(Request aRequest, String aFieldName, String anErrorMessageResource, List aValidationResults) { + Object value = aRequest.getParameter(aFieldName); + if (value==null || !(value instanceof String) || ((String) value).trim().length()==0) { + logger.debug(" missing field " + aFieldName + " value = " + value); + aValidationResults.add(new ValidationError(aFieldName, anErrorMessageResource)); + return false; + } + else + return true; + } + + protected boolean testFieldIsNumeric(Request aRequest, String aFieldName, String anErrorMessageResource, List aValidationResults) { + Object value = aRequest.getParameter(aFieldName); + if (value!=null) { + try { + Integer.parseInt((String) value); + return true; + } + catch (Throwable t) { + logger.debug(" field not numeric: " + aFieldName + " value = " + value); + aValidationResults.add(new ValidationError(aFieldName, anErrorMessageResource)); + return false; + } + } + return true; + } + + public void validate(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure { + + } + + public List validate(Request aRequest, Session aSession) throws SessionExc, SessionFailure { + List result = new Vector(); + + testFieldEntered(aRequest, "title", "validationerror.missing", result); + testFieldEntered(aRequest, "description", "validationerror.missing", result); + testFieldEntered(aRequest, "creator", "validationerror.missing", result); + + return result; + } + + public void subsequentRequest(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure { + try { + Map commentFields = new HashMap(); + + Iterator i = DatabaseContent.getInstance().getFields().iterator(); + while (i.hasNext()) { + String field = (String) i.next(); + aResponse.setResponseValue(field, aRequest.getParameter(field)); + if (aRequest.getParameter(field)!=null) { + commentFields.put(field, aRequest.getParameter(field)); + } + } + + initializeResponseData(aRequest, aSession, aResponse); + + List validationErrors = validate(aRequest, aSession); + + if (validationErrors != null && validationErrors.size()>0) { + returnValidationErrors(aRequest, aSession, aResponse, validationErrors); + } + else { +// finish(aRequest, aSession, aResponse); + + EntityComment comment = (EntityComment) commentModule.createNew (); +// comment.setValues(getIntersectingValues(aRequest, )); + + finishComment(aRequest, aSession, comment); + + String id = comment.insert(); + if(id==null){ + afterDuplicateCommentPosting(aRequest, aSession, aResponse, comment); + logger.info("Dupe comment rejected"); + aSession.terminate(); + } + else { + i = aRequest.getUploadedFiles().iterator(); + while (i.hasNext()) { + UploadedFile file = (UploadedFile) i.next(); + processMediaFile(aRequest, aSession, comment, file); + } + + afterCommentPosting(aRequest, aSession, aResponse, comment); + MirGlobal.abuse().checkComment(comment, aRequest, null); + MirGlobal.localizer().openPostings().afterCommentPosting(comment); + logger.info("Comment posted"); + aSession.terminate(); + } + } + } + catch (Throwable t) { + ExceptionFunctions.traceCauseException(t).printStackTrace(); + + throw new SessionFailure("MirBasicPostingSessionHandler.subsequentRequest: " + t.getMessage(), t); + } + } + + public void initializeCommentPosting(Request aRequest, Session aSession, Response aResponse) throws SessionFailure, SessionExc { + String articleId = aRequest.getParameter("to_media"); + if (articleId==null) + articleId = aRequest.getParameter("aid"); + + if (articleId==null) + throw new SessionExc("initializeCommentPosting: article id not set!"); + + aSession.setAttribute("to_media", articleId); + processCommentPosting(aRequest, aSession, aResponse); + }; + + public void returnValidationErrors(Request aRequest, Session aSession, Response aResponse, List aValidationErrors) throws SessionFailure, SessionExc { + aResponse.setResponseValue("errors", aValidationErrors); + aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate")); + }; + + public void processCommentPosting(Request aRequest, Session aSession, Response aResponse) throws SessionExc, SessionFailure { + if (MirGlobal.abuse().getOpenPostingPassword()) { + String password = generateOnetimePassword(); + aSession.setAttribute("password", password); + aResponse.setResponseValue("password", password); + aResponse.setResponseValue("passwd", password); + } + else { + aResponse.setResponseValue("password", null); + } + + aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.EditTemplate")); + }; + + public void processMediaFile(Request aRequest, Session aSession, EntityComment aComment, UploadedFile aFile) throws SessionExc, SessionFailure { + try { + Entity mediaItem = MediaUploadProcessor.processMediaUpload(aFile, new HashMap()); + finishMedia(aRequest, aSession, aFile, mediaItem); + mediaItem.update(); + commentToMedia.addMedia(aComment.getId(), mediaItem.getId()); + } + catch (Throwable t) { + throw new SessionFailure(t); + } + } + + public void finishMedia(Request aRequest, Session aSession, UploadedFile aFile, Entity aMedia) throws SessionExc, SessionFailure { + } + + public void finishComment(Request aRequest, Session aSession, EntityComment aComment) throws SessionExc, SessionFailure { + if (aSession.getAttribute("to_media") == null) + throw new SessionExc("missing to_media"); + + aComment.setValueForProperty("is_published", "1"); + aComment.setValueForProperty("to_comment_status", "1"); + aComment.setValueForProperty("is_html","0"); + aComment.setValueForProperty("to_media", (String) aSession.getAttribute("to_media")); + }; + + public void addMedia(Request aRequest, Session aSession, EntityComment aComment) throws SessionExc, SessionFailure { + } + + public void afterCommentPosting(Request aRequest, Session aSession, Response aResponse, EntityComment aComment) { + DatabaseContent.getInstance().setUnproduced("id=" + aComment.getValue("to_media")); + aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.DoneTemplate")); + }; + + public void afterDuplicateCommentPosting(Request aRequest, Session aSession, Response aResponse, EntityComment aComment) { + aResponse.setResponseGenerator(configuration.getString("Localizer.OpenSession.comment.DupeTemplate")); + }; + + public class ValidationError { + private String field; + private String message; + private List parameters; + + public ValidationError(String aField, String aMessage) { + this (aField, aMessage, new String[] {}); + } + + public ValidationError(String aField, String aMessage, Object aParameter) { + this (aField, aMessage, new Object[] {aParameter}); + } + + public ValidationError(String aField, String aMessage, Object[] aParameters) { + field = aField; + message = aMessage; + parameters = Arrays.asList(aParameters); + } + + public String getMessage() { + return message; + } + + public String getField() { + return field; + } + + public List getParameters() { + return parameters; + } + } + + + +} diff --git a/source/mircoders/media/MediaRequest.java b/source/mircoders/media/MediaRequest.java deleted file mode 100755 index 473051cb..00000000 --- a/source/mircoders/media/MediaRequest.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * 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 the com.oreilly.servlet library, 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.media; - -import java.util.GregorianCalendar; -import java.util.Iterator; -import java.util.Map; - -import javax.servlet.ServletContext; - -import mir.config.MirPropertiesConfiguration; -import mir.entity.Entity; -import mir.entity.EntityList; -import mir.log.LoggerWrapper; -import mir.media.MediaHelper; -import mir.media.MirMedia; -import mir.misc.FileHandler; -import mir.misc.StringUtil; -import mir.storage.Database; -import mir.storage.StorageObjectFailure; -import mircoders.storage.DatabaseMediaType; - -import com.oreilly.servlet.multipart.FilePart; - - -/* - * MediaRequest.java - - * Takes an HTTPServletRequest from a mutltipart form and finds the files - * uploaded via the com.oreilly.servlet.multipart package. Finally the - * appropriate media objects are set. - * - * @author mh - * @version $Id: MediaRequest.java,v 1.18 2003/03/09 19:14:21 idfx Exp $ - * - */ - -public class MediaRequest implements FileHandler -{ - private String _user; - private EntityList _returnList = new EntityList(); - private boolean _publish; - private LoggerWrapper logger; - - public MediaRequest(String user, boolean publish) { - _user = user; - _publish = publish; - logger = new LoggerWrapper("Media.Request"); - } - - public EntityList getEntityList() { - return _returnList; - } - - /* - * parses the files in the uploaded media and creates media Entity's out of - * them. Produces them if the "produce" argument is true. The "publish" - * parameter determines if it should publish per default in the case where no - * is_published parameter (from the upload form) is supplied. (for backwards - * compatibility.) - */ - public void setFile(FilePart filePart, int fileNum, Map mediaValues) throws FileHandlerExc, FileHandlerFailure { - - String mediaId=null; - MirMedia mediaHandler; - Database mediaStorage = null; - - try { - String fileName = filePart.getFileName(); - - //get the content-type from what the client browser - //sends us. (the "Oreilly method") - String contentType = filePart.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 = MirPropertiesConfiguration.getContext(); - contentType = ctx.getMimeType(fileName); - if (contentType==null) - contentType = "text/plain"; // rfc1867 says this is the default - } - //theLog.printInfo("CONTENT TYPE IS: "+contentType); - - if (contentType.equals("text/plain") || - contentType.equals("application/octet-stream")) { - _throwBadContentType(fileName, contentType); - } - - // call the routines that escape html - for (Iterator i=mediaValues.keySet().iterator(); i.hasNext(); ){ - String k=(String)i.next(); - String v=(String)mediaValues.get(k); - - if (k.equals("description")) { - String tmp = StringUtil.deleteForbiddenTags(v); - mediaValues.put(k,StringUtil.deleteHTMLTableTags(tmp)); - } else { - //we don't want people fucking with the author/title, etc.. - mediaValues.put(k,StringUtil.removeHTMLTags(v)); - } - - } - - String mediaTitle = (String)mediaValues.get("media_title"+fileNum); - if ( (mediaTitle == null) || (mediaTitle.length() == 0)) { - // uncomment the next line and comment out the exception throw - // if you'd rather just assign missing media titles automatically - // mediaTitle="media item "+fileNum; -// throw new FileHandlerUserException("Missing field: media title "+mediaTitle+fileNum); - } - - // TODO: need to add all the extra fields that can be present in the - // admin upload form. -mh - mediaValues.put("title", mediaTitle); - mediaValues.put("date", StringUtil.date2webdbDate( - new GregorianCalendar())); - mediaValues.put("to_publisher", _user); - //mediaValues.put("to_media_folder", "7"); // op media_folder - mediaValues.put("is_produced", "0"); - - // icky backwards compatibility code -mh - if (_publish == true) { - mediaValues.put("is_published", "1"); - } else { - if (!mediaValues.containsKey("is_published")) - 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; - - //if we didn't find an entry matching the - //content-type int the table. - if (mediaTypesList.size() == 0) { - _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 Integer.parseInt(maxMedia)) { - numOfMedia = maxMedia; - } - - int mediaNum = Integer.parseInt(numOfMedia); - SimpleList mediaFields = new SimpleList(); - for(int i =0; i Integer.parseInt(maxMedia)) { + numOfMedia = maxMedia; + } + + int mediaNum = Integer.parseInt(numOfMedia); + SimpleList mediaFields = new SimpleList(); + for(int i =0; i -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -    - - ${lang("media.created")}: ${data.webdb_create} - / ${lang("media.changed")} ${data.webdb_lastchange}
- ${lang("media.published")}: ${data.publish_date} / ${data.publish_server}${data.publish_path}
- ${lang("media.format")}: ${data.mimetype} / ${data.media_descr}
- ${lang("media.size")}: ${data.human_readable_size}
- ${lang("media.rights")}: ${data.rightsHashdata[to_rights]["name"]}
-
- ${lang("media.mediafolder")}: - - -
 
- ${lang("media.is_published")} : - - checked> -
 
- ${lang("media.title")}: - - -
-   - -
-
- ${lang("media.title")}: - - -
- - - - ${lang("media.is_published")} checked> -    - -
- -

[<] ${lang("list")}  

- - - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +    + + ${lang("media.created")}: ${data.webdb_create} + / ${lang("media.changed")} ${data.webdb_lastchange}
+ ${lang("media.published")}: ${data.publish_date} / ${data.publish_server}${data.publish_path}
+ ${lang("media.format")}: ${data.mimetype} / ${data.media_descr}
+ ${lang("media.size")}: ${data.human_readable_size}
+ ${lang("media.rights")}: ${data.rightsHashdata[to_rights]["name"]}
+
+ ${lang("media.mediafolder")}: + + +
 
+ ${lang("media.is_published")} : + + checked> +
 
+ ${lang("media.title")}: + + +
+   + +
+
+ + + + ${lang("media.is_published")} checked> +    + +
+
+ +

[<] ${lang("list")}  

+ + + diff --git a/templates/admin/image.template b/templates/admin/image.template index 872fc1ed..e4a40605 100755 --- a/templates/admin/image.template +++ b/templates/admin/image.template @@ -85,14 +85,14 @@ function openWin(url) { - - + + + + - - - - + +   @@ -123,19 +123,10 @@ function openWin(url) {   -
+
- - - - ${lang("media.title")}: - - - - - diff --git a/templates/admin/media.template b/templates/admin/media.template index bcb86c07..897f852a 100755 --- a/templates/admin/media.template +++ b/templates/admin/media.template @@ -82,14 +82,14 @@ function openWin(url) { - - - - - - - - + + + + + + + +   @@ -119,19 +119,10 @@ function openWin(url) {   -
+
- - - - ${lang("media.title")}: - - - - - diff --git a/templates/admin/video.template b/templates/admin/video.template index 7728b221..126bdf5b 100755 --- a/templates/admin/video.template +++ b/templates/admin/video.template @@ -35,116 +35,108 @@ function openWin(url) { -
- - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - -
- -    - - ${lang("media.created")}: ${data.webdb_create} - / ${lang("media.changed")} ${data.webdb_lastchange}
- ${lang("media.published")}: ${data.publish_date} / ${data.publish_server}${data.publish_path}
- ${lang("media.format")}: ${data.mimetype} / ${data.media_descr}
- ${lang("media.size")}: ${data.human_readable_size}
- ${lang("media.rights")}: ${data.rightsHashdata[to_rights]["name"]}
-
- ${lang("media.mediafolder")}: - - -
 
- ${lang("media.is_published")} : - - checked> -
 
- ${lang("media.title")}: - - -
-   - -
-
- ${lang("media.title")}: - - -
- - - - ${lang("media.is_published")} checked> -    - -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +    + + ${lang("media.created")}: ${data.webdb_create} + / ${lang("media.changed")} ${data.webdb_lastchange}
+ ${lang("media.published")}: ${data.publish_date} / ${data.publish_server}${data.publish_path}
+ ${lang("media.format")}: ${data.mimetype} / ${data.media_descr}
+ ${lang("media.size")}: ${data.human_readable_size}
+ ${lang("media.rights")}: ${data.rightsHashdata[to_rights]["name"]}
+
+ ${lang("media.mediafolder")}: + + +
 
+ ${lang("media.is_published")} : + + checked> +
 
+ ${lang("media.title")}: + + +
+   + +
+
+ + + + ${lang("media.is_published")} checked> +    + +
+ -

[<] ${lang("list")}  

+

[<] ${lang("list")}  

- + - + -- 2.11.0