blob: 686d2de0357b31b4decc0c2651f92d368695b8c7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* http://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.
*/
package org.apache.sshd.util.test;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.time.Duration;
import java.util.ArrayList;
import org.apache.sshd.client.ClientBuilder;
import org.apache.sshd.client.SshClient;
import org.apache.sshd.client.config.hosts.HostConfigEntryResolver;
import org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.helpers.AbstractFactoryManager;
import org.apache.sshd.common.kex.BuiltinDHFactories;
import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
import org.apache.sshd.common.signature.BuiltinSignatures;
import org.apache.sshd.common.util.GenericUtils;
import org.apache.sshd.core.CoreModuleProperties;
import org.apache.sshd.server.ServerBuilder;
import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.auth.pubkey.AcceptAllPublickeyAuthenticator;
import org.apache.sshd.server.shell.UnknownCommandFactory;
public final class CoreTestSupportUtils {
public static final Duration READ_TIMEOUT = getTimeout("read.nio2", Duration.ofSeconds(60));
private CoreTestSupportUtils() {
throw new UnsupportedOperationException("No instance");
}
public static int getFreePort() throws Exception {
try (ServerSocket s = new ServerSocket()) {
s.setReuseAddress(true);
s.bind(new InetSocketAddress((InetAddress) null, 0));
return s.getLocalPort();
}
}
public static SshClient setupTestClient(Class<?> anchor) {
return setupTestClient(SshClient.setUpDefaultClient(), anchor);
}
public static <C extends SshClient> C setupTestClient(C client, Class<?> anchor) {
client.setServerKeyVerifier(AcceptAllServerKeyVerifier.INSTANCE);
client.setHostConfigEntryResolver(HostConfigEntryResolver.EMPTY);
client.setKeyIdentityProvider(KeyIdentityProvider.EMPTY_KEYS_PROVIDER);
CoreModuleProperties.NIO2_READ_TIMEOUT.set(client, READ_TIMEOUT);
return client;
}
public static SshClient setupTestFullSupportClient(Class<?> anchor) {
SshClient client = setupTestClient(anchor);
return setupTestFullSupportClient(client);
}
public static SshClient setupTestFullSupportClient(SshClient client) {
client.setKeyExchangeFactories(
NamedFactory.setUpTransformedFactories(false, BuiltinDHFactories.VALUES, ClientBuilder.DH2KEX));
setupFullSignaturesSupport(client);
return client;
}
public static SshServer setupTestServer(Class<?> anchor) {
return setupTestServer(SshServer.setUpDefaultServer(), anchor);
}
public static <S extends SshServer> S setupTestServer(S sshd, Class<?> anchor) {
sshd.setKeyPairProvider(CommonTestSupportUtils.createTestHostKeyProvider(anchor));
sshd.setPasswordAuthenticator(BogusPasswordAuthenticator.INSTANCE);
sshd.setPublickeyAuthenticator(AcceptAllPublickeyAuthenticator.INSTANCE);
sshd.setShellFactory(EchoShellFactory.INSTANCE);
sshd.setCommandFactory(UnknownCommandFactory.INSTANCE);
CoreModuleProperties.NIO2_READ_TIMEOUT.set(sshd, READ_TIMEOUT);
return sshd;
}
// Adds deprecated / insecure settings
public static SshServer setupTestFullSupportServer(Class<?> anchor) {
SshServer sshd = setupTestServer(anchor);
return setupTestFullSupportServer(sshd);
}
public static SshServer setupTestFullSupportServer(SshServer sshd) {
sshd.setKeyExchangeFactories(
NamedFactory.setUpTransformedFactories(false, BuiltinDHFactories.VALUES, ServerBuilder.DH2KEX));
setupFullSignaturesSupport(sshd);
return sshd;
}
public static <M extends AbstractFactoryManager> M setupFullSignaturesSupport(M manager) {
manager.setSignatureFactories(new ArrayList<>(BuiltinSignatures.VALUES));
return manager;
}
public static Duration getTimeout(String property, Duration defaultValue) {
// Do we have a specific timeout value ?
String str = System.getProperty("org.apache.sshd.test.timeout." + property);
if (GenericUtils.isNotEmpty(str)) {
return Duration.ofMillis(Long.parseLong(str));
}
// Do we have a specific factor ?
str = System.getProperty("org.apache.sshd.test.timeout.factor." + property);
if (GenericUtils.isEmpty(str)) {
// Do we have a global factor ?
str = System.getProperty("org.apache.sshd.test.timeout.factor");
}
if (GenericUtils.isNotEmpty(str)) {
double factor = Double.parseDouble(str);
long dur = Math.round(defaultValue.toMillis() * factor);
return Duration.ofMillis(dur);
}
return defaultValue;
}
}