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 2012/09/12 14:36:33 UTC

svn commit: r1383918 - /mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/sftp/SftpSubsystem.java

Author: gnodet
Date: Wed Sep 12 12:36:32 2012
New Revision: 1383918

URL: http://svn.apache.org/viewvc?rev=1383918&view=rev
Log:
[SSHD-174] Provide correct SFTP return codes based on version

Modified:
    mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/sftp/SftpSubsystem.java

Modified: mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/sftp/SftpSubsystem.java
URL: http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/sftp/SftpSubsystem.java?rev=1383918&r1=1383917&r2=1383918&view=diff
==============================================================================
--- mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/sftp/SftpSubsystem.java (original)
+++ mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/sftp/SftpSubsystem.java Wed Sep 12 12:36:32 2012
@@ -231,6 +231,91 @@ public class SftpSubsystem implements Co
     private int version;
     private Map<String, Handle> handles = new HashMap<String, Handle>();
 
+    
+    protected static int mapV4ToV3(int code) {
+        switch (code) {
+            case SSH_FX_INVALID_HANDLE:
+                return SSH_FX_FAILURE;
+            case SSH_FX_NO_SUCH_PATH:
+                return SSH_FX_NO_SUCH_FILE;
+            case SSH_FX_FILE_ALREADY_EXISTS:
+                return SSH_FX_FAILURE;
+            case SSH_FX_WRITE_PROTECT:
+                return SSH_FX_PERMISSION_DENIED;
+            case SSH_FX_NO_MEDIA:
+                return SSH_FX_FAILURE;
+            default:
+                return code;
+        }
+    }
+    
+    protected static int mapV5ToV4(int code) {
+        switch (code) {
+            case SSH_FX_NO_SPACE_ON_FILESYSTEM:
+                return SSH_FX_FAILURE;
+            case SSH_FX_QUOTA_EXCEEDED:
+                return SSH_FX_FAILURE;
+            case SSH_FX_UNKNOWN_PRINCIPAL:
+                return SSH_FX_FAILURE;
+            case SSH_FX_LOCK_CONFLICT:
+                return SSH_FX_FAILURE;
+            default:
+                return code;
+        }
+    }
+
+    protected static int mapV6ToV5(int code) {
+        switch (code) {
+            case SSH_FX_DIR_NOT_EMPTY:
+                return SSH_FX_FAILURE;
+            case SSH_FX_NOT_A_DIRECTORY:
+                return SSH_FX_NO_SUCH_FILE;
+            case SSH_FX_INVALID_FILENAME:
+                return SSH_FX_NO_SUCH_FILE;
+            case SSH_FX_LINK_LOOP:
+                return SSH_FX_FAILURE;
+            case SSH_FX_CANNOT_DELETE:
+                return SSH_FX_PERMISSION_DENIED;
+            case SSH_FX_INVALID_PARAMETER:
+                return SSH_FX_FAILURE;
+            case SSH_FX_FILE_IS_A_DIRECTORY:
+                return SSH_FX_NO_SUCH_FILE;
+            case SSH_FX_BYTE_RANGE_LOCK_CONFLICT:
+                return SSH_FX_FAILURE;
+            case SSH_FX_BYTE_RANGE_LOCK_REFUSED:
+                return SSH_FX_FAILURE;
+            case SSH_FX_DELETE_PENDING:
+                return SSH_FX_FAILURE;
+            case SSH_FX_FILE_CORRUPT:
+                return SSH_FX_FAILURE;
+            case SSH_FX_OWNER_INVALID:
+                return SSH_FX_PERMISSION_DENIED;
+            case SSH_FX_GROUP_INVALID:
+                return SSH_FX_PERMISSION_DENIED;
+            case SSH_FX_NO_MATCHING_BYTE_RANGE_LOCK:
+                return SSH_FX_FAILURE;
+            default:
+                return code;
+        }
+    }
+    
+    protected static int mapToVersion(int code, int version) {
+        int mappedCode = code;
+        if (version < 6) {
+            mappedCode = mapV6ToV5(mappedCode);
+        }
+        if (version < 5) {
+            mappedCode = mapV5ToV4(mappedCode);
+        }
+        if (version < 4) {
+            mappedCode = mapV4ToV3(mappedCode);
+        }
+        return mappedCode;
+    }
+    
+    protected int mapToVersion(int code) {
+        return mapToVersion(code, version);
+    }
 
     protected static abstract class Handle {
         SshFile file;
@@ -1020,7 +1105,7 @@ public class SftpSubsystem implements Co
     }
 
     protected void sendStatus(int id, int substatus, String msg) throws IOException {
-        sendStatus(id, substatus, msg, "");
+        sendStatus(id, mapToVersion(substatus), msg, "");
     }
 
     protected void sendStatus(int id, int substatus, String msg, String lang) throws IOException {