Skip to content

Commit 7fadf42

Browse files
committed
Fix auth tests
1 parent 2f29977 commit 7fadf42

File tree

10 files changed

+125
-17
lines changed

10 files changed

+125
-17
lines changed

operator/controller/src/main/java/io/apicurio/registry/operator/EnvironmentVariables.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public class EnvironmentVariables {
1111
public static final String QUARKUS_TLS_KEY_STORE_P12_PASSWORD = "QUARKUS_TLS_KEY_STORE_P12_PASSWORD";
1212
public static final String QUARKUS_TLS_TRUST_STORE_P12_PATH = "QUARKUS_TLS_TRUST_STORE_P12_PATH";
1313
public static final String QUARKUS_TLS_TRUST_STORE_P12_PASSWORD = "QUARKUS_TLS_TRUST_STORE_P12_PASSWORD";
14+
public static final String QUARKUS_OIDC_TLS_TLS_CONFIGURATION_NAME = "QUARKUS_OIDC_TLS_TLS_CONFIGURATION_NAME";
15+
1416
public static final String APICURIO_REST_DELETION_ARTIFACT_VERSION_ENABLED = "APICURIO_REST_DELETION_ARTIFACT-VERSION_ENABLED";
1517
public static final String APICURIO_REST_DELETION_ARTIFACT_ENABLED = "APICURIO_REST_DELETION_ARTIFACT_ENABLED";
1618
public static final String APICURIO_REST_DELETION_GROUP_ENABLED = "APICURIO_REST_DELETION_GROUP_ENABLED";
@@ -33,6 +35,8 @@ public class EnvironmentVariables {
3335
public static final String APICURIO_UI_AUTH_OIDC_LOGOUT_URL = "APICURIO_UI_AUTH_OIDC_LOGOUT_URL";
3436
public static final String APICURIO_REGISTRY_AUTH_SERVER_URL = "QUARKUS_OIDC_AUTH_SERVER_URL";
3537
public static final String OIDC_TLS_VERIFICATION = "QUARKUS_OIDC_TLS_VERIFICATION";
38+
public static final String OIDC_TLS_TRUSTSTORE_LOCATION = "QUARKUS_OIDC_TLS_TRUST_STORE_FILE";
39+
public static final String OIDC_TLS_TRUSTSTORE_PASSWORD = "QUARKUS_OIDC_TLS_TRUST_STORE_PASSWORD";
3640

3741
public static final String APICURIO_AUTHN_BASIC_CLIENT_CREDENTIALS_ENABLED = "APICURIO_AUTHN_BASIC_CLIENT_CREDENTIALS_ENABLED";
3842
public static final String APICURIO_AUTHN_BASIC_CLIENT_CREDENTIALS_CACHE_EXPIRATION = "APICURIO_AUTHN_BASIC_CLIENT_CREDENTIALS_CACHE_EXPIRATION";

operator/controller/src/main/java/io/apicurio/registry/operator/feat/security/Auth.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.apicurio.registry.operator.EnvironmentVariables;
44
import io.apicurio.registry.operator.api.v1.spec.auth.AuthSpec;
55
import io.fabric8.kubernetes.api.model.EnvVar;
6+
import io.fabric8.kubernetes.api.model.apps.Deployment;
67

78
import java.util.Map;
89
import java.util.Optional;
@@ -19,10 +20,11 @@ public class Auth {
1920
* Configures authentication-related environment variables for the Apicurio Registry.
2021
*
2122
* @param env The map of environment variables to be configured.
23+
* @param deployment The application deployment to configure TLS.
2224
* @param authSpec The authentication specification containing required auth settings. If null, no changes
2325
* will be made to envVars.
2426
*/
25-
public static void configureAuth(AuthSpec authSpec, Map<String, EnvVar> env) {
27+
public static void configureAuth(AuthSpec authSpec, Deployment deployment, Map<String, EnvVar> env) {
2628
if (authSpec == null) {
2729
return;
2830
}
@@ -51,9 +53,7 @@ public static void configureAuth(AuthSpec authSpec, Map<String, EnvVar> env) {
5153
authSpec.getBasicAuth().getCacheExpiration());
5254
}
5355

54-
putIfNotBlank(env, EnvironmentVariables.OIDC_TLS_VERIFICATION,
55-
authSpec.getTlsVerificationType());
56-
56+
AuthTLS.configureAuthTLS(authSpec, deployment, env);
5757
Authz.configureAuthz(authSpec.getAuthz(), env);
5858
}
5959
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.apicurio.registry.operator.feat.security;
2+
3+
import io.apicurio.registry.operator.EnvironmentVariables;
4+
import io.apicurio.registry.operator.api.v1.spec.auth.AuthSpec;
5+
import io.apicurio.registry.operator.api.v1.spec.auth.AuthTLSSpec;
6+
import io.apicurio.registry.operator.utils.SecretKeyRefTool;
7+
import io.fabric8.kubernetes.api.model.EnvVar;
8+
import io.fabric8.kubernetes.api.model.apps.Deployment;
9+
10+
import java.util.Map;
11+
import java.util.Optional;
12+
13+
import static io.apicurio.registry.operator.EnvironmentVariables.*;
14+
import static io.apicurio.registry.operator.api.v1.ContainerNames.REGISTRY_APP_CONTAINER_NAME;
15+
import static io.apicurio.registry.operator.resource.app.AppDeploymentResource.addEnvVar;
16+
import static io.apicurio.registry.operator.utils.Utils.putIfNotBlank;
17+
import static java.util.Optional.ofNullable;
18+
19+
public class AuthTLS {
20+
21+
/**
22+
* Configure TLS for OIDC authentication
23+
*/
24+
public static void configureAuthTLS(AuthSpec authSpec, Deployment deployment, Map<String, EnvVar> env) {
25+
26+
putIfNotBlank(env, EnvironmentVariables.OIDC_TLS_VERIFICATION,
27+
authSpec.getTls().getTlsVerificationType());
28+
29+
// spotless:off
30+
var truststore = new SecretKeyRefTool(getAuthTLSSpec(authSpec)
31+
.map(AuthTLSSpec::getTruststoreSecretRef)
32+
.orElse(null), "ca.p12");
33+
34+
var truststorePassword = new SecretKeyRefTool(getAuthTLSSpec(authSpec)
35+
.map(AuthTLSSpec::getTruststorePasswordSecretRef)
36+
.orElse(null), "ca.password");
37+
// spotless:on
38+
if (truststore.isValid() && truststorePassword.isValid()) {
39+
truststore.applySecretVolume(deployment, REGISTRY_APP_CONTAINER_NAME);
40+
addEnvVar(env, OIDC_TLS_TRUSTSTORE_LOCATION, truststore.getSecretVolumeKeyPath());
41+
truststorePassword.applySecretEnvVar(env, OIDC_TLS_TRUSTSTORE_PASSWORD);
42+
}
43+
}
44+
45+
private static Optional<AuthTLSSpec> getAuthTLSSpec(AuthSpec primary) {
46+
// spotless:off
47+
return ofNullable(primary)
48+
.map(AuthSpec::getTls);
49+
// spotless:on
50+
}
51+
}

operator/controller/src/main/java/io/apicurio/registry/operator/resource/ResourceFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ public Deployment getDefaultAppDeployment(ApicurioRegistry3 primary) {
5858
ofNullable(primary.getSpec()).map(ApicurioRegistry3Spec::getApp)
5959
.map(AppSpec::getPodTemplateSpec).orElse(null)); // TODO:
6060

61-
var readinessProbe = DEFAULT_READINESS_PROBE;
62-
var livenessProbe = DEFAULT_LIVENESS_PROBE;
61+
var readinessProbe = new ProbeBuilder().withHttpGet(new HTTPGetActionBuilder().withPath("/health/ready").withPort(new IntOrString(8080)).withScheme("HTTP").build()).build();
62+
var livenessProbe = new ProbeBuilder().withHttpGet(new HTTPGetActionBuilder().withPath("/health/live").withPort(new IntOrString(8080)).withScheme("HTTP").build()).build();
6363

6464
Optional<TLSSpec> tlsSpec = ofNullable(primary.getSpec())
6565
.map(ApicurioRegistry3Spec::getApp)

operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppDeploymentResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ protected Deployment desired(ApicurioRegistry3 primary, Context<ApicurioRegistry
8282
if (authEnabled) {
8383
Auth.configureAuth(requireNonNull(ofNullable(primary.getSpec().getApp())
8484
.map(AppSpec::getAuth)
85-
.orElse(null)), envVars);
85+
.orElse(null)), deployment, envVars);
8686
}
8787

8888
// Configure the CORS_ALLOWED_ORIGINS env var based on the ingress host

operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppNetworkPolicyResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ protected NetworkPolicy desired(ApicurioRegistry3 primary, Context<ApicurioRegis
5050
var httpPolicy = new io.fabric8.kubernetes.api.model.networking.v1.NetworkPolicyPortBuilder()
5151
.withPort(new IntOrStringBuilder().withValue(8080).build()).build();
5252

53-
if (!tls.getInsecureRequests().equals("enabled")) {
53+
if (tls.getInsecureRequests() != null && !tls.getInsecureRequests().equals("enabled")) {
5454
networkPolicy.getSpec().setIngress(List.of(new NetworkPolicyIngressRuleBuilder()
5555
.withPorts(httpsPolicy)
5656
.build()));

operator/controller/src/main/java/io/apicurio/registry/operator/resource/app/AppServiceResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ protected Service desired(ApicurioRegistry3 primary, Context<ApicurioRegistry3>
4848
.withTargetPort(new IntOrStringBuilder().withValue(8443).build())
4949
.build();
5050

51-
if (tls.getInsecureRequests().equals("enabled")) {
51+
if (tls.getInsecureRequests() != null && tls.getInsecureRequests().equals("enabled")) {
5252
s.getSpec().setPorts(List.of(httpsPort, httpPort));
5353
}
5454
else {

operator/model/src/main/java/io/apicurio/registry/operator/api/v1/spec/AppSpec.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
@JsonDeserialize(using = None.class)
1515
@JsonInclude(NON_NULL)
16-
@JsonPropertyOrder({ "env", "ingress", "podTemplateSpec", "storage", "sql", "kafkasql", "features", "auth", "tls" })
16+
@JsonPropertyOrder({ "env", "ingress", "podTemplateSpec", "storage", "sql", "kafkasql", "features", "auth" })
1717
@NoArgsConstructor
1818
@AllArgsConstructor(access = PRIVATE)
1919
@SuperBuilder(toBuilder = true)

operator/model/src/main/java/io/apicurio/registry/operator/api/v1/spec/auth/AuthSpec.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
@JsonDeserialize(using = JsonDeserializer.None.class)
2323
@JsonInclude(NON_NULL)
2424
@JsonPropertyOrder({ "enabled", "appClientId", "uiClientId", "redirectURI", "authServerUrl", "logoutURL",
25-
"anonymousReads", "basicAuth", "tlsVerificationType", "authz" })
25+
"anonymousReads", "basicAuth", "tls", "authz" })
2626
@NoArgsConstructor
2727
@AllArgsConstructor(access = PRIVATE)
2828
@SuperBuilder(toBuilder = true)
@@ -83,14 +83,12 @@ public class AuthSpec {
8383
@JsonSetter(nulls = Nulls.SKIP)
8484
private BasicAuthSpec basicAuth;
8585

86-
/**
87-
* Type of TLS verification for authentication.
88-
*/
89-
@JsonProperty("tlsVerificationType")
86+
@JsonProperty("tls")
9087
@JsonPropertyDescription("""
91-
Verify the identity server certificate.""")
88+
OIDC TLS configuration.
89+
When custom certificates are used, this is the field to be used to configure the trustore""")
9290
@JsonSetter(nulls = Nulls.SKIP)
93-
private String tlsVerificationType;
91+
private AuthTLSSpec tls;
9492

9593
@JsonProperty("authz")
9694
@JsonPropertyDescription("""
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.apicurio.registry.operator.api.v1.spec.auth;
2+
3+
import com.fasterxml.jackson.annotation.*;
4+
import com.fasterxml.jackson.annotation.JsonInclude.Include;
5+
import com.fasterxml.jackson.databind.JsonDeserializer.None;
6+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
7+
import io.apicurio.registry.operator.api.v1.spec.SecretKeyRef;
8+
import lombok.*;
9+
import lombok.experimental.SuperBuilder;
10+
11+
import static lombok.AccessLevel.PRIVATE;
12+
13+
@JsonDeserialize(using = None.class)
14+
@JsonInclude(Include.NON_NULL)
15+
@JsonPropertyOrder({ "tlsVerificationType", "truststoreSecretRef", "truststorePasswordSecretRef" })
16+
@NoArgsConstructor
17+
@AllArgsConstructor(access = PRIVATE)
18+
@SuperBuilder(toBuilder = true)
19+
@Getter
20+
@Setter
21+
@EqualsAndHashCode
22+
@ToString
23+
public class AuthTLSSpec {
24+
25+
/**
26+
* Type of TLS verification.
27+
*/
28+
@JsonProperty("tlsVerificationType")
29+
@JsonPropertyDescription("""
30+
Verify the identity server certificate.""")
31+
@JsonSetter(nulls = Nulls.SKIP)
32+
private String tlsVerificationType;
33+
34+
/**
35+
* Name of a Secret that contains the TLS truststore (in PKCS12 format). Key <code>ca.p12</code> is
36+
* assumed by default.
37+
*/
38+
@JsonProperty("truststoreSecretRef")
39+
@JsonPropertyDescription("""
40+
Name of a Secret that contains the TLS truststore (in PKCS12 format). \
41+
Key `ca.p12` is assumed by default.""")
42+
@JsonSetter(nulls = Nulls.SKIP)
43+
private SecretKeyRef truststoreSecretRef;
44+
45+
/**
46+
* Name of a Secret that contains the TLS truststore password. Key <code>ca.password</code> is assumed by
47+
* default.
48+
*/
49+
@JsonProperty("truststorePasswordSecretRef")
50+
@JsonPropertyDescription("""
51+
Name of a Secret that contains the TLS truststore password. \
52+
Key `ca.password` is assumed by default.""")
53+
@JsonSetter(nulls = Nulls.SKIP)
54+
private SecretKeyRef truststorePasswordSecretRef;
55+
}

0 commit comments

Comments
 (0)