Index: lams_central/conf/xdoclet/servlets.xml =================================================================== diff -u -r8f6d6a60fc7c387a228d25067500c316e3bff68b -r9b86062d232d20d13b9f4052a48852090d18934e --- lams_central/conf/xdoclet/servlets.xml (.../servlets.xml) (revision 8f6d6a60fc7c387a228d25067500c316e3bff68b) +++ lams_central/conf/xdoclet/servlets.xml (.../servlets.xml) (revision 9b86062d232d20d13b9f4052a48852090d18934e) @@ -24,33 +24,33 @@ Connector - com.fredck.FCKeditor.connector.ConnectorServlet + org.lamsfoundation.lams.authoring.web.LAMSConnectorServlet baseDir - /UserFiles/ + secure debug - false + true 1 SimpleUploader - com.fredck.FCKeditor.uploader.SimpleUploaderServlet + org.lamsfoundation.lams.authoring.web.LAMSUploadServlet baseDir - /UserFiles/ + secure debug true enabled - false + true AllowedExtensionsFile Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/LAMSConnectorServlet.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/LAMSConnectorServlet.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/LAMSConnectorServlet.java (revision 9b86062d232d20d13b9f4052a48852090d18934e) @@ -0,0 +1,312 @@ +package org.lamsfoundation.lams.authoring.web; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.lamsfoundation.lams.util.Configuration; +import org.lamsfoundation.lams.util.ConfigurationKeys; + +import org.apache.commons.fileupload.DiskFileUpload; +import org.apache.commons.fileupload.FileItem; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + + + +public class LAMSConnectorServlet extends HttpServlet { + + private static String baseDir; + private String realBaseDir; + private static boolean debug=false; + + /** + * Initialize the servlet.
+ * Retrieve from the servlet configuration the "baseDir" which is the root of the file repository:
+ * If not specified the value of "/UserFiles/" will be used. + * + */ + public void init() throws ServletException { + baseDir=getInitParameter("baseDir"); + debug=(new Boolean(getInitParameter("debug"))).booleanValue(); + + if(baseDir==null) + baseDir="secure"; + + realBaseDir = Configuration.get(ConfigurationKeys.LAMS_EAR_DIR) + "/" + AuthoringConstants.LAMS_WWW_DIR + "/" + baseDir; + + File baseFile=new File(realBaseDir); + if(!baseFile.exists()){ + baseFile.mkdir(); + } + } + + /** + * Manage the Get requests (GetFolders, GetFoldersAndFiles, CreateFolder).
+ * + * The servlet accepts commands sent in the following format:
+ * connector?Command=CommandName&Type=ResourceType&CurrentFolder=FolderPath

+ * It execute the command and then return the results to the client in XML format. + * + */ + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + if (debug) System.out.println("--- BEGIN DOGET ---"); + + response.setContentType("text/xml; charset=UTF-8"); + response.setHeader("Cache-Control","no-cache"); + PrintWriter out = response.getWriter(); + + String commandStr=request.getParameter("Command"); + String typeStr=request.getParameter("Type"); + String currentFolderStr=request.getParameter("CurrentFolder"); + + // create content directory if non-existant + String currentDirPath=realBaseDir + currentFolderStr; + + File currentContentDir=new File(currentDirPath); + if(!currentContentDir.exists()){ + currentContentDir.mkdir(); + } + + // create content type directory if non-existant + currentDirPath += typeStr; + + File currentDir=new File(currentDirPath); + if(!currentDir.exists()){ + currentDir.mkdir(); + } + + Document document=null; + try { + DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + document=builder.newDocument(); + } catch (ParserConfigurationException pce) { + pce.printStackTrace(); + } + + Node root=CreateCommonXml(document,commandStr,typeStr,currentFolderStr,currentDirPath); + + if (debug) System.out.println("Command = " + commandStr); + + if(commandStr.equals("GetFolders")) { + getFolders(currentDir,root,document); + } + else if (commandStr.equals("GetFoldersAndFiles")) { + getFolders(currentDir,root,document); + getFiles(currentDir,root,document); + } + else if (commandStr.equals("CreateFolder")) { + String newFolderStr=request.getParameter("NewFolderName"); + File newFolder=new File(currentDir,newFolderStr); + String retValue="110"; + + if(newFolder.exists()){ + retValue="101"; + } + else { + try { + boolean dirCreated = newFolder.mkdir(); + if(dirCreated) + retValue="0"; + else + retValue="102"; + }catch(SecurityException sex) { + retValue="103"; + } + + } + setCreateFolderResponse(retValue,root,document); + } + + document.getDocumentElement().normalize(); + try { + TransformerFactory tFactory = TransformerFactory.newInstance(); + Transformer transformer = tFactory.newTransformer(); + + DOMSource source = new DOMSource(document); + + StreamResult result = new StreamResult(out); + transformer.transform(source, result); + + if (debug) { + StreamResult dbgResult = new StreamResult(System.out); + transformer.transform(source, dbgResult); + System.out.println(""); + System.out.println("--- END DOGET ---"); + } + + + } catch (Exception ex) { + ex.printStackTrace(); + } + + + out.flush(); + out.close(); + } + + + /** + * Manage the Post requests (FileUpload).
+ * + * The servlet accepts commands sent in the following format:
+ * connector?Command=FileUpload&Type=ResourceType&CurrentFolder=FolderPath

+ * It store the file (renaming it in case a file with the same name exists) and then return an HTML file + * with a javascript command in it. + * + */ + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + if (debug) System.out.println("--- BEGIN DOPOST ---"); + + response.setContentType("text/html; charset=UTF-8"); + response.setHeader("Cache-Control","no-cache"); + PrintWriter out = response.getWriter(); + + String commandStr=request.getParameter("Command"); + String typeStr=request.getParameter("Type"); + String currentFolderStr=request.getParameter("CurrentFolder"); + + String currentDirPath=realBaseDir + "/" + currentFolderStr + "/" + typeStr; + + if (debug) System.out.println(currentDirPath); + + String retVal="0"; + String newName=""; + + if(!commandStr.equals("FileUpload")) + retVal="203"; + else { + DiskFileUpload upload = new DiskFileUpload(); + try { + List items = upload.parseRequest(request); + + Map fields=new HashMap(); + + Iterator iter = items.iterator(); + while (iter.hasNext()) { + FileItem item = (FileItem) iter.next(); + if (item.isFormField()) + fields.put(item.getFieldName(),item.getString()); + else + fields.put(item.getFieldName(),item); + } + FileItem uplFile=(FileItem)fields.get("NewFile"); + String fileNameLong=uplFile.getName(); + fileNameLong=fileNameLong.replace('\\','/'); + String[] pathParts=fileNameLong.split("/"); + String fileName=pathParts[pathParts.length-1]; + + String nameWithoutExt=getNameWithoutExtension(fileName); + String ext=getExtension(fileName); + File pathToSave=new File(currentDirPath,fileName); + int counter=1; + while(pathToSave.exists()){ + newName=nameWithoutExt+"("+counter+")"+"."+ext; + retVal="201"; + pathToSave=new File(currentDirPath,newName); + counter++; + } + uplFile.write(pathToSave); + }catch (Exception ex) { + retVal="203"; + } + + } + + out.println(""); + out.flush(); + out.close(); + + if (debug) System.out.println("--- END DOPOST ---"); + + } + + private void setCreateFolderResponse(String retValue,Node root,Document doc) { + Element myEl=doc.createElement("Error"); + myEl.setAttribute("number",retValue); + root.appendChild(myEl); + } + + + private void getFolders(File dir,Node root,Document doc) { + Element folders=doc.createElement("Folders"); + root.appendChild(folders); + File[] fileList=dir.listFiles(); + for(int i=0;i + * + * This servlet accepts just file uploads, eventually with a parameter specifying file type + * + * @author Simone Chiaretta (simo@users.sourceforge.net) + */ + +public class LAMSUploadServlet extends HttpServlet { + + private static String baseDir; + private String realBaseDir; + private static boolean debug=false; + private static boolean enabled=false; + private static Hashtable allowedExtensions; + private static Hashtable deniedExtensions; + + /** + * Initialize the servlet.
+ * Retrieve from the servlet configuration the "baseDir" which is the root of the file repository:
+ * If not specified the value of "/UserFiles/" will be used.
+ * Also it retrieve all allowed and denied extensions to be handled. + * + */ + public void init() throws ServletException { + + debug=(new Boolean(getInitParameter("debug"))).booleanValue(); + + if(debug) System.out.println("\r\n---- SimpleUploaderServlet initialization started ----"); + + baseDir=getInitParameter("baseDir"); + enabled=(new Boolean(getInitParameter("enabled"))).booleanValue(); + + if(baseDir==null) + baseDir="secure"; + + realBaseDir = Configuration.get(ConfigurationKeys.LAMS_EAR_DIR) + "/" + AuthoringConstants.LAMS_WWW_DIR + "/" + baseDir; + + File baseFile=new File(realBaseDir); + if(!baseFile.exists()){ + baseFile.mkdir(); + } + + allowedExtensions = new Hashtable(3); + deniedExtensions = new Hashtable(3); + + allowedExtensions.put("File",stringToArrayList(getInitParameter("AllowedExtensionsFile"))); + deniedExtensions.put("File",stringToArrayList(getInitParameter("DeniedExtensionsFile"))); + + allowedExtensions.put("Image",stringToArrayList(getInitParameter("AllowedExtensionsImage"))); + deniedExtensions.put("Image",stringToArrayList(getInitParameter("DeniedExtensionsImage"))); + + allowedExtensions.put("Flash",stringToArrayList(getInitParameter("AllowedExtensionsFlash"))); + deniedExtensions.put("Flash",stringToArrayList(getInitParameter("DeniedExtensionsFlash"))); + + if(debug) System.out.println("---- SimpleUploaderServlet initialization completed ----\r\n"); + + } + + + /** + * Manage the Upload requests.
+ * + * The servlet accepts commands sent in the following format:
+ * simpleUploader?Type=ResourceType

+ * It store the file (renaming it in case a file with the same name exists) and then return an HTML file + * with a javascript command in it. + * + */ + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + if (debug) System.out.println("--- BEGIN DOPOST ---"); + + response.setContentType("text/html; charset=UTF-8"); + response.setHeader("Cache-Control","no-cache"); + PrintWriter out = response.getWriter(); + + + String typeStr=request.getParameter("Type"); + String currentFolderStr=request.getParameter("CurrentFolder"); + //String currentPath=baseDir+typeStr; + //String currentDirPath=getServletContext().getRealPath(currentPath); + //currentPath=request.getContextPath()+currentPath; + + // create content directory if non-existant + String currentDirPath=realBaseDir + currentFolderStr; + String currentPath= Configuration.get(ConfigurationKeys.SERVER_URL) + "www" + "/" + "secure" + currentFolderStr + typeStr; + + File currentContentDir=new File(currentDirPath); + if(!currentContentDir.exists()){ + currentContentDir.mkdir(); + } + + // create content type directory if non-existant + currentDirPath += typeStr; + + File currentDir=new File(currentDirPath); + if(!currentDir.exists()){ + currentDir.mkdir(); + } + + if (debug) System.out.println(currentDirPath); + + String retVal="0"; + String newName=""; + String fileUrl=""; + String errorMessage=""; + + if(enabled) { + DiskFileUpload upload = new DiskFileUpload(); + try { + List items = upload.parseRequest(request); + + Map fields=new HashMap(); + + Iterator iter = items.iterator(); + while (iter.hasNext()) { + FileItem item = (FileItem) iter.next(); + if (item.isFormField()) + fields.put(item.getFieldName(),item.getString()); + else + fields.put(item.getFieldName(),item); + } + FileItem uplFile=(FileItem)fields.get("NewFile"); + String fileNameLong=uplFile.getName(); + fileNameLong=fileNameLong.replace('\\','/'); + String[] pathParts=fileNameLong.split("/"); + String fileName=pathParts[pathParts.length-1]; + + String nameWithoutExt=getNameWithoutExtension(fileName); + String ext=getExtension(fileName); + File pathToSave=new File(currentDirPath,fileName); + fileUrl=currentPath+'/'+fileName; + if(extIsAllowed(typeStr,ext)) { + int counter=1; + while(pathToSave.exists()){ + newName=nameWithoutExt+"("+counter+")"+"."+ext; + fileUrl=currentPath+'/'+newName; + retVal="201"; + pathToSave=new File(currentDirPath,newName); + counter++; + } + uplFile.write(pathToSave); + } + else { + retVal="202"; + errorMessage=""; + if (debug) System.out.println("Invalid file type: " + ext); + } + }catch (Exception ex) { + if (debug) ex.printStackTrace(); + retVal="203"; + } + } + else { + retVal="1"; + errorMessage="This file uploader is disabled. Please check the WEB-INF/web.xml file"; + } + + + out.println(""); + out.flush(); + out.close(); + + if (debug) System.out.println("--- END DOPOST ---"); + + } + + + /* + * This method was fixed after Kris Barnhoorn (kurioskronic) submitted SF bug #991489 + */ + private static String getNameWithoutExtension(String fileName) { + return fileName.substring(0, fileName.lastIndexOf(".")); + } + + /* + * This method was fixed after Kris Barnhoorn (kurioskronic) submitted SF bug #991489 + */ + private String getExtension(String fileName) { + return fileName.substring(fileName.lastIndexOf(".")+1); + } + + + + /** + * Helper function to convert the configuration string to an ArrayList. + */ + + private ArrayList stringToArrayList(String str) { + + if(debug) System.out.println(str); + String[] strArr=str.split("\\|"); + + ArrayList tmp=new ArrayList(); + if(str.length()>0) { + for(int i=0;i classpath:/org/lamsfoundation/lams/lesson/lessonApplicationContext.xml classpath:/org/lamsfoundation/lams/learning/learningApplicationContext.xml @@ -69,13 +70,13 @@ - flashCrashDump - org.lamsfoundation.lams.web.FlashCrashDumpServlet + storeLD + org.lamsfoundation.lams.authoring.web.StoreLDServlet - storeLD - org.lamsfoundation.lams.authoring.web.StoreLDServlet + storeTheme + org.lamsfoundation.lams.themes.web.StoreThemeServlet @@ -84,11 +85,16 @@ - storeTheme - org.lamsfoundation.lams.themes.web.StoreThemeServlet + storeNotebookEntry + org.lamsfoundation.lams.notebook.web.StoreNBEntryServlet + + flashCrashDump + org.lamsfoundation.lams.web.FlashCrashDumpServlet + + action org.apache.struts.action.ActionServlet @@ -115,33 +121,33 @@ Connector - com.fredck.FCKeditor.connector.ConnectorServlet + org.lamsfoundation.lams.authoring.web.LAMSConnectorServlet baseDir - /UserFiles/ + secure debug - false + true 1 SimpleUploader - com.fredck.FCKeditor.uploader.SimpleUploaderServlet + org.lamsfoundation.lams.authoring.web.LAMSUploadServlet baseDir - /UserFiles/ + secure debug true enabled - false + true AllowedExtensionsFile @@ -170,6 +176,18 @@ 1 + + Instructions Download + Instructions Download + download + org.lamsfoundation.lams.contentrepository.client.ToolDownload + + toolContentHandlerBeanName + centralToolContentHandler + + 3 + + action *.do @@ -187,22 +205,31 @@ /fckeditor/editor/filemanager/upload/simpleuploader + + download + /download/* + + - flashCrashDump - /flashCrashDump - - storeLD /authoring/storeLearningDesignDetails + storeTheme + /themes/storeTheme + + dumpWDDX /dumpWDDX - storeTheme - /themes/storeTheme + storeNotebookEntry + /notebook/storeNotebookEntry + + flashCrashDump + /flashCrashDump + 120 @@ -221,11 +248,11 @@ 403 - /403.jsp + /errorpages/403.jsp 404 - /404.jsp + /errorpages/404.jsp