diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java index 7c44930216e74afa929ea0f04ff707661c98ea6d..cc3f43309899f397b8b498326b08999e8f590205 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java @@ -98,7 +98,8 @@ public class FileLinkChooserController extends BasicController { * index.html */ public FileLinkChooserController(UserRequest ureq, WindowControl wControl, - VFSContainer rootDir, String uploadRelPath, String absolutePath, String[] suffixes, boolean uriValidation, String fileName) { + VFSContainer rootDir, String uploadRelPath, String absolutePath, String[] suffixes, + boolean uriValidation, boolean htmlLinkValidation, String fileName) { super(ureq, wControl); this.fileName = fileName; this.suffixes = suffixes; @@ -173,6 +174,7 @@ public class FileLinkChooserController extends BasicController { uploadCtr = new FileUploadController(wControl, fileUploadBase, ureq, uploadLimit, remainingSpace, mimeTypes, uriValidation, true, false, true, true, false); + uploadCtr.setHtmlLinkValidation(htmlLinkValidation); listenTo(uploadCtr); // set specific upload path uploadCtr.setUploadRelPath(uploadRelPath); diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java index fa83aabebf4e5e777692f88f49109036c00c8902..2b40b962ffed57128954f7f0a878f17eb010d118 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java @@ -73,7 +73,7 @@ public class LinkChooserController extends BasicController { * internalLinkTreeModel is null. */ public LinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, - String uploadRelPath, String absolutPath, String[] suffixes, boolean uriValidation, String fileName, + String uploadRelPath, String absolutPath, String[] suffixes, boolean uriValidation, boolean htmlExtraValidation, String fileName, CustomLinkTreeModel customLinkTreeModel, CustomLinkTreeModel toolLinkTreeModel, boolean allowCustomMediaChooserFactory) { super(ureq, wControl); @@ -82,7 +82,8 @@ public class LinkChooserController extends BasicController { linkChooserTabbedPane = new TabbedPane("linkChooserTabbedPane", ureq.getLocale()); tabbedPaneViewVC.put("linkChooserTabbedPane", linkChooserTabbedPane); - fileLinkChooserController = new FileLinkChooserController(ureq, wControl, rootDir, uploadRelPath, absolutPath, suffixes, uriValidation, fileName); + fileLinkChooserController = new FileLinkChooserController(ureq, wControl, rootDir, uploadRelPath, absolutPath, suffixes, + uriValidation, htmlExtraValidation, fileName); listenTo(fileLinkChooserController); linkChooserTabbedPane.addTab(translate("linkchooser.tabbedpane.label.filechooser"), fileLinkChooserController.getInitialComponent()); diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java index d3cbcb333b3d5a082a2db8df31a4c2cac2885d9a..cfb9ced10761e928a414ef59c75c2c3111c8d068 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java @@ -64,13 +64,9 @@ public class MediaChooserController extends LinkChooserController { */ public MediaChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath, String[] suffixes, String fileName, CustomLinkTreeModel customLinkTreeModel, boolean allowCustomMediaFactory) { - super(ureq, wControl, rootDir, uploadRelPath, null, suffixes, false, fileName, customLinkTreeModel, null, allowCustomMediaFactory); + super(ureq, wControl, rootDir, uploadRelPath, null, suffixes, true, false, fileName, customLinkTreeModel, null, allowCustomMediaFactory); } - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) - */ @Override public void event(UserRequest ureq, Controller source, Event event) { fireEvent(ureq, event); diff --git a/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java b/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java index 449e576763a041273baa6b009cb6635631cec2c4..c5a1dcb9c841985da1bbe1a0d60e668cf296878f 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java +++ b/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java @@ -91,7 +91,7 @@ public class FileCopyController extends LinkChooserController { public FileCopyController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, FolderComponent folderComponent) { - super(ureq, wControl, rootDir, null, null, null, false, "", null, null, true); + super(ureq, wControl, rootDir, null, null, null, false, false, "", null, null, true); this.folderComponent = folderComponent; } diff --git a/src/main/java/org/olat/core/commons/modules/bc/FileUploadController.java b/src/main/java/org/olat/core/commons/modules/bc/FileUploadController.java index cdab92c7cf5e11cd5d8eaddf5622b3b0acf7dae2..b622e13a8041efcb17d7eb3682183799a1931a2b 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/FileUploadController.java +++ b/src/main/java/org/olat/core/commons/modules/bc/FileUploadController.java @@ -35,6 +35,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.regex.Pattern; @@ -108,7 +109,14 @@ import org.springframework.beans.factory.annotation.Autowired; * @author Florian Gnägi */ public class FileUploadController extends FormBasicController { - + /** + * Extra validation for the htmlLinkValidation option + */ + private static final char[] HTML_EXTRA_FORBIDDEN_CHARS = { '+' }; + static { + Arrays.sort(HTML_EXTRA_FORBIDDEN_CHARS); + } + private static final String[] resizeKeys = new String[]{"resize"}; private int status = FolderCommandStatus.STATUS_SUCCESS; @@ -129,6 +137,7 @@ public class FileUploadController extends FormBasicController { private long remainingQuotKB; private Set<String> mimeTypes; private boolean uriValidation; + private boolean htmlLinkValidation; // // Form elements private FileElement fileEl; @@ -836,6 +845,14 @@ public class FileUploadController extends FormBasicController { } } + public boolean isHtmlLinkValidation() { + return htmlLinkValidation; + } + + public void setHtmlLinkValidation(boolean htmlLinkValidation) { + this.htmlLinkValidation = htmlLinkValidation; + } + public String getNewFileName() { return (this.newFile != null) ? this.newFile.getName() : null; } @@ -954,6 +971,15 @@ public class FileUploadController extends FormBasicController { itemEl.setErrorKey("cfile.name.notvalid.uri", null); allOk &= false; } + } else if(htmlLinkValidation) { + for(int i=0; i<filename.length(); i++) { + char character = filename.charAt(i); + if(Arrays.binarySearch(HTML_EXTRA_FORBIDDEN_CHARS, character) >= 0) { + itemEl.setErrorKey("cfile.name.notvalid", null); + allOk &= false; + break; + } + } } return allOk; diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java index 91b91a031011af925f4cda46eede1ab1c2a0e406..d8232ed655142016cb12d725b1c42a45256d1d37 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java @@ -181,10 +181,10 @@ class RichTextElementComponent extends FormBaseComponentImpl { CustomLinkTreeModel toolLinkTreeModel = config.getToolLinkTreeModel(); if (type.equals(CMD_FILEBROWSER)) { // when in file mode we include the internal links to the selection - myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, absolutePath, suffixes, uriValidation, fileName, linkBrowserCustomTreeModel, toolLinkTreeModel, allowCustomMediaFactory); + myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, absolutePath, suffixes, true, uriValidation, fileName, linkBrowserCustomTreeModel, toolLinkTreeModel, allowCustomMediaFactory); } else { // in media or image mode, internal links make no sense here - myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, absolutePath, suffixes, uriValidation, fileName, null, null, allowCustomMediaFactory); + myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, absolutePath, suffixes, true, uriValidation, fileName, null, null, allowCustomMediaFactory); } return new LayoutMain3ColsController(lureq, lwControl, myLinkChooserController); } diff --git a/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java index c8849c996b39640517fe57e73dac99af708bfaa3..8599e9fe26433673366e005b81ad0ffb3d9fda55 100644 --- a/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java +++ b/src/main/java/org/olat/course/nodes/dialog/ui/DialogCourseNodeRunController.java @@ -346,7 +346,7 @@ public class DialogCourseNodeRunController extends BasicController implements Ac private class MyLinkChooserController extends LinkChooserController { public MyLinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath) { - super(ureq, wControl, rootDir, uploadRelPath, null, null, false, "", null, null, true); + super(ureq, wControl, rootDir, uploadRelPath, null, null, false, false, "", null, null, true); } @Override