Skip to content

Commit

Permalink
eclipse-ditto#985 review addition of ssh tunnel to connection model, …
Browse files Browse the repository at this point in the history
…add username to ssh public key credentials

Signed-off-by: Dominik Guggemos <dominik.guggemos@bosch.io>
  • Loading branch information
dguggemos committed Mar 19, 2021
1 parent 6a1a5b5 commit 6e7a701
Show file tree
Hide file tree
Showing 25 changed files with 212 additions and 377 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,11 @@ public Optional<String> getClientKey() {

@Override
public boolean equals(final Object o) {
if (o instanceof ClientCertificateCredentials) {
final ClientCertificateCredentials that = (ClientCertificateCredentials) o;
return Objects.equals(clientCertificate, that.clientCertificate) &&
Objects.equals(clientKey, that.clientKey);
} else {
return false;
}
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final ClientCertificateCredentials that = (ClientCertificateCredentials) o;
return Objects.equals(clientCertificate, that.clientCertificate) &&
Objects.equals(clientKey, that.clientKey);
}

@Override
Expand All @@ -86,7 +84,8 @@ public int hashCode() {
@Override
public String toString() {
return getClass().getSimpleName() + " [" +
"hashCode=" + hashCode() +
"clientCertificate=" + clientCertificate +
", clientKey=" + clientKey +
"]";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -783,7 +783,7 @@ public static Target newTarget(final String address,
* @return new {@link org.eclipse.ditto.model.connectivity.SshTunnelBuilder} builder
* @since 2.0.0
*/
public static SshTunnelBuilder newSshTunnelBuilder(final Boolean enabled, final Credentials credentials,
public static SshTunnelBuilder newSshTunnelBuilder(final boolean enabled, final Credentials credentials,
final String uri) {
return new ImmutableSshTunnel.Builder(enabled, credentials, uri);
}
Expand Down Expand Up @@ -814,29 +814,29 @@ public static SshTunnel sshTunnelFromJson(final JsonObject jsonObject) {
/**
* Creates a new {@code SshTunnel}.
*
* @param enabled sets if the ssh tunnel is active
* @param enabled {@code true} if the ssh tunnel is enabled
* @param credentials the credentials of the ssh tunnel
* @param validateHost {@code true} if host validation is enabled
* @param knownHosts the known hosts of the ssh tunnel
* @param uri the uri of the ssh tunnel
* @return the created {@link org.eclipse.ditto.model.connectivity.SshTunnel}
* @since 2.0.0
*/
public static SshTunnel newSshTunnel(final Boolean enabled, final Credentials credentials,
public static SshTunnel newSshTunnel(final boolean enabled, final Credentials credentials,
final boolean validateHost, final List<String> knownHosts, final String uri) {
return new ImmutableSshTunnel.Builder(enabled, credentials, validateHost, knownHosts, uri).build();
}

/**
* Creates a new {@code SshTunnel} without knownHosts.
*
* @param enabled sets if the ssh tunnel is active
* @param enabled {@code true} if the ssh tunnel is enabled
* @param credentials the credentials of the ssh tunnel
* @param uri the uri of the ssh tunnel
* @return the created {@link org.eclipse.ditto.model.connectivity.SshTunnel}
* @since 2.0.0
*/
public static SshTunnel newSshTunnel(final Boolean enabled, final Credentials credentials, final String uri) {
public static SshTunnel newSshTunnel(final boolean enabled, final Credentials credentials, final String uri) {
return new ImmutableSshTunnel.Builder(enabled, credentials, uri).build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ abstract class JsonFields {
static {
// load subclasses in this package.
registerDeserializer(ClientCertificateCredentials.TYPE, ClientCertificateCredentials::fromJson);
registerDeserializer(KeyPairCredentials.TYPE, KeyPairCredentials::fromJson);
registerDeserializer(SshPublicKeyAuthentication.TYPE, SshPublicKeyAuthentication::fromJson);
registerDeserializer(UserPasswordCredentials.TYPE, UserPasswordCredentials::fromJson);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ public interface CredentialsVisitor<T> {
T usernamePassword(UserPasswordCredentials credentials);

/**
* Evaluate keypair credentials.
* Evaluate SshPublicKeyAuthentication credentials.
*
* @param credentials the keypair credentials.
* @param credentials the SshPublicKeyAuthentication credentials.
* @return evaluation result.
*/
T keyPair(KeyPairCredentials credentials);
T sshPublicKeyAuthentication(SshPublicKeyAuthentication credentials);
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
@Immutable
final class ImmutableSshTunnel implements SshTunnel {

private final Boolean enabled;
private final boolean enabled;
private final Credentials credentials;
private final boolean validateHost;
private final List<String> knownHosts;
Expand All @@ -53,7 +53,7 @@ private ImmutableSshTunnel(final Builder builder) {
uri = checkNotNull(builder.uri, "uri");
}

private ImmutableSshTunnel(final Boolean enabled, final Credentials credentials, final boolean validateHost,
private ImmutableSshTunnel(final boolean enabled, final Credentials credentials, final boolean validateHost,
final List<String> knownHosts, final String uri) {
this.enabled = checkNotNull(enabled, "enabled");
this.credentials = checkNotNull(credentials, "credentials");
Expand All @@ -73,7 +73,7 @@ private ImmutableSshTunnel(final Boolean enabled, final Credentials credentials,
* @return new instance of {@code SshTunnelBuilder}.
* @throws NullPointerException if any argument is {@code null}.
*/
public static SshTunnelBuilder getBuilder(final Boolean enabled,
public static SshTunnelBuilder getBuilder(final boolean enabled,
final Credentials credentials,
final boolean validateHost,
final List<String> knownHosts,
Expand All @@ -91,7 +91,7 @@ public static SshTunnelBuilder getBuilder(final Boolean enabled,
* @return new instance of {@code SshTunnelBuilder}.
* @throws NullPointerException if any argument is {@code null}.
*/
public static SshTunnelBuilder getBuilder(final Boolean enabled,
public static SshTunnelBuilder getBuilder(final boolean enabled,
final Credentials credentials,
final String uri) {

Expand All @@ -100,7 +100,7 @@ public static SshTunnelBuilder getBuilder(final Boolean enabled,


@Override
public Boolean isSshTunnelActive() {
public boolean isEnabled() {
return enabled;
}

Expand Down Expand Up @@ -133,13 +133,13 @@ public String getUri() {
* @throws org.eclipse.ditto.json.JsonParseException if {@code jsonObject} is not an appropriate JSON object.
*/
public static SshTunnel fromJson(final JsonObject jsonObject) {
checkNotNull(jsonObject, "ssh tunnel");
checkNotNull(jsonObject, "jsonObject");
return new Builder(extractEnabled(jsonObject), extractCredentials(jsonObject), extractValidateHost(jsonObject),
extractKnownHosts(jsonObject),
extractUri(jsonObject)).build();
}

private static Boolean extractEnabled(final JsonObject jsonObject) {
private static boolean extractEnabled(final JsonObject jsonObject) {
return jsonObject.getValueOrThrow(JsonFields.ENABLED);
}

Expand Down Expand Up @@ -217,21 +217,21 @@ public String toString() {
static final class Builder implements SshTunnelBuilder {

// required but changeable:
private Boolean enabled;
private boolean enabled;
private Credentials credentials;
private String uri;

// optional with Default:
private boolean validateHost = false;
private List<String> knownHosts = new ArrayList<>();

Builder(final Boolean enabled, final Credentials credentials, final String uri) {
Builder(final boolean enabled, final Credentials credentials, final String uri) {
this.enabled = enabled;
this.credentials = credentials;
this.uri = uri;
}

Builder(final Boolean enabled, final Credentials credentials, final boolean validateHost,
Builder(final boolean enabled, final Credentials credentials, final boolean validateHost,
final List<String> knownHosts, final String uri) {
this.enabled = enabled;
this.credentials = credentials;
Expand All @@ -241,22 +241,22 @@ static final class Builder implements SshTunnelBuilder {
}

Builder(final SshTunnel sshTunnel) {
this.enabled = sshTunnel.isSshTunnelActive();
this.enabled = sshTunnel.isEnabled();
this.credentials = sshTunnel.getCredentials();
this.uri = sshTunnel.getUri();
this.validateHost = sshTunnel.isValidateHost();
this.knownHosts = sshTunnel.getKnownHosts();
}

@Override
public SshTunnelBuilder enabled(final Boolean activate) {
this.enabled = activate;
public SshTunnelBuilder enabled(final boolean enabled) {
this.enabled = enabled;
return this;
}

@Override
public SshTunnelBuilder credentials(final Credentials credentials) {
this.credentials = credentials;
this.credentials = checkNotNull(credentials, "credentials");
return this;
}

Expand All @@ -268,13 +268,13 @@ public SshTunnelBuilder validateHost(final boolean validateHost) {

@Override
public SshTunnelBuilder knownHosts(final List<String> knownHosts) {
this.knownHosts = knownHosts;
this.knownHosts = checkNotNull(knownHosts, "knownHosts");
return this;
}

@Override
public SshTunnelBuilder uri(final String uri) {
this.uri = uri;
this.uri = checkNotNull(uri, "uri");
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,28 +22,42 @@
import org.eclipse.ditto.json.JsonObjectBuilder;

/**
* Key pair credentials. Containing the public and the private key.
* Holds information required to do SSH public key authentication, namely: {@code username}, {@code public key} and
* {@code private key}.
*/
@Immutable
public final class KeyPairCredentials implements Credentials {
public final class SshPublicKeyAuthentication implements Credentials {

/**
* Credential type name.
*/
public static final String TYPE = "key-pair";
public static final String TYPE = "public-key";

private final String username;
private final String publicKey;
private final String privateKey;

private KeyPairCredentials(final String publicKey,
final String privateKey) {
private SshPublicKeyAuthentication(final String username, final String publicKey, final String privateKey) {
this.username = username;
this.publicKey = publicKey;
this.privateKey = privateKey;
}

public static SshPublicKeyAuthentication of(final String username, final String publicKey,
final String privateKey) {
return new SshPublicKeyAuthentication(username, publicKey, privateKey);
}

@Override
public <T> T accept(final CredentialsVisitor<T> visitor) {
return visitor.keyPair(this);
return visitor.sshPublicKeyAuthentication(this);
}

/**
* @return the username
*/
public String getUsername() {
return username;
}

/**
Expand All @@ -62,109 +76,52 @@ public String getPrivateKey() {

@Override
public boolean equals(final Object o) {
if (o instanceof KeyPairCredentials) {
final KeyPairCredentials that = (KeyPairCredentials) o;
return Objects.equals(publicKey, that.publicKey) &&
Objects.equals(privateKey, that.privateKey);
} else {
return false;
}
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final SshPublicKeyAuthentication that = (SshPublicKeyAuthentication) o;
return username.equals(that.username) && publicKey.equals(that.publicKey) && privateKey.equals(that.privateKey);
}

@Override
public int hashCode() {
return Objects.hash(publicKey, privateKey);
return Objects.hash(username, publicKey, privateKey);
}

@Override
public String toString() {
return getClass().getSimpleName() + " [" +
"hashCode=" + hashCode() +
"username=" + username +
", publicKey=" + publicKey +
", privateKey=" + privateKey +
"]";
}

@Override
public JsonObject toJson() {
final JsonObjectBuilder jsonObjectBuilder = JsonFactory.newObjectBuilder();
jsonObjectBuilder.set(JsonFields.TYPE, TYPE);
jsonObjectBuilder.set(JsonFields.USERNAME, username);
jsonObjectBuilder.set(JsonFields.PUBLIC_KEY, publicKey);
jsonObjectBuilder.set(JsonFields.PRIVATE_KEY, privateKey);
return jsonObjectBuilder.build();
}

static KeyPairCredentials fromJson(final JsonObject jsonObject) {
static SshPublicKeyAuthentication fromJson(final JsonObject jsonObject) {
final String username = jsonObject.getValueOrThrow(JsonFields.USERNAME);
final String publicKey = jsonObject.getValueOrThrow(JsonFields.PUBLIC_KEY);
final String privateKey = jsonObject.getValueOrThrow(JsonFields.PRIVATE_KEY);
return new KeyPairCredentials(publicKey, privateKey);
}

/**
* Create a new builder initialized with fields of this object.
*
* @return a new builder.
*/
public Builder toBuilder() {
return new Builder(publicKey, privateKey);
}

/**
* Create an builder.
*
* @return a new builder.
*/
public static Builder newBuilder(final String publicKey, final String privateKey) {
return new Builder(publicKey, privateKey);
return new SshPublicKeyAuthentication(username, publicKey, privateKey);
}

/**
* Builder of {@code KeyPair}.
* JSON field definitions.
*/
public static final class Builder {

private String publicKey;
private String privateKey;

private Builder(final String publicKey, final String privateKey) {
this.publicKey = publicKey;
this.privateKey = privateKey;
}

/**
* Set the public key.
*
* @param publicKey the public key
* @return this builder
*/
public Builder publicKey(final String publicKey) {
this.publicKey = publicKey;
return this;
}

/**
* Set the private key.
*
* @param privateKey the client key
* @return this builder
*/
public Builder privateKey(final String privateKey) {
this.privateKey = privateKey;
return this;
}
public static final class JsonFields extends Credentials.JsonFields {

/**
* Build a new KeyPair credentials.
*
* @return the credentials.
* JSON field containing the username
*/
public KeyPairCredentials build() {
return new KeyPairCredentials(publicKey, privateKey);
}
}

/**
* JSON field definitions.
*/
public static final class JsonFields extends Credentials.JsonFields {
public static final JsonFieldDefinition<String> USERNAME = JsonFieldDefinition.ofString("username");

/**
* JSON field containing the public key
Expand Down

0 comments on commit 6e7a701

Please sign in to comment.