You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by sn...@apache.org on 2006/01/18 06:45:45 UTC

svn commit: r370060 - in /incubator/roller/trunk: src/org/roller/business/ src/org/roller/model/ src/org/roller/presentation/website/actions/ src/org/roller/presentation/website/tags/ src/org/roller/presentation/xmlrpc/ web/WEB-INF/ web/website/

Author: snoopdave
Date: Tue Jan 17 21:45:32 2006
New Revision: 370060

URL: http://svn.apache.org/viewcvs?rev=370060&view=rev
Log:
Refactoring in upload file page, removed monlithic JSP tags

Added:
    incubator/roller/trunk/web/website/UploadFile.jsp
Removed:
    incubator/roller/trunk/src/org/roller/presentation/website/tags/
    incubator/roller/trunk/web/website/upload-file.jsp
Modified:
    incubator/roller/trunk/src/org/roller/business/FileManagerImpl.java
    incubator/roller/trunk/src/org/roller/model/FileManager.java
    incubator/roller/trunk/src/org/roller/presentation/website/actions/UploadFileFormAction.java
    incubator/roller/trunk/src/org/roller/presentation/xmlrpc/MetaWeblogAPIHandler.java
    incubator/roller/trunk/web/WEB-INF/tiles-defs.xml

Modified: incubator/roller/trunk/src/org/roller/business/FileManagerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/business/FileManagerImpl.java?rev=370060&r1=370059&r2=370060&view=diff
==============================================================================
--- incubator/roller/trunk/src/org/roller/business/FileManagerImpl.java (original)
+++ incubator/roller/trunk/src/org/roller/business/FileManagerImpl.java Tue Jan 17 21:45:32 2006
@@ -12,42 +12,40 @@
 import org.apache.commons.logging.LogFactory;
 import org.roller.RollerException;
 import org.roller.config.RollerConfig;
+import org.roller.config.RollerRuntimeConfig;
 import org.roller.model.FileManager;
 import org.roller.model.Roller;
 import org.roller.model.RollerFactory;
 import org.roller.pojos.RollerPropertyData;
-import org.roller.pojos.WebsiteData;
 import org.roller.util.RollerMessages;
 
 /**
  * Responsible for managing website resources.  This base implementation
  * writes resources to a filesystem.
- * 
+ *
  * @author David M Johnson
  * @author Allen Gilliland
  */
-public class FileManagerImpl implements FileManager
-{
+public class FileManagerImpl implements FileManager {
     private String upload_dir = null;
     private String upload_url = null;
     
-    private static Log mLogger = 
-        LogFactory.getFactory().getInstance(FileManagerImpl.class);
+    private static Log mLogger =
+            LogFactory.getFactory().getInstance(FileManagerImpl.class);
     
     
     /**
      * Create file manager.
      */
-    public FileManagerImpl()
-    {
+    public FileManagerImpl() {
         String uploaddir = RollerConfig.getProperty("uploads.dir");
         String uploadurl = RollerConfig.getProperty("uploads.url");
-
+        
         // Note: System property expansion is now handled by RollerConfig.
-
+        
         if(uploaddir == null || uploaddir.trim().length() < 1)
             uploaddir = System.getProperty("user.home") + File.separator+"roller_data"+File.separator+"uploads";
-
+        
         if( ! uploaddir.endsWith(File.separator))
             uploaddir += File.separator;
         
@@ -78,9 +76,8 @@
      * Determine if file can be saved given current RollerConfig settings.
      */
     public boolean canSave(
-            WebsiteData site, String name, long size, RollerMessages messages)
-            throws RollerException
-    {
+            String weblogHandle, String name, long size, RollerMessages messages)
+            throws RollerException {
         Roller mRoller = RollerFactory.getRoller();
         Map config = mRoller.getPropertiesManager().getProperties();
         
@@ -101,7 +98,7 @@
         BigDecimal maxDirMB = new BigDecimal(
                 ((RollerPropertyData)config.get("uploads.dir.maxsize")).getValue());
         int maxDirBytes = (int)(1024000 * maxDirMB.doubleValue());
-        int userDirSize = getWebsiteDirSize(site.getHandle(), this.upload_dir);
+        int userDirSize = getWebsiteDirSize(weblogHandle, this.upload_dir);
         if (userDirSize + size > maxDirBytes) {
             messages.addError("error.upload.dirmax", maxDirMB.toString());
             return false;
@@ -119,30 +116,53 @@
         
         return true;
     }
+    
+    public boolean overQuota(String weblogHandle) throws RollerException {
+        
+        String maxDir = RollerRuntimeConfig.getProperty("uploads.dir.maxsize");
+        String maxFile = RollerRuntimeConfig.getProperty("uploads.file.maxsize");
+        BigDecimal maxDirSize = new BigDecimal(maxDir); // in megabytes
+        BigDecimal maxFileSize = new BigDecimal(maxFile); // in megabytes
 
+        // determine the number of bytes in website's directory
+        int maxDirBytes = (int)(1024000 * maxDirSize.doubleValue());
+        int userDirSize = 0;
+         String dir = getUploadDir();
+         File d = new File(dir + weblogHandle);
+        if (d.mkdirs() || d.exists()) {
+            File[] files = d.listFiles();
+            long dirSize = 0l;
+            for (int i=0; i<files.length; i++) {
+                if (!files[i].isDirectory()) {
+                    dirSize = dirSize + files[i].length();
+                }
+            }
+            userDirSize = new Long(dirSize).intValue();
+        }
+        return userDirSize > maxDirBytes;
+    }
+    
     /**
      * Get collection files in website's resource directory.
      * @param site Website
      * @return Collection of files in website's resource directory
      */
-    public File[] getFiles(WebsiteData site) throws RollerException
-    {
-        String dir = this.upload_dir + site.getHandle();
+    public File[] getFiles(String weblogHandle) throws RollerException {
+        String dir = this.upload_dir + weblogHandle;
         File uploadDir = new File(dir);
         return uploadDir.listFiles();
     }
-
+    
     /**
      * Delete named file from website's resource area.
      */
-    public void deleteFile(WebsiteData site, String name)
-            throws RollerException
-    {
-        String dir = this.upload_dir + site.getHandle();
+    public void deleteFile(String weblogHandle, String name)
+    throws RollerException {
+        String dir = this.upload_dir + weblogHandle;
         File f = new File(dir + File.separator + name);
         f.delete();
     }
-
+    
     /**
      * Save file to website's resource directory.
      * @param site Website to save to
@@ -150,98 +170,54 @@
      * @param size Size of file to be saved
      * @param is Read file from input stream
      */
-    public void saveFile(WebsiteData site, String name, long size, InputStream is)
-            throws RollerException
-    {
-        if (!canSave(site, name, size, new RollerMessages())) 
-        {
+    public void saveFile(String weblogHandle, String name, long size, InputStream is)
+    throws RollerException {
+        if (!canSave(weblogHandle, name, size, new RollerMessages())) {
             throw new RollerException("ERROR: upload denied");
         }
         
         byte[] buffer = new byte[8192];
         int bytesRead = 0;
         String dir = this.upload_dir;
-        String handle = site.getHandle();
-
-        File dirPath = new File(dir + File.separator + handle);
-        if (!dirPath.exists())
-        {
+        
+        File dirPath = new File(dir + File.separator + weblogHandle);
+        if (!dirPath.exists()) {
             dirPath.mkdirs();
         }
         OutputStream bos = null;
-        try
-        {
+        try {
             bos = new FileOutputStream(
                     dirPath.getAbsolutePath() + File.separator + name);
-            while ((bytesRead = is.read(buffer, 0, 8192)) != -1)
-            {
+            while ((bytesRead = is.read(buffer, 0, 8192)) != -1) {
                 bos.write(buffer, 0, bytesRead);
             }
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             throw new RollerException("ERROR uploading file", e);
-        }
-        finally 
-        {
-            try 
-            {
+        } finally {
+            try {
                 bos.flush();
                 bos.close();
-            } 
-            catch (Exception ignored) {}
+            } catch (Exception ignored) {}
         }
-        if (mLogger.isDebugEnabled())
-        {
-            mLogger.debug("The file has been written to \"" + dir + handle + "\"");
-        }
-    }
-
-    /**
-     * Get upload directory path.
-     * @return Upload directory path.
-     * @throws RollerException
-     */
-    /* old method ... no longer used -- Allen G
-    private String getUploadDir() throws RollerException
-    {
-        if(this.upload_dir != null)
-        {
-            return this.upload_dir;
-        }
-        else
-        {
-            Roller mRoller = RollerFactory.getRoller();
-            RollerConfigData config = RollerFactory.getRoller().getConfigManager().getRollerConfig();
-            String dir = config.getUploadDir();
-            if (dir == null || dir.trim().length()==0)
-            {
-                dir = mRealPath + File.separator + USER_RESOURCES;
-            }
-            
-            return dir;
+        if (mLogger.isDebugEnabled()) {
+            mLogger.debug("The file has been written to \"" + dir + weblogHandle + "\"");
         }
     }
-    */
     
     /**
-     * Returns current size of file uploads owned by specified user.
+     * Returns current size of file uploads owned by specified weblog handle.
      * @param username User
      * @param dir      Upload directory
      * @return Size of user's uploaded files in bytes.
      */
-    private int getWebsiteDirSize(String username, String dir)
-    {
+    private int getWebsiteDirSize(String weblogHandle, String dir) {
         int userDirSize = 0;
-        File d = new File(dir + File.separator + username);
-        if (d.mkdirs() || d.exists())
-        {
+        File d = new File(dir + File.separator + weblogHandle);
+        if (d.mkdirs() || d.exists()) {
             File[] files = d.listFiles();
             long dirSize = 0l;
-            for (int i=0; i<files.length; i++)
-            {
-                if (!files[i].isDirectory())
-                {
+            for (int i=0; i<files.length; i++) {
+                if (!files[i].isDirectory()) {
                     dirSize = dirSize + files[i].length();
                 }
             }
@@ -249,9 +225,9 @@
         }
         return userDirSize;
     }
-
+    
     /**
-     * Return true if file is allowed to be uplaoded given specified allowed and 
+     * Return true if file is allowed to be uplaoded given specified allowed and
      * forbidden file types.
      * @param allowFiles  File types (i.e. extensions) that are allowed
      * @param forbidFiles File types that are forbidden
@@ -259,8 +235,7 @@
      * @return True if file is allowed to be uploaded
      */
     private boolean checkFileType(
-            String[] allowFiles, String[] forbidFiles, String fileName)
-    {
+            String[] allowFiles, String[] forbidFiles, String fileName) {
         // default to false
         boolean allowFile = false;
         
@@ -270,13 +245,10 @@
             allowFile = true;
         
         // check for allowed types
-        if (allowFiles != null && allowFiles.length > 0)
-        {
-            for (int y=0; y<allowFiles.length; y++)
-            {
+        if (allowFiles != null && allowFiles.length > 0) {
+            for (int y=0; y<allowFiles.length; y++) {
                 if (fileName.toLowerCase().endsWith(
-                        allowFiles[y].toLowerCase()))
-                {
+                        allowFiles[y].toLowerCase())) {
                     allowFile = true;
                     break;
                 }
@@ -284,28 +256,19 @@
         }
         
         // check for forbidden types ... this overrides any allows
-        if (forbidFiles != null && forbidFiles.length > 0)
-        {
-            for (int x=0; x<forbidFiles.length; x++)
-            {
+        if (forbidFiles != null && forbidFiles.length > 0) {
+            for (int x=0; x<forbidFiles.length; x++) {
                 if (fileName.toLowerCase().endsWith(
-                        forbidFiles[x].toLowerCase()))
-                {
+                        forbidFiles[x].toLowerCase())) {
                     allowFile = false;
                     break;
                 }
             }
-        } 
-
+        }
+        
         return allowFile;
     }
-
-    /* (non-Javadoc)
-     * @see org.roller.model.FileManager#release()
-     */
-    public void release()
-    {
-        // TODO Auto-generated method stub
-        
+    
+    public void release() {
     }
 }

Modified: incubator/roller/trunk/src/org/roller/model/FileManager.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/model/FileManager.java?rev=370060&r1=370059&r2=370060&view=diff
==============================================================================
--- incubator/roller/trunk/src/org/roller/model/FileManager.java (original)
+++ incubator/roller/trunk/src/org/roller/model/FileManager.java Tue Jan 17 21:45:32 2006
@@ -22,21 +22,24 @@
 {
     /** Determine if file can be saved in website's file space. */
     public boolean canSave(
-        WebsiteData site, String name, long size, RollerMessages msgs) 
+        String weblogHandle, String name, long size, RollerMessages msgs) 
         throws RollerException;
     
     /** Get website's files */
-    public File[] getFiles(WebsiteData site) 
+    public File[] getFiles(String weblogHandle) 
         throws RollerException;
     
     /** Delete specified file from website's file space. */
-    public void deleteFile(WebsiteData site, String name) 
+    public void deleteFile(String weblogHandle, String name) 
         throws RollerException;
 
     /** Save file in website's file space or throw exception if rules violated. */
-    public void saveFile(WebsiteData site, String name, long size, InputStream is) 
+    public void saveFile(String weblogHandle, String name, long size, InputStream is) 
         throws RollerException;
 
+    /** Return true if weblog is over the file-upload limit */
+    public boolean overQuota(String weblogHandle) throws RollerException; 
+            
     /**
      * Get directory in which uploaded files are stored
      */

Modified: incubator/roller/trunk/src/org/roller/presentation/website/actions/UploadFileFormAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/website/actions/UploadFileFormAction.java?rev=370060&r1=370059&r2=370060&view=diff
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/website/actions/UploadFileFormAction.java (original)
+++ incubator/roller/trunk/src/org/roller/presentation/website/actions/UploadFileFormAction.java Tue Jan 17 21:45:32 2006
@@ -1,9 +1,11 @@
 
 package org.roller.presentation.website.actions;
 
-import java.io.IOException;
+import java.io.File;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
@@ -22,6 +24,7 @@
 import org.roller.RollerException;
 import org.roller.config.RollerRuntimeConfig;
 import org.roller.model.FileManager;
+import org.roller.model.PropertiesManager;
 import org.roller.model.Roller;
 import org.roller.model.RollerFactory;
 import org.roller.pojos.WebsiteData;
@@ -36,233 +39,269 @@
 /**
  * @struts.action name="uploadFiles" path="/editor/uploadFiles"
  *  	parameter="method" scope="request" validate="false"
- * 
+ *
  * @struts.action-forward name="uploadFiles.page" path=".upload-file"
  */
-public final class UploadFileFormAction extends DispatchAction
-{
+public final class UploadFileFormAction extends DispatchAction {
     private static final String HANDLE = "fileupload.website.handle";
-    private static Log mLogger = 
-        LogFactory.getFactory().getInstance(UploadFileFormAction.class);
+    private static Log mLogger =
+            LogFactory.getFactory().getInstance(UploadFileFormAction.class);
+    
+    /**
+     * Display upload file page.
+     */
+    public ActionForward unspecified(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws Exception {
+        
+        ActionForward fwd =  mapping.findForward("access-denied");
+        RollerSession rses = RollerSession.getRollerSession(request);
+        WebsiteData website = getWebsite(request);
+        
+        if (rses.isUserAuthorizedToAuthor(website)) {
+            UploadFilePageModel pageModel = new UploadFilePageModel(
+                request, response, mapping, website.getHandle());
+            pageModel.setWebsite(website);
+            request.setAttribute("model", pageModel);
+            fwd = mapping.findForward("uploadFiles.page");
+        }        
+        return fwd;
+    }
 
     /**
      * Request to upload files
      */
     public ActionForward upload(
-        ActionMapping       mapping,
-        ActionForm          actionForm,
-        HttpServletRequest  request,
-        HttpServletResponse response)
-        throws IOException, ServletException
-    {
-        ActionForward fwd = mapping.findForward("uploadFiles.page");
-        WebsiteData website = getWebsite(request);
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws Exception {
         
-        BasePageModel pageModel = new BasePageModel(
-                "uploadFiles.title", request, response, mapping);
-        request.setAttribute("model", pageModel);
-        pageModel.setWebsite(website);
-                
+        ActionForward fwd = mapping.findForward("access-denied"); 
+        WebsiteData website = getWebsite(request);
         RollerMessages msgs = new RollerMessages();
-        try
-        {            
-            RollerSession rses = RollerSession.getRollerSession(request);            
-            if ( !rses.isUserAuthorizedToAuthor(website) )
-            {
-                return mapping.findForward("access-denied");
-            }
-        }
-        catch (Exception e)
-        {
-            mLogger.warn("Unable to find user.");
-            return fwd;
-        }
-
-        ActionErrors errors = new ActionErrors();
-        UploadFileForm theForm = (UploadFileForm)actionForm;
-        if ( theForm.getUploadedFile() != null )
-        {
-            ServletContext app = servlet.getServletConfig().getServletContext();
-
-            boolean uploadEnabled = 
-                    RollerRuntimeConfig.getBooleanProperty("uploads.enabled");
+        RollerSession rses = RollerSession.getRollerSession(request);
+        
+        if ( rses.isUserAuthorizedToAuthor(website)) {
             
-            if ( !uploadEnabled )
-            {
-                errors.add(ActionErrors.GLOBAL_ERROR,
-                    new ActionError("error.upload.disabled", ""));
-                saveErrors(request, errors);
-                return fwd;
-            }
+            fwd = mapping.findForward("uploadFiles.page");
+            ActionErrors errors = new ActionErrors();
+            UploadFileForm theForm = (UploadFileForm)actionForm;
+            if ( theForm.getUploadedFile() != null ) {
+                ServletContext app = servlet.getServletConfig().getServletContext();
+
+                boolean uploadEnabled =
+                        RollerRuntimeConfig.getBooleanProperty("uploads.enabled");
+
+                if ( !uploadEnabled ) {
+                    errors.add(ActionErrors.GLOBAL_ERROR,
+                            new ActionError("error.upload.disabled", ""));
+                    saveErrors(request, errors);
+                    return fwd;
+                }
 
-            //this line is here for when the input page is upload-utf8.jsp,
-            //it sets the correct character encoding for the response
-            String encoding = request.getCharacterEncoding();
-            if ((encoding != null) && (encoding.equalsIgnoreCase("utf-8")))
-            {
-                response.setContentType("text/html; charset=utf-8");
-            }
+                //this line is here for when the input page is upload-utf8.jsp,
+                //it sets the correct character encoding for the response
+                String encoding = request.getCharacterEncoding();
+                if ((encoding != null) && (encoding.equalsIgnoreCase("utf-8"))) {
+                    response.setContentType("text/html; charset=utf-8");
+                }
 
-            //retrieve the file representation
-            //FormFile[] files = theForm.getUploadedFiles();
-            FormFile[] files = new FormFile[]{theForm.getUploadedFile()};
-            int fileSize = 0;
-            try
-            {
-                for (int i=0; i<files.length; i++)
-                {
-                    if (files[i] == null) continue;
-
-                    // retrieve the file name
-                    String fileName= files[i].getFileName();
-                	   int terminated = fileName.indexOf("\000");
-                	   if (terminated != -1) 
-                    {
-                		  // disallow sneaky null terminated strings
-                		  fileName = fileName.substring(0, terminated).trim();
-                    }
-                    
-                    fileSize = files[i].getFileSize();
-                    
-                    //retrieve the file data
-                    FileManager fmgr = RollerFactory.getRoller().getFileManager();
-                    if (fmgr.canSave(website, fileName, fileSize, msgs))
-                    {
-                        InputStream stream = files[i].getInputStream();
-                        fmgr.saveFile(website, fileName, fileSize, stream);
-                    }
+                //retrieve the file representation
+                //FormFile[] files = theForm.getUploadedFiles();
+                FormFile[] files = new FormFile[]{theForm.getUploadedFile()};
+                int fileSize = 0;
+                try {
+                    for (int i=0; i<files.length; i++) {
+                        if (files[i] == null) continue;
+
+                        // retrieve the file name
+                        String fileName= files[i].getFileName();
+                        int terminated = fileName.indexOf("\000");
+                        if (terminated != -1) {
+                            // disallow sneaky null terminated strings
+                            fileName = fileName.substring(0, terminated).trim();
+                        }
+
+                        fileSize = files[i].getFileSize();
+
+                        //retrieve the file data
+                        FileManager fmgr = RollerFactory.getRoller().getFileManager();
+                        if (fmgr.canSave(website.getHandle(), fileName, fileSize, msgs)) {
+                            InputStream stream = files[i].getInputStream();
+                            fmgr.saveFile(website.getHandle(), fileName, fileSize, stream);
+                        }
 
-                    //destroy the temporary file created
-                    files[i].destroy();
+                        //destroy the temporary file created
+                        files[i].destroy();
+                    }
+                } catch (Exception e) {
+                    errors.add(ActionErrors.GLOBAL_ERROR,
+                        new ActionError("error.upload.file",e.toString()));
                 }
-            }
-            catch (Exception e)
-            {
+            }        
+            UploadFilePageModel pageModel = new UploadFilePageModel(
+                request, response, mapping, website.getHandle());
+            request.setAttribute("model", pageModel);
+            pageModel.setWebsite(website);
+
+            Iterator iter = msgs.getErrors();
+            while (iter.hasNext()) {
+                RollerMessages.RollerMessage error =
+                        (RollerMessages.RollerMessage) iter.next();
                 errors.add(ActionErrors.GLOBAL_ERROR,
-                    new ActionError("error.upload.file",e.toString()));
+                        new ActionError(error.getKey(), error.getArgs()));
             }
+            saveErrors(request, errors);
         }
-        Iterator iter = msgs.getErrors();
-        while (iter.hasNext())
-        {
-            RollerMessages.RollerMessage error = 
-                (RollerMessages.RollerMessage) iter.next();
-            errors.add(ActionErrors.GLOBAL_ERROR, 
-                new ActionError(error.getKey(), error.getArgs()));
-        }
-        saveErrors(request, errors);
         return fwd;
     }
-
+    
     /**
      * Request to delete files
      */
     public ActionForward delete(
-        ActionMapping       mapping,
-        ActionForm          actionForm,
-        HttpServletRequest  request,
-        HttpServletResponse response)
-        throws IOException, ServletException
-    {
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws Exception {
+
         ActionErrors errors = new ActionErrors();
         UploadFileForm theForm = (UploadFileForm)actionForm;
-        ActionForward fwd = mapping.findForward("uploadFiles.page");
-        
+        ActionForward fwd = mapping.findForward("access-denied");        
         WebsiteData website = getWebsite(request);
-        BasePageModel pageModel = 
-            new BasePageModel("uploadFiles.title", request, response, mapping);
-        pageModel.setWebsite(website);
-        request.setAttribute("model", pageModel);
-
-        try
-        {
-            FileManager fmgr = RollerFactory.getRoller().getFileManager();
-            String[] deleteFiles = theForm.getDeleteFiles();
-            for (int i=0; i<deleteFiles.length; i++)
-            {
-                if (    deleteFiles[i].trim().startsWith("/")
-            	        || deleteFiles[i].trim().startsWith("\\")
-                     || deleteFiles[i].indexOf("..") != -1)
-            	   {
-            		   // ignore absolute paths, or paths that contiain '..'
-            	   }
-            	   else 
-            	   {
-                    fmgr.deleteFile(website, deleteFiles[i]);
-            	   }
+
+        RollerSession rses = RollerSession.getRollerSession(request);
+        if (rses.isUserAuthorizedToAuthor(website)) {
+            fwd = mapping.findForward("uploadFiles.page"); 
+            try {
+                FileManager fmgr = RollerFactory.getRoller().getFileManager();
+                String[] deleteFiles = theForm.getDeleteFiles();
+                for (int i=0; i<deleteFiles.length; i++) {
+                    if (    deleteFiles[i].trim().startsWith("/")
+                    || deleteFiles[i].trim().startsWith("\\") 
+                    || deleteFiles[i].indexOf("..") != -1) {
+                        // ignore absolute paths, or paths that contiain '..'
+                    } else {
+                        fmgr.deleteFile(website.getHandle(), deleteFiles[i]);
+                    }
+                }
+            } catch (Exception e) {
+                errors.add(ActionErrors.GLOBAL_ERROR,
+                        new ActionError("error.upload.file",e.toString()));
+                saveErrors(request,errors);
             }
-        }
-        catch (Exception e)
-        {
-            errors.add(ActionErrors.GLOBAL_ERROR,
-                new ActionError("error.upload.file",e.toString()));
-            saveErrors(request,errors);
+            UploadFilePageModel pageModel = new UploadFilePageModel(
+                request, response, mapping, website.getHandle());
+            pageModel.setWebsite(website);
+            request.setAttribute("model", pageModel);
         }
         return fwd;
     }
-
-
+        
     /**
-     * Load file-listings page.
+     * Other actions can get the website handle from request params, but
+     * request params don't come accross in a file-upload post so we have to
+     * stash the website handle in the session.
      */
-    public ActionForward unspecified(
-            ActionMapping       mapping,
-            ActionForm          actionForm,
-            HttpServletRequest  request,
-            HttpServletResponse response)
-        throws IOException, ServletException
-    {       
-        try
-        {
-            WebsiteData website = getWebsite(request);
+    public static WebsiteData getWebsite(HttpServletRequest request) throws RollerException {
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        WebsiteData website = rreq.getWebsite();
+        if (website != null) {
+            request.getSession().setAttribute(HANDLE, website.getHandle());
+        } else {
+            String handle = (String)request.getSession().getAttribute(HANDLE);
+            Roller roller = RollerFactory.getRoller();
+            website = roller.getUserManager().getWebsiteByHandle(handle);
+        }
+        return website;
+    }
+    
+    /** All information we'll need on the UploadFile page */
+    public class UploadFilePageModel extends BasePageModel {
+        private String resourcesBaseURL = null;
+        private boolean uploadEnabled = true;
+        private boolean overQuota = false;
+        private String maxDirMB = null; // in megabytes
+        private String maxFileMB = null; // in megabytes
+        private List files = null;
+        private long totalSize = 0;
+        
+        public UploadFilePageModel(
+                HttpServletRequest req, 
+                HttpServletResponse res, 
+                ActionMapping mapping,
+                String weblogHandle) throws RollerException {
             
-            BasePageModel pageModel = new BasePageModel(
-                "uploadFiles.title", request, response, mapping);
-            pageModel.setWebsite(website);
-            request.setAttribute("model", pageModel);
+            super("uploadFiles.title", req, res, mapping);
+            
+            Roller roller = RollerFactory.getRoller();
+            PropertiesManager pmgr = roller.getPropertiesManager();
+            FileManager fmgr = roller.getFileManager();
             
-            RollerSession rses = RollerSession.getRollerSession(request);
-            if ( !rses.isUserAuthorizedToAuthor(website) )
-            {
-                return mapping.findForward("access-denied");
+            String dir = fmgr.getUploadDir();
+            resourcesBaseURL = getBaseURL() + fmgr.getUploadUrl() + "/" + weblogHandle;
+            
+            RollerRequest rreq = RollerRequest.getRollerRequest(req);
+            WebsiteData website = UploadFileFormAction.getWebsite(req);            
+            String maxDirMB = RollerRuntimeConfig.getProperty("uploads.dir.maxsize");
+            String maxFileMB = RollerRuntimeConfig.getProperty("uploads.file.maxsize");
+                     
+            overQuota = fmgr.overQuota(weblogHandle);
+            uploadEnabled = RollerRuntimeConfig.getBooleanProperty("uploads.enabled");  
+            
+            files = new ArrayList();
+            File[] rawFiles = fmgr.getFiles(weblogHandle);
+            for (int i=0; i<rawFiles.length; i++) {
+                files.add(new FileBean(rawFiles[i]));
+                totalSize += rawFiles[i].length();
             }
         }
-        catch (RollerException re)
-        {
-            mLogger.error("Unexpected exception",re.getRootCause());
-            throw new ServletException(re);
+        public boolean isUploadEnabled() {
+            return uploadEnabled;
+        }
+        public boolean isOverQuota() {
+            return overQuota;
+        }
+        public String getMaxDirMB() {
+            return maxDirMB;
+        }
+        public String getMaxFileMB() {
+            return maxFileMB;
+        }
+        public String getResourcesBaseURL() {
+            return resourcesBaseURL;
+        }
+        public long getTotalSize() {
+            return totalSize;
+        }
+        public List getFiles() {
+            return files;
         }
-        return mapping.findForward("uploadFiles.page"); 
     }
-
+    
     /** 
-     * Other actions can get the website handle from request params, but 
-     * request params don't come accross in a file-upload post so we have to 
-     * stash the website handle in the session.
+     * If java.io.File followed bean conventions we wouldn't need this. (perhaps 
+     * we shouldn't be using files directly here in the presentation layer) 
      */
-    public static WebsiteData getWebsite(HttpServletRequest request) 
-        throws ServletException
-    {
-        RollerRequest rreq = RollerRequest.getRollerRequest(request);
-        WebsiteData website = rreq.getWebsite();
-        if (website != null) 
-        {
-            request.getSession().setAttribute(HANDLE, website.getHandle());
+    public class FileBean {
+        private File file;
+        public FileBean(File file) {
+            this.file = file;
         }
-        else 
-        {
-            String handle = (String)request.getSession().getAttribute(HANDLE);
-            Roller roller = RollerFactory.getRoller();
-            try 
-            {
-                website = roller.getUserManager().getWebsiteByHandle(handle);
-            }
-            catch (RollerException e)
-            {
-                throw new ServletException(e);
-            }
-        }
-        return website;
+        public String getName() { return file.getName(); }
+        public long getLength() { return file.length(); }
     }
 }
+
+
+
+
+
+
 

Modified: incubator/roller/trunk/src/org/roller/presentation/xmlrpc/MetaWeblogAPIHandler.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/xmlrpc/MetaWeblogAPIHandler.java?rev=370060&r1=370059&r2=370060&view=diff
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/xmlrpc/MetaWeblogAPIHandler.java (original)
+++ incubator/roller/trunk/src/org/roller/presentation/xmlrpc/MetaWeblogAPIHandler.java Tue Jan 17 21:45:32 2006
@@ -356,11 +356,11 @@
             RollerMessages msgs = new RollerMessages();
             
             // If save is allowed by Roller system-wide policies
-            if (fmgr.canSave(website, name, bits.length, msgs)) 
+            if (fmgr.canSave(website.getHandle(), name, bits.length, msgs)) 
             {
                 // Then save the file
                 fmgr.saveFile(
-                    website, name, bits.length, new ByteArrayInputStream(bits));
+                    website.getHandle(), name, bits.length, new ByteArrayInputStream(bits));
                 
                 RollerRequest rreq = RollerRequest.getRollerRequest();
                 HttpServletRequest request = rreq.getRequest();

Modified: incubator/roller/trunk/web/WEB-INF/tiles-defs.xml
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/web/WEB-INF/tiles-defs.xml?rev=370060&r1=370059&r2=370060&view=diff
==============================================================================
--- incubator/roller/trunk/web/WEB-INF/tiles-defs.xml (original)
+++ incubator/roller/trunk/web/WEB-INF/tiles-defs.xml Tue Jan 17 21:45:32 2006
@@ -125,7 +125,7 @@
     <put name="styles" value="/theme/css-sidebar.jsp" />
 </definition>
 <definition name=".upload-file" extends=".tiles-editorpage" >
-    <put name="content" value="/website/upload-file.jsp" />
+    <put name="content" value="/website/UploadFile.jsp" />
 </definition>
 
 <definition name=".WeblogEntryRemove" extends=".tiles-simplepage" >

Added: incubator/roller/trunk/web/website/UploadFile.jsp
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/web/website/UploadFile.jsp?rev=370060&view=auto
==============================================================================
--- incubator/roller/trunk/web/website/UploadFile.jsp (added)
+++ incubator/roller/trunk/web/website/UploadFile.jsp Tue Jan 17 21:45:32 2006
@@ -0,0 +1,113 @@
+<%@ include file="/taglibs.jsp" %>
+<%@ page import="org.apache.struts.util.RequestUtils" %>
+<%@ page import="java.util.Hashtable" %>
+<%@ page import="java.util.ResourceBundle" %>
+
+<%
+BasePageModel model = (BasePageModel)request.getAttribute("model");
+ResourceBundle bundle = ResourceBundle.getBundle("ApplicationResources");
+%>
+
+<p class="subtitle">
+    <fmt:message key="uploadFiles.subtitle" >
+        <fmt:param value="${model.website.handle}" />
+    </fmt:message>
+</p>  
+<p class="pagetip">
+    <fmt:message key="uploadFiles.tip" />
+</p>
+
+<%-- --------------------------
+File upload form, but only if it's enabled and weblog is under quota
+--%>
+
+<c:choose>
+    <c:when test="${!model.uploadEnabled}">
+       <span class="error"><fmt:message key="uploadFiles.uploadDisabled" /></span>
+    </c:when>
+    <c:when test="${model.overQuota}">
+       <span class="error"><fmt:message key="uploadFiles.exceededQuota" /></span>
+       <br />
+    </c:when>
+    <c:otherwise>
+         <% String edit = RequestUtils.computeURL( pageContext,
+           "uploadFiles", null, null, null, new Hashtable(), null, false); %>
+        <form name="uploadFiles" method="post" action="<%= edit %>" enctype="multipart/form-data">
+            <br />
+            <input type="file" name="uploadedFile" size="30" />
+            &nbsp;
+            <input type="submit" value='<%= bundle.getString("uploadFiles.upload") %>' />
+            <input type="hidden" name="method" value="upload" />
+            <input type="hidden" name="weblog" value='<%= model.getWebsite().getHandle() %>'>
+            <br />
+            <fmt:message key="uploadFiles.quotaNote">
+               <fmt:param value="${model.maxFileMB}" />
+               <fmt:param value="${model.maxDirMB}" />
+            </fmt:message>
+        </form>
+    </c:otherwise>
+</c:choose>
+
+<%-- --------------------------
+Table of files, each with link, size and checkbox
+--%>
+
+<h1><fmt:message key="uploadFiles.manageFiles" /></h1>    
+<html:form action="/editor/uploadFiles" method="post">
+
+    <table class="rollertable">
+
+        <tr class="rHeaderTr">
+            <th class="rollertable" width="95%">Filename</th>
+            <th class="rollertable">Size</td>
+            <th class="rollertable">Delete</td>
+        </tr>
+
+        <c:forEach var="loopfile" items="${model.files}" >
+           <roller:row oddStyleClass="rollertable_odd" evenStyleClass="rollertable_even">
+                <td class="rollertable">
+                    <a href='<c:out value="${model.resourcesBaseURL}" />/<c:out value="${loopfile.name}" />'><c:out value="${loopfile.name}" /></a>
+                </td>
+                <td class="rollertable" align="right">
+                    <fmt:formatNumber value="${loopfile.length / 1024}" type="number" maxFractionDigits="2" />&nbsp;KB
+                </td>
+                <td class="rollertable" align="center">
+                   <input type="checkbox" name="deleteFiles" value='<c:out value="${loopfile.name}" />' />
+                </td>
+           </roller:row>
+
+        </c:forEach>
+
+       <tr>
+           <td></td>
+           <td></td>
+           <td><fmt:formatNumber value="${model.totalSize / 1024}" type="number" maxFractionDigits="2" />&nbsp;KB</td>
+       </tr>
+    </table>
+    
+    <table>
+       <tr>
+          <td align="left">
+             <input type="submit" value='<fmt:message key="uploadFiles.button.delete" />' /></input>
+          </td>
+       </tr>
+    </table>
+    
+    <input type=hidden name="weblog" value='<c:out value="${model.website.handle}" />' />
+    <input type="hidden" name="method" value="delete"></input>
+    
+</html:form>
+
+<%--
+Added by Matt Raible since the focus javascript generated by Struts uses
+a name reference and IE seems to only focus on file inputs via elements[0]?
+--%>
+<script type="text/javascript">
+<!--
+    document.forms[0].elements[0].focus();
+// -->
+</script>
+
+
+
+