+ /**
+ * Called when an edited file is saved by the user
+ */
+ public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
+ {
+ HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
+ String filename = requestParser.getParameter("filename");
+ String subDirectory = requestParser.getParameter("subdirectory");
+ String text =
+ StringRoutines.performRegularExpressionReplacement(
+ requestParser.getParameter("text"),
+ "\r\n",
+ System.getProperty("line.separator"));
+ FileEditDirectory directory = getDirectory(aRequest);
+
+ try {
+ File f = new File(new File(directory.getRootDirectory(), subDirectory), filename);
+
+ if (isDirectoryValid(directory, f)) {
+ FileWriter out = new FileWriter(f);
+ try {
+ out.write(text.toCharArray());
+ }
+ finally {
+ out.close();
+ }
+
+ logAdminUsage(aRequest, f.getAbsolutePath(), "object modified");
+
+ MirGlobal.getChangeEngine().getTracker().addChange(f.getCanonicalPath(), ChangeType.MODIFICATION);
+
+ editFile(directory, filename, subDirectory, aRequest, aResponse);
+ }
+ }
+ catch (Throwable e) {
+ throw new ServletModuleFailure(e);
+ }
+ }
+
+ public void listSubDirectory(FileEditDirectory aDirectory, String aSubDirectory, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
+ {
+ try {
+ Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
+ File dir = new File(aDirectory.getRootDirectory(), aSubDirectory);
+
+ if (!isDirectoryValid(aDirectory, dir) || !dir.isDirectory()) {
+ dir = aDirectory.getRootDirectory();
+ aSubDirectory = "";
+ }
+
+ responseData.put("filelist", FileRoutines.getDirectoryContentsAsList(dir, aDirectory.getFilter()));
+
+ if (aDirectory.getRecursive()) {
+ List dirs = new ArrayList();
+ if (!dir.getCanonicalPath().equals(aDirectory.getRootDirectory().getCanonicalPath()))
+ responseData.put("updir", new File(aSubDirectory).getParent());
+
+ dirs.addAll(FileRoutines.getDirectoryContentsAsList(dir, dirFilter));
+
+ responseData.put("dirlist", dirs);
+ }
+ else {
+ responseData.put("dirlist", null);
+ responseData.put("updir", null);
+ }
+
+ responseData.put("subdirectory", aSubDirectory);
+ responseData.put("entry", aDirectory.getName());
+
+ ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator);
+ }
+ catch (Throwable e) {
+ throw new ServletModuleFailure(e);
+ }
+ }
+
+ public void editFile(FileEditDirectory aDirectory, String aFileName, String aSubDirectory, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
+ try {
+ File f = new File(new File(aDirectory.getRootDirectory(), aSubDirectory), aFileName);
+
+ if (!isDirectoryValid(aDirectory, f) || f.isDirectory() || !isFileValid(aDirectory, f)) {
+ listSubDirectory(aDirectory, "", aRequest, aResponse);
+ }
+ else {
+ Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
+ URLBuilder urlBuilder = new URLBuilder();
+
+ urlBuilder.setValue("module", "FileEdit");
+ urlBuilder.setValue("do", "enter");
+ urlBuilder.setValue("entry", aDirectory.getName());
+ urlBuilder.setValue("directory", "");
+ urlBuilder.setValue("subdirectory", aSubDirectory);
+
+ BufferedReader in = new BufferedReader(new FileReader(f));
+ StringWriter textout = new StringWriter();
+ BufferedWriter out = new BufferedWriter(textout);
+
+ // TODO read array
+ char[] c = new char[4096];
+ int read;
+ while ((read=in.read(c)) != -1) {
+ out.write(c, 0, read);
+ }
+ in.close();
+ out.close();
+
+ responseData.put("entry", aDirectory.getName());
+ responseData.put("text", textout.toString());
+ responseData.put("filename", aFileName);
+ responseData.put("subdirectory", aSubDirectory);
+ responseData.put("returnurl", urlBuilder.getQuery());
+
+ ServletHelper.generateResponse(aResponse.getWriter(), responseData, editGenerator);
+ }
+ }
+ catch (Throwable e) {
+ throw new ServletModuleFailure(e);
+ }
+ }
+
+ private boolean isDirectoryValid(FileEditDirectory aDirectory, File aFile) {
+ try {
+ return aFile.getCanonicalPath().startsWith(aDirectory.getRootDirectory().getCanonicalPath());
+ }
+ catch (Throwable t) {
+ return false;
+ }
+ }
+
+ private boolean isFileValid(FileEditDirectory aDirectory, File aFile) {
+ try {
+ return aDirectory.getFilter().accept(aFile.getParentFile(), aFile.getName());
+ }
+ catch (Throwable t) {
+ return false;
+ }
+ }
+
+ private class FileEditDirectory {
+ private String name;
+ private FileRoutines.RegExpFileFilter filter;
+ private File rootDirectory;
+ private boolean recursive;
+
+ public FileEditDirectory(String aName, String aRootDirectory, String aFilter, boolean aRecursive) {
+ name = aName;
+ rootDirectory = new File(aRootDirectory);
+ filter = new FileRoutines.RegExpFileFilter(aFilter);
+ recursive = aRecursive;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public FileRoutines.RegExpFileFilter getFilter() {
+ return filter;
+ }
+
+ public File getRootDirectory() {
+ return rootDirectory;
+ }
+
+ public boolean getRecursive() {
+ return recursive;
+ }
+ }