import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.netconf.api.TransportConstants;
import org.opendaylight.netconf.client.NetconfClientSessionNegotiatorFactory;
+import org.opendaylight.netconf.shaded.sshd.client.ClientFactoryManager;
import org.opendaylight.netconf.shaded.sshd.client.auth.password.UserAuthPasswordFactory;
import org.opendaylight.netconf.shaded.sshd.client.auth.pubkey.UserAuthPublicKeyFactory;
import org.opendaylight.netconf.shaded.sshd.client.session.ClientSession;
// NB actual username will be assigned dynamically but predefined one is required for transport initialization
final var sshClientParams = new SshClientParametersBuilder().setClientIdentity(
new ClientIdentityBuilder().setUsername("ignored").build()).build();
- final ClientFactoryManagerConfigurator configurator = factoryMgr -> {
- factoryMgr.setServerKeyVerifier(this::verifyServerKey);
- factoryMgr.addSessionListener(createSessionListener());
- // supported auth factories
- factoryMgr.setUserAuthFactories(List.of(new UserAuthPasswordFactory(), new UserAuthPublicKeyFactory()));
+ final var configurator = new ClientFactoryManagerConfigurator() {
+ @Override
+ protected void configureClientFactoryManager(final ClientFactoryManager factoryManager) {
+ factoryManager.setServerKeyVerifier((clientSession, remoteAddress, serverKey)
+ -> verifyServerKey(clientSession, remoteAddress, serverKey));
+ factoryManager.addSessionListener(createSessionListener());
+ // supported auth factories
+ factoryManager.setUserAuthFactories(List.of(
+ new UserAuthPasswordFactory(),
+ new UserAuthPublicKeyFactory()));
+ }
};
try {
client = transportStackFactory.listenClient(TransportConstants.SSH_SUBSYSTEM, transportChannelListener,
import org.opendaylight.netconf.client.conf.NetconfClientConfigurationBuilder;
import org.opendaylight.netconf.client.mdsal.api.CredentialProvider;
import org.opendaylight.netconf.client.mdsal.api.SslContextFactoryProvider;
+import org.opendaylight.netconf.shaded.sshd.client.ClientFactoryManager;
import org.opendaylight.netconf.shaded.sshd.client.auth.pubkey.UserAuthPublicKeyFactory;
import org.opendaylight.netconf.shaded.sshd.common.keyprovider.KeyIdentityProvider;
+import org.opendaylight.netconf.transport.api.UnsupportedConfigurationException;
+import org.opendaylight.netconf.transport.ssh.ClientFactoryManagerConfigurator;
import org.opendaylight.netconf.transport.tls.FixedSslHandlerFactory;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.crypto.types.rev240208.password.grouping.password.type.CleartextPasswordBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.client.rev240208.netconf.client.initiate.stack.grouping.transport.ssh.ssh.SshClientParametersBuilder;
} else if (credentials instanceof KeyAuth keyAuth) {
final var keyBased = keyAuth.getKeyBased();
sshParamsBuilder.setClientIdentity(new ClientIdentityBuilder().setUsername(keyBased.getUsername()).build());
- confBuilder.withSshConfigurator(factoryMgr -> {
- final var keyId = keyBased.getKeyId();
- final var keyPair = credentialProvider.credentialForId(keyId);
- if (keyPair == null) {
- throw new IllegalArgumentException("No keypair found with keyId=" + keyId);
+ confBuilder.withSshConfigurator(new ClientFactoryManagerConfigurator() {
+ @Override
+ protected void configureClientFactoryManager(final ClientFactoryManager factoryManager)
+ throws UnsupportedConfigurationException {
+ final var keyId = keyBased.getKeyId();
+ final var keyPair = credentialProvider.credentialForId(keyId);
+ if (keyPair == null) {
+ throw new IllegalArgumentException("No keypair found with keyId=" + keyId);
+ }
+ factoryManager.setKeyIdentityProvider(KeyIdentityProvider.wrapKeyPairs(keyPair));
+ final var factory = new UserAuthPublicKeyFactory();
+ factory.setSignatureFactories(factoryManager.getSignatureFactories());
+ factoryManager.setUserAuthFactories(List.of(factory));
}
- factoryMgr.setKeyIdentityProvider(KeyIdentityProvider.wrapKeyPairs(keyPair));
- final var factory = new UserAuthPublicKeyFactory();
- factory.setSignatureFactories(factoryMgr.getSignatureFactories());
- factoryMgr.setUserAuthFactories(List.of(factory));
});
} else {
throw new IllegalArgumentException("Unsupported credential type: " + credentials.getClass());
import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
import org.opendaylight.netconf.client.conf.NetconfClientConfigurationBuilder;
import org.opendaylight.netconf.common.impl.DefaultNetconfTimer;
+import org.opendaylight.netconf.shaded.sshd.client.ClientFactoryManager;
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;
(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 clientConfigurator = new ClientFactoryManagerConfigurator() {
+ @Override
+ protected void configureClientFactoryManager(final ClientFactoryManager factoryManager) {
+ factoryManager.setPasswordIdentityProvider(PasswordIdentityProvider.wrapPasswords(PASSWORD));
+ factoryManager.setUserAuthFactories(List.of(
+ new org.opendaylight.netconf.shaded.sshd.client.auth.password.UserAuthPasswordFactory()));
+ }
};
final var server = SERVER_FACTORY.listenServer("netconf", serverTransportListener, tcpServerParams,
* Extension interface allowing one to customize {@link ClientFactoryManager} before it is used to create the
* {@link SSHClient} instance.
*/
-@FunctionalInterface
-public interface ClientFactoryManagerConfigurator {
+public abstract class ClientFactoryManagerConfigurator {
/**
* Apply custom configuration.
*
* @param factoryManager client factory manager instance
* @throws UnsupportedConfigurationException if the configuration is not acceptable
*/
- void configureClientFactoryManager(@NonNull ClientFactoryManager factoryManager)
+ protected abstract void configureClientFactoryManager(@NonNull ClientFactoryManager factoryManager)
throws UnsupportedConfigurationException;
}
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.netconf.shaded.sshd.client.ClientFactoryManager;
import org.opendaylight.netconf.shaded.sshd.client.auth.password.PasswordIdentityProvider;
import org.opendaylight.netconf.shaded.sshd.client.session.ClientSession;
import org.opendaylight.netconf.shaded.sshd.common.session.Session;
}
private static ClientFactoryManagerConfigurator clientConfigurator(final String username) {
- return factoryManager -> {
- factoryManager.setPasswordIdentityProvider(PasswordIdentityProvider.wrapPasswords(PASSWORD));
- factoryManager.setUserAuthFactories(List.of(
- new org.opendaylight.netconf.shaded.sshd.client.auth.password.UserAuthPasswordFactory()));
+ return new ClientFactoryManagerConfigurator() {
+ @Override
+ protected void configureClientFactoryManager(final ClientFactoryManager factoryManager)
+ throws UnsupportedConfigurationException {
+ factoryManager.setPasswordIdentityProvider(PasswordIdentityProvider.wrapPasswords(PASSWORD));
+ factoryManager.setUserAuthFactories(List.of(
+ new org.opendaylight.netconf.shaded.sshd.client.auth.password.UserAuthPasswordFactory()));
+ }
};
}