You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2013/12/02 22:05:24 UTC

[2/2] git commit: [SSHD-265] Provide a file system that can be locked to a dir (eventually user dependant)

[SSHD-265] Provide a file system that can be locked to a dir (eventually user dependant)

Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/d78cbf0f
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/d78cbf0f
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/d78cbf0f

Branch: refs/heads/master
Commit: d78cbf0fa4dc29508301332973e9a4bacd35f741
Parents: bd33a76
Author: Guillaume Nodet <gn...@apache.org>
Authored: Mon Dec 2 22:05:12 2013 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Mon Dec 2 22:05:12 2013 +0100

----------------------------------------------------------------------
 .../file/nativefs/NativeFileSystemView.java     |  4 +
 .../common/file/nativefs/NativeSshFile.java     |  4 +
 .../virtualfs/VirtualFileSystemFactory.java     | 75 ++++++++++++++++
 .../file/virtualfs/VirtualFileSystemView.java   | 63 +++++++++++++
 .../common/file/nativefs/NativeSshFileTest.java | 42 +++++++++
 .../file/virtualfs/VirtualFileSystemTest.java   | 95 ++++++++++++++++++++
 6 files changed, 283 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d78cbf0f/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeFileSystemView.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeFileSystemView.java b/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeFileSystemView.java
index e78b562..69bc2d2 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeFileSystemView.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeFileSystemView.java
@@ -72,6 +72,10 @@ public class NativeFileSystemView implements FileSystemView {
         LOG.debug("Native filesystem view created for user \"{}\" with root \"{}\"", userName, currDir);
     }
 
+    public String getUserName() {
+        return userName;
+    }
+
     /**
      * Get file object.
      */

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d78cbf0f/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeSshFile.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeSshFile.java b/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeSshFile.java
index 53d573b..5d2acbe 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeSshFile.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/file/nativefs/NativeSshFile.java
@@ -87,6 +87,10 @@ public class NativeSshFile implements SshFile {
         this.userName = userName;
     }
 
+    public File getNativeFile() {
+        return file;
+    }
+
     /**
      * Get full name.
      */

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d78cbf0f/sshd-core/src/main/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemFactory.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemFactory.java
new file mode 100644
index 0000000..4c99b52
--- /dev/null
+++ b/sshd-core/src/main/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemFactory.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd.common.file.virtualfs;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.sshd.common.Session;
+import org.apache.sshd.common.file.FileSystemFactory;
+import org.apache.sshd.common.file.FileSystemView;
+
+/**
+ * SSHd file system factory to reduce the visibility to a physical folder.
+ */
+public class VirtualFileSystemFactory implements FileSystemFactory {
+
+    private String defaultHomeDir;
+    private final Map<String, String> homeDirs = new ConcurrentHashMap<String, String>();
+
+    public VirtualFileSystemFactory() {
+    }
+
+    public VirtualFileSystemFactory(String defaultHomeDir) {
+        this.defaultHomeDir = defaultHomeDir;
+    }
+
+    public void setDefaultHomeDir(String defaultHomeDir) {
+        this.defaultHomeDir = defaultHomeDir;
+    }
+
+    public String getDefaultHomeDir() {
+        return defaultHomeDir;
+    }
+
+    public void setUserHomeDir(String userName, String userHomeDir) {
+        homeDirs.put(userName, userHomeDir);
+    }
+
+    public String getUserHomeDir(String userName) {
+        return homeDirs.get(userName);
+    }
+
+    protected String computeRootDir(String userName) {
+        String homeDir = homeDirs.get(userName);
+        if (homeDir == null) {
+            homeDir = defaultHomeDir;
+        }
+        if (homeDir == null) {
+            throw new IllegalStateException("No home directory for user " + userName);
+        }
+        return homeDir;
+    }
+
+    public FileSystemView createFileSystemView(Session session) {
+        return new VirtualFileSystemView(session.getUsername(),
+                                         computeRootDir(session.getUsername()));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d78cbf0f/sshd-core/src/main/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemView.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemView.java b/sshd-core/src/main/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemView.java
new file mode 100644
index 0000000..0c96cf8
--- /dev/null
+++ b/sshd-core/src/main/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemView.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd.common.file.virtualfs;
+
+import java.io.File;
+
+import org.apache.sshd.common.file.SshFile;
+import org.apache.sshd.common.file.nativefs.NativeFileSystemView;
+import org.apache.sshd.common.file.nativefs.NativeSshFile;
+
+/**
+ * Virtual file system view reduced to a physical folder
+ */
+public class VirtualFileSystemView extends NativeFileSystemView {
+
+    private String location;
+
+    public VirtualFileSystemView(String username, String location) {
+        super(username);
+        if (location.endsWith("/")) {
+            location = location.substring(0, location.length() - 1);
+        }
+        this.location = location;
+    }
+
+    @Override
+    public String getVirtualUserDir() {
+        return "/";
+    }
+
+    @Override
+    public String getPhysicalUserDir() {
+        return location;
+    }
+
+    @Override
+    protected SshFile getFile(String dir, String file) {
+        // get actual file object
+        String location = getPhysicalUserDir();
+        String physicalName = NativeSshFile.getPhysicalName(location, dir, file, false);
+        File fileObj = new File(physicalName);
+        // strip the root directory and return
+        String karafFileName = physicalName.substring(location.length());
+        return createNativeSshFile(karafFileName, fileObj, getUserName());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d78cbf0f/sshd-core/src/test/java/org/apache/sshd/common/file/nativefs/NativeSshFileTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/file/nativefs/NativeSshFileTest.java b/sshd-core/src/test/java/org/apache/sshd/common/file/nativefs/NativeSshFileTest.java
new file mode 100644
index 0000000..a941d85
--- /dev/null
+++ b/sshd-core/src/test/java/org/apache/sshd/common/file/nativefs/NativeSshFileTest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd.common.file.nativefs;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class NativeSshFileTest {
+
+    @Test
+    public void testResolve() {
+        assertEquals("/bar", NativeSshFile.getPhysicalName("/", "/foo", "/bar", false));
+        assertEquals("/bar", NativeSshFile.getPhysicalName("/", "/", "/bar", false));
+        assertEquals("/bar", NativeSshFile.getPhysicalName("/", "/", "bar", false));
+        assertEquals("/foo/bar", NativeSshFile.getPhysicalName("/", "/foo", "bar", false));
+        assertEquals("/foo/bar", NativeSshFile.getPhysicalName("/", "/foo/xyz", "../bar", false));
+        assertEquals("/foo/xyz/bar", NativeSshFile.getPhysicalName("/", "/foo/xyz", "./bar", false));
+
+        assertEquals("/foo/bar", NativeSshFile.getPhysicalName("/foo", "/", "bar", false));
+        assertEquals("/foo/bar", NativeSshFile.getPhysicalName("/foo", "/xyz", "../bar", false));
+        assertEquals("/foo/bar", NativeSshFile.getPhysicalName("/foo", "/xyz", "../../bar", false));
+        assertEquals("/foo/xyz/bar", NativeSshFile.getPhysicalName("/foo", "/xyz", "./bar", false));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/d78cbf0f/sshd-core/src/test/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemTest.java b/sshd-core/src/test/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemTest.java
new file mode 100644
index 0000000..90fb952
--- /dev/null
+++ b/sshd-core/src/test/java/org/apache/sshd/common/file/virtualfs/VirtualFileSystemTest.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd.common.file.virtualfs;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.sshd.SshServer;
+import org.apache.sshd.common.AbstractFactoryManager;
+import org.apache.sshd.common.file.FileSystemView;
+import org.apache.sshd.common.file.SshFile;
+import org.apache.sshd.common.file.nativefs.NativeFileSystemFactory;
+import org.apache.sshd.common.file.nativefs.NativeSshFile;
+import org.apache.sshd.common.session.AbstractSession;
+import org.apache.sshd.common.util.Buffer;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class VirtualFileSystemTest {
+
+    @Test
+    public void testNativeFileSystem() throws IOException {
+        String homeDir = System.getProperty("user.dir");
+        NativeFileSystemFactory vfs = new NativeFileSystemFactory();
+
+        FileSystemView view = vfs.createFileSystemView(new TestSession());
+
+        SshFile file = view.getFile("foo");
+        String physicalName = ((NativeSshFile) file).getNativeFile().getAbsolutePath();
+        assertEquals(homeDir + "/foo", physicalName);
+
+        file = view.getFile(view.getFile("foo"), "../bar");
+        physicalName = ((NativeSshFile) file).getNativeFile().getAbsolutePath();
+        assertEquals(homeDir + "/bar", physicalName);
+
+        file = view.getFile("../bar");
+        physicalName = ((NativeSshFile) file).getNativeFile().getAbsolutePath();
+        assertEquals(new File(homeDir, "../bar").getCanonicalPath(), physicalName);
+    }
+
+    @Test
+    public void testVirtualFileSystem() {
+        String homeDir = System.getProperty("user.dir");
+        VirtualFileSystemFactory vfs = new VirtualFileSystemFactory(homeDir);
+
+        FileSystemView view = vfs.createFileSystemView(new TestSession());
+
+        SshFile file = view.getFile("foo");
+        String physicalName = ((NativeSshFile) file).getNativeFile().getAbsolutePath();
+        assertEquals(homeDir + "/foo", physicalName);
+
+        file = view.getFile(view.getFile("foo"), "../bar");
+        physicalName = ((NativeSshFile) file).getNativeFile().getAbsolutePath();
+        assertEquals(homeDir + "/bar", physicalName);
+
+        file = view.getFile("../bar");
+        physicalName = ((NativeSshFile) file).getNativeFile().getAbsolutePath();
+        assertEquals(homeDir + "/bar", physicalName);
+    }
+
+    static class TestSession extends AbstractSession {
+        TestSession() {
+            super(SshServer.setUpDefaultServer(), null);
+            this.username = "userName";
+        }
+        @Override
+        protected void handleMessage(Buffer buffer) throws Exception {
+        }
+        @Override
+        protected boolean readIdentification(Buffer buffer) throws IOException {
+            return false;
+        }
+    }
+
+    static class TestFactoryManager extends AbstractFactoryManager {
+
+    }
+}