Clean special characters in data path when used for an URL.
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 10 Jul 2021 07:48:58 +0000 (09:48 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 10 Jul 2021 07:48:58 +0000 (09:48 +0200)
org.argeo.cms.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java

index 698ab1b0692daf1a29225314465ccc8c153be119..d817a9efacc21086a868a75763870a1dbe38532b 100644 (file)
@@ -9,8 +9,13 @@ import static org.argeo.cms.ui.CmsConstants.NO_IMAGE_SIZE;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.StringTokenizer;
 
 import javax.jcr.Binary;
 import javax.jcr.Node;
@@ -150,7 +155,19 @@ public class DefaultImageManager implements CmsImageManager {
        /** @return null if not available */
        @Override
        public String getImageUrl(Node node) throws RepositoryException {
-               return CmsUiUtils.getDataPath(node);
+               return getCleanDataPath(node);
+       }
+
+       /** Clean special character from the URL. */
+       protected String getCleanDataPath(Node node) throws RepositoryException {
+               String path = CmsUiUtils.getDataPath(node);
+               StringTokenizer st = new StringTokenizer(path, "/");
+               StringBuilder sb = new StringBuilder();
+               while (st.hasMoreElements()) {
+                       sb.append('/');
+                       sb.append(URLEncoder.encode(st.nextToken(), StandardCharsets.UTF_8));
+               }
+               return sb.toString();
        }
 
        protected String getResourceName(Node node) throws RepositoryException {