8000 fix: introduces the concept of a synthetic option by shawkins · Pull Request #47399 · keycloak/keycloak · GitHub
[go: up one dir, main page]

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Stream;

import org.keycloak.config.database.Database;

Expand Down Expand Up @@ -154,90 +155,16 @@ public class DatabaseOptions {
.description("The type of the truststore file. Common values include 'JKS' (Java KeyStore) and 'PKCS12'. If not specified, it uses the driver's default.")
.build();

// TLS hidden options, per vendor, to configure TLS in the driver
public static final Option<String> DB_ORACLE_TLS_TRANSPORT = new OptionBuilder<>("db-oracle-protocol", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_SSL_SERVER_DN_MATCH = new OptionBuilder<>("db-property-ssl-server-dn-match", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_ENCRYPT = new OptionBuilder<>("db-property-encrypt", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_TRUST_SERVER_CERTIFICATE = new OptionBuilder<>("db-property-trust-server-certificate", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_SSLFACTORY = new OptionBuilder<>("db-property-sslfactory", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_SSLMODE = new OptionBuilder<>("db-property-sslmode", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_SSL_MODE = new OptionBuilder<>("db-property-sslMode", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_SSLROOTCERT = new OptionBuilder<>("db-property-sslrootcert", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_TRUST_CERTIFICATE_KEY_STORE_URL = new OptionBuilder<>("db-property-trustCertificateKeyStoreUrl", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_SERVER_SSL_CERT = new OptionBuilder<>("db-property-serverSslCert", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_TRUST_STORE = new OptionBuilder<>("db-property-trustStore", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_ORACLE_TRUST_STORE = new OptionBuilder<>("db-property-javax.net.ssl.trustStore", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_TRUST_CERTIFICATE_KEY_STORE_PASSWORD = new OptionBuilder<>("db-property-trustCertificateKeyStorePassword", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_TRUST_STORE_PASSWORD = new OptionBuilder<>("db-property-trustStorePassword", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_ORACLE_TRUST_STORE_PASSWORD = new OptionBuilder<>("db-property-javax.net.ssl.trustStorePassword", String.class)
.hidden()
.build();
public static final Option<String> DB_PROPERTY_ORACLE_TRUST_STORE_TYPE = new OptionBuilder<>("db-property-javax.net.ssl.trustStoreType", String.class)
.hidden()
.build();
public static final Option<String> DB_MSSQL_SEND_STRING_PARAMETER_AS_UNICODE = new OptionBuilder<>("db-mssql-send-string-parameter-as-unicode", String.class)
.category(OptionCategory.DATABASE)
.defaultValue("false")
.hidden()
.build();
public static final Option<String> DB_MYSQL_CONNECT_TIMEOUT = new OptionBuilder<>("db-mysql-connect-timeout", String.class)
.category(OptionCategory.DATABASE)
.hidden()
.build();
public static final Option<String> DB_MARIADB_CONNECT_TIMEOUT = new OptionBuilder<>("db-mariadb-connect-timeout", String.class)
.category(OptionCategory.DATABASE)
.hidden()
.build();
public static final Option<String> DB_ORACLE_CONNECT_TIMEOUT = new OptionBuilder<>("db-oracle-connect-timeout", String.class)
.category(OptionCategory.DATABASE)
.hidden()
.build();
public static final Option<String> DB_MSSQL_CONNECT_TIMEOUT = new OptionBuilder<>("db-mssql-login-timeout", String.class)
.category(OptionCategory.DATABASE)
.hidden()
.build();
public static final Option<String> DB_POSTGRES_CONNECT_TIMEOUT = new OptionBuilder<>("db-postgres-connect-timeout", String.class)
.category(OptionCategory.DATABASE)
.hidden()
.build();
public static final Option<String> DB_TIDB_CONNECT_TIMEOUT = new OptionBuilder<>("db-tidb-connect-timeout", String.class)
.category(OptionCategory.DATABASE)
.hidden()
.build();

public static final class Datasources {
/**
* Options that have their sibling for a named datasource
* Example: for `db-dialect`, `db-dialect-<datasource>` is created
*/
public static final List<Option<?>> OPTIONS_DATASOURCES = List.of(
public static final List<String> OPTIONS_DATASOURCES = Stream.of(
DB_DIALECT,
DB_DRIVER,
DB,
Expand All @@ -258,23 +185,8 @@ public static final class Datasources {
DB_TLS_TRUST_STORE_FILE,
DB_TLS_TRUST_STORE_PASSWORD,
DB_TLS_TRUST_STORE_TYPE,
DB_PROPERTY_SSLMODE,
DB_PROPERTY_SSLFACTORY,
DB_PROPERTY_SSL_MODE,
DB_PROPERTY_ENCRYPT,
DB_PROPERTY_TRUST_SERVER_CERTIFICATE,
DB_PROPERTY_SSL_SERVER_DN_MATCH,
DB_ORACLE_TLS_TRANSPORT,
DB_PROPERTY_SSLROOTCERT,
DB_PROPERTY_TRUST_CERTIFICATE_KEY_STORE_URL,
DB_PROPERTY_SERVER_SSL_CERT,
DB_PROPERTY_TRUST_STORE,
DB_PROPERTY_ORACLE_TRUST_STORE,
DB_PROPERTY_TRUST_CERTIFICATE_KEY_STORE_PASSWORD,
DB_PROPERTY_TRUST_STORE_PASSWORD,
DB_PROPERTY_ORACLE_TRUST_STORE_PASSWORD,
DB_PROPERTY_ORACLE_TRUST_STORE_TYPE
);
DB_ORACLE_TLS_TRANSPORT
).map(Option::getKey).toList();

/**
* In order to avoid ambiguity, we need to have unique option names for wildcard options.
Expand Down Expand Up @@ -308,7 +220,7 @@ public static final class Datasources {
*/
@SuppressWarnings("unchecked")
public static <T> Optional<Option<T>> getDatasourceOption(Option<T> parentOption) {
if (!OPTIONS_DATASOURCES.contains(parentOption)) {
if (!OPTIONS_DATASOURCES.contains(parentOption.getKey())) {
return Optional.empty();
}

Expand Down Expand Up @@ -354,7 +266,7 @@ public static Optional<String> getKeyForDatasource(Option<?> option) {
*/
public static Optional<String> getKeyForDatasource(String option) {
return Optional.of(option)
.filter(o -> OPTIONS_DATASOURCES.stream().map(Option::getKey).anyMatch(o::equals))
.filter(OPTIONS_DATASOURCES::contains)
.map(key -> key.concat(DATASOURCES_OVERRIDES_SUFFIX.getOrDefault(key, "")))
.map(key -> key.concat("-<datasource>"));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,11 @@ public class Option<T> {
private final DeprecatedMetadata deprecatedMetadata;
private final Set<String> connectedOptions;
private String wildcardKey;
private final boolean synthetic;

public Option(Class<T> type, String key, OptionCategory category, boolean hidden, boolean buildTime, String description,
Optional<T> defaultValue, List<String> expectedValues, boolean strictExpectedValues, boolean caseInsensitiveExpectedValues,
DeprecatedMetadata deprecatedMetadata, Set<String> connectedOptions, String wildcardKey, Class<?> componentType) {
DeprecatedMetadata deprecatedMetadata, Set<String> connectedOptions, String wildcardKey, Class<?> componentType, boolean synthetic) {
this.type = type;
this.key = key;
this.category = category;
Expand All @@ -40,6 +41,7 @@ public Option(Class<T> type, String key, OptionCategory category, boolean hidden
this.connectedOptions = connectedOptions;
this.wildcardKey = wildcardKey;
this.componentType = componentType;
this.synthetic = synthetic;
}

public Class<T> getType() {
Expand Down Expand Up @@ -135,6 +137,9 @@ public OptionBuilder<T> toBuilder() {
if (hidden) {
builder.hidden();
}
if (synthetic) {
builder.synthetic();
}
return builder;
}

Expand Down Expand Up @@ -176,4 +181,8 @@ public static String transformEnumValue(String value) {
public Class<?> getComponentType() {
return componentType;
}

public boolean isSynthetic() {
return synthetic;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public class OptionBuilder<T> {
private DeprecatedMetadata deprecatedMetadata;
private String wildcardKey;

private boolean synthetic;

public static <A> OptionBuilder<List<A>> listOptionBuilder(String key, Class<A> type) {
return new OptionBuilder(key, List.class, type);
}
Expand Down Expand Up @@ -194,7 +196,12 @@ public Option<T> build() {
}
}

return new Option<T>(type, key, category, hidden, build, description, defaultValue, expectedValues, strictExpectedValues, caseInsensitiveExpectedValues, deprecatedMetadata, connectedOptions, wildcardKey, expected);
return new Option<T>(type, key, category, hidden || synthetic, build, description, defaultValue, expectedValues, strictExpectedValues, caseInsensitiveExpectedValues, deprecatedMetadata, connectedOptions, wildcardKey, expected, synthetic);
}

public OptionBuilder<T> synthetic() {
this.synthetic = true;
return this;
}

}
Loading
Loading
0