mirror of
https://github.com/hierynomus/sshj.git
synced 2025-12-09 00:18:39 +03:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c4d50c6a24 |
55
.github/workflows/gradle.yml
vendored
55
.github/workflows/gradle.yml
vendored
@@ -1,55 +0,0 @@
|
|||||||
# This workflow will build a Java project with Gradle
|
|
||||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
|
|
||||||
|
|
||||||
name: Build SSHJ
|
|
||||||
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
java9:
|
|
||||||
name: Build with Java 9
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Set up JDK 9
|
|
||||||
uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 9
|
|
||||||
- name: Grant execute permission for gradlew
|
|
||||||
run: chmod +x gradlew
|
|
||||||
- name: Build with Gradle
|
|
||||||
run: ./gradlew check
|
|
||||||
java10:
|
|
||||||
name: Build with Java 10
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Set up JDK 10
|
|
||||||
uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 10
|
|
||||||
- name: Grant execute permission for gradlew
|
|
||||||
run: chmod +x gradlew
|
|
||||||
- name: Build with Gradle
|
|
||||||
run: ./gradlew check -xanimalsnifferMain -xanimalsnifferTest
|
|
||||||
|
|
||||||
integration:
|
|
||||||
name: Integration test
|
|
||||||
needs: [java9]
|
|
||||||
runs-on: [ubuntu-latest]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
|
|
||||||
- uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 9
|
|
||||||
- name: Grant execute permission for gradlew
|
|
||||||
run: chmod +x gradlew
|
|
||||||
- name: Build with Gradle
|
|
||||||
run: ./gradlew integrationTest
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
9
|
|
||||||
2
NOTICE
2
NOTICE
@@ -15,7 +15,7 @@ The Apache Software Foundation (http://www.apache.org/):
|
|||||||
== in this case for the SSHD distribution. ==
|
== in this case for the SSHD distribution. ==
|
||||||
=========================================================================
|
=========================================================================
|
||||||
|
|
||||||
This product contains software developed by JCraft,Inc. and subject to
|
This product contains software developped by JCraft,Inc. and subject to
|
||||||
the following license:
|
the following license:
|
||||||
|
|
||||||
Copyright (c) 2002,2003,2004,2005,2006,2007,2008 Atsuhiko Yamanaka, JCraft,Inc.
|
Copyright (c) 2002,2003,2004,2005,2006,2007,2008 Atsuhiko Yamanaka, JCraft,Inc.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
= sshj - SSHv2 library for Java
|
= sshj - SSHv2 library for Java
|
||||||
Jeroen van Erp
|
Jeroen van Erp
|
||||||
:sshj_groupid: com.hierynomus
|
:sshj_groupid: com.hierynomus
|
||||||
:sshj_version: 0.29.0
|
:sshj_version: 0.27.0
|
||||||
:source-highlighter: pygments
|
:source-highlighter: pygments
|
||||||
|
|
||||||
image:https://api.bintray.com/packages/hierynomus/maven/sshj/images/download.svg[link="https://bintray.com/hierynomus/maven/sshj/_latestVersion"]
|
image:https://api.bintray.com/packages/hierynomus/maven/sshj/images/download.svg[link="https://bintray.com/hierynomus/maven/sshj/_latestVersion"]
|
||||||
@@ -73,7 +73,7 @@ key exchange::
|
|||||||
`diffie-hellman-group-exchange-sha1`, `diffie-hellman-group-exchange-sha256`,
|
`diffie-hellman-group-exchange-sha1`, `diffie-hellman-group-exchange-sha256`,
|
||||||
`ecdh-sha2-nistp256`, `ecdh-sha2-nistp384`, `ecdh-sha2-nistp521`, `curve25519-sha256@libssh.org`
|
`ecdh-sha2-nistp256`, `ecdh-sha2-nistp384`, `ecdh-sha2-nistp521`, `curve25519-sha256@libssh.org`
|
||||||
|
|
||||||
SSHJ also supports the following extended (non official) key exchange algorithms:
|
SSHJ also supports the following extended (non official) key exchange algoriths:
|
||||||
`diffie-hellman-group14-sha256@ssh.com`, `diffie-hellman-group15-sha256`, `diffie-hellman-group15-sha256@ssh.com`, `diffie-hellman-group15-sha384@ssh.com`,
|
`diffie-hellman-group14-sha256@ssh.com`, `diffie-hellman-group15-sha256`, `diffie-hellman-group15-sha256@ssh.com`, `diffie-hellman-group15-sha384@ssh.com`,
|
||||||
`diffie-hellman-group16-sha256`, `diffie-hellman-group16-sha384@ssh.com`, `diffie-hellman-group16-sha512@ssh.com`, `diffie-hellman-group18-sha512@ssh.com`
|
`diffie-hellman-group16-sha256`, `diffie-hellman-group16-sha384@ssh.com`, `diffie-hellman-group16-sha512@ssh.com`, `diffie-hellman-group18-sha512@ssh.com`
|
||||||
|
|
||||||
@@ -152,7 +152,7 @@ SSHJ 0.19.1 (2016-12-30)::
|
|||||||
* Enabled PKCS5 Key files in DefaultConfig
|
* Enabled PKCS5 Key files in DefaultConfig
|
||||||
* Merged https://github.com/hierynomus/sshj/pulls/291[#291]: Fixed sshj.properties loading and chained exception messages
|
* Merged https://github.com/hierynomus/sshj/pulls/291[#291]: Fixed sshj.properties loading and chained exception messages
|
||||||
* Merged https://github.com/hierynomus/sshj/pulls/284[#284]: Correctly catch interrupt in keepalive thread
|
* Merged https://github.com/hierynomus/sshj/pulls/284[#284]: Correctly catch interrupt in keepalive thread
|
||||||
* Fixed https://github.com/hierynomus/sshj/issues/292[#292]: Pass the configured RandomFactory to Diffie Hellman KEX
|
* Fixed https://github.com/hierynomus/sshj/issues/292[#292]: Pass the configured RandomFactory to Diffie Hellmann KEX
|
||||||
* Fixed https://github.com/hierynomus/sshj/issues/256[#256]: SSHJ now builds if no git repository present
|
* Fixed https://github.com/hierynomus/sshj/issues/256[#256]: SSHJ now builds if no git repository present
|
||||||
* LocalPortForwarder now correctly interrupts its own thread on close()
|
* LocalPortForwarder now correctly interrupts its own thread on close()
|
||||||
SSHJ 0.19.0 (2016-11-25)::
|
SSHJ 0.19.0 (2016-11-25)::
|
||||||
|
|||||||
57
build.gradle
57
build.gradle
@@ -6,15 +6,16 @@ plugins {
|
|||||||
id "java"
|
id "java"
|
||||||
id "groovy"
|
id "groovy"
|
||||||
id "jacoco"
|
id "jacoco"
|
||||||
id "com.github.blindpirate.osgi" version '0.0.3'
|
id "osgi"
|
||||||
id "maven-publish"
|
id "maven-publish"
|
||||||
id 'pl.allegro.tech.build.axion-release' version '1.11.0'
|
id 'pl.allegro.tech.build.axion-release' version '1.9.2'
|
||||||
id "com.bmuschko.docker-remote-api" version "3.2.1"
|
id "com.bmuschko.docker-remote-api" version "3.2.1"
|
||||||
id "com.github.hierynomus.license" version "0.12.1"
|
id "com.github.hierynomus.license" version "0.12.1"
|
||||||
id "com.jfrog.bintray" version "1.8.5"
|
id "com.jfrog.bintray" version "1.7"
|
||||||
id 'ru.vyarus.java-lib' version '1.0.5'
|
id 'ru.vyarus.java-lib' version '1.0.5'
|
||||||
// id 'ru.vyarus.pom' version '1.0.3'
|
// id 'ru.vyarus.pom' version '1.0.3'
|
||||||
id 'ru.vyarus.github-info' version '1.1.0'
|
id 'ru.vyarus.github-info' version '1.1.0'
|
||||||
|
id 'ru.vyarus.animalsniffer' version '1.4.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "com.hierynomus"
|
group = "com.hierynomus"
|
||||||
@@ -38,28 +39,33 @@ repositories {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sourceCompatibility = 1.6
|
||||||
|
targetCompatibility = 1.6
|
||||||
|
|
||||||
configurations.compile.transitive = false
|
configurations.compile.transitive = false
|
||||||
|
|
||||||
def bouncycastleVersion = "1.65"
|
def bouncycastleVersion = "1.60"
|
||||||
def sshdVersion = "2.1.0"
|
def sshdVersion = "2.1.0"
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "org.slf4j:slf4j-api:1.7.7"
|
signature 'org.codehaus.mojo.signature:java16:1.1@signature'
|
||||||
implementation "org.bouncycastle:bcprov-jdk15on:$bouncycastleVersion"
|
|
||||||
implementation "org.bouncycastle:bcpkix-jdk15on:$bouncycastleVersion"
|
|
||||||
implementation "com.jcraft:jzlib:1.1.3"
|
|
||||||
|
|
||||||
implementation "net.i2p.crypto:eddsa:0.3.0"
|
compile "org.slf4j:slf4j-api:1.7.7"
|
||||||
|
compile "org.bouncycastle:bcprov-jdk15on:$bouncycastleVersion"
|
||||||
|
compile "org.bouncycastle:bcpkix-jdk15on:$bouncycastleVersion"
|
||||||
|
compile "com.jcraft:jzlib:1.1.3"
|
||||||
|
|
||||||
testImplementation "junit:junit:4.12"
|
compile "net.i2p.crypto:eddsa:0.3.0"
|
||||||
testImplementation 'org.spockframework:spock-core:1.3-groovy-2.4'
|
|
||||||
testImplementation "org.mockito:mockito-core:2.28.2"
|
testCompile "junit:junit:4.12"
|
||||||
testImplementation "org.apache.sshd:sshd-core:$sshdVersion"
|
testCompile 'org.spockframework:spock-core:1.3-groovy-2.4'
|
||||||
testImplementation "org.apache.sshd:sshd-sftp:$sshdVersion"
|
testCompile "org.mockito:mockito-core:2.28.2"
|
||||||
testImplementation "org.apache.sshd:sshd-scp:$sshdVersion"
|
testCompile "org.apache.sshd:sshd-core:$sshdVersion"
|
||||||
testRuntimeOnly "ch.qos.logback:logback-classic:1.2.3"
|
testCompile "org.apache.sshd:sshd-sftp:$sshdVersion"
|
||||||
testImplementation 'org.glassfish.grizzly:grizzly-http-server:2.4.4'
|
testCompile "org.apache.sshd:sshd-scp:$sshdVersion"
|
||||||
testImplementation 'org.apache.httpcomponents:httpclient:4.5.9'
|
testRuntime "ch.qos.logback:logback-classic:1.2.3"
|
||||||
|
testCompile 'org.glassfish.grizzly:grizzly-http-server:2.4.4'
|
||||||
|
testCompile 'org.apache.httpcomponents:httpclient:4.5.9'
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,10 +78,6 @@ license {
|
|||||||
excludes(['**/djb/Curve25519.java', '**/sshj/common/Base64.java', '**/org/mindrot/jbcrypt/*.java'])
|
excludes(['**/djb/Curve25519.java', '**/sshj/common/Base64.java', '**/org/mindrot/jbcrypt/*.java'])
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!JavaVersion.current().isJava9Compatible()) {
|
|
||||||
throw new GradleScriptException("Minimum compilation version is Java 9")
|
|
||||||
}
|
|
||||||
|
|
||||||
// This disables the pedantic doclint feature of JDK8
|
// This disables the pedantic doclint feature of JDK8
|
||||||
if (JavaVersion.current().isJava8Compatible()) {
|
if (JavaVersion.current().isJava8Compatible()) {
|
||||||
tasks.withType(Javadoc) {
|
tasks.withType(Javadoc) {
|
||||||
@@ -83,11 +85,6 @@ if (JavaVersion.current().isJava8Compatible()) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
compileJava {
|
|
||||||
options.compilerArgs.addAll(['--release', '7'])
|
|
||||||
}
|
|
||||||
|
|
||||||
task writeSshjVersionProperties {
|
task writeSshjVersionProperties {
|
||||||
doLast {
|
doLast {
|
||||||
project.file("${project.buildDir}/resources/main").mkdirs()
|
project.file("${project.buildDir}/resources/main").mkdirs()
|
||||||
@@ -132,8 +129,8 @@ sourcesJar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
integrationTestImplementation.extendsFrom testImplementation
|
integrationTestCompile.extendsFrom testCompile
|
||||||
integrationTestRuntimeOnly.extendsFrom testRuntimeOnly
|
integrationTestRuntime.extendsFrom testRuntime
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@@ -226,7 +223,7 @@ if (project.hasProperty("bintrayUsername") && project.hasProperty("bintrayApiKey
|
|||||||
publications = ["maven"]
|
publications = ["maven"]
|
||||||
pkg {
|
pkg {
|
||||||
repo = "maven"
|
repo = "maven"
|
||||||
name = "${project.name}"
|
name = project.name
|
||||||
licenses = ["Apache-2.0"]
|
licenses = ["Apache-2.0"]
|
||||||
vcsUrl = "https://github.com/hierynomus/sshj.git"
|
vcsUrl = "https://github.com/hierynomus/sshj.git"
|
||||||
labels = ["ssh", "sftp", "secure-shell", "network", "file-transfer"]
|
labels = ["ssh", "sftp", "secure-shell", "network", "file-transfer"]
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
package net.schmizz.sshj.examples;
|
|
||||||
|
|
||||||
import net.schmizz.sshj.SSHClient;
|
|
||||||
import net.schmizz.sshj.common.KeyType;
|
|
||||||
import net.schmizz.sshj.transport.verification.HostKeyVerifier;
|
|
||||||
import net.schmizz.sshj.transport.verification.OpenSSHKnownHosts;
|
|
||||||
import net.schmizz.sshj.xfer.FileSystemFile;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.security.PublicKey;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/** This examples demonstrates how to configure {@link net.schmizz.sshj.SSHClient} client with an in-memory known_hosts file */
|
|
||||||
public class InMemoryKnownHosts {
|
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException {
|
|
||||||
InputStream entry = new ByteArrayInputStream("localhost ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPmhSBtMctNa4hsZt8QGlsYSE5/gMkjeand69Vj4ir13".getBytes(Charset.defaultCharset()));
|
|
||||||
SSHClient ssh = new SSHClient();
|
|
||||||
ssh.addHostKeyVerifier(new InMemoryHostKeyVerifier(entry, Charset.defaultCharset()));
|
|
||||||
ssh.connect("localhost");
|
|
||||||
try {
|
|
||||||
ssh.authPublickey(System.getProperty("user.name"));
|
|
||||||
ssh.newSCPFileTransfer().download("test_file", new FileSystemFile("/tmp/"));
|
|
||||||
} finally {
|
|
||||||
ssh.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class InMemoryHostKeyVerifier implements HostKeyVerifier {
|
|
||||||
|
|
||||||
private final List<OpenSSHKnownHosts.KnownHostEntry> entries = new ArrayList<OpenSSHKnownHosts.KnownHostEntry>();
|
|
||||||
|
|
||||||
public InMemoryHostKeyVerifier(InputStream inputStream, Charset charset) throws IOException {
|
|
||||||
final OpenSSHKnownHosts.EntryFactory entryFactory = new OpenSSHKnownHosts.EntryFactory();
|
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
|
|
||||||
while(reader.ready()) {
|
|
||||||
String line = reader.readLine();
|
|
||||||
try {
|
|
||||||
OpenSSHKnownHosts.KnownHostEntry entry = entryFactory.parseEntry(line);
|
|
||||||
if (entry != null) {
|
|
||||||
entries.add(entry);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
//log error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean verify(String hostname, int port, PublicKey key) {
|
|
||||||
final KeyType type = KeyType.fromKey(key);
|
|
||||||
if (type == KeyType.UNKNOWN) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (OpenSSHKnownHosts.KnownHostEntry e : entries) {
|
|
||||||
try {
|
|
||||||
if (e.appliesTo(type, hostname) && e.verify(key)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
//log error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-bin.zip
|
distributionSha256Sum=8626cbf206b4e201ade7b87779090690447054bc93f052954c78480fa6ed186e
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
51
gradlew
vendored
51
gradlew
vendored
@@ -1,21 +1,5 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
#
|
|
||||||
# Copyright 2015 the original author or authors.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
##
|
##
|
||||||
## Gradle start up script for UN*X
|
## Gradle start up script for UN*X
|
||||||
@@ -44,7 +28,7 @@ APP_NAME="Gradle"
|
|||||||
APP_BASE_NAME=`basename "$0"`
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
DEFAULT_JVM_OPTS=""
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD="maximum"
|
MAX_FD="maximum"
|
||||||
@@ -125,8 +109,8 @@ if $darwin; then
|
|||||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
if $cygwin ; then
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
@@ -154,19 +138,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
|||||||
else
|
else
|
||||||
eval `echo args$i`="\"$arg\""
|
eval `echo args$i`="\"$arg\""
|
||||||
fi
|
fi
|
||||||
i=`expr $i + 1`
|
i=$((i+1))
|
||||||
done
|
done
|
||||||
case $i in
|
case $i in
|
||||||
0) set -- ;;
|
(0) set -- ;;
|
||||||
1) set -- "$args0" ;;
|
(1) set -- "$args0" ;;
|
||||||
2) set -- "$args0" "$args1" ;;
|
(2) set -- "$args0" "$args1" ;;
|
||||||
3) set -- "$args0" "$args1" "$args2" ;;
|
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -175,9 +159,14 @@ save () {
|
|||||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||||
echo " "
|
echo " "
|
||||||
}
|
}
|
||||||
APP_ARGS=`save "$@"`
|
APP_ARGS=$(save "$@")
|
||||||
|
|
||||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||||
|
|
||||||
|
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||||
|
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
fi
|
||||||
|
|
||||||
exec "$JAVACMD" "$@"
|
exec "$JAVACMD" "$@"
|
||||||
|
|||||||
21
gradlew.bat
vendored
21
gradlew.bat
vendored
@@ -1,19 +1,3 @@
|
|||||||
@rem
|
|
||||||
@rem Copyright 2015 the original author or authors.
|
|
||||||
@rem
|
|
||||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
@rem you may not use this file except in compliance with the License.
|
|
||||||
@rem You may obtain a copy of the License at
|
|
||||||
@rem
|
|
||||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
@rem
|
|
||||||
@rem Unless required by applicable law or agreed to in writing, software
|
|
||||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
@rem See the License for the specific language governing permissions and
|
|
||||||
@rem limitations under the License.
|
|
||||||
@rem
|
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
@if "%DEBUG%" == "" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
@@ -29,11 +13,8 @@ if "%DIRNAME%" == "" set DIRNAME=.
|
|||||||
set APP_BASE_NAME=%~n0
|
set APP_BASE_NAME=%~n0
|
||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
|
||||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
|
||||||
|
|
||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
set DEFAULT_JVM_OPTS=
|
||||||
|
|
||||||
@rem Find java.exe
|
@rem Find java.exe
|
||||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import java.math.BigInteger;
|
|||||||
import static net.schmizz.sshj.transport.kex.DHGroupData.*;
|
import static net.schmizz.sshj.transport.kex.DHGroupData.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory methods for Diffie Hellman KEX algorithms based on MODP groups / Oakley Groups
|
* Factory methods for Diffie Hellmann KEX algorithms based on MODP groups / Oakley Groups
|
||||||
*
|
*
|
||||||
* - https://tools.ietf.org/html/rfc4253
|
* - https://tools.ietf.org/html/rfc4253
|
||||||
* - https://tools.ietf.org/html/draft-ietf-curdle-ssh-modp-dh-sha2-01
|
* - https://tools.ietf.org/html/draft-ietf-curdle-ssh-modp-dh-sha2-01
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ package net.schmizz.concurrent;
|
|||||||
* if (t instanceof SomeException)
|
* if (t instanceof SomeException)
|
||||||
* return (SomeException) t;
|
* return (SomeException) t;
|
||||||
* else
|
* else
|
||||||
* return new SomeException(t);
|
* return new SomeExcepion(t);
|
||||||
* }
|
* }
|
||||||
* };
|
* };
|
||||||
* </pre>
|
* </pre>
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ public interface Config {
|
|||||||
/**
|
/**
|
||||||
* Gets whether the client should first wait for a received server ident, before sending the client ident.
|
* Gets whether the client should first wait for a received server ident, before sending the client ident.
|
||||||
* <p/>
|
* <p/>
|
||||||
* <strong>NB:</strong> This is non-standard behaviour, and can potentially deadlock if the server also waits on the client ident.
|
* <stong>NB:</stong> This is non-standard behaviour, and can potentially deadlock if the server also waits on the client ident.
|
||||||
*
|
*
|
||||||
* The default value is set to false.
|
* The default value is set to false.
|
||||||
*
|
*
|
||||||
@@ -171,7 +171,7 @@ public interface Config {
|
|||||||
/**
|
/**
|
||||||
* Sets whether the SSH client should wait for a received server ident, before sending the client ident.
|
* Sets whether the SSH client should wait for a received server ident, before sending the client ident.
|
||||||
* <p/>
|
* <p/>
|
||||||
* <strong>NB:</strong> This is non-standard behaviour, and can potentially deadlock if the server also waits on the client ident.
|
* <stong>NB:</stong> This is non-standard behaviour, and can potentially deadlock if the server also waits on the client ident.
|
||||||
|
|
||||||
* @param waitForServerIdentBeforeSendingClientIdent Whether to wait for the server ident.
|
* @param waitForServerIdentBeforeSendingClientIdent Whether to wait for the server ident.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -515,7 +515,7 @@ public class SSHClient
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility function for creating a {@link KeyProvider} instance from given location on the file system. Creates a
|
* Utility function for createing a {@link KeyProvider} instance from given location on the file system. Creates a
|
||||||
* one-off {@link PasswordFinder} using {@link PasswordUtils#createOneOff(char[])}, and calls {@link
|
* one-off {@link PasswordFinder} using {@link PasswordUtils#createOneOff(char[])}, and calls {@link
|
||||||
* #loadKeys(String, PasswordFinder)}.
|
* #loadKeys(String, PasswordFinder)}.
|
||||||
*
|
*
|
||||||
@@ -754,7 +754,7 @@ public class SSHClient
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds {@code zlib} compression to preferred compression algorithms. There is no guarantee that it will be
|
* Adds {@code zlib} compression to preferred compression algorithms. There is no guarantee that it will be
|
||||||
* successfully negotiated.
|
* successfully negotiatied.
|
||||||
* <p/>
|
* <p/>
|
||||||
* If the client is already connected renegotiation is done; otherwise this method simply returns (and compression
|
* If the client is already connected renegotiation is done; otherwise this method simply returns (and compression
|
||||||
* will be negotiated during connection establishment).
|
* will be negotiated during connection establishment).
|
||||||
|
|||||||
@@ -53,10 +53,6 @@ public abstract class SocketClient {
|
|||||||
this.defaultPort = defaultPort;
|
this.defaultPort = defaultPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected InetSocketAddress makeInetSocketAddress(String hostname, int port) {
|
|
||||||
return new InetSocketAddress(hostname, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect to a host via a proxy.
|
* Connect to a host via a proxy.
|
||||||
* @param hostname The host name to connect to.
|
* @param hostname The host name to connect to.
|
||||||
@@ -87,7 +83,7 @@ public abstract class SocketClient {
|
|||||||
} else {
|
} else {
|
||||||
socket = new Socket(proxy);
|
socket = new Socket(proxy);
|
||||||
}
|
}
|
||||||
socket.connect(makeInetSocketAddress(hostname, port), connectTimeout);
|
socket.connect(new InetSocketAddress(hostname, port), connectTimeout);
|
||||||
onConnect();
|
onConnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +131,7 @@ public abstract class SocketClient {
|
|||||||
this.hostname = hostname;
|
this.hostname = hostname;
|
||||||
this.port = port;
|
this.port = port;
|
||||||
socket = socketFactory.createSocket();
|
socket = socketFactory.createSocket();
|
||||||
socket.connect(makeInetSocketAddress(hostname, port), connectTimeout);
|
socket.connect(new InetSocketAddress(hostname, port), connectTimeout);
|
||||||
onConnect();
|
onConnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -148,7 +144,7 @@ public abstract class SocketClient {
|
|||||||
this.port = port;
|
this.port = port;
|
||||||
socket = socketFactory.createSocket();
|
socket = socketFactory.createSocket();
|
||||||
socket.bind(new InetSocketAddress(localAddr, localPort));
|
socket.bind(new InetSocketAddress(localAddr, localPort));
|
||||||
socket.connect(makeInetSocketAddress(hostname, port), connectTimeout);
|
socket.connect(new InetSocketAddress(hostname, port), connectTimeout);
|
||||||
onConnect();
|
onConnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ package net.schmizz.sshj.common;
|
|||||||
* <a href="http://www.faqs.org/rfcs/rfc3548.html">RFC3548</a>.</li>
|
* <a href="http://www.faqs.org/rfcs/rfc3548.html">RFC3548</a>.</li>
|
||||||
* <li><em>Throws exceptions instead of returning null values.</em> Because some operations
|
* <li><em>Throws exceptions instead of returning null values.</em> Because some operations
|
||||||
* (especially those that may permit the GZIP option) use IO streams, there
|
* (especially those that may permit the GZIP option) use IO streams, there
|
||||||
* is a possibility of an java.io.IOException being thrown. After some discussion and
|
* is a possiblity of an java.io.IOException being thrown. After some discussion and
|
||||||
* thought, I've changed the behavior of the methods to throw java.io.IOExceptions
|
* thought, I've changed the behavior of the methods to throw java.io.IOExceptions
|
||||||
* rather than return null if ever there's an error. I think this is more
|
* rather than return null if ever there's an error. I think this is more
|
||||||
* appropriate, though it will require some changes to your code. Sorry,
|
* appropriate, though it will require some changes to your code. Sorry,
|
||||||
@@ -476,7 +476,7 @@ public class Base64
|
|||||||
* anywhere along their length by specifying
|
* anywhere along their length by specifying
|
||||||
* <var>srcOffset</var> and <var>destOffset</var>.
|
* <var>srcOffset</var> and <var>destOffset</var>.
|
||||||
* This method does not check to make sure your arrays
|
* This method does not check to make sure your arrays
|
||||||
* are large enough to accommodate <var>srcOffset</var> + 3 for
|
* are large enough to accomodate <var>srcOffset</var> + 3 for
|
||||||
* the <var>source</var> array or <var>destOffset</var> + 4 for
|
* the <var>source</var> array or <var>destOffset</var> + 4 for
|
||||||
* the <var>destination</var> array.
|
* the <var>destination</var> array.
|
||||||
* The actual number of significant bytes in your array is
|
* The actual number of significant bytes in your array is
|
||||||
@@ -1007,7 +1007,7 @@ public class Base64
|
|||||||
* anywhere along their length by specifying
|
* anywhere along their length by specifying
|
||||||
* <var>srcOffset</var> and <var>destOffset</var>.
|
* <var>srcOffset</var> and <var>destOffset</var>.
|
||||||
* This method does not check to make sure your arrays
|
* This method does not check to make sure your arrays
|
||||||
* are large enough to accommodate <var>srcOffset</var> + 4 for
|
* are large enough to accomodate <var>srcOffset</var> + 4 for
|
||||||
* the <var>source</var> array or <var>destOffset</var> + 3 for
|
* the <var>source</var> array or <var>destOffset</var> + 3 for
|
||||||
* the <var>destination</var> array.
|
* the <var>destination</var> array.
|
||||||
* This method returns the actual number of bytes that
|
* This method returns the actual number of bytes that
|
||||||
@@ -1928,7 +1928,7 @@ public class Base64
|
|||||||
if( suspendEncoding ) {
|
if( suspendEncoding ) {
|
||||||
this.out.write( theByte );
|
this.out.write( theByte );
|
||||||
return;
|
return;
|
||||||
} // end if: suspended
|
} // end if: supsended
|
||||||
|
|
||||||
// Encode?
|
// Encode?
|
||||||
if( encode ) {
|
if( encode ) {
|
||||||
@@ -1983,7 +1983,7 @@ public class Base64
|
|||||||
if( suspendEncoding ) {
|
if( suspendEncoding ) {
|
||||||
this.out.write( theBytes, off, len );
|
this.out.write( theBytes, off, len );
|
||||||
return;
|
return;
|
||||||
} // end if: suspended
|
} // end if: supsended
|
||||||
|
|
||||||
for( int i = 0; i < len; i++ ) {
|
for( int i = 0; i < len; i++ ) {
|
||||||
write( theBytes[ off + i ] );
|
write( theBytes[ off + i ] );
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import java.util.List;
|
|||||||
public interface Factory<T> {
|
public interface Factory<T> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for a named factory. Named factories are simply factories that are identified by a name. Such names are
|
* Inteface for a named factory. Named factories are simply factories that are identified by a name. Such names are
|
||||||
* used mainly in SSH algorithm negotiation.
|
* used mainly in SSH algorithm negotiation.
|
||||||
*
|
*
|
||||||
* @param <T> type of object created by this factory
|
* @param <T> type of object created by this factory
|
||||||
|
|||||||
@@ -150,8 +150,7 @@ public final class ChannelOutputStream extends OutputStream implements ErrorNoti
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void checkClose() throws SSHException {
|
private void checkClose() throws SSHException {
|
||||||
// Check whether either the Stream is closed, or the underlying channel is closed
|
if (closed) {
|
||||||
if (closed || !chan.isOpen()) {
|
|
||||||
if (error != null)
|
if (error != null)
|
||||||
throw error;
|
throw error;
|
||||||
else
|
else
|
||||||
@@ -161,8 +160,7 @@ public final class ChannelOutputStream extends OutputStream implements ErrorNoti
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void close() throws IOException {
|
public synchronized void close() throws IOException {
|
||||||
// Not closed yet, and underlying channel is open to flush the data to.
|
if (!closed) {
|
||||||
if (!closed && chan.isOpen()) {
|
|
||||||
try {
|
try {
|
||||||
buffer.flush(false);
|
buffer.flush(false);
|
||||||
// trans.write(new SSHPacket(Message.CHANNEL_EOF).putUInt32(chan.getRecipient()));
|
// trans.write(new SSHPacket(Message.CHANNEL_EOF).putUInt32(chan.getRecipient()));
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import net.schmizz.sshj.transport.TransportException;
|
|||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/** Base class for direct channels whose open is initiated by the client. */
|
/** Base class for direct channels whose open is initated by the client. */
|
||||||
public abstract class AbstractDirectChannel
|
public abstract class AbstractDirectChannel
|
||||||
extends AbstractChannel
|
extends AbstractChannel
|
||||||
implements Channel.Direct {
|
implements Channel.Direct {
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ public interface Session
|
|||||||
TransportException;
|
TransportException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set an environment variable.
|
* Set an enviornment variable.
|
||||||
*
|
*
|
||||||
* @param name name of the variable
|
* @param name name of the variable
|
||||||
* @param value value to set
|
* @param value value to set
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public interface ForwardedChannelOpener {
|
|||||||
/**
|
/**
|
||||||
* Delegates a {@code SSH_MSG_CHANNEL_OPEN} request for the channel type claimed by this opener.
|
* Delegates a {@code SSH_MSG_CHANNEL_OPEN} request for the channel type claimed by this opener.
|
||||||
*
|
*
|
||||||
* @param buf {@link SSHPacket} containing the request except for the message identifier and channel type field
|
* @param buf {@link SSHPacket} containg the request except for the message identifier and channel type field
|
||||||
*/
|
*/
|
||||||
void handleOpen(SSHPacket buf)
|
void handleOpen(SSHPacket buf)
|
||||||
throws ConnectionException, TransportException;
|
throws ConnectionException, TransportException;
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ final class KeyExchanger
|
|||||||
* Add a callback for host key verification.
|
* Add a callback for host key verification.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Any of the {@link HostKeyVerifier} implementations added this way can deem a host key to be acceptable, allowing
|
* Any of the {@link HostKeyVerifier} implementations added this way can deem a host key to be acceptable, allowing
|
||||||
* key exchange to successfully complete. Otherwise, a {@link TransportException} will result during key exchange.
|
* key exchange to successfuly complete. Otherwise, a {@link TransportException} will result during key exchange.
|
||||||
*
|
*
|
||||||
* @param hkv object whose {@link HostKeyVerifier#verify} method will be invoked
|
* @param hkv object whose {@link HostKeyVerifier#verify} method will be invoked
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ public interface Transport
|
|||||||
int getHeartbeatInterval();
|
int getHeartbeatInterval();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param interval the interval in seconds, {@code 0} means no heartbeat
|
* @param interval the interval in seconds, {@code 0} means no hearbeat
|
||||||
* @deprecated Moved to {@link net.schmizz.keepalive.KeepAlive#getKeepAliveInterval()}. This is accessible through the {@link net.schmizz.sshj.connection.Connection}.
|
* @deprecated Moved to {@link net.schmizz.keepalive.KeepAlive#getKeepAliveInterval()}. This is accessible through the {@link net.schmizz.sshj.connection.Connection}.
|
||||||
* Scheduled to be removed in 0.12.0
|
* Scheduled to be removed in 0.12.0
|
||||||
*/
|
*/
|
||||||
@@ -156,7 +156,7 @@ public interface Transport
|
|||||||
*
|
*
|
||||||
* @return the sequence number of the packet sent
|
* @return the sequence number of the packet sent
|
||||||
*
|
*
|
||||||
* @throws TransportException if an error occurred sending the packet
|
* @throws TransportException if an error occured sending the packet
|
||||||
*/
|
*/
|
||||||
long sendUnimplemented()
|
long sendUnimplemented()
|
||||||
throws TransportException;
|
throws TransportException;
|
||||||
|
|||||||
@@ -104,11 +104,6 @@ public final class TransportImpl
|
|||||||
*/
|
*/
|
||||||
private volatile Service service;
|
private volatile Service service;
|
||||||
|
|
||||||
/**
|
|
||||||
* The next service that will be activated, only set when sending an SSH_MSG_SERVICE_REQUEST
|
|
||||||
*/
|
|
||||||
private volatile Service nextService;
|
|
||||||
|
|
||||||
private DisconnectListener disconnectListener;
|
private DisconnectListener disconnectListener;
|
||||||
|
|
||||||
private ConnInfo connInfo;
|
private ConnInfo connInfo;
|
||||||
@@ -329,9 +324,8 @@ public final class TransportImpl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void setService(Service service) {
|
public synchronized void setService(Service service) {
|
||||||
if (service == null) {
|
if (service == null)
|
||||||
service = nullService;
|
service = nullService;
|
||||||
}
|
|
||||||
|
|
||||||
log.debug("Setting active service to {}", service.getName());
|
log.debug("Setting active service to {}", service.getName());
|
||||||
this.service = service;
|
this.service = service;
|
||||||
@@ -343,12 +337,11 @@ public final class TransportImpl
|
|||||||
serviceAccept.lock();
|
serviceAccept.lock();
|
||||||
try {
|
try {
|
||||||
serviceAccept.clear();
|
serviceAccept.clear();
|
||||||
this.nextService = service;
|
|
||||||
sendServiceRequest(service.getName());
|
sendServiceRequest(service.getName());
|
||||||
serviceAccept.await(timeoutMs, TimeUnit.MILLISECONDS);
|
serviceAccept.await(timeoutMs, TimeUnit.MILLISECONDS);
|
||||||
|
setService(service);
|
||||||
} finally {
|
} finally {
|
||||||
serviceAccept.unlock();
|
serviceAccept.unlock();
|
||||||
this.nextService = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -492,8 +485,8 @@ public final class TransportImpl
|
|||||||
* This method is called in the context of the {@link #reader} thread via {@link Decoder#received} when a full
|
* This method is called in the context of the {@link #reader} thread via {@link Decoder#received} when a full
|
||||||
* packet has been decoded.
|
* packet has been decoded.
|
||||||
*
|
*
|
||||||
* @param msg the message identifier
|
* @param msg the message identifer
|
||||||
* @param buf buffer containing rest of the packet
|
* @param buf buffer containg rest of the packet
|
||||||
* @throws SSHException if an error occurs during handling (unrecoverable)
|
* @throws SSHException if an error occurs during handling (unrecoverable)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@@ -503,11 +496,13 @@ public final class TransportImpl
|
|||||||
|
|
||||||
log.trace("Received packet {}", msg);
|
log.trace("Received packet {}", msg);
|
||||||
|
|
||||||
if (msg.geq(50)) { // not a transport layer packet
|
if (msg.geq(50)) // not a transport layer packet
|
||||||
service.handle(msg, buf);
|
service.handle(msg, buf);
|
||||||
} else if (msg.in(20, 21) || msg.in(30, 49)) { // kex packet
|
|
||||||
|
else if (msg.in(20, 21) || msg.in(30, 49)) // kex packet
|
||||||
kexer.handle(msg, buf);
|
kexer.handle(msg, buf);
|
||||||
} else {
|
|
||||||
|
else
|
||||||
switch (msg) {
|
switch (msg) {
|
||||||
case DISCONNECT:
|
case DISCONNECT:
|
||||||
gotDisconnect(buf);
|
gotDisconnect(buf);
|
||||||
@@ -532,7 +527,6 @@ public final class TransportImpl
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private void gotDebug(SSHPacket buf)
|
private void gotDebug(SSHPacket buf)
|
||||||
throws TransportException {
|
throws TransportException {
|
||||||
@@ -564,8 +558,6 @@ public final class TransportImpl
|
|||||||
if (!serviceAccept.hasWaiters())
|
if (!serviceAccept.hasWaiters())
|
||||||
throw new TransportException(DisconnectReason.PROTOCOL_ERROR,
|
throw new TransportException(DisconnectReason.PROTOCOL_ERROR,
|
||||||
"Got a service accept notification when none was awaited");
|
"Got a service accept notification when none was awaited");
|
||||||
// Immediately switch to next service to prevent race condition mentioned in #559
|
|
||||||
setService(nextService);
|
|
||||||
serviceAccept.set();
|
serviceAccept.set();
|
||||||
} finally {
|
} finally {
|
||||||
serviceAccept.unlock();
|
serviceAccept.unlock();
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ public class OpenSSHKnownHosts
|
|||||||
* Lines starting with `#' and empty lines are ignored as comments.
|
* Lines starting with `#' and empty lines are ignored as comments.
|
||||||
*/
|
*/
|
||||||
public class EntryFactory {
|
public class EntryFactory {
|
||||||
public EntryFactory() {
|
EntryFactory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public KnownHostEntry parseEntry(String line)
|
public KnownHostEntry parseEntry(String line)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import net.schmizz.sshj.userauth.keyprovider.KeyProvider;
|
|||||||
/**
|
/**
|
||||||
* Implements the {@code "publickey"} SSH authentication method.
|
* Implements the {@code "publickey"} SSH authentication method.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Requesting authentication with this method first sends a "feeler" request with just the public key, and if the
|
* Requesteing authentication with this method first sends a "feeler" request with just the public key, and if the
|
||||||
* server responds with {@code SSH_MSG_USERAUTH_PK_OK} indicating that the key is acceptable, it proceeds to send a
|
* server responds with {@code SSH_MSG_USERAUTH_PK_OK} indicating that the key is acceptable, it proceeds to send a
|
||||||
* request signed with the private key. Therefore, private keys are not requested from the associated {@link
|
* request signed with the private key. Therefore, private keys are not requested from the associated {@link
|
||||||
* KeyProvider} unless needed.
|
* KeyProvider} unless needed.
|
||||||
|
|||||||
@@ -44,6 +44,6 @@ public class StreamCopierTest {
|
|||||||
long copied = streamCopier.copy();
|
long copied = streamCopier.copy();
|
||||||
assertThat(copied, is(1024L));
|
assertThat(copied, is(1024L));
|
||||||
|
|
||||||
verify(logger).debug(matches("^1[.,]0 KiB transferred.*$"));
|
verify(logger).debug(contains("1.0 KiB transferred"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user