From 71498ad961088e48a4a2d9fee59585c9c7068de1 Mon Sep 17 00:00:00 2001 From: David Solin Date: Fri, 26 Aug 2016 13:02:16 -0500 Subject: [PATCH 1/3] Added some features required to integrate sshj with Joval's remote jSAF provider. 1) Added boolean Channel.isEOF() method, for checking whether the server has sent EOF. 2) Added SFTP response constants to the Response enumeration 3) Spelling correction for the SYMLINK FileMode enum constant --- .../connection/channel/AbstractChannel.java | 8 ++++++ .../sshj/connection/channel/Channel.java | 5 ++++ .../java/net/schmizz/sshj/sftp/FileMode.java | 2 +- .../java/net/schmizz/sshj/sftp/Response.java | 25 ++++++++++++++++++- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/schmizz/sshj/connection/channel/AbstractChannel.java b/src/main/java/net/schmizz/sshj/connection/channel/AbstractChannel.java index 215f14bd..cf49ff40 100644 --- a/src/main/java/net/schmizz/sshj/connection/channel/AbstractChannel.java +++ b/src/main/java/net/schmizz/sshj/connection/channel/AbstractChannel.java @@ -52,6 +52,8 @@ public abstract class AbstractChannel /** Remote recipient ID */ private int recipient; + private boolean eof = false; + private final Queue> chanReqResponseEvents = new LinkedList>(); /* The lock used by to create the open & close events */ @@ -191,6 +193,11 @@ public abstract class AbstractChannel } } + @Override + public boolean isEOF() { + return eof; + } + @Override public LoggerFactory getLoggerFactory() { return loggerFactory; @@ -394,6 +401,7 @@ public abstract class AbstractChannel /** Called when EOF has been received. Subclasses can override but must call super. */ protected void eofInputStreams() { in.eof(); + eof = true; } @Override diff --git a/src/main/java/net/schmizz/sshj/connection/channel/Channel.java b/src/main/java/net/schmizz/sshj/connection/channel/Channel.java index 4ad9f975..a1fa7e69 100644 --- a/src/main/java/net/schmizz/sshj/connection/channel/Channel.java +++ b/src/main/java/net/schmizz/sshj/connection/channel/Channel.java @@ -135,6 +135,11 @@ public interface Channel void join(long timeout, TimeUnit unit) throws ConnectionException; + /** + * Returns whether EOF has been received. + */ + boolean isEOF(); + /** * Get the LoggerFactory associated with the SSH client. */ diff --git a/src/main/java/net/schmizz/sshj/sftp/FileMode.java b/src/main/java/net/schmizz/sshj/sftp/FileMode.java index 7ee09c44..e87de80c 100644 --- a/src/main/java/net/schmizz/sshj/sftp/FileMode.java +++ b/src/main/java/net/schmizz/sshj/sftp/FileMode.java @@ -36,7 +36,7 @@ public class FileMode { /** directory */ DIRECTORY(0040000), /** symbolic link */ - SYMKLINK(0120000), + SYMLINK(0120000), /** unknown */ UNKNOWN(0); diff --git a/src/main/java/net/schmizz/sshj/sftp/Response.java b/src/main/java/net/schmizz/sshj/sftp/Response.java index ff88830a..a44fac9d 100644 --- a/src/main/java/net/schmizz/sshj/sftp/Response.java +++ b/src/main/java/net/schmizz/sshj/sftp/Response.java @@ -30,7 +30,30 @@ public final class Response BAD_MESSAGE(5), NO_CONNECTION(6), CONNECITON_LOST(7), - OP_UNSUPPORTED(8); + OP_UNSUPPORTED(8), + INVALID_HANDLE(9), + NO_SUCH_PATH(10), + FILE_ALREADY_EXISTS(11), + WRITE_PROTECT(12), + NO_MEDIA(13), + NO_SPACE_ON_FILESYSTEM(14), + QUOTA_EXCEEDED(15), + UNKNOWN_PRINCIPAL(16), + LOCK_CONFLICT(17), + DIR_NOT_EMPTY(18), + NOT_A_DIRECTORY(19), + INVALID_FILENAME(20), + LINK_LOOP(21), + CANNOT_DELETE(22), + INVALID_PARAMETER(23), + FILE_IS_A_DIRECTORY(24), + BYTE_RANGE_LOCK_CONFLICT(25), + BYTE_RANGE_LOCK_REFUSED(26), + DELETE_PENDING(27), + FILE_CORRUPT(28), + OWNER_INVALID(29), + GROUP_INVALID(30), + NO_MATCHING_BYTE_RANGE_LOCK(31); private final int code; From f2bfe9bfcf3093369d325c657d979799ac13a2bc Mon Sep 17 00:00:00 2001 From: "David A. Solin" Date: Fri, 26 Aug 2016 13:26:01 -0500 Subject: [PATCH 2/3] Make Java-6 compatible. --- src/main/java/net/schmizz/sshj/SSHClient.java | 8 ++-- .../net/schmizz/sshj/sftp/SFTPClient.java | 2 +- .../schmizz/sshj/sftp/SFTPFileTransfer.java | 38 +++++++++++++++---- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/schmizz/sshj/SSHClient.java b/src/main/java/net/schmizz/sshj/SSHClient.java index deef70c4..4c84cdde 100644 --- a/src/main/java/net/schmizz/sshj/SSHClient.java +++ b/src/main/java/net/schmizz/sshj/SSHClient.java @@ -212,7 +212,7 @@ public class SSHClient public void auth(String username, Iterable methods) throws UserAuthException, TransportException { checkConnected(); - final Deque savedEx = new LinkedList<>(); + final Deque savedEx = new LinkedList(); for (AuthMethod method: methods) { method.setLoggerFactory(loggerFactory); try { @@ -334,7 +334,7 @@ public class SSHClient */ public void authPublickey(String username, Iterable keyProviders) throws UserAuthException, TransportException { - final List am = new LinkedList<>(); + final List am = new LinkedList(); for (KeyProvider kp : keyProviders) am.add(new AuthPublickey(kp)); auth(username, am); @@ -377,7 +377,7 @@ public class SSHClient */ public void authPublickey(String username, String... locations) throws UserAuthException, TransportException { - final List keyProviders = new LinkedList<>(); + final List keyProviders = new LinkedList(); for (String loc : locations) { try { log.debug("Attempting to load key from: {}", loc); @@ -407,7 +407,7 @@ public class SSHClient public void authGssApiWithMic(String username, LoginContext context, Oid supportedOid, Oid... supportedOids) throws UserAuthException, TransportException { // insert supportedOid to the front of the list since ordering matters - List oids = new ArrayList<>(Arrays.asList(supportedOids)); + List oids = new ArrayList(Arrays.asList(supportedOids)); oids.add(0, supportedOid); auth(username, new AuthGssApiWithMic(context, oids)); diff --git a/src/main/java/net/schmizz/sshj/sftp/SFTPClient.java b/src/main/java/net/schmizz/sshj/sftp/SFTPClient.java index a8539318..03ae541a 100644 --- a/src/main/java/net/schmizz/sshj/sftp/SFTPClient.java +++ b/src/main/java/net/schmizz/sshj/sftp/SFTPClient.java @@ -86,7 +86,7 @@ public class SFTPClient public void mkdirs(String path) throws IOException { - final Deque dirsToMake = new LinkedList<>(); + final Deque dirsToMake = new LinkedList(); for (PathComponents current = engine.getPathHelper().getComponents(path); ; current = engine.getPathHelper().getComponents(current.getParent())) { final FileAttributes attrs = statExistence(current.getPath()); diff --git a/src/main/java/net/schmizz/sshj/sftp/SFTPFileTransfer.java b/src/main/java/net/schmizz/sshj/sftp/SFTPFileTransfer.java index f23314e9..e84094b5 100644 --- a/src/main/java/net/schmizz/sshj/sftp/SFTPFileTransfer.java +++ b/src/main/java/net/schmizz/sshj/sftp/SFTPFileTransfer.java @@ -229,14 +229,36 @@ public class SFTPFileTransfer final String remote) throws IOException { final String adjusted = prepareFile(local, remote); - try (RemoteFile rf = engine.open(adjusted, EnumSet.of(OpenMode.WRITE, OpenMode.CREAT, OpenMode.TRUNC))) { - try (InputStream fis = local.getInputStream(); - RemoteFile.RemoteFileOutputStream rfos = rf.new RemoteFileOutputStream(0, 16)) { - new StreamCopier(fis, rfos, engine.getLoggerFactory()) - .bufSize(engine.getSubsystem().getRemoteMaxPacketSize() - rf.getOutgoingPacketOverhead()) - .keepFlushing(false) - .listener(listener) - .copy(); + RemoteFile rf = null; + InputStream fis = null; + RemoteFile.RemoteFileOutputStream rfos = null; + try { + rf = engine.open(adjusted, EnumSet.of(OpenMode.WRITE, OpenMode.CREAT, OpenMode.TRUNC)); + fis = local.getInputStream(); + rfos = rf.new RemoteFileOutputStream(0, 16); + new StreamCopier(fis, rfos, engine.getLoggerFactory()) + .bufSize(engine.getSubsystem().getRemoteMaxPacketSize() - rf.getOutgoingPacketOverhead()) + .keepFlushing(false) + .listener(listener) + .copy(); + } finally { + if (rf != null) { + try { + rf.close(); + } catch (IOException e) { + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + } + } + if (rfos != null) { + try { + rfos.close(); + } catch (IOException e) { + } } } return adjusted; From 8ffd852e67885e427c4a8608b4e6208479f59d03 Mon Sep 17 00:00:00 2001 From: David Solin Date: Fri, 2 Sep 2016 09:16:26 -0500 Subject: [PATCH 3/3] SPACES NOT TABS (like in Silicon Valley). --- .../schmizz/sshj/connection/channel/AbstractChannel.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/schmizz/sshj/connection/channel/AbstractChannel.java b/src/main/java/net/schmizz/sshj/connection/channel/AbstractChannel.java index cf49ff40..fa89f028 100644 --- a/src/main/java/net/schmizz/sshj/connection/channel/AbstractChannel.java +++ b/src/main/java/net/schmizz/sshj/connection/channel/AbstractChannel.java @@ -195,12 +195,12 @@ public abstract class AbstractChannel @Override public boolean isEOF() { - return eof; + return eof; } @Override public LoggerFactory getLoggerFactory() { - return loggerFactory; + return loggerFactory; } private void gotClose() @@ -401,7 +401,7 @@ public abstract class AbstractChannel /** Called when EOF has been received. Subclasses can override but must call super. */ protected void eofInputStreams() { in.eof(); - eof = true; + eof = true; } @Override