Author: gnodet Date: Fri Apr 30 07:38:15 2010 New Revision: 939573 URL: http://svn.apache.org/viewvc?rev=939573&view=rev Log: [sshd] reformat SftpSubsystem
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=939573&r1=939572&r2=939573&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 Fri Apr 30 07:38:15 2010 @@ -46,159 +46,160 @@ import org.slf4j.LoggerFactory; * @author <a href="mailto:d...@mina.apache.org">Apache MINA SSHD Project</a> */ public class SftpSubsystem implements Command, Runnable, SessionAware { - - protected final Logger log = LoggerFactory.getLogger(getClass()); - - public static class Factory implements NamedFactory<Command> { + + protected final Logger log = LoggerFactory.getLogger(getClass()); + + public static class Factory implements NamedFactory<Command> { public Command create() { return new SftpSubsystem(); } + public String getName() { return "sftp"; } } - public static final int HIGHEST_SFTP_IMPL = 3; // Working implementation up to v3, v4 and v5 are work in progress + public static final int HIGHEST_SFTP_IMPL = 3; // Working implementation up to v3, v4 and v5 are work in progress + - - public static final int SSH_FXP_INIT = 1; - public static final int SSH_FXP_VERSION = 2; - public static final int SSH_FXP_OPEN = 3; - public static final int SSH_FXP_CLOSE = 4; - public static final int SSH_FXP_READ = 5; - public static final int SSH_FXP_WRITE = 6; - public static final int SSH_FXP_LSTAT = 7; - public static final int SSH_FXP_FSTAT = 8; - public static final int SSH_FXP_SETSTAT = 9; - public static final int SSH_FXP_FSETSTAT = 10; - public static final int SSH_FXP_OPENDIR = 11; - public static final int SSH_FXP_READDIR = 12; - public static final int SSH_FXP_REMOVE = 13; - public static final int SSH_FXP_MKDIR = 14; - public static final int SSH_FXP_RMDIR = 15; - public static final int SSH_FXP_REALPATH = 16; - public static final int SSH_FXP_STAT = 17; - public static final int SSH_FXP_RENAME = 18; - public static final int SSH_FXP_READLINK = 19; - public static final int SSH_FXP_LINK = 21; - public static final int SSH_FXP_BLOCK = 22; - public static final int SSH_FXP_UNBLOCK = 23; - - public static final int SSH_FXP_STATUS = 101; - public static final int SSH_FXP_HANDLE = 102; - public static final int SSH_FXP_DATA = 103; - public static final int SSH_FXP_NAME = 104; - public static final int SSH_FXP_ATTRS = 105; - - public static final int SSH_FXP_EXTENDED = 200; - public static final int SSH_FXP_EXTENDED_REPLY = 201; - - public static final int SSH_FX_OK = 0; - public static final int SSH_FX_EOF = 1; - public static final int SSH_FX_NO_SUCH_FILE = 2; - public static final int SSH_FX_PERMISSION_DENIED = 3; - public static final int SSH_FX_FAILURE = 4; - public static final int SSH_FX_BAD_MESSAGE = 5; - public static final int SSH_FX_NO_CONNECTION = 6; - public static final int SSH_FX_CONNECTION_LOST = 7; - public static final int SSH_FX_OP_UNSUPPORTED = 8; - public static final int SSH_FX_INVALID_HANDLE = 9; - public static final int SSH_FX_NO_SUCH_PATH = 10; - public static final int SSH_FX_FILE_ALREADY_EXISTS = 11; - public static final int SSH_FX_WRITE_PROTECT = 12; - public static final int SSH_FX_NO_MEDIA = 13; - public static final int SSH_FX_NO_SPACE_ON_FILESYSTEM = 14; - public static final int SSH_FX_QUOTA_EXCEEDED = 15; - public static final int SSH_FX_UNKNOWN_PRINCIPAL = 16; - public static final int SSH_FX_LOCK_CONFLICT = 17; - public static final int SSH_FX_DIR_NOT_EMPTY = 18; - public static final int SSH_FX_NOT_A_DIRECTORY = 19; - public static final int SSH_FX_INVALID_FILENAME = 20; - public static final int SSH_FX_LINK_LOOP = 21; - public static final int SSH_FX_CANNOT_DELETE = 22; - public static final int SSH_FX_INVALID_PARAMETER = 23; - public static final int SSH_FX_FILE_IS_A_DIRECTORY = 24; - public static final int SSH_FX_BYTE_RANGE_LOCK_CONFLICT = 25; - public static final int SSH_FX_BYTE_RANGE_LOCK_REFUSED = 26; - public static final int SSH_FX_DELETE_PENDING = 27; - public static final int SSH_FX_FILE_CORRUPT = 28; - public static final int SSH_FX_OWNER_INVALID = 29; - public static final int SSH_FX_GROUP_INVALID = 30; - public static final int SSH_FX_NO_MATCHING_BYTE_RANGE_LOCK = 31; - - public static final int SSH_FILEXFER_ATTR_SIZE = 0x00000001; - public static final int SSH_FILEXFER_ATTR_PERMISSIONS = 0x00000004; - public static final int SSH_FILEXFER_ATTR_ACCESSTIME = 0x00000008; - public static final int SSH_FILEXFER_ATTR_CREATETIME = 0x00000010; - public static final int SSH_FILEXFER_ATTR_MODIFYTIME = 0x00000020; - public static final int SSH_FILEXFER_ATTR_ACL = 0x00000040; - public static final int SSH_FILEXFER_ATTR_OWNERGROUP = 0x00000080; - public static final int SSH_FILEXFER_ATTR_SUBSECOND_TIMES = 0x00000100; - public static final int SSH_FILEXFER_ATTR_BITS = 0x00000200; - public static final int SSH_FILEXFER_ATTR_ALLOCATION_SIZE = 0x00000400; - public static final int SSH_FILEXFER_ATTR_TEXT_HINT = 0x00000800; - public static final int SSH_FILEXFER_ATTR_MIME_TYPE = 0x00001000; - public static final int SSH_FILEXFER_ATTR_LINK_COUNT = 0x00002000; + public static final int SSH_FXP_INIT = 1; + public static final int SSH_FXP_VERSION = 2; + public static final int SSH_FXP_OPEN = 3; + public static final int SSH_FXP_CLOSE = 4; + public static final int SSH_FXP_READ = 5; + public static final int SSH_FXP_WRITE = 6; + public static final int SSH_FXP_LSTAT = 7; + public static final int SSH_FXP_FSTAT = 8; + public static final int SSH_FXP_SETSTAT = 9; + public static final int SSH_FXP_FSETSTAT = 10; + public static final int SSH_FXP_OPENDIR = 11; + public static final int SSH_FXP_READDIR = 12; + public static final int SSH_FXP_REMOVE = 13; + public static final int SSH_FXP_MKDIR = 14; + public static final int SSH_FXP_RMDIR = 15; + public static final int SSH_FXP_REALPATH = 16; + public static final int SSH_FXP_STAT = 17; + public static final int SSH_FXP_RENAME = 18; + public static final int SSH_FXP_READLINK = 19; + public static final int SSH_FXP_LINK = 21; + public static final int SSH_FXP_BLOCK = 22; + public static final int SSH_FXP_UNBLOCK = 23; + + public static final int SSH_FXP_STATUS = 101; + public static final int SSH_FXP_HANDLE = 102; + public static final int SSH_FXP_DATA = 103; + public static final int SSH_FXP_NAME = 104; + public static final int SSH_FXP_ATTRS = 105; + + public static final int SSH_FXP_EXTENDED = 200; + public static final int SSH_FXP_EXTENDED_REPLY = 201; + + public static final int SSH_FX_OK = 0; + public static final int SSH_FX_EOF = 1; + public static final int SSH_FX_NO_SUCH_FILE = 2; + public static final int SSH_FX_PERMISSION_DENIED = 3; + public static final int SSH_FX_FAILURE = 4; + public static final int SSH_FX_BAD_MESSAGE = 5; + public static final int SSH_FX_NO_CONNECTION = 6; + public static final int SSH_FX_CONNECTION_LOST = 7; + public static final int SSH_FX_OP_UNSUPPORTED = 8; + public static final int SSH_FX_INVALID_HANDLE = 9; + public static final int SSH_FX_NO_SUCH_PATH = 10; + public static final int SSH_FX_FILE_ALREADY_EXISTS = 11; + public static final int SSH_FX_WRITE_PROTECT = 12; + public static final int SSH_FX_NO_MEDIA = 13; + public static final int SSH_FX_NO_SPACE_ON_FILESYSTEM = 14; + public static final int SSH_FX_QUOTA_EXCEEDED = 15; + public static final int SSH_FX_UNKNOWN_PRINCIPAL = 16; + public static final int SSH_FX_LOCK_CONFLICT = 17; + public static final int SSH_FX_DIR_NOT_EMPTY = 18; + public static final int SSH_FX_NOT_A_DIRECTORY = 19; + public static final int SSH_FX_INVALID_FILENAME = 20; + public static final int SSH_FX_LINK_LOOP = 21; + public static final int SSH_FX_CANNOT_DELETE = 22; + public static final int SSH_FX_INVALID_PARAMETER = 23; + public static final int SSH_FX_FILE_IS_A_DIRECTORY = 24; + public static final int SSH_FX_BYTE_RANGE_LOCK_CONFLICT = 25; + public static final int SSH_FX_BYTE_RANGE_LOCK_REFUSED = 26; + public static final int SSH_FX_DELETE_PENDING = 27; + public static final int SSH_FX_FILE_CORRUPT = 28; + public static final int SSH_FX_OWNER_INVALID = 29; + public static final int SSH_FX_GROUP_INVALID = 30; + public static final int SSH_FX_NO_MATCHING_BYTE_RANGE_LOCK = 31; + + public static final int SSH_FILEXFER_ATTR_SIZE = 0x00000001; + public static final int SSH_FILEXFER_ATTR_PERMISSIONS = 0x00000004; + public static final int SSH_FILEXFER_ATTR_ACCESSTIME = 0x00000008; + public static final int SSH_FILEXFER_ATTR_CREATETIME = 0x00000010; + public static final int SSH_FILEXFER_ATTR_MODIFYTIME = 0x00000020; + public static final int SSH_FILEXFER_ATTR_ACL = 0x00000040; + public static final int SSH_FILEXFER_ATTR_OWNERGROUP = 0x00000080; + public static final int SSH_FILEXFER_ATTR_SUBSECOND_TIMES = 0x00000100; + public static final int SSH_FILEXFER_ATTR_BITS = 0x00000200; + public static final int SSH_FILEXFER_ATTR_ALLOCATION_SIZE = 0x00000400; + public static final int SSH_FILEXFER_ATTR_TEXT_HINT = 0x00000800; + public static final int SSH_FILEXFER_ATTR_MIME_TYPE = 0x00001000; + public static final int SSH_FILEXFER_ATTR_LINK_COUNT = 0x00002000; public static final int SSH_FILEXFER_ATTR_UNTRANSLATED_NAME = 0x00004000; - public static final int SSH_FILEXFER_ATTR_CTIME = 0x00008000; - public static final int SSH_FILEXFER_ATTR_EXTENDED = 0x80000000; + public static final int SSH_FILEXFER_ATTR_CTIME = 0x00008000; + public static final int SSH_FILEXFER_ATTR_EXTENDED = 0x80000000; - public static final int SSH_FILEXFER_TYPE_REGULAR = 1; - public static final int SSH_FILEXFER_TYPE_DIRECTORY = 2; - public static final int SSH_FILEXFER_TYPE_SYMLINK = 3; - public static final int SSH_FILEXFER_TYPE_SPECIAL = 4; - public static final int SSH_FILEXFER_TYPE_UNKNOWN = 5; - public static final int SSH_FILEXFER_TYPE_SOCKET = 6; - public static final int SSH_FILEXFER_TYPE_CHAR_DEVICE = 7; - public static final int SSH_FILEXFER_TYPE_BLOCK_DEVICE = 8; - public static final int SSH_FILEXFER_TYPE_FIFO = 9; - - - public static final int SSH_FXF_ACCESS_DISPOSITION = 0x00000007; - public static final int SSH_FXF_CREATE_NEW = 0x00000000; - public static final int SSH_FXF_CREATE_TRUNCATE = 0x00000001; - public static final int SSH_FXF_OPEN_EXISTING = 0x00000002; - public static final int SSH_FXF_OPEN_OR_CREATE = 0x00000003; - public static final int SSH_FXF_TRUNCATE_EXISTING = 0x00000004; - public static final int SSH_FXF_APPEND_DATA = 0x00000008; - public static final int SSH_FXF_APPEND_DATA_ATOMIC = 0x00000010; - public static final int SSH_FXF_TEXT_MODE = 0x00000020; - public static final int SSH_FXF_BLOCK_READ = 0x00000040; - public static final int SSH_FXF_BLOCK_WRITE = 0x00000080; - public static final int SSH_FXF_BLOCK_DELETE = 0x00000100; - public static final int SSH_FXF_BLOCK_ADVISORY = 0x00000200; - public static final int SSH_FXF_NOFOLLOW = 0x00000400; - public static final int SSH_FXF_DELETE_ON_CLOSE = 0x00000800; + public static final int SSH_FILEXFER_TYPE_REGULAR = 1; + public static final int SSH_FILEXFER_TYPE_DIRECTORY = 2; + public static final int SSH_FILEXFER_TYPE_SYMLINK = 3; + public static final int SSH_FILEXFER_TYPE_SPECIAL = 4; + public static final int SSH_FILEXFER_TYPE_UNKNOWN = 5; + public static final int SSH_FILEXFER_TYPE_SOCKET = 6; + public static final int SSH_FILEXFER_TYPE_CHAR_DEVICE = 7; + public static final int SSH_FILEXFER_TYPE_BLOCK_DEVICE = 8; + public static final int SSH_FILEXFER_TYPE_FIFO = 9; + + + public static final int SSH_FXF_ACCESS_DISPOSITION = 0x00000007; + public static final int SSH_FXF_CREATE_NEW = 0x00000000; + public static final int SSH_FXF_CREATE_TRUNCATE = 0x00000001; + public static final int SSH_FXF_OPEN_EXISTING = 0x00000002; + public static final int SSH_FXF_OPEN_OR_CREATE = 0x00000003; + public static final int SSH_FXF_TRUNCATE_EXISTING = 0x00000004; + public static final int SSH_FXF_APPEND_DATA = 0x00000008; + public static final int SSH_FXF_APPEND_DATA_ATOMIC = 0x00000010; + public static final int SSH_FXF_TEXT_MODE = 0x00000020; + public static final int SSH_FXF_BLOCK_READ = 0x00000040; + public static final int SSH_FXF_BLOCK_WRITE = 0x00000080; + public static final int SSH_FXF_BLOCK_DELETE = 0x00000100; + public static final int SSH_FXF_BLOCK_ADVISORY = 0x00000200; + public static final int SSH_FXF_NOFOLLOW = 0x00000400; + public static final int SSH_FXF_DELETE_ON_CLOSE = 0x00000800; public static final int SSH_FXF_ACCESS_AUDIT_ALARM_INFO = 0x00001000; - public static final int SSH_FXF_ACCESS_BACKUP = 0x00002000; - public static final int SSH_FXF_BACKUP_STREAM = 0x00004000; - public static final int SSH_FXF_OVERRIDE_OWNER = 0x00008000; - - public static final int SSH_FXF_READ = 0x00000001; - public static final int SSH_FXF_WRITE = 0x00000002; - public static final int SSH_FXF_APPEND = 0x00000004; - public static final int SSH_FXF_CREAT = 0x00000008; - public static final int SSH_FXF_TRUNC = 0x00000010; - public static final int SSH_FXF_EXCL = 0x00000020; - public static final int SSH_FXF_TEXT = 0x00000040; - - public static final int ACE4_READ_DATA = 0x00000001; - public static final int ACE4_LIST_DIRECTORY = 0x00000001; - public static final int ACE4_WRITE_DATA = 0x00000002; - public static final int ACE4_ADD_FILE = 0x00000002; - public static final int ACE4_APPEND_DATA = 0x00000004; - public static final int ACE4_ADD_SUBDIRECTORY = 0x00000004; - public static final int ACE4_READ_NAMED_ATTRS = 0x00000008; - public static final int ACE4_WRITE_NAMED_ATTRS = 0x00000010; - public static final int ACE4_EXECUTE = 0x00000020; - public static final int ACE4_DELETE_CHILD = 0x00000040; - public static final int ACE4_READ_ATTRIBUTES = 0x00000080; - public static final int ACE4_WRITE_ATTRIBUTES = 0x00000100; - public static final int ACE4_DELETE = 0x00010000; - public static final int ACE4_READ_ACL = 0x00020000; - public static final int ACE4_WRITE_ACL = 0x00040000; - public static final int ACE4_WRITE_OWNER = 0x00080000; - + public static final int SSH_FXF_ACCESS_BACKUP = 0x00002000; + public static final int SSH_FXF_BACKUP_STREAM = 0x00004000; + public static final int SSH_FXF_OVERRIDE_OWNER = 0x00008000; + + public static final int SSH_FXF_READ = 0x00000001; + public static final int SSH_FXF_WRITE = 0x00000002; + public static final int SSH_FXF_APPEND = 0x00000004; + public static final int SSH_FXF_CREAT = 0x00000008; + public static final int SSH_FXF_TRUNC = 0x00000010; + public static final int SSH_FXF_EXCL = 0x00000020; + public static final int SSH_FXF_TEXT = 0x00000040; + + public static final int ACE4_READ_DATA = 0x00000001; + public static final int ACE4_LIST_DIRECTORY = 0x00000001; + public static final int ACE4_WRITE_DATA = 0x00000002; + public static final int ACE4_ADD_FILE = 0x00000002; + public static final int ACE4_APPEND_DATA = 0x00000004; + public static final int ACE4_ADD_SUBDIRECTORY = 0x00000004; + public static final int ACE4_READ_NAMED_ATTRS = 0x00000008; + public static final int ACE4_WRITE_NAMED_ATTRS = 0x00000010; + public static final int ACE4_EXECUTE = 0x00000020; + public static final int ACE4_DELETE_CHILD = 0x00000040; + public static final int ACE4_READ_ATTRIBUTES = 0x00000080; + public static final int ACE4_WRITE_ATTRIBUTES = 0x00000100; + public static final int ACE4_DELETE = 0x00010000; + public static final int ACE4_READ_ACL = 0x00020000; + public static final int ACE4_WRITE_ACL = 0x00040000; + public static final int ACE4_WRITE_OWNER = 0x00080000; + public static final int S_IRUSR = 0000400; public static final int S_IWUSR = 0000200; public static final int S_IXUSR = 0000100; @@ -248,6 +249,7 @@ public class SftpSubsystem implements Co public DirectoryHandle(File file) { super(file); } + public boolean isDone() { return done; } @@ -281,9 +283,9 @@ public class SftpSubsystem implements Co } } - public void setSession(ServerSession session) { - this.session = session; - } + public void setSession(ServerSession session) { + this.session = session; + } public void setExitCallback(ExitCallback callback) { this.callback = callback; @@ -307,11 +309,11 @@ public class SftpSubsystem implements Co } public void run() { - DataInputStream dis = null; + DataInputStream dis = null; try { dis = new DataInputStream(in); while (true) { - int length = dis.readInt(); + int length = dis.readInt(); if (length < 5) { throw new IllegalArgumentException(); } @@ -333,14 +335,14 @@ public class SftpSubsystem implements Co log.error("Exception caught in SFTP subsystem", t); } } finally { - if (dis != null) { - try { - dis.close(); - } catch (IOException ioe) { - log.error("Could not close DataInputStream", ioe); - } - } - dis = null; + if (dis != null) { + try { + dis.close(); + } catch (IOException ioe) { + log.error("Could not close DataInputStream", ioe); + } + } + dis = null; callback.onExit(0); } @@ -348,8 +350,8 @@ public class SftpSubsystem implements Co protected void process(Buffer buffer) throws IOException { int length = buffer.getInt(); - int type = buffer.getByte(); - int id = buffer.getInt(); + int type = buffer.getByte(); + int id = buffer.getInt(); switch (type) { case SSH_FXP_INIT: { if (length != 5) { @@ -357,22 +359,22 @@ public class SftpSubsystem implements Co } version = id; if (version >= HIGHEST_SFTP_IMPL) { - buffer.clear(); - buffer.putByte((byte) SSH_FXP_VERSION); - buffer.putInt(HIGHEST_SFTP_IMPL); - send(buffer); - version = HIGHEST_SFTP_IMPL; + buffer.clear(); + buffer.putByte((byte) SSH_FXP_VERSION); + buffer.putInt(HIGHEST_SFTP_IMPL); + send(buffer); + version = HIGHEST_SFTP_IMPL; } else { - // We only support version 3 (Version 1 and 2 are not common) - sendStatus(id, SSH_FX_OP_UNSUPPORTED, "Babelway SFTP server only support SFTP up to version " + HIGHEST_SFTP_IMPL); + // We only support version 3 (Version 1 and 2 are not common) + sendStatus(id, SSH_FX_OP_UNSUPPORTED, "Babelway SFTP server only support SFTP up to version " + HIGHEST_SFTP_IMPL); } break; } case SSH_FXP_OPEN: { if (version <= 4) { - String path = buffer.getString(); - int pflags = buffer.getInt(); + String path = buffer.getString(); + int pflags = buffer.getInt(); // attrs try { File file = new File(path); @@ -390,7 +392,7 @@ public class SftpSubsystem implements Co } } String acc = ((pflags & (SSH_FXF_READ | SSH_FXF_WRITE)) != 0 ? "r" : "") + - ((pflags & SSH_FXF_WRITE) != 0 ? "w" : ""); + ((pflags & SSH_FXF_WRITE) != 0 ? "w" : ""); raf = new RandomAccessFile(file, acc); if ((pflags & SSH_FXF_TRUNC) != 0) { raf.setLength(0); @@ -402,9 +404,9 @@ public class SftpSubsystem implements Co sendStatus(id, SSH_FX_FAILURE, e.getMessage()); } } else { - String path = buffer.getString(); - int acc = buffer.getInt(); - int flags = buffer.getInt(); + String path = buffer.getString(); + int acc = buffer.getInt(); + int flags = buffer.getInt(); // attrs try { File file = new File(path); @@ -490,8 +492,8 @@ public class SftpSubsystem implements Co } case SSH_FXP_READ: { String handle = buffer.getString(); - long offset = buffer.getLong(); - int len = buffer.getInt(); + long offset = buffer.getLong(); + int len = buffer.getInt(); try { Handle p = handles.get(handle); if (!(p instanceof FileHandle)) { @@ -519,8 +521,8 @@ public class SftpSubsystem implements Co } case SSH_FXP_WRITE: { String handle = buffer.getString(); - long offset = buffer.getLong(); - byte[] data = buffer.getBytes(); + long offset = buffer.getLong(); + byte[] data = buffer.getBytes(); try { Handle p = handles.get(handle); if (!(p instanceof FileHandle)) { @@ -573,7 +575,7 @@ public class SftpSubsystem implements Co sendStatus(id, SSH_FX_NO_SUCH_FILE, path); } else if (!p.isDirectory()) { sendStatus(id, SSH_FX_NOT_A_DIRECTORY, path); - } else if (!p.canRead()) { + } else if (!p.canRead()) { sendStatus(id, SSH_FX_PERMISSION_DENIED, path); } else { String handle = UUID.randomUUID().toString(); @@ -617,10 +619,10 @@ public class SftpSubsystem implements Co } else if (p.isDirectory()) { sendStatus(id, SSH_FX_FILE_IS_A_DIRECTORY, p.getPath()); } else if (!p.delete()) { - sendStatus(id, SSH_FX_FAILURE, "Failed to delete file"); + sendStatus(id, SSH_FX_FAILURE, "Failed to delete file"); } else { - sendStatus(id, SSH_FX_OK, ""); - } + sendStatus(id, SSH_FX_OK, ""); + } } catch (IOException e) { sendStatus(id, SSH_FX_FAILURE, e.getMessage()); } @@ -679,7 +681,7 @@ public class SftpSubsystem implements Co } // TODO: handle optional args try { - log.info("path="+path); + log.info("path=" + path); File p = new File(path); sendName(id, p); } catch (FileNotFoundException e) { @@ -691,16 +693,16 @@ public class SftpSubsystem implements Co } break; } - - case SSH_FXP_SETSTAT: + + case SSH_FXP_SETSTAT: case SSH_FXP_FSETSTAT: { - // This is required for WinSCP / Cyberduck to upload properly - // Blindly reply "OK" - // TODO implement it + // This is required for WinSCP / Cyberduck to upload properly + // Blindly reply "OK" + // TODO implement it sendStatus(id, SSH_FX_OK, ""); - break; - } - + break; + } + default: log.error("Received: {}", type); sendStatus(id, SSH_FX_OP_UNSUPPORTED, "Command " + type + " is unsupported or not implemented"); @@ -723,7 +725,7 @@ public class SftpSubsystem implements Co writeAttrs(buffer, file); send(buffer); } - + protected void sendAttrs(int id, File file, int flags) throws IOException { Buffer buffer = new Buffer(); buffer.putByte((byte) SSH_FXP_ATTRS); @@ -739,57 +741,58 @@ public class SftpSubsystem implements Co buffer.putInt(id); buffer.putInt(files.length); for (File f : files) { - buffer.putString(f.getName()); + buffer.putString(f.getName()); if (version <= 3) { buffer.putString(getLongName(f)); // Format specified in the specs } else { - buffer.putString(f.getName()); // Supposed to be UTF-8 - } + buffer.putString(f.getName()); // Supposed to be UTF-8 + } writeAttrs(buffer, f); } send(buffer); - } + } + private String getLongName(File f) { - String username = session.getUsername(); - if (username.length() > 8) { - username = username.substring(0, 8); - } else { - for (int i=username.length(); i < 8; i++) { - username = username + " "; - } - } - - long length = f.length(); - String lengthString = String.format("%1$#8s", length); - - StringBuilder sb = new StringBuilder(); - sb.append((f.isDirectory() ? "d" : "-")); - sb.append((f.canRead() ? "r" : "-")); - sb.append((f.canWrite() ? "w" : "-")); - sb.append((f.canExecute() ? "x" : "-")); - sb.append((f.canRead() ? "r" : "-")); - sb.append((f.canWrite() ? "w" : "-")); - sb.append((f.canExecute() ? "x" : "-")); - sb.append((f.canRead() ? "r" : "-")); - sb.append((f.canWrite() ? "w" : "-")); - sb.append((f.canExecute() ? "x" : "-")); - sb.append(" "); - sb.append(" 1"); - sb.append(" "); - sb.append(username); - sb.append(" "); - sb.append(username); - sb.append(" "); - sb.append(lengthString); - sb.append(" "); - sb.append("Jan 01 00:00 "); - sb.append(f.getName()); - - return sb.toString(); + String username = session.getUsername(); + if (username.length() > 8) { + username = username.substring(0, 8); + } else { + for (int i = username.length(); i < 8; i++) { + username = username + " "; + } + } + + long length = f.length(); + String lengthString = String.format("%1$#8s", length); + + StringBuilder sb = new StringBuilder(); + sb.append((f.isDirectory() ? "d" : "-")); + sb.append((f.canRead() ? "r" : "-")); + sb.append((f.canWrite() ? "w" : "-")); + sb.append((f.canExecute() ? "x" : "-")); + sb.append((f.canRead() ? "r" : "-")); + sb.append((f.canWrite() ? "w" : "-")); + sb.append((f.canExecute() ? "x" : "-")); + sb.append((f.canRead() ? "r" : "-")); + sb.append((f.canWrite() ? "w" : "-")); + sb.append((f.canExecute() ? "x" : "-")); + sb.append(" "); + sb.append(" 1"); + sb.append(" "); + sb.append(username); + sb.append(" "); + sb.append(username); + sb.append(" "); + sb.append(lengthString); + sb.append(" "); + sb.append("Jan 01 00:00 "); + sb.append(f.getName()); + + return sb.toString(); } - + protected void writeAttrs(Buffer buffer, File file) throws IOException { - writeAttrs(buffer, file, 0); + writeAttrs(buffer, file, 0); } @@ -798,9 +801,9 @@ public class SftpSubsystem implements Co throw new FileNotFoundException(file.getPath()); } if (version >= 4) { - long size = file.length(); - String username = session.getUsername(); - long lastModif = file.lastModified(); + long size = file.length(); + String username = session.getUsername(); + long lastModif = file.lastModified(); int p = 0; if (file.canRead()) { p |= S_IRUSR;