http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java b/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java index 3bc8a05..8204890 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java @@ -24,7 +24,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.LinkOption; -import java.nio.file.OpenOption; import java.nio.file.Path; import java.nio.file.attribute.PosixFilePermission; import java.security.GeneralSecurityException; @@ -43,31 +42,34 @@ import org.apache.sshd.common.config.keys.KeyUtils; import org.apache.sshd.common.config.keys.PublicKeyEntry; import org.apache.sshd.common.keyprovider.KeyPairProvider; import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.Transformer; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.io.IoUtils; /** * Provides keys loading capability from the user's keys folder - e.g., {@code id_rsa} + * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> - * @see SecurityUtils#isBouncyCastleRegistered() + * @see org.apache.sshd.common.util.SecurityUtils#isBouncyCastleRegistered() */ public final class ClientIdentity { - public static final String ID_FILE_PREFIX = "id_", ID_FILE_SUFFIX = ""; + + public static final String ID_FILE_PREFIX = "id_"; + + public static final String ID_FILE_SUFFIX = ""; + + public static final Transformer<String, String> ID_GENERATOR = + new Transformer<String, String>() { + @Override + public String transform(String input) { + return getIdentityFileName(input); + } + }; private ClientIdentity() { throw new UnsupportedOperationException("No instance"); } - public static final Transformer<String,String> ID_GENERATOR = - new Transformer<String,String>() { - @Override - public String transform(String input) { - return getIdentityFileName(input); - } - }; - /** * @param name The file name - ignored if {@code null}/empty * @return The identity type - {@code null} if cannot determine it - e.g., @@ -75,8 +77,8 @@ public final class ClientIdentity { */ public static String getIdentityType(String name) { if (GenericUtils.isEmpty(name) - || (name.length() <= ID_FILE_PREFIX.length()) - || (!name.startsWith(ID_FILE_PREFIX))) { + || (name.length() <= ID_FILE_PREFIX.length()) + || (!name.startsWith(ID_FILE_PREFIX))) { return null; } else { return name.substring(ID_FILE_PREFIX.length()); @@ -89,7 +91,7 @@ public final class ClientIdentity { /** * @param type The identity type - e.g., {@code rsa} - ignored - * if {@code null}/empty + * if {@code null}/empty * @return The matching file name for the identity - {@code null} * if no name * @see #ID_FILE_PREFIX @@ -101,149 +103,149 @@ public final class ClientIdentity { } /** - * @param client The {@link SshClient} to updated - * @param strict If {@code true} then files that do not have the required - * access rights are excluded from consideration + * @param client The {@link SshClient} to updated + * @param strict If {@code true} then files that do not have the required + * access rights are excluded from consideration * @param supportedOnly If {@code true} then ignore identities that are not - * supported internally - * @param provider A {@link FilePasswordProvider} - may be {@code null} - * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument - * to {@link FilePasswordProvider#getPassword(String)} is the path of the - * file whose key is to be loaded - * @param options The {@link LinkOption}s to apply when checking - * for existence + * supported internally + * @param provider A {@link FilePasswordProvider} - may be {@code null} + * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument + * to {@link FilePasswordProvider#getPassword(String)} is the path of the + * file whose key is to be loaded + * @param options The {@link LinkOption}s to apply when checking + * for existence * @return The updated <tt>client</tt> instance - provided a non-{@code null} * {@link KeyPairProvider} was generated - * @throws IOException If failed to access the file system + * @throws IOException If failed to access the file system * @throws GeneralSecurityException If failed to load the keys * @see #getDefaultUserIdentitiesFolder() * @see #setKeyPairProvider(SshClient, Path, boolean, boolean, FilePasswordProvider, LinkOption...) */ public static <C extends SshClient> C setKeyPairProvider( - C client, boolean strict, boolean supportedOnly, FilePasswordProvider provider, LinkOption ... options) - throws IOException, GeneralSecurityException { + C client, boolean strict, boolean supportedOnly, FilePasswordProvider provider, LinkOption... options) + throws IOException, GeneralSecurityException { return setKeyPairProvider(client, getDefaultUserIdentitiesFolder(), strict, supportedOnly, provider, options); } /** - * @param client The {@link SshClient} to updated - * @param dir The folder to scan for the built-in identities - * @param strict If {@code true} then files that do not have the required - * access rights are excluded from consideration + * @param client The {@link SshClient} to updated + * @param dir The folder to scan for the built-in identities + * @param strict If {@code true} then files that do not have the required + * access rights are excluded from consideration * @param supportedOnly If {@code true} then ignore identities that are not - * supported internally - * @param provider A {@link FilePasswordProvider} - may be {@code null} - * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument - * to {@link FilePasswordProvider#getPassword(String)} is the path of the - * file whose key is to be loaded - * @param options The {@link LinkOption}s to apply when checking - * for existence + * supported internally + * @param provider A {@link FilePasswordProvider} - may be {@code null} + * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument + * to {@link FilePasswordProvider#getPassword(String)} is the path of the + * file whose key is to be loaded + * @param options The {@link LinkOption}s to apply when checking + * for existence * @return The updated <tt>client</tt> instance - provided a non-{@code null} * {@link KeyPairProvider} was generated - * @throws IOException If failed to access the file system + * @throws IOException If failed to access the file system * @throws GeneralSecurityException If failed to load the keys * @see #loadDefaultKeyPairProvider(Path, boolean, boolean, FilePasswordProvider, LinkOption...) */ public static <C extends SshClient> C setKeyPairProvider( - C client, Path dir, boolean strict, boolean supportedOnly, FilePasswordProvider provider, LinkOption ... options) - throws IOException, GeneralSecurityException { + C client, Path dir, boolean strict, boolean supportedOnly, FilePasswordProvider provider, LinkOption... options) + throws IOException, GeneralSecurityException { KeyPairProvider kpp = loadDefaultKeyPairProvider(dir, strict, supportedOnly, provider, options); if (kpp != null) { client.setKeyPairProvider(kpp); } - + return client; } /** - * @param strict If {@code true} then files that do not have the required - * access rights are excluded from consideration + * @param strict If {@code true} then files that do not have the required + * access rights are excluded from consideration * @param supportedOnly If {@code true} then ignore identities that are not - * supported internally - * @param provider A {@link FilePasswordProvider} - may be {@code null} - * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument - * to {@link FilePasswordProvider#getPassword(String)} is the path of the - * file whose key is to be loaded - * @param options The {@link LinkOption}s to apply when checking - * for existence + * supported internally + * @param provider A {@link FilePasswordProvider} - may be {@code null} + * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument + * to {@link FilePasswordProvider#getPassword(String)} is the path of the + * file whose key is to be loaded + * @param options The {@link LinkOption}s to apply when checking + * for existence * @return A {@link KeyPair} for the identities - {@code null} if no identities * available (e.g., after filtering unsupported ones or strict permissions) - * @throws IOException If failed to access the file system + * @throws IOException If failed to access the file system * @throws GeneralSecurityException If failed to load the keys * @see #loadDefaultIdentities(Path, boolean, FilePasswordProvider, LinkOption...) * @see #getDefaultUserIdentitiesFolder() */ public static KeyPairProvider loadDefaultKeyPairProvider( - boolean strict, boolean supportedOnly, FilePasswordProvider provider, LinkOption ... options) - throws IOException, GeneralSecurityException { + boolean strict, boolean supportedOnly, FilePasswordProvider provider, LinkOption... options) + throws IOException, GeneralSecurityException { return loadDefaultKeyPairProvider(getDefaultUserIdentitiesFolder(), strict, supportedOnly, provider, options); } /** - * @param dir The folder to scan for the built-in identities - * @param strict If {@code true} then files that do not have the required - * access rights are excluded from consideration + * @param dir The folder to scan for the built-in identities + * @param strict If {@code true} then files that do not have the required + * access rights are excluded from consideration * @param supportedOnly If {@code true} then ignore identities that are not - * supported internally - * @param provider A {@link FilePasswordProvider} - may be {@code null} - * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument - * to {@link FilePasswordProvider#getPassword(String)} is the path of the - * file whose key is to be loaded - * @param options The {@link LinkOption}s to apply when checking - * for existence + * supported internally + * @param provider A {@link FilePasswordProvider} - may be {@code null} + * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument + * to {@link FilePasswordProvider#getPassword(String)} is the path of the + * file whose key is to be loaded + * @param options The {@link LinkOption}s to apply when checking + * for existence * @return A {@link KeyPair} for the identities - {@code null} if no identities * available (e.g., after filtering unsupported ones or strict permissions) - * @throws IOException If failed to access the file system + * @throws IOException If failed to access the file system * @throws GeneralSecurityException If failed to load the keys * @see #loadDefaultIdentities(Path, boolean, FilePasswordProvider, LinkOption...) * @see IdentityUtils#createKeyPairProvider(Map, boolean) */ public static KeyPairProvider loadDefaultKeyPairProvider( - Path dir, boolean strict, boolean supportedOnly, FilePasswordProvider provider, LinkOption ... options) - throws IOException, GeneralSecurityException { - Map<String,KeyPair> ids = loadDefaultIdentities(dir, strict, provider, options); + Path dir, boolean strict, boolean supportedOnly, FilePasswordProvider provider, LinkOption... options) + throws IOException, GeneralSecurityException { + Map<String, KeyPair> ids = loadDefaultIdentities(dir, strict, provider, options); return IdentityUtils.createKeyPairProvider(ids, supportedOnly); } /** - * @param strict If {@code true} then files that do not have the required - * access rights are excluded from consideration + * @param strict If {@code true} then files that do not have the required + * access rights are excluded from consideration * @param provider A {@link FilePasswordProvider} - may be {@code null} - * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument - * to {@link FilePasswordProvider#getPassword(String)} is the path of the - * file whose key is to be loaded - * @param options The {@link LinkOption}s to apply when checking - * for existence + * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument + * to {@link FilePasswordProvider#getPassword(String)} is the path of the + * file whose key is to be loaded + * @param options The {@link LinkOption}s to apply when checking + * for existence * @return A {@link Map} of the found files where key=identity type (case * <U>insensitive</U>), value=the {@link KeyPair} of the identity - * @throws IOException If failed to access the file system + * @throws IOException If failed to access the file system * @throws GeneralSecurityException If failed to load the keys * @see #getDefaultUserIdentitiesFolder() * @see #loadDefaultIdentities(Path, boolean, FilePasswordProvider, LinkOption...) */ - public static Map<String,KeyPair> loadDefaultIdentities(boolean strict, FilePasswordProvider provider, LinkOption ... options) + public static Map<String, KeyPair> loadDefaultIdentities(boolean strict, FilePasswordProvider provider, LinkOption... options) throws IOException, GeneralSecurityException { return loadDefaultIdentities(getDefaultUserIdentitiesFolder(), strict, provider, options); } /** - * @param dir The folder to scan for the built-in identities - * @param strict If {@code true} then files that do not have the required - * access rights are excluded from consideration + * @param dir The folder to scan for the built-in identities + * @param strict If {@code true} then files that do not have the required + * access rights are excluded from consideration * @param provider A {@link FilePasswordProvider} - may be {@code null} - * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument - * to {@link FilePasswordProvider#getPassword(String)} is the path of the - * file whose key is to be loaded - * @param options The {@link LinkOption}s to apply when checking - * for existence + * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument + * to {@link FilePasswordProvider#getPassword(String)} is the path of the + * file whose key is to be loaded + * @param options The {@link LinkOption}s to apply when checking + * for existence * @return A {@link Map} of the found files where key=identity type (case * <U>insensitive</U>), value=the {@link KeyPair} of the identity - * @throws IOException If failed to access the file system + * @throws IOException If failed to access the file system * @throws GeneralSecurityException If failed to load the keys * @see #loadIdentities(Path, boolean, Collection, Transformer, FilePasswordProvider, LinkOption...) * @see BuiltinIdentities */ - public static Map<String,KeyPair> loadDefaultIdentities(Path dir, boolean strict, FilePasswordProvider provider, LinkOption ... options) + public static Map<String, KeyPair> loadDefaultIdentities(Path dir, boolean strict, FilePasswordProvider provider, LinkOption... options) throws IOException, GeneralSecurityException { return loadIdentities(dir, strict, BuiltinIdentities.NAMES, ID_GENERATOR, provider, options); } @@ -258,75 +260,77 @@ public final class ClientIdentity { if (GenericUtils.isEmpty(userHome)) { throw new FileNotFoundException("No user home value"); } - + Path homeDir = new File(userHome).toPath(); return homeDir.resolve(PublicKeyEntry.STD_KEYFILE_FOLDER_NAME); } /** * Scans a folder and loads all available identity files - * @param dir The {@link Path} of the folder to scan - ignored if not exists - * @param strict If {@code true} then files that do not have the required - * access rights are excluded from consideration - * @param types The identity types - ignored if {@code null}/empty + * + * @param dir The {@link Path} of the folder to scan - ignored if not exists + * @param strict If {@code true} then files that do not have the required + * access rights are excluded from consideration + * @param types The identity types - ignored if {@code null}/empty * @param idGenerator A {@link Transformer} to derive the file name - * holding the specified type - * @param provider A {@link FilePasswordProvider} - may be {@code null} - * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument - * to {@link FilePasswordProvider#getPassword(String)} is the path of the - * file whose key is to be loaded - * @param options The {@link LinkOption}s to apply when checking - * for existence + * holding the specified type + * @param provider A {@link FilePasswordProvider} - may be {@code null} + * if the loaded keys are <U>guaranteed</U> not to be encrypted. The argument + * to {@link FilePasswordProvider#getPassword(String)} is the path of the + * file whose key is to be loaded + * @param options The {@link LinkOption}s to apply when checking + * for existence * @return A {@link Map} of the found files where key=identity type (case * <U>insensitive</U>), value=the {@link KeyPair} of the identity - * @throws IOException If failed to access the file system + * @throws IOException If failed to access the file system * @throws GeneralSecurityException If failed to load the keys * @see #scanIdentitiesFolder(Path, boolean, Collection, Transformer, LinkOption...) - * @see IdentityUtils#loadIdentities(Map, FilePasswordProvider, OpenOption...) + * @see IdentityUtils#loadIdentities(Map, FilePasswordProvider, java.nio.file.OpenOption...) */ - public static Map<String,KeyPair> loadIdentities( - Path dir, boolean strict, Collection<String> types, Transformer<String,String> idGenerator, FilePasswordProvider provider, LinkOption ... options) - throws IOException, GeneralSecurityException { - Map<String,Path> paths = scanIdentitiesFolder(dir, strict, types, idGenerator, options); + public static Map<String, KeyPair> loadIdentities( + Path dir, boolean strict, Collection<String> types, Transformer<String, String> idGenerator, FilePasswordProvider provider, LinkOption... options) + throws IOException, GeneralSecurityException { + Map<String, Path> paths = scanIdentitiesFolder(dir, strict, types, idGenerator, options); return IdentityUtils.loadIdentities(paths, provider, IoUtils.EMPTY_OPEN_OPTIONS); } - + /** * Scans a folder for possible identity files - * @param dir The {@link Path} of the folder to scan - ignored if not exists - * @param strict If {@code true} then files that do not have the required - * access rights are excluded from consideration - * @param types The identity types - ignored if {@code null}/empty + * + * @param dir The {@link Path} of the folder to scan - ignored if not exists + * @param strict If {@code true} then files that do not have the required + * access rights are excluded from consideration + * @param types The identity types - ignored if {@code null}/empty * @param idGenerator A {@link Transformer} to derive the file name - * holding the specified type - * @param options The {@link LinkOption}s to apply when checking - * for existence + * holding the specified type + * @param options The {@link LinkOption}s to apply when checking + * for existence * @return A {@link Map} of the found files where key=identity type (case * <U>insensitive</U>), value=the {@link Path} of the file holding the key * @throws IOException If failed to access the file system * @see KeyUtils#validateStrictKeyFilePermissions(Path, LinkOption...) */ - public static Map<String,Path> scanIdentitiesFolder( - Path dir, boolean strict, Collection<String> types, Transformer<String,String> idGenerator, LinkOption ... options) - throws IOException { + public static Map<String, Path> scanIdentitiesFolder( + Path dir, boolean strict, Collection<String> types, Transformer<String, String> idGenerator, LinkOption... options) + throws IOException { if (GenericUtils.isEmpty(types)) { return Collections.emptyMap(); } - + if (!Files.exists(dir, options)) { return Collections.emptyMap(); } - + ValidateUtils.checkTrue(Files.isDirectory(dir, options), "Not a directory: %s", dir); - - Map<String,Path> paths = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + Map<String, Path> paths = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (String t : types) { String fileName = idGenerator.transform(t); Path p = dir.resolve(fileName); if (!Files.exists(p, options)) { continue; } - + if (strict) { PosixFilePermission perm = KeyUtils.validateStrictKeyFilePermissions(p, options); if (perm != null) { @@ -337,7 +341,7 @@ public final class ClientIdentity { Path prev = paths.put(t, p); ValidateUtils.checkTrue(prev == null, "Multiple mappings for type=%s", t); } - + return paths; } }
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/future/AuthFuture.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/AuthFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/AuthFuture.java index 11fd830..2972567 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/future/AuthFuture.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/future/AuthFuture.java @@ -31,18 +31,21 @@ import org.apache.sshd.common.future.SshFuture; public interface AuthFuture extends SshFuture<AuthFuture> { /** * Wait and verify that the authentication succeeded. + * * @throws IOException if the authentication failed for any reason */ void verify() throws IOException; /** * Wait and verify that the authentication succeeded within the specified timeout. + * * @throws IOException if the authentication failed for any reason */ void verify(long timeout, TimeUnit unit) throws IOException; /** * Wait and verify that the authentication succeeded within the specified timeout. + * * @throws IOException if the authentication failed for any reason */ void verify(long timeoutMillis) throws IOException; @@ -51,7 +54,7 @@ public interface AuthFuture extends SshFuture<AuthFuture> { * Returns the cause of the connection failure. * * @return <tt>null</tt> if the connect operation is not finished yet, - * or if the connection attempt is successful. + * or if the connection attempt is successful. */ Throwable getException(); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/future/ConnectFuture.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/ConnectFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/ConnectFuture.java index 3bbefa9..43fe89b 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/future/ConnectFuture.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/future/ConnectFuture.java @@ -26,7 +26,7 @@ import org.apache.sshd.common.future.SshFuture; /** * An {@link SshFuture} for asynchronous connections requests. - * + * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public interface ConnectFuture extends SshFuture<ConnectFuture> { @@ -35,13 +35,14 @@ public interface ConnectFuture extends SshFuture<ConnectFuture> { // wait and verify that connection succeeded within specified timeout ConnectFuture verify(long count, TimeUnit unit) throws IOException; + ConnectFuture verify(long timeout) throws IOException; - + /** * Returns the cause of the connection failure. * * @return <tt>null</tt> if the connect operation is not finished yet, - * or if the connection attempt is successful. + * or if the connection attempt is successful. */ Throwable getException(); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java index 9a79045..97e00b3 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultAuthFuture.java @@ -23,7 +23,6 @@ import java.util.concurrent.TimeUnit; import org.apache.sshd.common.SshException; import org.apache.sshd.common.future.DefaultSshFuture; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; @@ -44,7 +43,7 @@ public class DefaultAuthFuture extends DefaultSshFuture<AuthFuture> implements A @Override // TODO for JDK-8 make this a default method public void verify(long timeout, TimeUnit unit) throws IOException { - verify(unit.toMillis(timeout)); + verify(unit.toMillis(timeout)); } @Override http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java index 5963df9..bedac92 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultConnectFuture.java @@ -25,7 +25,6 @@ import org.apache.sshd.client.session.ClientSession; import org.apache.sshd.common.RuntimeSshException; import org.apache.sshd.common.future.DefaultSshFuture; import org.apache.sshd.common.io.IoSession; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; /** @@ -42,7 +41,7 @@ public class DefaultConnectFuture extends DefaultSshFuture<ConnectFuture> implem public ConnectFuture verify(long count, TimeUnit unit) throws IOException { return verify(unit.toMillis(count)); } - + @Override // TODO in JDK-8 make this a default method public ConnectFuture verify(long timeout) throws IOException { long startTime = System.nanoTime(); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java index 081e242..15385c7 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/future/DefaultOpenFuture.java @@ -23,7 +23,6 @@ import java.util.concurrent.TimeUnit; import org.apache.sshd.common.SshException; import org.apache.sshd.common.future.DefaultSshFuture; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; /** @@ -43,7 +42,7 @@ public class DefaultOpenFuture extends DefaultSshFuture<OpenFuture> implements O @Override // TODO for JDK-8 make this a default method public void verify(long timeout, TimeUnit unit) throws IOException { - verify(unit.toMillis(timeout)); + verify(unit.toMillis(timeout)); } @Override // TODO for JDK-8 make this a default method http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/future/OpenFuture.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/future/OpenFuture.java b/sshd-core/src/main/java/org/apache/sshd/client/future/OpenFuture.java index b80dc03..116f9e5 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/future/OpenFuture.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/future/OpenFuture.java @@ -31,17 +31,20 @@ import org.apache.sshd.common.future.SshFuture; public interface OpenFuture extends SshFuture<OpenFuture> { /** * Wait and verify that the channel has been successfully opened. + * * @throws IOException if the action failed for any reason */ void verify() throws IOException; + void verify(long timeout, TimeUnit unit) throws IOException; + void verify(long timeoutMillis) throws IOException; /** * Returns the cause of the connection failure. * * @return <tt>null</tt> if the connect operation is not finished yet, - * or if the connection attempt is successful. + * or if the connection attempt is successful. */ Throwable getException(); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/kex/AbstractDHClientKeyExchange.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/kex/AbstractDHClientKeyExchange.java b/sshd-core/src/main/java/org/apache/sshd/client/kex/AbstractDHClientKeyExchange.java index 1a73680..ed4e18b 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/kex/AbstractDHClientKeyExchange.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/kex/AbstractDHClientKeyExchange.java @@ -24,7 +24,6 @@ import java.security.PublicKey; import org.apache.sshd.client.session.ClientSession; import org.apache.sshd.common.kex.dh.AbstractDHKeyExchange; import org.apache.sshd.common.session.AbstractSession; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; /** @@ -38,8 +37,8 @@ public abstract class AbstractDHClientKeyExchange extends AbstractDHKeyExchange } @Override - public void init(AbstractSession s, byte[] V_S, byte[] V_C, byte[] I_S, byte[] I_C) throws Exception { - super.init(s, V_S, V_C, I_S, I_C); + public void init(AbstractSession s, byte[] v_s, byte[] v_c, byte[] i_s, byte[] i_c) throws Exception { + super.init(s, v_s, v_c, i_s, i_c); ValidateUtils.checkTrue(s instanceof ClientSession, "Using a client side KeyExchange on a server"); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGClient.java b/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGClient.java index 5f6250c..1b11e1b 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGClient.java @@ -47,6 +47,10 @@ public class DHGClient extends AbstractDHClientKeyExchange { protected final DHFactory factory; protected AbstractDH dh; + protected DHGClient(DHFactory factory) { + this.factory = ValidateUtils.checkNotNull(factory, "No factory"); + } + public static final KeyExchangeFactory newFactory(final DHFactory delegate) { return new KeyExchangeFactory() { @Override @@ -68,22 +72,18 @@ public class DHGClient extends AbstractDHClientKeyExchange { }; } - protected DHGClient(DHFactory factory) { - this.factory = ValidateUtils.checkNotNull(factory, "No factory"); - } - @Override - public void init(AbstractSession s, byte[] V_S, byte[] V_C, byte[] I_S, byte[] I_C) throws Exception { - super.init(s, V_S, V_C, I_S, I_C); + public void init(AbstractSession s, byte[] v_s, byte[] v_c, byte[] i_s, byte[] i_c) throws Exception { + super.init(s, v_s, v_c, i_s, i_c); dh = getDH(); - hash = dh.getHash(); + hash = dh.getHash(); hash.init(); e = dh.getE(); log.debug("Send SSH_MSG_KEXDH_INIT"); Buffer buffer = s.createBuffer(SshConstants.SSH_MSG_KEXDH_INIT); buffer.putMPInt(e); - + s.writePacket(buffer); } @@ -96,18 +96,18 @@ public class DHGClient extends AbstractDHClientKeyExchange { int cmd = buffer.getUByte(); if (cmd != SshConstants.SSH_MSG_KEXDH_REPLY) { throw new SshException(SshConstants.SSH2_DISCONNECT_KEY_EXCHANGE_FAILED, - "Protocol error: expected packet SSH_MSG_KEXDH_REPLY, got " + cmd); + "Protocol error: expected packet SSH_MSG_KEXDH_REPLY, got " + cmd); } log.debug("Received SSH_MSG_KEXDH_REPLY"); - - byte[] K_S = buffer.getBytes(); + + byte[] k_s = buffer.getBytes(); f = buffer.getMPIntAsBytes(); byte[] sig = buffer.getBytes(); dh.setF(f); - K = dh.getK(); + k = dh.getK(); - buffer = new ByteArrayBuffer(K_S); + buffer = new ByteArrayBuffer(k_s); serverKey = buffer.getRawPublicKey(); final String keyAlg = KeyUtils.getKeyType(serverKey); if (GenericUtils.isEmpty(keyAlg)) { @@ -115,24 +115,24 @@ public class DHGClient extends AbstractDHClientKeyExchange { } buffer = new ByteArrayBuffer(); - buffer.putBytes(V_C); - buffer.putBytes(V_S); - buffer.putBytes(I_C); - buffer.putBytes(I_S); - buffer.putBytes(K_S); + buffer.putBytes(v_c); + buffer.putBytes(v_s); + buffer.putBytes(i_c); + buffer.putBytes(i_s); + buffer.putBytes(k_s); buffer.putMPInt(e); buffer.putMPInt(f); - buffer.putMPInt(K); + buffer.putMPInt(k); hash.update(buffer.array(), 0, buffer.available()); - H = hash.digest(); + h = hash.digest(); Session session = getSession(); FactoryManager manager = session.getFactoryManager(); Signature verif = ValidateUtils.checkNotNull(NamedFactory.Utils.create(manager.getSignatureFactories(), keyAlg), - "No verifier located for algorithm=%s", - keyAlg); + "No verifier located for algorithm=%s", + keyAlg); verif.initVerifier(serverKey); - verif.update(H); + verif.update(h); if (!verif.verify(sig)) { throw new SshException(SshConstants.SSH2_DISCONNECT_KEY_EXCHANGE_FAILED, "KeyExchange signature verification failed"); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java b/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java index 3490b0e..d118178 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java @@ -53,7 +53,11 @@ public class DHGEXClient extends AbstractDHClientKeyExchange { protected byte[] p; protected byte[] g; - public static final KeyExchangeFactory newFactory(final DHFactory delegate) { + protected DHGEXClient(DHFactory factory) { + this.factory = ValidateUtils.checkNotNull(factory, "No factory"); + } + + public static KeyExchangeFactory newFactory(final DHFactory delegate) { return new KeyExchangeFactory() { @Override public String getName() { @@ -73,13 +77,10 @@ public class DHGEXClient extends AbstractDHClientKeyExchange { } }; } - protected DHGEXClient(DHFactory factory) { - this.factory = ValidateUtils.checkNotNull(factory, "No factory"); - } @Override - public void init(AbstractSession s, byte[] V_S, byte[] V_C, byte[] I_S, byte[] I_C) throws Exception { - super.init(s, V_S, V_C, I_S, I_C); + public void init(AbstractSession s, byte[] v_s, byte[] v_c, byte[] i_s, byte[] i_c) throws Exception { + super.init(s, v_s, v_c, i_s, i_c); log.debug("Send SSH_MSG_KEX_DH_GEX_REQUEST"); Buffer buffer = s.createBuffer(SshConstants.SSH_MSG_KEX_DH_GEX_REQUEST); buffer.putInt(min); @@ -119,13 +120,13 @@ public class DHGEXClient extends AbstractDHClientKeyExchange { if (cmd == SshConstants.SSH_MSG_KEX_DH_GEX_REPLY) { log.debug("Received SSH_MSG_KEX_DH_GEX_REPLY"); - byte[] K_S = buffer.getBytes(); + byte[] k_s = buffer.getBytes(); f = buffer.getMPIntAsBytes(); byte[] sig = buffer.getBytes(); dh.setF(f); - K = dh.getK(); + k = dh.getK(); - buffer = new ByteArrayBuffer(K_S); + buffer = new ByteArrayBuffer(k_s); serverKey = buffer.getRawPublicKey(); final String keyAlg = KeyUtils.getKeyType(serverKey); if (GenericUtils.isEmpty(keyAlg)) { @@ -133,11 +134,11 @@ public class DHGEXClient extends AbstractDHClientKeyExchange { } buffer = new ByteArrayBuffer(); - buffer.putBytes(V_C); - buffer.putBytes(V_S); - buffer.putBytes(I_C); - buffer.putBytes(I_S); - buffer.putBytes(K_S); + buffer.putBytes(v_c); + buffer.putBytes(v_s); + buffer.putBytes(i_c); + buffer.putBytes(i_s); + buffer.putBytes(k_s); buffer.putInt(min); buffer.putInt(prf); buffer.putInt(max); @@ -145,9 +146,9 @@ public class DHGEXClient extends AbstractDHClientKeyExchange { buffer.putMPInt(g); buffer.putMPInt(e); buffer.putMPInt(f); - buffer.putMPInt(K); + buffer.putMPInt(k); hash.update(buffer.array(), 0, buffer.available()); - H = hash.digest(); + h = hash.digest(); Session session = getSession(); FactoryManager manager = session.getFactoryManager(); @@ -156,7 +157,7 @@ public class DHGEXClient extends AbstractDHClientKeyExchange { "No verifier located for algorithm=%s", keyAlg); verif.initVerifier(serverKey); - verif.update(H); + verif.update(h); if (!verif.verify(sig)) { throw new SshException(SshConstants.SSH2_DISCONNECT_KEY_EXCHANGE_FAILED, "KeyExchange signature verification failed"); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/AcceptAllServerKeyVerifier.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/AcceptAllServerKeyVerifier.java b/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/AcceptAllServerKeyVerifier.java index d824a2a..64653e8 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/AcceptAllServerKeyVerifier.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/AcceptAllServerKeyVerifier.java @@ -25,9 +25,9 @@ package org.apache.sshd.client.keyverifier; * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public final class AcceptAllServerKeyVerifier extends StaticServerKeyVerifier { - public static final AcceptAllServerKeyVerifier INSTANCE = new AcceptAllServerKeyVerifier(); + public static final AcceptAllServerKeyVerifier INSTANCE = new AcceptAllServerKeyVerifier(); - private AcceptAllServerKeyVerifier() { - super(true); - } + private AcceptAllServerKeyVerifier() { + super(true); + } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/DelegatingServerKeyVerifier.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/DelegatingServerKeyVerifier.java b/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/DelegatingServerKeyVerifier.java index 73ba903..ab33027 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/DelegatingServerKeyVerifier.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/DelegatingServerKeyVerifier.java @@ -38,17 +38,17 @@ public class DelegatingServerKeyVerifier extends AbstractLoggingBean implements super(); } - @Override + @Override public boolean verifyServerKey(ClientSession sshClientSession, SocketAddress remoteAddress, PublicKey serverKey) { - Map<Object, Object> metadataMap = sshClientSession.getMetadataMap(); - Object verifier = metadataMap.get(ServerKeyVerifier.class); - if (verifier == null) { - if (log.isTraceEnabled()) { - log.trace("verifyServerKey(" + remoteAddress + ") No verifier found in ClientSession metadata; accepting server key"); - } - return true; - } - // We throw if it's not a ServerKeyVerifier... - return ((ServerKeyVerifier) verifier).verifyServerKey(sshClientSession, remoteAddress, serverKey); - } + Map<Object, Object> metadataMap = sshClientSession.getMetadataMap(); + Object verifier = metadataMap.get(ServerKeyVerifier.class); + if (verifier == null) { + if (log.isTraceEnabled()) { + log.trace("verifyServerKey(" + remoteAddress + ") No verifier found in ClientSession metadata; accepting server key"); + } + return true; + } + // We throw if it's not a ServerKeyVerifier... + return ((ServerKeyVerifier) verifier).verifyServerKey(sshClientSession, remoteAddress, serverKey); + } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/RequiredServerKeyVerifier.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/RequiredServerKeyVerifier.java b/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/RequiredServerKeyVerifier.java index 6cd5dbc..4c10165 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/RequiredServerKeyVerifier.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/RequiredServerKeyVerifier.java @@ -32,26 +32,26 @@ import org.apache.sshd.common.util.logging.AbstractLoggingBean; * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public class RequiredServerKeyVerifier extends AbstractLoggingBean implements ServerKeyVerifier { - private final PublicKey requiredKey; + private final PublicKey requiredKey; - public RequiredServerKeyVerifier(PublicKey requiredKey) { - this.requiredKey = requiredKey; - } + public RequiredServerKeyVerifier(PublicKey requiredKey) { + this.requiredKey = requiredKey; + } - public final PublicKey getRequiredKey() { - return requiredKey; - } + public final PublicKey getRequiredKey() { + return requiredKey; + } - @Override + @Override public boolean verifyServerKey(ClientSession sshClientSession, SocketAddress remoteAddress, PublicKey serverKey) { - if (requiredKey.equals(serverKey)) { - if (log.isDebugEnabled()) { - log.debug("Server at {} presented expected key: {}", remoteAddress, BufferUtils.printHex(serverKey.getEncoded())); - } - return true; - } else { + if (requiredKey.equals(serverKey)) { + if (log.isDebugEnabled()) { + log.debug("Server at {} presented expected key: {}", remoteAddress, BufferUtils.printHex(serverKey.getEncoded())); + } + return true; + } else { log.error("Server at {} presented wrong key: {}", remoteAddress, BufferUtils.printHex(serverKey.getEncoded())); return false; } - } + } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/StaticServerKeyVerifier.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/StaticServerKeyVerifier.java b/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/StaticServerKeyVerifier.java index 18bb93a..09111bd 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/StaticServerKeyVerifier.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/keyverifier/StaticServerKeyVerifier.java @@ -29,10 +29,11 @@ import org.apache.sshd.common.util.logging.AbstractLoggingBean; /** * Returns the same constant answer {@code true/false} regardless + * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public abstract class StaticServerKeyVerifier extends AbstractLoggingBean implements ServerKeyVerifier { - private final boolean acceptance; + private final boolean acceptance; protected StaticServerKeyVerifier(boolean acceptance) { this.acceptance = acceptance; @@ -46,12 +47,12 @@ public abstract class StaticServerKeyVerifier extends AbstractLoggingBean implem public final boolean verifyServerKey(ClientSession sshClientSession, SocketAddress remoteAddress, PublicKey serverKey) { if (isAccepted()) { log.warn("Server at {} presented unverified {} key: {}", - new Object[] { remoteAddress, (serverKey == null) ? null : serverKey.getAlgorithm(), KeyUtils.getFingerPrint(serverKey) }); + new Object[]{remoteAddress, (serverKey == null) ? null : serverKey.getAlgorithm(), KeyUtils.getFingerPrint(serverKey)}); return true; } else { if (log.isDebugEnabled()) { log.debug("Reject server {} unverified {} key: {}", - new Object[] { remoteAddress, (serverKey == null) ? null : serverKey.getAlgorithm(), KeyUtils.getFingerPrint(serverKey) }); + new Object[]{remoteAddress, (serverKey == null) ? null : serverKey.getAlgorithm(), KeyUtils.getFingerPrint(serverKey)}); } return false; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java b/sshd-core/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java index 4e14ffa..dc1d2bf 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/scp/AbstractScpClient.java @@ -106,7 +106,7 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S local = ValidateUtils.checkNotNull(local, "Invalid argument local: %s", local); remote = ValidateUtils.checkNotNullAndNotEmpty(remote, "Invalid argument remote: %s", remote); - LinkOption[] opts = IoUtils.getLinkOptions(false); + LinkOption[] opts = IoUtils.getLinkOptions(false); if (Files.isDirectory(local, opts)) { options = addTargetIsDirectory(options); } @@ -133,7 +133,7 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S @Override public byte[] downloadBytes(String remote) throws IOException { - try(ByteArrayOutputStream local = new ByteArrayOutputStream()) { + try (ByteArrayOutputStream local = new ByteArrayOutputStream()) { download(remote, local); return local.toByteArray(); } @@ -146,7 +146,7 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S @Override public void upload(String local, String remote, Collection<Option> options) throws IOException { - upload(new String[] { ValidateUtils.checkNotNullAndNotEmpty(local, "Invalid argument local: %s", local) }, remote, options); + upload(new String[]{ValidateUtils.checkNotNullAndNotEmpty(local, "Invalid argument local: %s", local)}, remote, options); } @Override @@ -158,10 +158,11 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S public void upload(Path local, String remote, Option... options) throws IOException { upload(local, remote, GenericUtils.isEmpty(options) ? Collections.<Option>emptySet() : GenericUtils.of(options)); } - + @Override public void upload(Path local, String remote, Collection<Option> options) throws IOException { - upload(new Path[] { ValidateUtils.checkNotNull(local, "Invalid local argument: %s", local) }, remote, GenericUtils.isEmpty(options) ? Collections.<Option>emptySet() : GenericUtils.of(options)); + upload(new Path[]{ValidateUtils.checkNotNull(local, "Invalid local argument: %s", local)}, + remote, GenericUtils.isEmpty(options) ? Collections.<Option>emptySet() : GenericUtils.of(options)); } @Override @@ -176,14 +177,14 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S @Override public void upload(byte[] data, int offset, int len, String remote, Collection<PosixFilePermission> perms, ScpTimestamp time) throws IOException { - try(InputStream local = new ByteArrayInputStream(data, offset, len)) { + try (InputStream local = new ByteArrayInputStream(data, offset, len)) { upload(local, remote, len, perms, time); } } @Override public void upload(String[] local, String remote, Collection<Option> options) throws IOException { - final Collection<String> paths=Arrays.asList(ValidateUtils.checkNotNullAndNotEmpty(local, "Invalid argument local: %s", (Object) local)); + final Collection<String> paths = Arrays.asList(ValidateUtils.checkNotNullAndNotEmpty(local, "Invalid argument local: %s", (Object) local)); runUpload(remote, options, paths, new ScpOperationExecutor<String>() { @Override public void execute(ScpHelper helper, Collection<String> local, Collection<Option> sendOptions) throws IOException { @@ -194,7 +195,7 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S @Override public void upload(Path[] local, String remote, Collection<Option> options) throws IOException { - final Collection<Path> paths=Arrays.asList(ValidateUtils.checkNotNullAndNotEmpty(local, "Invalid argument local: %s", (Object) local)); + final Collection<Path> paths = Arrays.asList(ValidateUtils.checkNotNullAndNotEmpty(local, "Invalid argument local: %s", (Object) local)); runUpload(remote, options, paths, new ScpOperationExecutor<Path>() { @Override public void execute(ScpHelper helper, Collection<Path> local, Collection<Option> sendOptions) throws IOException { @@ -211,7 +212,7 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S options = GenericUtils.isEmpty(options) ? EnumSet.noneOf(Option.class) : GenericUtils.of(options); options.add(Option.TargetIsDirectory); } - + return options; } @@ -223,7 +224,8 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S long startTime = System.nanoTime(); try { channel.open().verify(waitTimeout); - long endTime = System.nanoTime(), nanosWait = endTime - startTime; + long endTime = System.nanoTime(); + long nanosWait = endTime - startTime; if (log.isTraceEnabled()) { log.trace("openCommandChannel(" + session + ")[" + cmd + "]" + " completed after " + nanosWait @@ -231,8 +233,9 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S } return channel; - } catch(IOException | RuntimeException e) { - long endTime = System.nanoTime(), nanosWait = endTime - startTime; + } catch (IOException | RuntimeException e) { + long endTime = System.nanoTime(); + long nanosWait = endTime - startTime; if (log.isTraceEnabled()) { log.trace("openCommandChannel(" + session + ")[" + cmd + "]" + " failed (" + e.getClass().getSimpleName() + ")" @@ -276,7 +279,7 @@ public abstract class AbstractScpClient extends AbstractLoggingBean implements S return sb.toString(); } - public static interface ScpOperationExecutor<T> { + public interface ScpOperationExecutor<T> { void execute(ScpHelper helper, Collection<T> local, Collection<Option> options) throws IOException; } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java b/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java index d3e4750..20e14be 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/scp/DefaultScpClient.java @@ -38,7 +38,6 @@ import org.apache.sshd.common.scp.ScpHelper; import org.apache.sshd.common.scp.ScpSourceStreamResolver; import org.apache.sshd.common.scp.ScpTimestamp; import org.apache.sshd.common.scp.ScpTransferEventListener; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; /** @@ -96,10 +95,10 @@ public class DefaultScpClient extends AbstractScpClient { try { ScpHelper helper = new ScpHelper(channel.getInvertedOut(), channel.getInvertedIn(), fs, listener); helper.receive(local, - options.contains(Option.Recursive), - options.contains(Option.TargetIsDirectory), - options.contains(Option.PreserveAttributes), - ScpHelper.DEFAULT_RECEIVE_BUFFER_SIZE); + options.contains(Option.Recursive), + options.contains(Option.TargetIsDirectory), + options.contains(Option.PreserveAttributes), + ScpHelper.DEFAULT_RECEIVE_BUFFER_SIZE); } finally { channel.close(false); } @@ -109,51 +108,15 @@ public class DefaultScpClient extends AbstractScpClient { public void upload(final InputStream local, final String remote, final long size, final Collection<PosixFilePermission> perms, final ScpTimestamp time) throws IOException { int namePos = ValidateUtils.checkNotNullAndNotEmpty(remote, "No remote location specified").lastIndexOf('/'); final String name = (namePos < 0) - ? remote - : ValidateUtils.checkNotNullAndNotEmpty(remote.substring(namePos + 1), "No name value in remote=%s", remote) - ; + ? remote + : ValidateUtils.checkNotNullAndNotEmpty(remote.substring(namePos + 1), "No name value in remote=%s", remote); final String cmd = createSendCommand(remote, (time != null) ? EnumSet.of(Option.PreserveAttributes) : Collections.<Option>emptySet()); ChannelExec channel = openCommandChannel(clientSession, cmd); try { ScpHelper helper = new ScpHelper(channel.getInvertedOut(), channel.getInvertedIn(), new MockFileSystem(remote), listener); final Path mockPath = new MockPath(remote); - helper.sendStream(new ScpSourceStreamResolver() { - @Override - public String getFileName() throws IOException { - return name; - } - - @Override - public Path getEventListenerFilePath() { - return mockPath; - } - - @Override - public Collection<PosixFilePermission> getPermissions() throws IOException { - return perms; - } - - @Override - public ScpTimestamp getTimestamp() throws IOException { - return time; - } - - @Override - public long getSize() throws IOException { - return size; - } - - @Override - public InputStream resolveSourceStream() throws IOException { - return local; - } - - @Override - public String toString() { - return cmd; - } - }, - (time != null), ScpHelper.DEFAULT_SEND_BUFFER_SIZE); + helper.sendStream(new StreamResolver(name, mockPath, perms, time, size, local, cmd), + time != null, ScpHelper.DEFAULT_SEND_BUFFER_SIZE); } finally { channel.close(false); } @@ -179,7 +142,7 @@ public class DefaultScpClient extends AbstractScpClient { } finally { try { fs.close(); - } catch(UnsupportedOperationException e) { + } catch (UnsupportedOperationException e) { // Ignore } } @@ -187,4 +150,59 @@ public class DefaultScpClient extends AbstractScpClient { channel.close(false); } } + + private static class StreamResolver implements ScpSourceStreamResolver { + private final String name; + private final Path mockPath; + private final Collection<PosixFilePermission> perms; + private final ScpTimestamp time; + private final long size; + private final java.io.InputStream local; + private final String cmd; + + public StreamResolver(String name, Path mockPath, Collection<PosixFilePermission> perms, ScpTimestamp time, long size, InputStream local, String cmd) { + this.name = name; + this.mockPath = mockPath; + this.perms = perms; + this.time = time; + this.size = size; + this.local = local; + this.cmd = cmd; + } + + @Override + public String getFileName() throws java.io.IOException { + return name; + } + + @Override + public Path getEventListenerFilePath() { + return mockPath; + } + + @Override + public Collection<PosixFilePermission> getPermissions() throws IOException { + return perms; + } + + @Override + public ScpTimestamp getTimestamp() throws IOException { + return time; + } + + @Override + public long getSize() throws IOException { + return size; + } + + @Override + public InputStream resolveSourceStream() throws IOException { + return local; + } + + @Override + public String toString() { + return cmd; + } + } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/scp/ScpClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/scp/ScpClient.java b/sshd-core/src/main/java/org/apache/sshd/client/scp/ScpClient.java index 7db1d64..fe4c6da 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/scp/ScpClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/scp/ScpClient.java @@ -45,39 +45,50 @@ public interface ScpClient { * value is used */ String SCP_EXEC_CHANNEL_OPEN_TIMEOUT = "scp-exec-channel-open-timeout"; - long DEFAULT_EXEC_CHANNEL_OPEN_TIMEOUT = TimeUnit.SECONDS.toMillis(30L); + long DEFAULT_EXEC_CHANNEL_OPEN_TIMEOUT = TimeUnit.SECONDS.toMillis(30L); void download(String remote, String local, Option... options) throws IOException; + void download(String remote, String local, Collection<Option> options) throws IOException; void download(String remote, Path local, Option... options) throws IOException; + void download(String remote, Path local, Collection<Option> options) throws IOException; // NOTE: the remote location MUST be a file or an exception is generated void download(String remote, OutputStream local) throws IOException; + byte[] downloadBytes(String remote) throws IOException; void download(String[] remote, String local, Option... options) throws IOException; + void download(String[] remote, String local, Collection<Option> options) throws IOException; void download(String[] remote, Path local, Option... options) throws IOException; + void download(String[] remote, Path local, Collection<Option> options) throws IOException; void upload(String local, String remote, Option... options) throws IOException; + void upload(String local, String remote, Collection<Option> options) throws IOException; void upload(Path local, String remote, Option... options) throws IOException; + void upload(Path local, String remote, Collection<Option> options) throws IOException; void upload(String[] local, String remote, Option... options) throws IOException; + void upload(String[] local, String remote, Collection<Option> options) throws IOException; - + void upload(Path[] local, String remote, Option... options) throws IOException; + void upload(Path[] local, String remote, Collection<Option> options) throws IOException; - + // NOTE: due to SCP command limitations, the amount of data to be uploaded must be known a-priori // To upload a dynamic amount of data use SFTP void upload(byte[] data, String remote, Collection<PosixFilePermission> perms, ScpTimestamp time) throws IOException; + void upload(byte[] data, int offset, int len, String remote, Collection<PosixFilePermission> perms, ScpTimestamp time) throws IOException; + void upload(InputStream local, String remote, long size, Collection<PosixFilePermission> perms, ScpTimestamp time) throws IOException; } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java index 3525065..7d0001d 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientConnectionService.java @@ -29,7 +29,6 @@ import org.apache.sshd.common.SshConstants; import org.apache.sshd.common.SshException; import org.apache.sshd.common.session.AbstractConnectionService; import org.apache.sshd.common.session.Session; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.buffer.Buffer; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java index 9dc9ee2..74cb75e 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java @@ -24,7 +24,6 @@ import java.security.KeyPair; import java.util.Map; import org.apache.sshd.client.ClientFactoryManager; -import org.apache.sshd.client.SshClient; import org.apache.sshd.client.auth.UserInteraction; import org.apache.sshd.client.channel.ChannelDirectTcpip; import org.apache.sshd.client.channel.ChannelExec; @@ -42,20 +41,21 @@ import org.apache.sshd.common.session.Session; /** * An authenticated session to a given SSH server - * - * A client session is established using the {@link SshClient}. + * <p/> + * A client session is established using the {@link org.apache.sshd.client.SshClient}. * Once the session has been created, the user has to authenticate - * using either {@link #authPassword(String, String)} or - * {@link #authPublicKey(String, java.security.KeyPair)}. - * + * using either {@link #addPasswordIdentity(String)} or + * {@link #addPublicKeyIdentity(java.security.KeyPair)} followed by + * a call to {$link #auth()}. + * <p/> * From this session, channels can be created using the * {@link #createChannel(String)} method. Multiple channels can * be created on a given session concurrently. - * + * <p/> * When using the client in an interactive mode, the * {@link #waitFor(int, long)} method can be used to listen to specific * events such as the session being established, authenticated or closed. - * + * <p/> * When a given session is no longer used, it must be closed using the * {@link #close(boolean)} method. * @@ -63,10 +63,10 @@ import org.apache.sshd.common.session.Session; */ public interface ClientSession extends Session { - int TIMEOUT = 0x0001; - int CLOSED = 0x0002; - int WAIT_AUTH = 0x0004; - int AUTHED = 0x0008; + int TIMEOUT = 0x0001; + int CLOSED = 0x0002; + int WAIT_AUTH = 0x0004; + int AUTHED = 0x0008; /** * @param password Password to be added - may not be {@code null}/empty @@ -77,7 +77,7 @@ public interface ClientSession extends Session { * @param password The password to remove - ignored if {@code null}/empty * @return The removed password - same one that was added via * {@link #addPasswordIdentity(String)} - or {@code null} if no - * match found + * match found */ String removePasswordIdentity(String password); @@ -95,6 +95,7 @@ public interface ClientSession extends Session { KeyPair removePublicKeyIdentity(KeyPair kp); UserInteraction getUserInteraction(); + void setUserInteraction(UserInteraction userInteraction); /** @@ -143,6 +144,7 @@ public interface ClientSession extends Session { /** * Create an SCP client from this session. + * * @return An {@link ScpClient} instance. <B>Note:</B> uses the currently * registered {@link ScpTransferEventListener} if any * @see #setScpTransferEventListener(ScpTransferEventListener) @@ -151,10 +153,11 @@ public interface ClientSession extends Session { /** * Create an SCP client from this session. + * * @param listener A {@link ScpTransferEventListener} that can be used - * to receive information about the SCP operations - may be {@code null} - * to indicate no more events are required. <B>Note:</B> this listener - * is used <U>instead</U> of any listener set via {@link #setScpTransferEventListener(ScpTransferEventListener)} + * to receive information about the SCP operations - may be {@code null} + * to indicate no more events are required. <B>Note:</B> this listener + * is used <U>instead</U> of any listener set via {@link #setScpTransferEventListener(ScpTransferEventListener)} * @return An {@link ScpClient} instance */ ScpClient createScpClient(ScpTransferEventListener listener); @@ -167,31 +170,36 @@ public interface ClientSession extends Session { /** * @param listener A default {@link ScpTransferEventListener} that can be used - * to receive information about the SCP operations - may be {@code null} - * to indicate no more events are required + * to receive information about the SCP operations - may be {@code null} + * to indicate no more events are required * @see #createScpClient(ScpTransferEventListener) */ void setScpTransferEventListener(ScpTransferEventListener listener); /** * Create an SFTP client from this session. + * * @return The created {@link SftpClient} * @throws IOException if failed to create the client */ SftpClient createSftpClient() throws IOException; + /** * @param selector The {@link SftpVersionSelector} to use - <B>Note:</B> - * if the server does not support versions re-negotiation then the - * selector will be presented with only one "choice" - the - * current version + * if the server does not support versions re-negotiation then the + * selector will be presented with only one "choice" - the + * current version * @return The created {@link SftpClient} * @throws IOException If failed to create the client or re-negotiate */ SftpClient createSftpClient(SftpVersionSelector selector) throws IOException; FileSystem createSftpFileSystem() throws IOException; + FileSystem createSftpFileSystem(SftpVersionSelector selector) throws IOException; + FileSystem createSftpFileSystem(int readBufferSize, int writeBufferSize) throws IOException; + FileSystem createSftpFileSystem(SftpVersionSelector selector, int readBufferSize, int writeBufferSize) throws IOException; /** @@ -207,19 +215,18 @@ public interface ClientSession extends Session { /** * Start forwarding tcpip from the given address on the server to the * given address on the client. - * + * <p/> * The remote host name is the address to bind to on the server: * <ul> - * <li>"" means that connections are to be accepted on all protocol families - * supported by the SSH implementation</li> - * <li>"0.0.0.0" means to listen on all IPv4 addresses</li> - * <li>"::" means to listen on all IPv6 addresses</li> - * <li>"localhost" means to listen on all protocol families supported by the SSH - * implementation on loopback addresses only, [RFC3330] and RFC3513]</li> - * <li>"127.0.0.1" and "::1" indicate listening on the loopback interfaces for - * IPv4 and IPv6 respectively</li> + * <li>"" means that connections are to be accepted on all protocol families + * supported by the SSH implementation</li> + * <li>"0.0.0.0" means to listen on all IPv4 addresses</li> + * <li>"::" means to listen on all IPv6 addresses</li> + * <li>"localhost" means to listen on all protocol families supported by the SSH + * implementation on loopback addresses only, [RFC3330] and RFC3513]</li> + * <li>"127.0.0.1" and "::1" indicate listening on the loopback interfaces for + * IPv4 and IPv6 respectively</li> * </ul> - * */ SshdSocketAddress startRemotePortForwarding(SshdSocketAddress remote, SshdSocketAddress local) throws IOException; @@ -258,18 +265,19 @@ public interface ClientSession extends Session { /** * @return The ClientFactoryManager for this session. */ - @Override ClientFactoryManager getFactoryManager(); + @Override + ClientFactoryManager getFactoryManager(); /** * Switch to a none cipher for performance. - * + * <p/> * This should be done after the authentication phase has been performed. * After such a switch, interactive channels are not allowed anymore. * Both client and server must have been configured to support the none cipher. * If that's not the case, the returned future will be set with an exception. * * @return an {@link SshFuture} that can be used to wait for the exchange - * to be finished + * to be finished * @throws IOException if a key exchange is already running */ @SuppressWarnings("rawtypes") http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java index a1252af..b9b7e16 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSessionImpl.java @@ -81,32 +81,34 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession * objects are {@link String}s and equal to each other */ public static final Comparator<Object> PASSWORD_IDENTITY_COMPARATOR = new Comparator<Object>() { - @Override - public int compare(Object o1, Object o2) { - if ((!(o1 instanceof String)) || (!(o2 instanceof String))) { - return (-1); - } else { - return ((String) o1).compareTo((String) o2); - } + @Override + public int compare(Object o1, Object o2) { + if (!(o1 instanceof String) || !(o2 instanceof String)) { + return -1; + } else { + return ((String) o1).compareTo((String) o2); } - }; + } + }; /** * Compares 2 {@link KeyPair} identities - returns zero ONLY if <U>both</U> compared * objects are {@link KeyPair}s and equal to each other */ public static final Comparator<Object> KEYPAIR_IDENTITY_COMPARATOR = new Comparator<Object>() { - @Override - public int compare(Object o1, Object o2) { - if ((!(o1 instanceof KeyPair)) || (!(o2 instanceof KeyPair))) { - return (-1); - } else if (KeyUtils.compareKeyPairs((KeyPair) o1, (KeyPair) o2)) { - return 0; - } else { - return 1; - } + @Override + public int compare(Object o1, Object o2) { + if ((!(o1 instanceof KeyPair)) || (!(o2 instanceof KeyPair))) { + return -1; + } else if (KeyUtils.compareKeyPairs((KeyPair) o1, (KeyPair) o2)) { + return 0; + } else { + return 1; } - }; + } + }; + + protected AuthFuture authFuture; /** * For clients to store their own metadata @@ -122,8 +124,6 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession private UserInteraction userInteraction; private ScpTransferEventListener scpListener; - protected AuthFuture authFuture; - public ClientSessionImpl(ClientFactoryManager client, IoSession session) throws Exception { super(false, client, session); log.debug("Client session created: {}", session); @@ -153,9 +153,9 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession protected Service[] getServices() { Service[] services; if (nextService != null) { - services = new Service[] { currentService, nextService }; + services = new Service[]{currentService, nextService}; } else if (currentService != null) { - services = new Service[] { currentService }; + services = new Service[]{currentService}; } else { services = new Service[0]; } @@ -207,7 +207,7 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession if (kp == null) { return null; } - + int index = findIdentityIndex(KEYPAIR_IDENTITY_COMPARATOR, kp); if (index >= 0) { return (KeyPair) identities.remove(index); @@ -223,8 +223,8 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession return index; } } - - return (-1); + + return -1; } @Override @@ -242,10 +242,11 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession if (username == null) { throw new IllegalStateException("No username specified when the session was created"); } - + ClientUserAuthService authService = getUserAuthService(); synchronized (lock) { - return authFuture = authService.auth(identities, nextServiceName()); + authFuture = authService.auth(identities, nextServiceName()); + return authFuture; } } @@ -272,22 +273,24 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession @SuppressWarnings("rawtypes") public SshFuture switchToNoneCipher() throws IOException { if (!(currentService instanceof AbstractConnectionService) - || !((AbstractConnectionService) currentService).getChannels().isEmpty()) { + || !((AbstractConnectionService) currentService).getChannels().isEmpty()) { throw new IllegalStateException("The switch to the none cipher must be done immediately after authentication"); } if (kexState.compareAndSet(KexState.DONE, KexState.INIT)) { reexchangeFuture = new DefaultSshFuture(null); - - String c2sEncServer, s2cEncServer; - synchronized(serverProposal) { + + String c2sEncServer; + String s2cEncServer; + synchronized (serverProposal) { c2sEncServer = serverProposal.get(KexProposalOption.C2SENC); - s2cEncServer = serverProposal.get(KexProposalOption.S2CENC); + s2cEncServer = serverProposal.get(KexProposalOption.S2CENC); } boolean c2sEncServerNone = BuiltinCiphers.Constants.isNoneCipherIncluded(c2sEncServer); boolean s2cEncServerNone = BuiltinCiphers.Constants.isNoneCipherIncluded(s2cEncServer); - String c2sEncClient, s2cEncClient; - synchronized(clientProposal) { + String c2sEncClient; + String s2cEncClient; + synchronized (clientProposal) { c2sEncClient = clientProposal.get(KexProposalOption.C2SENC); s2cEncClient = clientProposal.get(KexProposalOption.S2CENC); } @@ -301,9 +304,9 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession reexchangeFuture.setValue(new SshException("Client does not support none cipher")); } else { log.info("Switching to none cipher"); - - Map<KexProposalOption,String> proposal = new EnumMap<KexProposalOption, String>(KexProposalOption.class); - synchronized(clientProposal) { + + Map<KexProposalOption, String> proposal = new EnumMap<KexProposalOption, String>(KexProposalOption.class); + synchronized (clientProposal) { proposal.putAll(clientProposal); } @@ -442,7 +445,7 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession @Override public FileSystem createSftpFileSystem(SftpVersionSelector selector, int readBufferSize, int writeBufferSize) throws IOException { SftpFileSystemProvider provider = new SftpFileSystemProvider((org.apache.sshd.client.SshClient) factoryManager, selector); - SftpFileSystem fs = provider.newFileSystem(this); + SftpFileSystem fs = provider.newFileSystem(this); fs.setReadBufferSize(readBufferSize); fs.setWriteBufferSize(writeBufferSize); return fs; @@ -536,7 +539,7 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession log.debug("Server version string: {}", serverVersion); if (!(serverVersion.startsWith("SSH-2.0-") || serverVersion.startsWith("SSH-1.99-"))) { throw new SshException(SshConstants.SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED, - "Unsupported protocol version: " + serverVersion); + "Unsupported protocol version: " + serverVersion); } return true; } @@ -548,14 +551,14 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession } @Override - protected byte[] sendKexInit(Map<KexProposalOption,String> proposal) throws IOException { + protected byte[] sendKexInit(Map<KexProposalOption, String> proposal) throws IOException { mergeProposals(clientProposal, proposal); return super.sendKexInit(proposal); } @Override protected void setKexSeed(byte... seed) { - I_C = ValidateUtils.checkNotNullAndNotEmpty(seed, "No KEX seed"); + i_c = ValidateUtils.checkNotNullAndNotEmpty(seed, "No KEX seed"); } @Override @@ -565,9 +568,9 @@ public class ClientSessionImpl extends AbstractSession implements ClientSession } @Override - protected void receiveKexInit(Map<KexProposalOption,String> proposal, byte[] seed) throws IOException { + protected void receiveKexInit(Map<KexProposalOption, String> proposal, byte[] seed) throws IOException { mergeProposals(serverProposal, proposal); - I_S = seed; + i_s = seed; } @Override http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java index 316dffc..378807a 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java @@ -52,7 +52,7 @@ public class ClientUserAuthService extends CloseableUtils.AbstractCloseable impl */ private final AuthFuture authFuture; - protected final ClientSessionImpl session; + private final ClientSessionImpl session; private List<Object> identities; private String service; @@ -62,6 +62,8 @@ public class ClientUserAuthService extends CloseableUtils.AbstractCloseable impl private List<String> serverMethods; private UserAuth userAuth; + private int currentMethod; + public ClientUserAuthService(Session s) { if (!(s instanceof ClientSessionImpl)) { throw new IllegalStateException("Client side service used on server side"); @@ -75,7 +77,7 @@ public class ClientUserAuthService extends CloseableUtils.AbstractCloseable impl String prefs = FactoryManagerUtils.getString(manager, ClientFactoryManager.PREFERRED_AUTHS); if (!GenericUtils.isEmpty(prefs)) { for (String pref : prefs.split(",")) { - NamedFactory<UserAuth> factory = NamedResource.Utils.findByName(pref, String.CASE_INSENSITIVE_ORDER, authFactories); + NamedFactory<UserAuth> factory = NamedResource.Utils.findByName(pref, String.CASE_INSENSITIVE_ORDER, authFactories); if (factory != null) { clientMethods.add(pref); } else { @@ -135,10 +137,9 @@ public class ClientUserAuthService extends CloseableUtils.AbstractCloseable impl } } - private int currentMethod; - /** * execute one step in user authentication. + * * @param buffer * @throws java.io.IOException */ @@ -209,7 +210,8 @@ public class ClientUserAuthService extends CloseableUtils.AbstractCloseable impl return; } String method = clientMethods.get(currentMethod); - if ((userAuth = NamedFactory.Utils.create(authFactories, method)) == null) { + userAuth = NamedFactory.Utils.create(authFactories, method); + if (userAuth == null) { throw new UnsupportedOperationException("Failed to find a user-auth factory for method=" + method); } userAuth.init(session, service, identities);
