Skip to content

Commit 8d11c39

Browse files
committed
feat(oidc): populate config builders with defaults
1 parent 63962a0 commit 8d11c39

File tree

8 files changed

+158
-28
lines changed

8 files changed

+158
-28
lines changed

extensions/oidc-client-registration/runtime/src/main/java/io/quarkus/oidc/client/registration/OidcClientRegistrationConfig.java

+1-13
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
package io.quarkus.oidc.client.registration;
22

3-
import static io.quarkus.oidc.client.registration.runtime.OidcClientRegistrationsConfig.getDefaultClientRegistration;
4-
53
import java.util.Map;
6-
import java.util.Objects;
74
import java.util.Optional;
85

9-
import io.quarkus.oidc.client.registration.runtime.OidcClientRegistrationsConfig;
106
import io.quarkus.oidc.common.runtime.config.OidcCommonConfig;
11-
import io.smallrye.config.SmallRyeConfigBuilder;
127
import io.smallrye.config.WithDefault;
138

149
//https://datatracker.ietf.org/doc/html/rfc7592
@@ -74,13 +69,7 @@ interface Metadata {
7469
* @return OidcClientRegistrationConfigBuilder builder
7570
*/
7671
static OidcClientRegistrationConfigBuilder builder() {
77-
var clientRegistrationsConfig = new SmallRyeConfigBuilder()
78-
.addDiscoveredConverters()
79-
.withMapping(OidcClientRegistrationsConfig.class)
80-
.build()
81-
.getConfigMapping(OidcClientRegistrationsConfig.class);
82-
var clientRegistrationWithDefaultValues = getDefaultClientRegistration(clientRegistrationsConfig);
83-
return new OidcClientRegistrationConfigBuilder(clientRegistrationWithDefaultValues);
72+
return new OidcClientRegistrationConfigBuilder();
8473
}
8574

8675
/**
@@ -90,7 +79,6 @@ static OidcClientRegistrationConfigBuilder builder() {
9079
* @return OidcClientRegistrationConfigBuilder
9180
*/
9281
static OidcClientRegistrationConfigBuilder builder(OidcClientRegistrationConfig config) {
93-
Objects.requireNonNull(config);
9482
return new OidcClientRegistrationConfigBuilder(config);
9583
}
9684

extensions/oidc-client-registration/runtime/src/main/java/io/quarkus/oidc/client/registration/OidcClientRegistrationConfigBuilder.java

+36-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package io.quarkus.oidc.client.registration;
22

3+
import static io.quarkus.oidc.client.registration.runtime.OidcClientRegistrationsConfig.getDefaultClientRegistration;
4+
35
import java.util.HashMap;
46
import java.util.Map;
57
import java.util.Objects;
68
import java.util.Optional;
79

10+
import io.quarkus.oidc.client.registration.runtime.OidcClientRegistrationsConfig;
811
import io.quarkus.oidc.common.runtime.config.OidcCommonConfigBuilder;
12+
import io.smallrye.config.SmallRyeConfigBuilder;
913

1014
/**
1115
* The {@link OidcClientRegistrationConfig} builder. This builder is not thread safe.
@@ -60,14 +64,31 @@ public Metadata metadata() {
6064
}
6165
}
6266

67+
/**
68+
* {@link OidcClientRegistrationConfig} with documented defaults.
69+
* Cached here so that we avoid building the SmallRye Config again and again when no-args builder constructors
70+
* are used.
71+
*/
72+
private static volatile OidcClientRegistrationConfig configWithDefaults = null;
73+
6374
private Optional<String> id;
6475
private boolean registrationEnabled;
6576
private boolean registerEarly;
6677
private Optional<String> initialToken;
6778
private OidcClientRegistrationConfig.Metadata metadata;
6879

69-
OidcClientRegistrationConfigBuilder(OidcClientRegistrationConfig config) {
70-
super(config);
80+
/**
81+
* Creates {@link OidcClientRegistrationConfig} builder populated with documented default values.
82+
*/
83+
public OidcClientRegistrationConfigBuilder() {
84+
this(getConfigWithDefaults());
85+
}
86+
87+
/**
88+
* Creates {@link OidcClientRegistrationConfig} builder populated with {@code config} values.
89+
*/
90+
public OidcClientRegistrationConfigBuilder(OidcClientRegistrationConfig config) {
91+
super(Objects.requireNonNull(config));
7192
this.id = config.id();
7293
this.registrationEnabled = config.registrationEnabled();
7394
this.registerEarly = config.registerEarly();
@@ -171,7 +192,7 @@ public MetadataBuilder(OidcClientRegistrationConfigBuilder configBuilder) {
171192
}
172193

173194
public MetadataBuilder() {
174-
this.configBuilder = null;
195+
this(new OidcClientRegistrationConfigBuilder());
175196
}
176197

177198
public OidcClientRegistrationConfig.Metadata build() {
@@ -235,4 +256,16 @@ public MetadataBuilder extraProps(Map<String, String> extraProps) {
235256
return this;
236257
}
237258
}
259+
260+
private static OidcClientRegistrationConfig getConfigWithDefaults() {
261+
if (configWithDefaults == null) {
262+
final OidcClientRegistrationsConfig clientRegistrationsConfig = new SmallRyeConfigBuilder()
263+
.addDiscoveredConverters()
264+
.withMapping(OidcClientRegistrationsConfig.class)
265+
.build()
266+
.getConfigMapping(OidcClientRegistrationsConfig.class);
267+
configWithDefaults = getDefaultClientRegistration(clientRegistrationsConfig);
268+
}
269+
return configWithDefaults;
270+
}
238271
}

extensions/oidc-client-registration/runtime/src/test/java/io/quarkus/oidc/client/registration/OidcClientRegistrationConfigBuilderTest.java

+14
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ public class OidcClientRegistrationConfigBuilderTest {
1717
@Test
1818
public void testDefaultValues() {
1919
var config = OidcClientRegistrationConfig.builder().build();
20+
testDefaultValues(config);
21+
config = new OidcClientRegistrationConfigBuilder().build();
22+
testDefaultValues(config);
23+
}
2024

25+
private static void testDefaultValues(OidcClientRegistrationConfig config) {
2126
// OidcClientRegistrationConfig methods
2227
assertTrue(config.id().isEmpty());
2328
assertTrue(config.registrationEnabled());
@@ -265,4 +270,13 @@ public void testCreateBuilderShortcuts() {
265270
assertEquals("registration-path", config.registrationPath().orElse(null));
266271
assertEquals("redirect-uri", config.metadata().redirectUri().orElse(null));
267272
}
273+
274+
@Test
275+
public void testMetadataBuilderDefaults() {
276+
var metadata = new MetadataBuilder().build();
277+
assertTrue(metadata.clientName().isEmpty());
278+
assertTrue(metadata.postLogoutUri().isEmpty());
279+
assertTrue(metadata.redirectUri().isEmpty());
280+
assertTrue(metadata.extraProps().isEmpty());
281+
}
268282
}

extensions/oidc-client/runtime/src/main/java/io/quarkus/oidc/client/OidcClientConfigBuilder.java

+29-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
import io.quarkus.oidc.client.runtime.OidcClientConfig;
1313
import io.quarkus.oidc.client.runtime.OidcClientConfig.Grant;
14+
import io.quarkus.oidc.client.runtime.OidcClientsConfig;
1415
import io.quarkus.oidc.common.runtime.config.OidcClientCommonConfigBuilder;
16+
import io.smallrye.config.SmallRyeConfigBuilder;
1517

1618
/**
1719
* Builder for the {@link io.quarkus.oidc.client.runtime.OidcClientConfig}. This builder is not thread-safe.
@@ -103,6 +105,13 @@ public Map<String, String> headers() {
103105
}
104106
}
105107

108+
/**
109+
* {@link OidcClientConfig} with documented defaults.
110+
* Cached here so that we avoid building the SmallRye Config again and again when no-args builder constructors
111+
* are used.
112+
*/
113+
private static volatile OidcClientConfig configWithDefaults = null;
114+
106115
private final Map<String, String> headers = new HashMap<>();
107116
private boolean earlyTokensAcquisition;
108117
private final Map<String, Map<String, String>> grantOptions = new HashMap<>();
@@ -115,6 +124,13 @@ public Map<String, String> headers() {
115124
private boolean clientEnabled;
116125
private Optional<String> id;
117126

127+
/**
128+
* Creates {@link OidcClientConfigBuilder} builder populated with documented default values.
129+
*/
130+
public OidcClientConfigBuilder() {
131+
this(getConfigWithDefaults());
132+
}
133+
118134
/**
119135
* @param config created either by this builder or SmallRye Config; config methods must never return null
120136
*/
@@ -339,7 +355,7 @@ private record GrantImpl(Type type, String accessTokenProperty, String refreshTo
339355
private String refreshExpiresInProperty;
340356

341357
public GrantBuilder() {
342-
this(OidcClientConfig.builder());
358+
this(new OidcClientConfigBuilder());
343359
}
344360

345361
public GrantBuilder(OidcClientConfigBuilder builder) {
@@ -405,4 +421,16 @@ public Grant build() {
405421
return new GrantImpl(type, accessTokenProperty, refreshTokenProperty, expiresInProperty, refreshExpiresInProperty);
406422
}
407423
}
424+
425+
private static OidcClientConfig getConfigWithDefaults() {
426+
if (configWithDefaults == null) {
427+
final OidcClientsConfig clientsConfig = new SmallRyeConfigBuilder()
428+
.addDiscoveredConverters()
429+
.withMapping(OidcClientsConfig.class)
430+
.build()
431+
.getConfigMapping(OidcClientsConfig.class);
432+
configWithDefaults = OidcClientsConfig.getDefaultClient(clientsConfig);
433+
}
434+
return configWithDefaults;
435+
}
408436
}

extensions/oidc-client/runtime/src/main/java/io/quarkus/oidc/client/runtime/OidcClientConfig.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import io.quarkus.oidc.common.runtime.config.OidcClientCommonConfig;
1111
import io.quarkus.oidc.common.runtime.config.OidcCommonConfig;
1212
import io.quarkus.runtime.annotations.ConfigDocMapKey;
13-
import io.smallrye.config.SmallRyeConfigBuilder;
1413
import io.smallrye.config.WithDefault;
1514

1615
public interface OidcClientConfig extends OidcClientCommonConfig {
@@ -179,12 +178,7 @@ public String getGrantType() {
179178
* @return OidcClientConfigBuilder builder
180179
*/
181180
static OidcClientConfigBuilder builder() {
182-
var clientsConfig = new SmallRyeConfigBuilder()
183-
.addDiscoveredConverters()
184-
.withMapping(OidcClientsConfig.class)
185-
.build()
186-
.getConfigMapping(OidcClientsConfig.class);
187-
return builder(OidcClientsConfig.getDefaultClient(clientsConfig));
181+
return new OidcClientConfigBuilder();
188182
}
189183

190184
/**

extensions/oidc-client/runtime/src/test/java/io/quarkus/oidc/client/OidcClientConfigBuilderTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ public class OidcClientConfigBuilderTest {
2626
@Test
2727
public void testDefaultValues() {
2828
var config = OidcClientConfig.builder().id("default-test").build();
29+
testDefaultValues(config);
30+
config = new OidcClientConfigBuilder().id("default-test").build();
31+
testDefaultValues(config);
32+
}
2933

34+
private static void testDefaultValues(OidcClientConfig config) {
3035
// OidcClientConfig methods
3136
assertEquals("default-test", config.id().orElse(null));
3237
assertTrue(config.clientEnabled());

extensions/oidc-common/runtime/src/main/java/io/quarkus/oidc/common/runtime/config/OidcClientCommonConfigBuilder.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.quarkus.oidc.common.runtime.config.OidcClientCommonConfig.Credentials.Provider;
1414
import io.quarkus.oidc.common.runtime.config.OidcClientCommonConfig.Credentials.Secret;
1515
import io.quarkus.oidc.common.runtime.config.OidcClientCommonConfig.Credentials.Secret.Method;
16+
import io.smallrye.config.SmallRyeConfigBuilder;
1617

1718
public abstract class OidcClientCommonConfigBuilder<T> extends OidcCommonConfigBuilder<T> {
1819

@@ -169,10 +170,7 @@ private record CredentialsImpl(Optional<String> secret, Secret clientSecret, Jwt
169170
private Jwt jwt;
170171

171172
public CredentialsBuilder() {
172-
this.builder = null;
173-
this.secret = Optional.empty();
174-
this.clientSecret = new SecretBuilder<>().build();
175-
this.jwt = new JwtBuilder<>().build();
173+
this(getConfigBuilderWithDefaults());
176174
}
177175

178176
public CredentialsBuilder(OidcClientCommonConfigBuilder<T> builder) {
@@ -268,6 +266,21 @@ public T end() {
268266
public Credentials build() {
269267
return new CredentialsImpl(secret, clientSecret, jwt);
270268
}
269+
270+
private static <T> OidcClientCommonConfigBuilder<T> getConfigBuilderWithDefaults() {
271+
final OidcClientCommonConfig clientCommonConfig = new SmallRyeConfigBuilder()
272+
.addDiscoveredConverters()
273+
.withMapping(OidcClientCommonConfig.class)
274+
.build()
275+
.getConfigMapping(OidcClientCommonConfig.class);
276+
return new OidcClientCommonConfigBuilder<>(clientCommonConfig) {
277+
@Override
278+
protected T getBuilder() {
279+
throw new UnsupportedOperationException(
280+
"Use the 'OidcClientCommonConfigBuilder.CredentialsBuilder#build' method instead");
281+
}
282+
};
283+
}
271284
}
272285

273286
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.quarkus.oidc.common.runtime;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
5+
import static org.junit.jupiter.api.Assertions.assertNotNull;
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
7+
8+
import org.junit.jupiter.api.Test;
9+
10+
import io.quarkus.oidc.common.runtime.config.OidcClientCommonConfig.Credentials;
11+
import io.quarkus.oidc.common.runtime.config.OidcClientCommonConfigBuilder.CredentialsBuilder;
12+
13+
public class OidcClientCommonConfigBuilderTest {
14+
15+
@Test
16+
public void testCredentialsBuilderDefaultValues() {
17+
Credentials credentials = new CredentialsBuilder<>().build();
18+
assertNotNull(credentials);
19+
assertTrue(credentials.secret().isEmpty());
20+
var clientSecret = credentials.clientSecret();
21+
assertNotNull(clientSecret);
22+
assertTrue(clientSecret.value().isEmpty());
23+
assertTrue(clientSecret.method().isEmpty());
24+
var provider = clientSecret.provider();
25+
assertNotNull(provider);
26+
assertTrue(provider.key().isEmpty());
27+
assertTrue(provider.keyringName().isEmpty());
28+
assertTrue(provider.name().isEmpty());
29+
var jwt = credentials.jwt();
30+
assertNotNull(jwt);
31+
assertEquals(Credentials.Jwt.Source.CLIENT, jwt.source());
32+
assertTrue(jwt.secret().isEmpty());
33+
provider = jwt.secretProvider();
34+
assertNotNull(provider);
35+
assertTrue(provider.key().isEmpty());
36+
assertTrue(provider.keyringName().isEmpty());
37+
assertTrue(provider.name().isEmpty());
38+
assertTrue(jwt.key().isEmpty());
39+
assertTrue(jwt.keyFile().isEmpty());
40+
assertTrue(jwt.keyStoreFile().isEmpty());
41+
assertTrue(jwt.keyStorePassword().isEmpty());
42+
assertTrue(jwt.keyId().isEmpty());
43+
assertTrue(jwt.keyPassword().isEmpty());
44+
assertTrue(jwt.audience().isEmpty());
45+
assertTrue(jwt.tokenKeyId().isEmpty());
46+
assertTrue(jwt.issuer().isEmpty());
47+
assertTrue(jwt.subject().isEmpty());
48+
assertTrue(jwt.claims().isEmpty());
49+
assertTrue(jwt.signatureAlgorithm().isEmpty());
50+
assertEquals(10, jwt.lifespan());
51+
assertFalse(jwt.assertion());
52+
assertFalse(jwt.tokenPath().isPresent());
53+
}
54+
55+
}

0 commit comments

Comments
 (0)