This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 7e07622  JAMES-3646 Rely on Java NIO Paths for file validation (#789)
7e07622 is described below

commit 7e07622acd86101d0043c9048b971e2fbeec47f6
Author: Benoit TELLIER <[email protected]>
AuthorDate: Mon Dec 13 08:21:58 2021 +0700

    JAMES-3646 Rely on Java NIO Paths for file validation (#789)
---
 .../james/server/core/filesystem/ResourceFactory.java      | 14 +++++++++-----
 .../java/org/apache/james/filesystem/api/FileSystem.java   |  9 +++++----
 .../spring/resource/DefaultJamesResourceLoader.java        | 11 ++++-------
 3 files changed, 18 insertions(+), 16 deletions(-)

diff --git 
a/server/container/core/src/main/java/org/apache/james/server/core/filesystem/ResourceFactory.java
 
b/server/container/core/src/main/java/org/apache/james/server/core/filesystem/ResourceFactory.java
index bb2b740..bdafd50 100644
--- 
a/server/container/core/src/main/java/org/apache/james/server/core/filesystem/ResourceFactory.java
+++ 
b/server/container/core/src/main/java/org/apache/james/server/core/filesystem/ResourceFactory.java
@@ -22,6 +22,8 @@ import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.filesystem.api.JamesDirectoriesProvider;
@@ -35,12 +37,14 @@ public class ResourceFactory {
     }
 
     public void validate(File file) throws IOException {
-        String canonicalPath = file.getCanonicalPath();
-        if (!canonicalPath.startsWith(directoryProvider.getAbsoluteDirectory())
-            && !canonicalPath.startsWith(directoryProvider.getRootDirectory())
-            && !canonicalPath.startsWith(directoryProvider.getVarDirectory())) 
{
+        Path resourcePath = file.toPath().normalize();
+        if 
(!resourcePath.startsWith(Paths.get(directoryProvider.getConfDirectory()).normalize())
+            && 
!resourcePath.startsWith(Paths.get(directoryProvider.getRootDirectory()).normalize())
+            && 
!resourcePath.startsWith(Paths.get(directoryProvider.getVarDirectory()).normalize()))
 {
 
-            throw new IOException(canonicalPath + " jail break outside of " + 
directoryProvider.getRootDirectory());
+            throw new IOException(String.format("%s path is not part of 
allowed resource locations: %s, %s, %s",
+                resourcePath.toFile().getCanonicalPath(), 
directoryProvider.getConfDirectory(), directoryProvider.getRootDirectory(),
+                directoryProvider.getVarDirectory()));
         }
     }
     
diff --git 
a/server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/FileSystem.java
 
b/server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/FileSystem.java
index 96f095b..792c820 100644
--- 
a/server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/FileSystem.java
+++ 
b/server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/FileSystem.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Path;
 
 /**
  * This service is used by components that wants to lookup a File resource from
@@ -85,11 +86,11 @@ public interface FileSystem {
      * Similar to getFile but enforces the file to be within baseDir
      */
     default File getFileWithinBaseDir(String fileURL) throws 
FileNotFoundException, IOException {
-        File file = getFile(fileURL);
-        if 
(file.getCanonicalPath().startsWith(getBasedir().getCanonicalPath())) {
-            return file;
+        Path path = getFile(fileURL).toPath().normalize();
+        if (path.startsWith(getBasedir().toPath().normalize())) {
+            return path.toFile();
         }
-        throw new IOException(fileURL + " -> " + file.getCanonicalPath() + " 
jail break outside of " + getBasedir().getCanonicalPath());
+        throw new IOException(fileURL + " -> " + 
path.toFile().getCanonicalPath() + " jail break outside of " + 
getBasedir().getCanonicalPath());
     }
 
     /**
diff --git 
a/server/container/spring/src/main/java/org/apache/james/container/spring/resource/DefaultJamesResourceLoader.java
 
b/server/container/spring/src/main/java/org/apache/james/container/spring/resource/DefaultJamesResourceLoader.java
index 1773a85..85c1bd5 100644
--- 
a/server/container/spring/src/main/java/org/apache/james/container/spring/resource/DefaultJamesResourceLoader.java
+++ 
b/server/container/spring/src/main/java/org/apache/james/container/spring/resource/DefaultJamesResourceLoader.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.filesystem.api.JamesDirectoriesProvider;
+import org.apache.james.server.core.filesystem.ResourceFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.DefaultResourceLoader;
@@ -36,20 +37,16 @@ import org.springframework.core.io.Resource;
 public class DefaultJamesResourceLoader extends DefaultResourceLoader 
implements JamesResourceLoader {
 
     private final JamesDirectoriesProvider jamesDirectoriesProvider;
+    private final ResourceFactory resourceFactory;
 
     public DefaultJamesResourceLoader(JamesDirectoriesProvider 
jamesDirectoriesProvider) {
         this.jamesDirectoriesProvider = jamesDirectoriesProvider;
+        this.resourceFactory = new ResourceFactory(jamesDirectoriesProvider);
     }
 
     @Override
     public void validate(File file) throws IOException {
-        String canonicalPath = file.getCanonicalPath();
-        if 
(!canonicalPath.startsWith(jamesDirectoriesProvider.getAbsoluteDirectory())
-            && 
!canonicalPath.startsWith(jamesDirectoriesProvider.getRootDirectory())
-            && 
!canonicalPath.startsWith(jamesDirectoriesProvider.getVarDirectory())) {
-
-            throw new IOException(canonicalPath + " jail break outside of " + 
jamesDirectoriesProvider.getRootDirectory());
-        }
+        resourceFactory.validate(file);
     }
     
     /**

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to