} else if (SSH.equals(protocol)) {
factory.connectClient(TransportConstants.SSH_SUBSYSTEM,
new ClientTransportChannelListener(future, channelInitializer), configuration.getTcpParameters(),
- configuration.getSshParameters());
+ configuration.getSshParameters(), configuration.getSshConfigurator());
}
return future;
}
import org.opendaylight.netconf.client.SslHandlerFactory;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
+import org.opendaylight.netconf.transport.ssh.ClientFactoryManagerConfigurator;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ssh.client.rev230417.SshClientGrouping;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tcp.client.rev230417.TcpClientGrouping;
private final TlsClientGrouping tlsParameters;
private final org.opendaylight.netconf.transport.tls.SslHandlerFactory transportSslHandlerFactory;
private final SshClientGrouping sshParameters;
+ private final ClientFactoryManagerConfigurator sshConfigurator;
NetconfClientConfiguration(final NetconfClientProtocol protocol, final InetSocketAddress address,
final Long connectionTimeoutMillis,
this.tlsParameters = null;
this.transportSslHandlerFactory = null;
this.sshParameters = null;
+ this.sshConfigurator = null;
validateConfiguration();
}
final TlsClientGrouping tlsParameters,
final org.opendaylight.netconf.transport.tls.SslHandlerFactory transportSslHandlerFactory,
final SshClientGrouping sshParameters,
+ final ClientFactoryManagerConfigurator sshConfigurator,
final NetconfClientSessionListener sessionListener,
final List<Uri> odlHelloCapabilities,
final Long connectionTimeoutMillis,
this.tlsParameters = tlsParameters;
this.transportSslHandlerFactory = transportSslHandlerFactory;
this.sshParameters = sshParameters;
+ this.sshConfigurator = sshConfigurator;
this.sessionListener = requireNonNull(sessionListener);
this.odlHelloCapabilities = odlHelloCapabilities;
this.connectionTimeoutMillis = connectionTimeoutMillis;
return sshParameters;
}
+ public ClientFactoryManagerConfigurator getSshConfigurator() {
+ return sshConfigurator;
+ }
+
private void validateConfiguration() {
switch (requireNonNull(clientProtocol)) {
case TLS:
import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiator;
import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
+import org.opendaylight.netconf.transport.ssh.ClientFactoryManagerConfigurator;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ssh.client.rev230417.SshClientGrouping;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tcp.client.rev230417.TcpClientGrouping;
private TlsClientGrouping tlsParameters;
private org.opendaylight.netconf.transport.tls.SslHandlerFactory transportSslHandlerFactory;
private SshClientGrouping sshParameters;
+ private ClientFactoryManagerConfigurator sshConfigurator;
protected NetconfClientConfigurationBuilder() {
}
return this;
}
+ /**
+ * Set SSH Client Factory Manager configurator.
+ *
+ * @param sshConfigurator configurator
+ * @return current builder instance
+ */
+ @SuppressWarnings("checkstyle:hiddenField")
+ public NetconfClientConfigurationBuilder withSshConfigurator(
+ final ClientFactoryManagerConfigurator sshConfigurator) {
+ this.sshConfigurator = sshConfigurator;
+ return this;
+ }
+
final InetSocketAddress getAddress() {
return address;
}
maximumIncomingChunkSize, name)
// new configuration
: new NetconfClientConfiguration(clientProtocol, tcpParameters, tlsParameters, transportSslHandlerFactory,
- sshParameters, sessionListener, odlHelloCapabilities, connectionTimeoutMillis,
+ sshParameters, sshConfigurator, sessionListener, odlHelloCapabilities, connectionTimeoutMillis,
maximumIncomingChunkSize, additionalHeader, name);
}
}
import org.mockito.junit.jupiter.MockitoExtension;
import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
import org.opendaylight.netconf.client.conf.NetconfClientConfigurationBuilder;
+import org.opendaylight.netconf.shaded.sshd.client.auth.password.PasswordIdentityProvider;
+import org.opendaylight.netconf.shaded.sshd.server.auth.password.UserAuthPasswordFactory;
+import org.opendaylight.netconf.shaded.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.opendaylight.netconf.transport.api.TransportChannel;
import org.opendaylight.netconf.transport.api.TransportChannelListener;
+import org.opendaylight.netconf.transport.ssh.ClientFactoryManagerConfigurator;
import org.opendaylight.netconf.transport.ssh.SSHTransportStackFactory;
+import org.opendaylight.netconf.transport.ssh.ServerFactoryManagerConfigurator;
import org.opendaylight.netconf.transport.tcp.TCPServer;
import org.opendaylight.netconf.transport.tls.TLSServer;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.crypt.hash.rev140806.CryptHash;
new UsersBuilder().setUser(Map.of(user.key(), user)).build()
).build();
}
+
+ @Test
+ void sshClientWithConfigurator() throws Exception {
+ final ServerFactoryManagerConfigurator serverConfigurator = factoryManager -> {
+ factoryManager.setUserAuthFactories(List.of(new UserAuthPasswordFactory()));
+ factoryManager.setPasswordAuthenticator(
+ (usr, psw, session) -> USERNAME.equals(usr) && PASSWORD.equals(psw));
+ factoryManager.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
+ };
+ final ClientFactoryManagerConfigurator clientConfigurator = factoryManager -> {
+ factoryManager.setPasswordIdentityProvider(PasswordIdentityProvider.wrapPasswords(PASSWORD));
+ factoryManager.setUserAuthFactories(List.of(
+ new org.opendaylight.netconf.shaded.sshd.client.auth.password.UserAuthPasswordFactory()));
+ };
+
+ final var server = serverTransportFactory.listenServer("netconf", serverTransportListener, tcpServerParams,
+ null, serverConfigurator).get(10, TimeUnit.SECONDS);
+ try {
+ final var clientConfig = NetconfClientConfigurationBuilder.create()
+ .withProtocol(NetconfClientConfiguration.NetconfClientProtocol.SSH)
+ .withTcpParameters(tcpClientParams)
+ .withSshParameters(new SshClientParametersBuilder()
+ .setClientIdentity(new ClientIdentityBuilder().setUsername(USERNAME).build()).build())
+ .withSshConfigurator(clientConfigurator)
+ .withSessionListener(sessionListener)
+ .withConnectionTimeoutMillis(10_000)
+ .build();
+ assertNotNull(factory.createClient(clientConfig));
+ verify(serverTransportListener, timeout(10_000L))
+ .onTransportChannelEstablished(any(TransportChannel.class));
+ } finally {
+ server.shutdown().get(1, TimeUnit.SECONDS);
+ }
+ }
}