mirror of
https://github.com/hierynomus/sshj.git
synced 2025-12-06 07:10:53 +03:00
Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7ba0e1e26 | ||
|
|
f712720538 | ||
|
|
540708e540 | ||
|
|
e4d3a1f866 | ||
|
|
33969340e2 | ||
|
|
d65df3c9bc | ||
|
|
d2b9248535 | ||
|
|
431be8e7c7 | ||
|
|
885c602ab8 | ||
|
|
8262e8fc98 | ||
|
|
844c5d7f77 | ||
|
|
fb690c4fb0 | ||
|
|
ab04596a20 | ||
|
|
9ffdc35f93 | ||
|
|
93e23f4cfb | ||
|
|
504637099d | ||
|
|
cafd9217bf | ||
|
|
c627fabebd | ||
|
|
1c4781a65d | ||
|
|
aac7af2827 | ||
|
|
11c286b9b9 | ||
|
|
7fae513fd8 | ||
|
|
53ad9d2288 | ||
|
|
ee07072846 | ||
|
|
d38bbbcdf7 | ||
|
|
bc59c81dbc | ||
|
|
d70d37cf4e | ||
|
|
777d82912c | ||
|
|
f5db3e1563 | ||
|
|
7e524f5c6f | ||
|
|
dbb3f62e82 |
@@ -6,3 +6,6 @@ Adar Dembo <adar@cloudera.com>
|
||||
Ioannis Canellos <iocanel@gmail.com>
|
||||
Neil Prosser <neil.prosser@gmail.com>
|
||||
hierynomus <jeroen@hierynomus.com>
|
||||
Ryan Tenney <ryan@10e.us>
|
||||
Aled Sage <aled.sage@gmail.com>
|
||||
Urs Reupke <ur@idos.de>
|
||||
|
||||
@@ -39,11 +39,15 @@ Dependencies
|
||||
|
||||
Java 6+. slf4j_ is required. bouncycastle_ is highly recommended and required for using some of the crypto algorithms. jzlib_ is required for using zlib compression.
|
||||
|
||||
Bugs, questions
|
||||
Reporting bugs
|
||||
----------------
|
||||
|
||||
`Issue tracker <https://github.com/shikhar/sshj/issues>`_
|
||||
|
||||
Discussion
|
||||
------------
|
||||
|
||||
`Google Group <http://groups.google.com/group/sshj-users>`_
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
2
pom.xml
2
pom.xml
@@ -6,7 +6,7 @@
|
||||
<groupId>net.schmizz</groupId>
|
||||
<artifactId>sshj</artifactId>
|
||||
<packaging>bundle</packaging>
|
||||
<version>0.7.0</version>
|
||||
<version>0.8.0</version>
|
||||
|
||||
<name>sshj</name>
|
||||
<description>SSHv2 library for Java</description>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -96,7 +96,7 @@ public class DefaultConfig
|
||||
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
||||
private static final String VERSION = "SSHJ_0_7";
|
||||
private static final String VERSION = "SSHJ_0_8";
|
||||
|
||||
public DefaultConfig() {
|
||||
setVersion(VERSION);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -103,8 +103,9 @@ import java.util.List;
|
||||
* cmd.join(1, TimeUnit.SECONDS);
|
||||
* } finally {
|
||||
* session.close();
|
||||
* } finally {
|
||||
* client.disconnect();
|
||||
* }
|
||||
* } finally {
|
||||
* client.disconnect();
|
||||
* }
|
||||
* </pre>
|
||||
* <p/>
|
||||
@@ -362,7 +363,6 @@ public class SSHClient
|
||||
@Override
|
||||
public void disconnect()
|
||||
throws IOException {
|
||||
assert isConnected();
|
||||
trans.disconnect();
|
||||
super.disconnect();
|
||||
assert !isConnected();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -74,10 +74,15 @@ public class Buffer<T extends Buffer<T>> {
|
||||
/** The default size for a {@code Buffer} (256 bytes) */
|
||||
public static final int DEFAULT_SIZE = 256;
|
||||
|
||||
/** The maximum valid size of buffer (i.e. biggest power of two that can be represented as an int - 2^30) */
|
||||
public static final int MAX_SIZE = (1 << 30);
|
||||
|
||||
protected static int getNextPowerOf2(int i) {
|
||||
int j = 1;
|
||||
while (j < i)
|
||||
while (j < i) {
|
||||
j <<= 1;
|
||||
if (j <= 0) throw new IllegalArgumentException("Cannot get next power of 2; "+i+" is too large");
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -107,7 +107,7 @@ public class StreamCopier {
|
||||
log.debug("Done copying from {}", in);
|
||||
doneEvent.set();
|
||||
} catch (IOException ioe) {
|
||||
log.error("In pipe from {} to {}: " + ioe.toString(), in, out);
|
||||
log.error("In pipe from {} to {}: {}", new Object[] { in, out, ioe });
|
||||
doneEvent.deliverError(ioe);
|
||||
}
|
||||
}
|
||||
@@ -136,7 +136,7 @@ public class StreamCopier {
|
||||
|
||||
final double timeSeconds = (System.currentTimeMillis() - startTime) / 1000.0;
|
||||
final double sizeKiB = count / 1024.0;
|
||||
log.info(sizeKiB + " KiB transferred in {} seconds ({} KiB/s)", timeSeconds, (sizeKiB / timeSeconds));
|
||||
log.info("{} KiB transferred in {} seconds ({} KiB/s)", new Object[] { sizeKiB, timeSeconds, (sizeKiB / timeSeconds) });
|
||||
|
||||
if (length != -1 && read == -1)
|
||||
throw new IOException("Encountered EOF, could not transfer " + length + " bytes");
|
||||
@@ -154,4 +154,4 @@ public class StreamCopier {
|
||||
return count;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -125,14 +125,14 @@ public interface Connection {
|
||||
void setMaxPacketSize(int maxPacketSize);
|
||||
|
||||
/** @return the size for the local window this connection recommends to any {@link Channel}'s that ask for it. */
|
||||
int getWindowSize();
|
||||
long getWindowSize();
|
||||
|
||||
/**
|
||||
* Set the size for the local window this connection recommends to any {@link Channel}'s that ask for it.
|
||||
*
|
||||
* @param windowSize window size in bytes
|
||||
*/
|
||||
void setWindowSize(int windowSize);
|
||||
void setWindowSize(long windowSize);
|
||||
|
||||
/** @return the associated {@link Transport}. */
|
||||
Transport getTransport();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -51,7 +51,7 @@ public class ConnectionImpl
|
||||
|
||||
private final Queue<Promise<SSHPacket, ConnectionException>> globalReqPromises = new LinkedList<Promise<SSHPacket, ConnectionException>>();
|
||||
|
||||
private int windowSize = 2048 * 1024;
|
||||
private long windowSize = 2048 * 1024;
|
||||
private int maxPacketSize = 32 * 1024;
|
||||
|
||||
/**
|
||||
@@ -159,12 +159,12 @@ public class ConnectionImpl
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWindowSize() {
|
||||
public long getWindowSize() {
|
||||
return windowSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWindowSize(int windowSize) {
|
||||
public void setWindowSize(long windowSize) {
|
||||
this.windowSize = windowSize;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -61,6 +61,8 @@ import java.util.concurrent.locks.ReentrantLock;
|
||||
public abstract class AbstractChannel
|
||||
implements Channel {
|
||||
|
||||
private static final int REMOTE_MAX_PACKET_SIZE_CEILING = 1024 * 1024;
|
||||
|
||||
/** Logger */
|
||||
protected final Logger log = LoggerFactory.getLogger(getClass());
|
||||
|
||||
@@ -116,9 +118,9 @@ public abstract class AbstractChannel
|
||||
close = new Event<ConnectionException>("chan#" + id + " / " + "close", ConnectionException.chainer, lock);
|
||||
}
|
||||
|
||||
protected void init(int recipient, int remoteWinSize, int remoteMaxPacketSize) {
|
||||
protected void init(int recipient, long remoteWinSize, long remoteMaxPacketSize) {
|
||||
this.recipient = recipient;
|
||||
rwin = new Window.Remote(remoteWinSize, remoteMaxPacketSize);
|
||||
rwin = new Window.Remote(remoteWinSize, (int) Math.min(remoteMaxPacketSize, REMOTE_MAX_PACKET_SIZE_CEILING));
|
||||
out = new ChannelOutputStream(this, trans, rwin);
|
||||
log.info("Initialized - {}", this);
|
||||
}
|
||||
@@ -144,7 +146,7 @@ public abstract class AbstractChannel
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLocalWinSize() {
|
||||
public long getLocalWinSize() {
|
||||
return lwin.getSize();
|
||||
}
|
||||
|
||||
@@ -164,7 +166,7 @@ public abstract class AbstractChannel
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRemoteWinSize() {
|
||||
public long getRemoteWinSize() {
|
||||
return rwin.getSize();
|
||||
}
|
||||
|
||||
@@ -315,9 +317,9 @@ public abstract class AbstractChannel
|
||||
|
||||
private void gotWindowAdjustment(SSHPacket buf)
|
||||
throws ConnectionException {
|
||||
final int howMuch;
|
||||
final long howMuch;
|
||||
try {
|
||||
howMuch = buf.readUInt32AsInt();
|
||||
howMuch = buf.readUInt32();
|
||||
} catch (Buffer.BufferException be) {
|
||||
throw new ConnectionException(be);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -99,7 +99,7 @@ public interface Channel
|
||||
int getLocalMaxPacketSize();
|
||||
|
||||
/** @return the current local window size. */
|
||||
int getLocalWinSize();
|
||||
long getLocalWinSize();
|
||||
|
||||
/** @return an {@code OutputStream} for this channel. */
|
||||
OutputStream getOutputStream();
|
||||
@@ -111,7 +111,7 @@ public interface Channel
|
||||
int getRemoteMaxPacketSize();
|
||||
|
||||
/** @return the current remote window size. */
|
||||
int getRemoteWinSize();
|
||||
long getRemoteWinSize();
|
||||
|
||||
/** @return the channel type identifier. */
|
||||
String getType();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -159,7 +159,7 @@ public final class ChannelInputStream
|
||||
private void checkWindow()
|
||||
throws TransportException {
|
||||
synchronized (win) {
|
||||
final int adjustment = win.neededAdjustment();
|
||||
final long adjustment = win.neededAdjustment();
|
||||
if (adjustment > 0) {
|
||||
log.info("Sending SSH_MSG_CHANNEL_WINDOW_ADJUST to #{} for {} bytes", chan.getRecipient(), adjustment);
|
||||
trans.write(new SSHPacket(Message.CHANNEL_WINDOW_ADJUST)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -97,12 +97,12 @@ public final class ChannelOutputStream
|
||||
throws TransportException, ConnectionException {
|
||||
flush(packet.wpos() - dataOffset);
|
||||
}
|
||||
|
||||
|
||||
void flush(int bufferSize)
|
||||
throws TransportException, ConnectionException {
|
||||
while (bufferSize > 0) {
|
||||
|
||||
int remoteWindowSize = win.getSize();
|
||||
long remoteWindowSize = win.getSize();
|
||||
if (remoteWindowSize == 0)
|
||||
remoteWindowSize = win.awaitExpansion(remoteWindowSize);
|
||||
|
||||
@@ -110,7 +110,7 @@ public final class ChannelOutputStream
|
||||
// a) how much data we have
|
||||
// b) the max packet size
|
||||
// c) what the current window size will allow
|
||||
final int writeNow = Math.min(bufferSize, Math.min(win.getMaxPacketSize(), remoteWindowSize));
|
||||
final int writeNow = Math.min(bufferSize, (int) Math.min(win.getMaxPacketSize(), remoteWindowSize));
|
||||
|
||||
packet.wpos(headerOffset);
|
||||
packet.putMessageID(Message.CHANNEL_DATA);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -28,14 +28,14 @@ public abstract class Window {
|
||||
|
||||
protected final int maxPacketSize;
|
||||
|
||||
protected int size;
|
||||
protected long size;
|
||||
|
||||
public Window(int initialWinSize, int maxPacketSize) {
|
||||
public Window(long initialWinSize, int maxPacketSize) {
|
||||
size = initialWinSize;
|
||||
this.maxPacketSize = maxPacketSize;
|
||||
}
|
||||
|
||||
public void expand(int inc) {
|
||||
public void expand(long inc) {
|
||||
synchronized (lock) {
|
||||
size += inc;
|
||||
log.debug("Increasing by {} up to {}", inc, size);
|
||||
@@ -47,17 +47,17 @@ public abstract class Window {
|
||||
return maxPacketSize;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
public long getSize() {
|
||||
synchronized (lock) {
|
||||
return size;
|
||||
}
|
||||
}
|
||||
|
||||
public void consume(int dec)
|
||||
public void consume(long dec)
|
||||
throws ConnectionException {
|
||||
synchronized (lock) {
|
||||
size -= dec;
|
||||
log.debug("Consuming by " + dec + " down to " + size);
|
||||
log.debug("Consuming by {} down to {}", dec, size);
|
||||
if (size < 0)
|
||||
throw new ConnectionException("Window consumed to below 0");
|
||||
}
|
||||
@@ -72,11 +72,11 @@ public abstract class Window {
|
||||
public static final class Remote
|
||||
extends Window {
|
||||
|
||||
public Remote(int initialWinSize, int maxPacketSize) {
|
||||
public Remote(long initialWinSize, int maxPacketSize) {
|
||||
super(initialWinSize, maxPacketSize);
|
||||
}
|
||||
|
||||
public int awaitExpansion(int was)
|
||||
public long awaitExpansion(long was)
|
||||
throws ConnectionException {
|
||||
synchronized (lock) {
|
||||
while (size <= was) {
|
||||
@@ -91,7 +91,7 @@ public abstract class Window {
|
||||
}
|
||||
}
|
||||
|
||||
public void consume(int howMuch) {
|
||||
public void consume(long howMuch) {
|
||||
try {
|
||||
super.consume(howMuch);
|
||||
} catch (ConnectionException e) { // It's a bug if we consume more than remote allowed
|
||||
@@ -105,18 +105,18 @@ public abstract class Window {
|
||||
public static final class Local
|
||||
extends Window {
|
||||
|
||||
private final int initialSize;
|
||||
private final int threshold;
|
||||
private final long initialSize;
|
||||
private final long threshold;
|
||||
|
||||
public Local(int initialWinSize, int maxPacketSize) {
|
||||
public Local(long initialWinSize, int maxPacketSize) {
|
||||
super(initialWinSize, maxPacketSize);
|
||||
this.initialSize = initialWinSize;
|
||||
threshold = Math.min(maxPacketSize * 20, initialSize / 4);
|
||||
}
|
||||
|
||||
public int neededAdjustment() {
|
||||
public long neededAdjustment() {
|
||||
synchronized (lock) {
|
||||
return (size - threshold <= 0) ? (initialSize - size) : 0;
|
||||
return (size <= threshold) ? (initialSize - size) : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -71,7 +71,7 @@ public abstract class AbstractDirectChannel
|
||||
private void gotOpenConfirmation(SSHPacket buf)
|
||||
throws ConnectionException {
|
||||
try {
|
||||
init(buf.readUInt32AsInt(), buf.readUInt32AsInt(), buf.readUInt32AsInt());
|
||||
init(buf.readUInt32AsInt(), buf.readUInt32(), buf.readUInt32());
|
||||
} catch (Buffer.BufferException be) {
|
||||
throw new ConnectionException(be);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -75,7 +75,7 @@ public class SessionChannel
|
||||
@Override
|
||||
public void allocateDefaultPTY()
|
||||
throws ConnectionException, TransportException {
|
||||
allocatePTY("dummy", 80, 24, 0, 0, Collections.<PTYMode, Integer>emptyMap());
|
||||
allocatePTY("vt100", 80, 24, 0, 0, Collections.<PTYMode, Integer>emptyMap());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -54,8 +54,9 @@ public abstract class AbstractForwardedChannel
|
||||
* First 2 args are standard; the others can be parsed from a CHANNEL_OPEN packet.
|
||||
*/
|
||||
|
||||
protected AbstractForwardedChannel(Connection conn, String type, int recipient, int remoteWinSize,
|
||||
int remoteMaxPacketSize, String origIP, int origPort) {
|
||||
protected AbstractForwardedChannel(Connection conn, String type,
|
||||
int recipient, long remoteWinSize, long remoteMaxPacketSize,
|
||||
String origIP, int origPort) {
|
||||
super(conn, type);
|
||||
this.origIP = origIP;
|
||||
this.origPort = origPort;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -127,7 +127,8 @@ public class RemotePortForwarder
|
||||
|
||||
private final Forward fwd;
|
||||
|
||||
public ForwardedTCPIPChannel(Connection conn, int recipient, int remoteWinSize, int remoteMaxPacketSize,
|
||||
public ForwardedTCPIPChannel(Connection conn,
|
||||
int recipient, long remoteWinSize, long remoteMaxPacketSize,
|
||||
Forward fwd, String origIP, int origPort) {
|
||||
super(conn, TYPE, recipient, remoteWinSize, remoteMaxPacketSize, origIP, origPort);
|
||||
this.fwd = fwd;
|
||||
@@ -217,7 +218,7 @@ public class RemotePortForwarder
|
||||
throws ConnectionException, TransportException {
|
||||
final ForwardedTCPIPChannel chan;
|
||||
try {
|
||||
chan = new ForwardedTCPIPChannel(conn, buf.readUInt32AsInt(), buf.readUInt32AsInt(), buf.readUInt32AsInt(),
|
||||
chan = new ForwardedTCPIPChannel(conn, buf.readUInt32AsInt(), buf.readUInt32(), buf.readUInt32(),
|
||||
new Forward(buf.readString(), buf.readUInt32AsInt()),
|
||||
buf.readString(), buf.readUInt32AsInt());
|
||||
} catch (Buffer.BufferException be) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -44,7 +44,7 @@ public class SocketForwardingConnectListener
|
||||
@Override
|
||||
public void gotConnect(Channel.Forwarded chan)
|
||||
throws IOException {
|
||||
log.info("New connection from " + chan.getOriginatorIP() + ":" + chan.getOriginatorPort());
|
||||
log.info("New connection from {}:{}", chan.getOriginatorIP(), chan.getOriginatorPort());
|
||||
|
||||
final Socket sock = new Socket();
|
||||
sock.setSendBufferSize(chan.getLocalMaxPacketSize());
|
||||
@@ -66,4 +66,4 @@ public class SocketForwardingConnectListener
|
||||
SocketStreamCopyMonitor.monitor(5, TimeUnit.SECONDS, chan2soc, soc2chan, chan, sock);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -34,8 +34,9 @@ public class X11Forwarder
|
||||
|
||||
public static final String TYPE = "x11";
|
||||
|
||||
public X11Channel(Connection conn, int recipient, int remoteWinSize, int remoteMaxPacketSize, String origIP,
|
||||
int origPort) {
|
||||
public X11Channel(Connection conn,
|
||||
int recipient, long remoteWinSize, long remoteMaxPacketSize,
|
||||
String origIP, int origPort) {
|
||||
super(conn, TYPE, recipient, remoteWinSize, remoteMaxPacketSize, origIP, origPort);
|
||||
}
|
||||
|
||||
@@ -58,8 +59,7 @@ public class X11Forwarder
|
||||
throws ConnectionException, TransportException {
|
||||
try {
|
||||
callListener(listener, new X11Channel(conn,
|
||||
buf.readUInt32AsInt(),
|
||||
buf.readUInt32AsInt(), buf.readUInt32AsInt(),
|
||||
buf.readUInt32AsInt(), buf.readUInt32(), buf.readUInt32(),
|
||||
buf.readString(), buf.readUInt32AsInt()));
|
||||
} catch (Buffer.BufferException be) {
|
||||
throw new ConnectionException(be);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -15,15 +15,16 @@
|
||||
*/
|
||||
package net.schmizz.sshj.sftp;
|
||||
|
||||
import net.schmizz.concurrent.Promise;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import net.schmizz.concurrent.Promise;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class PacketReader
|
||||
extends Thread {
|
||||
|
||||
@@ -65,7 +66,10 @@ public class PacketReader
|
||||
public SFTPPacket<Response> readPacket()
|
||||
throws IOException {
|
||||
int len = getPacketLength();
|
||||
|
||||
if (len > SFTPPacket.MAX_SIZE) {
|
||||
throw new IllegalStateException("Invalid packet: indicated length "+len+" too large");
|
||||
}
|
||||
|
||||
packet.rpos(0);
|
||||
packet.wpos(0);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -19,15 +19,27 @@ import java.io.IOException;
|
||||
|
||||
public class PathHelper {
|
||||
|
||||
public interface Canonicalizer {
|
||||
|
||||
String canonicalize(String path)
|
||||
throws IOException;
|
||||
|
||||
}
|
||||
|
||||
public static final String DEFAULT_PATH_SEPARATOR = "/";
|
||||
|
||||
private final SFTPEngine engine;
|
||||
private final Canonicalizer canonicalizer;
|
||||
private final String pathSep;
|
||||
|
||||
private String dotDir;
|
||||
|
||||
public PathHelper(SFTPEngine engine, String pathSep) {
|
||||
this.engine = engine;
|
||||
private synchronized String getDotDir() // cached
|
||||
throws IOException {
|
||||
return (dotDir != null) ? dotDir : (dotDir = canonicalizer.canonicalize("."));
|
||||
}
|
||||
|
||||
public PathHelper(Canonicalizer canonicalizer, String pathSep) {
|
||||
this.canonicalizer = canonicalizer;
|
||||
this.pathSep = pathSep;
|
||||
}
|
||||
|
||||
@@ -47,37 +59,33 @@ public class PathHelper {
|
||||
return new PathComponents(parent, name, pathSep);
|
||||
}
|
||||
|
||||
public PathComponents getComponents(String path)
|
||||
/**
|
||||
* Divide the path into {@code PathComponents(parent, name)} while making sure {@code name != "." && name != ".."}
|
||||
*
|
||||
* @param path to convert
|
||||
*
|
||||
* @return PathComponents
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
public PathComponents getComponents(final String path)
|
||||
throws IOException {
|
||||
if (path.isEmpty() || path.equals("."))
|
||||
if (path.equals(pathSep))
|
||||
return getComponents("", "");
|
||||
|
||||
if (path.isEmpty() || path.equals(".") || path.equals("." + pathSep))
|
||||
return getComponents(getDotDir());
|
||||
|
||||
final int lastSlash = path.lastIndexOf(pathSep);
|
||||
final String withoutTrailSep = trimTrailingSeparator(path);
|
||||
final int lastSep = withoutTrailSep.lastIndexOf(pathSep);
|
||||
final String parent = (lastSep == -1) ? "" : withoutTrailSep.substring(0, lastSep);
|
||||
final String name = (lastSep == -1) ? withoutTrailSep : withoutTrailSep.substring(lastSep + pathSep.length());
|
||||
|
||||
if (lastSlash == -1) // Relative path
|
||||
if (path.equals(".."))
|
||||
return getComponents(canon(path));
|
||||
else
|
||||
return getComponents(getDotDir(), path);
|
||||
|
||||
final String name = path.substring(lastSlash + pathSep.length());
|
||||
|
||||
if (name.equals(".") || name.equals(".."))
|
||||
return getComponents(canon(path));
|
||||
else {
|
||||
final String parent = path.substring(0, lastSlash);
|
||||
if (name.equals(".") || name.equals("..")) {
|
||||
return getComponents(canonicalizer.canonicalize(path));
|
||||
} else {
|
||||
return getComponents(parent, name);
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized String getDotDir()
|
||||
throws IOException {
|
||||
return (dotDir != null) ? dotDir : (dotDir = canon("."));
|
||||
}
|
||||
|
||||
private String canon(String path)
|
||||
throws IOException {
|
||||
return engine.canonicalize(path);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -61,7 +61,13 @@ public class SFTPEngine
|
||||
sub = ssh.startSession().startSubsystem("sftp");
|
||||
out = sub.getOutputStream();
|
||||
reader = new PacketReader(this);
|
||||
pathHelper = new PathHelper(this, pathSep);
|
||||
pathHelper = new PathHelper(new PathHelper.Canonicalizer() {
|
||||
@Override
|
||||
public String canonicalize(String path)
|
||||
throws IOException {
|
||||
return SFTPEngine.this.canonicalize(path);
|
||||
}
|
||||
}, pathSep);
|
||||
}
|
||||
|
||||
public SFTPEngine init()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -38,15 +38,24 @@ public class SFTPFileTransfer
|
||||
|
||||
private volatile LocalFileFilter uploadFilter;
|
||||
private volatile RemoteResourceFilter downloadFilter;
|
||||
private volatile boolean preserveAttributes = true;
|
||||
|
||||
public SFTPFileTransfer(SFTPEngine engine) {
|
||||
this.engine = engine;
|
||||
}
|
||||
|
||||
public boolean getPreserveAttributes() {
|
||||
return preserveAttributes;
|
||||
}
|
||||
|
||||
public void setPreserveAttributes(boolean preserveAttributes) {
|
||||
this.preserveAttributes = preserveAttributes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void upload(String source, String dest)
|
||||
throws IOException {
|
||||
new Uploader().upload(new FileSystemFile(source), dest);
|
||||
upload(new FileSystemFile(source), dest);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -58,7 +67,7 @@ public class SFTPFileTransfer
|
||||
@Override
|
||||
public void upload(LocalSourceFile localFile, String remotePath)
|
||||
throws IOException {
|
||||
new Uploader().upload(localFile, remotePath);
|
||||
new Uploader().upload(getTransferListener(), localFile, remotePath);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -66,7 +75,7 @@ public class SFTPFileTransfer
|
||||
throws IOException {
|
||||
final PathComponents pathComponents = engine.getPathHelper().getComponents(source);
|
||||
final FileAttributes attributes = engine.stat(source);
|
||||
new Downloader().download(new RemoteResourceInfo(pathComponents, attributes), dest);
|
||||
new Downloader().download(getTransferListener(), new RemoteResourceInfo(pathComponents, attributes), dest);
|
||||
}
|
||||
|
||||
public void setUploadFilter(LocalFileFilter uploadFilter) {
|
||||
@@ -87,46 +96,47 @@ public class SFTPFileTransfer
|
||||
|
||||
private class Downloader {
|
||||
|
||||
private final TransferListener listener = getTransferListener();
|
||||
|
||||
private void download(final RemoteResourceInfo remote, final LocalDestFile local)
|
||||
private void download(final TransferListener listener,
|
||||
final RemoteResourceInfo remote,
|
||||
final LocalDestFile local)
|
||||
throws IOException {
|
||||
final LocalDestFile adjustedFile;
|
||||
switch (remote.getAttributes().getType()) {
|
||||
case DIRECTORY:
|
||||
listener.startedDir(remote.getName());
|
||||
adjustedFile = downloadDir(remote, local);
|
||||
listener.finishedDir();
|
||||
adjustedFile = downloadDir(listener.directory(remote.getName()), remote, local);
|
||||
break;
|
||||
case UNKNOWN:
|
||||
log.warn("Server did not supply information about the type of file at `{}` " +
|
||||
"-- assuming it is a regular file!", remote.getPath());
|
||||
case REGULAR:
|
||||
listener.startedFile(remote.getName(), remote.getAttributes().getSize());
|
||||
adjustedFile = downloadFile(remote, local);
|
||||
listener.finishedFile();
|
||||
adjustedFile = downloadFile(listener.file(remote.getName(), remote.getAttributes().getSize()),
|
||||
remote, local);
|
||||
break;
|
||||
default:
|
||||
throw new IOException(remote + " is not a regular file or directory");
|
||||
}
|
||||
copyAttributes(remote, adjustedFile);
|
||||
|
||||
if (getPreserveAttributes())
|
||||
copyAttributes(remote, adjustedFile);
|
||||
}
|
||||
|
||||
private LocalDestFile downloadDir(final RemoteResourceInfo remote, final LocalDestFile local)
|
||||
private LocalDestFile downloadDir(final TransferListener listener,
|
||||
final RemoteResourceInfo remote,
|
||||
final LocalDestFile local)
|
||||
throws IOException {
|
||||
final LocalDestFile adjusted = local.getTargetDirectory(remote.getName());
|
||||
final RemoteDirectory rd = engine.openDir(remote.getPath());
|
||||
try {
|
||||
for (RemoteResourceInfo rri : rd.scan(getDownloadFilter()))
|
||||
download(rri, adjusted.getChild(rri.getName()));
|
||||
download(listener, rri, adjusted.getChild(rri.getName()));
|
||||
} finally {
|
||||
rd.close();
|
||||
}
|
||||
return adjusted;
|
||||
}
|
||||
|
||||
private LocalDestFile downloadFile(final RemoteResourceInfo remote, final LocalDestFile local)
|
||||
private LocalDestFile downloadFile(final StreamCopier.Listener listener,
|
||||
final RemoteResourceInfo remote,
|
||||
final LocalDestFile local)
|
||||
throws IOException {
|
||||
final LocalDestFile adjusted = local.getTargetFile(remote.getName());
|
||||
final RemoteFile rf = engine.open(remote.getPath());
|
||||
@@ -161,33 +171,34 @@ public class SFTPFileTransfer
|
||||
|
||||
private class Uploader {
|
||||
|
||||
private final TransferListener listener = getTransferListener();
|
||||
|
||||
private void upload(LocalSourceFile local, String remote)
|
||||
private void upload(final TransferListener listener,
|
||||
final LocalSourceFile local,
|
||||
final String remote)
|
||||
throws IOException {
|
||||
final String adjustedPath;
|
||||
if (local.isDirectory()) {
|
||||
listener.startedDir(local.getName());
|
||||
adjustedPath = uploadDir(local, remote);
|
||||
listener.finishedDir();
|
||||
adjustedPath = uploadDir(listener.directory(local.getName()), local, remote);
|
||||
} else if (local.isFile()) {
|
||||
listener.startedFile(local.getName(), local.getLength());
|
||||
adjustedPath = uploadFile(local, remote);
|
||||
listener.finishedFile();
|
||||
adjustedPath = uploadFile(listener.file(local.getName(), local.getLength()), local, remote);
|
||||
} else
|
||||
throw new IOException(local + " is not a file or directory");
|
||||
engine.setAttributes(adjustedPath, getAttributes(local));
|
||||
if (getPreserveAttributes())
|
||||
engine.setAttributes(adjustedPath, getAttributes(local));
|
||||
}
|
||||
|
||||
private String uploadDir(LocalSourceFile local, String remote)
|
||||
private String uploadDir(final TransferListener listener,
|
||||
final LocalSourceFile local,
|
||||
final String remote)
|
||||
throws IOException {
|
||||
final String adjusted = prepareDir(local, remote);
|
||||
for (LocalSourceFile f : local.getChildren(getUploadFilter()))
|
||||
upload(f, adjusted);
|
||||
upload(listener, f, adjusted);
|
||||
return adjusted;
|
||||
}
|
||||
|
||||
private String uploadFile(LocalSourceFile local, String remote)
|
||||
private String uploadFile(final StreamCopier.Listener listener,
|
||||
final LocalSourceFile local,
|
||||
final String remote)
|
||||
throws IOException {
|
||||
final String adjusted = prepareFile(local, remote);
|
||||
final RemoteFile rf = engine.open(adjusted, EnumSet.of(OpenMode.WRITE,
|
||||
@@ -210,7 +221,7 @@ public class SFTPFileTransfer
|
||||
return adjusted;
|
||||
}
|
||||
|
||||
private String prepareDir(LocalSourceFile local, String remote)
|
||||
private String prepareDir(final LocalSourceFile local, final String remote)
|
||||
throws IOException {
|
||||
final FileAttributes attrs;
|
||||
try {
|
||||
@@ -236,7 +247,7 @@ public class SFTPFileTransfer
|
||||
throw new IOException(attrs.getMode().getType() + " file already exists at " + remote);
|
||||
}
|
||||
|
||||
private String prepareFile(LocalSourceFile local, String remote)
|
||||
private String prepareFile(final LocalSourceFile local, final String remote)
|
||||
throws IOException {
|
||||
final FileAttributes attrs;
|
||||
try {
|
||||
@@ -250,8 +261,7 @@ public class SFTPFileTransfer
|
||||
}
|
||||
if (attrs.getMode().getType() == FileMode.Type.DIRECTORY) {
|
||||
log.debug("probeFile: {} was directory, path adjusted for {}", remote, local.getName());
|
||||
remote = engine.getPathHelper().adjustForParent(remote, local.getName());
|
||||
return remote;
|
||||
return engine.getPathHelper().adjustForParent(remote, local.getName());
|
||||
} else {
|
||||
log.debug("probeFile: {} is a {} file that will be replaced", remote, attrs.getMode().getType());
|
||||
return remote;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -31,7 +31,7 @@ public class StatefulSFTPClient
|
||||
throws IOException {
|
||||
super(engine);
|
||||
this.cwd = getSFTPEngine().canonicalize(".");
|
||||
log.info("Start dir = " + cwd);
|
||||
log.info("Start dir = {}", cwd);
|
||||
}
|
||||
|
||||
private synchronized String cwdify(String path) {
|
||||
@@ -44,7 +44,7 @@ public class StatefulSFTPClient
|
||||
if (statExistence(cwd) == null) {
|
||||
throw new SFTPException(cwd + ": does not exist");
|
||||
}
|
||||
log.info("CWD = " + cwd);
|
||||
log.info("CWD = {}", cwd);
|
||||
}
|
||||
|
||||
public synchronized List<RemoteResourceInfo> ls()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011 sshj contributors
|
||||
* Copyright 2010-2012 sshj contributors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -381,9 +381,9 @@ public final class TransportImpl
|
||||
public void disconnect(DisconnectReason reason, String message) {
|
||||
close.lock();
|
||||
try {
|
||||
disconnectListener.notifyDisconnect(reason);
|
||||
getService().notifyError(new TransportException(reason, "Disconnected"));
|
||||
if (!close.isSet()) {
|
||||
if (isRunning()) {
|
||||
disconnectListener.notifyDisconnect(reason);
|
||||
getService().notifyError(new TransportException(reason, "Disconnected"));
|
||||
sendDisconnect(reason, message);
|
||||
finishOff();
|
||||
close.set();
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user