Skip to content

Commit aa76cc1

Browse files
Oci secret retrieval refactor username test (#115)
* Refactor secret retrieval to centralize logic in OciResourceProvider * Rename retrieveSecret to getSecret * Add Username provider Test * Add Username provider Test * Refactor wallet retrieval in OciResourceProvider * Refactor wallet retrieval in OciResourceProvider * Refactor resource retrieval logic in AbstractResourceProvider && Rename getSecret to getVaultSecret and getWallet to getAutonomousDatabaseWallet
1 parent 84bcc79 commit aa76cc1

File tree

10 files changed

+175
-39
lines changed

10 files changed

+175
-39
lines changed

ojdbc-provider-common/src/main/java/oracle/jdbc/provider/resource/AbstractResourceProvider.java

+34
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
package oracle.jdbc.provider.resource;
4040

41+
import oracle.jdbc.provider.factory.ResourceFactory;
4142
import oracle.jdbc.provider.parameter.ParameterSet;
4243
import oracle.jdbc.provider.parameter.ParameterSetParser;
4344
import oracle.jdbc.spi.OracleResourceProvider;
@@ -129,4 +130,37 @@ protected final ParameterSet parseParameterValues(
129130
entry -> entry.getValue().toString())));
130131
}
131132

133+
/**
134+
* Requests a resource from a factory using the given parameterValues. This
135+
* method implements the common operations of parsing parameterValues,
136+
* requesting a resource from a factory, and then extracting the content from
137+
* the resource object. Concrete implementations of AbstractResourceProvider
138+
* should use this method whenever possible to avoid duplications of the same
139+
* code pattern.
140+
*
141+
* @param factory Factory to request resources from. Not null.
142+
*
143+
* @param parameterValues Parameters for the request. Not null.
144+
*
145+
* @return The content of the requested resource.
146+
*
147+
* @param <T> The type of resource content.
148+
*
149+
* @throws IllegalArgumentException If {@code parameterValues} includes an
150+
* unrecognized parameter or a value that can not be parsed. Or if the
151+
* {@code parameterValues} does not include a required parameter, or does
152+
* not represent a valid configuration.
153+
*
154+
* @throws IllegalStateException If the request fails to return a resource.
155+
*/
156+
protected <T> T getResource(
157+
ResourceFactory<T> factory, Map<Parameter, CharSequence> parameterValues) {
158+
159+
ParameterSet parameterSet = parseParameterValues(parameterValues);
160+
161+
return factory
162+
.request(parameterSet)
163+
.getContent();
164+
}
165+
132166
}

ojdbc-provider-oci/src/main/java/oracle/jdbc/provider/oci/resource/DatabaseConnectionStringProvider.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,7 @@ public String getConnectionString(
8383

8484
ParameterSet parameterSet = parseParameterValues(parameterValues);
8585

86-
Wallet wallet = WalletFactory.getInstance()
87-
.request(parameterSet)
88-
.getContent();
86+
Wallet wallet = getAutonomousDatabaseWallet(parameterValues);
8987

9088
String consumerGroup =
9189
parameterSet.getRequired(CONSUMER_GROUP)

ojdbc-provider-oci/src/main/java/oracle/jdbc/provider/oci/resource/DatabaseTlsProvider.java

+2-8
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
package oracle.jdbc.provider.oci.resource;
4040

4141
import oracle.jdbc.provider.oci.database.WalletFactory;
42-
import oracle.jdbc.provider.parameter.ParameterSet;
4342
import oracle.jdbc.provider.resource.ResourceParameter;
4443
import oracle.jdbc.spi.TlsConfigurationProvider;
4544

@@ -83,13 +82,8 @@ public DatabaseTlsProvider() {
8382
@Override
8483
public SSLContext getSSLContext(
8584
Map<Parameter, CharSequence> parameterValues) {
86-
87-
ParameterSet parameterSet = parseParameterValues(parameterValues);
88-
89-
return WalletFactory.getInstance()
90-
.request(parameterSet)
91-
.getContent()
92-
.getSSLContext();
85+
return getAutonomousDatabaseWallet(parameterValues)
86+
.getSSLContext();
9387
}
9488

9589
}

ojdbc-provider-oci/src/main/java/oracle/jdbc/provider/oci/resource/OciResourceProvider.java

+51
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,14 @@
4141
import com.oracle.bmc.Region;
4242
import oracle.jdbc.provider.oci.authentication.AuthenticationDetailsFactory;
4343
import oracle.jdbc.provider.oci.authentication.AuthenticationMethod;
44+
import oracle.jdbc.provider.oci.database.WalletFactory;
45+
import oracle.jdbc.provider.oci.vault.Secret;
46+
import oracle.jdbc.provider.oci.vault.SecretFactory;
4447
import oracle.jdbc.provider.resource.AbstractResourceProvider;
4548
import oracle.jdbc.provider.resource.ResourceParameter;
49+
import oracle.jdbc.provider.util.Wallet;
4650

51+
import java.util.Map;
4752
import java.util.stream.Stream;
4853

4954
import static oracle.jdbc.provider.oci.authentication.AuthenticationMethod.*;
@@ -127,4 +132,50 @@ private static AuthenticationMethod parseAuthenticationMethod(
127132
}
128133
}
129134

135+
/**
136+
* <p>
137+
* Retrieves a secret from OCI Vault identified by a set of parameters
138+
* provided in {@code parameterValues}. This method is intended to centralize
139+
* secret retrieval logic and can be called by subclasses implementing
140+
* {@link oracle.jdbc.spi.OracleResourceProvider} SPI.
141+
* </p><p>
142+
* This method uses the {@code getResource} method to parse parameters
143+
* from {@code parameterValues} and retrieve the secret from OCI Vault
144+
* through the {@link SecretFactory} instance.
145+
* </p>
146+
*
147+
* @param parameterValues The map of parameter names and their corresponding
148+
* text values required for secret retrieval. Must not be null.
149+
* @return The {@link Secret} object containing the retrieved secret data.
150+
* Not null.
151+
*/
152+
protected Secret getVaultSecret(
153+
Map<Parameter, CharSequence> parameterValues) {
154+
return getResource(SecretFactory.getInstance(),parameterValues);
155+
}
156+
157+
/**
158+
* <p>
159+
* Retrieves a wallet from the Autonomous Database (ADB) service using
160+
* a set of parameters provided in {@code parameterValues}. This method
161+
* centralizes wallet retrieval logic for use by subclasses implementing the
162+
* {@link oracle.jdbc.spi.OracleResourceProvider} SPI.
163+
* </p><p>
164+
* This method uses the {@code getResource} method to parse parameters
165+
* from {@code parameterValues} and retrieve the wallet from the ADB
166+
* service through the {@link WalletFactory} instance. Wallets contain
167+
* connection strings and TLS key and trust material for establishing secure
168+
* connections with the database.
169+
* </p>
170+
*
171+
* @param parameterValues The map of parameter names and their corresponding
172+
* text values required for wallet retrieval. Must not be null.
173+
* @return The {@link Wallet} object containing connection strings and
174+
* TLS material. Not null.
175+
*/
176+
protected Wallet getAutonomousDatabaseWallet(
177+
Map<Parameter, CharSequence> parameterValues) {
178+
return getResource(WalletFactory.getInstance(), parameterValues);
179+
}
180+
130181
}

ojdbc-provider-oci/src/main/java/oracle/jdbc/provider/oci/resource/VaultPasswordProvider.java

+2-9
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@
3838

3939
package oracle.jdbc.provider.oci.resource;
4040

41-
import oracle.jdbc.provider.oci.vault.SecretFactory;
42-
import oracle.jdbc.provider.parameter.ParameterSet;
4341
import oracle.jdbc.provider.resource.ResourceParameter;
4442
import oracle.jdbc.spi.PasswordProvider;
4543

@@ -74,13 +72,8 @@ public VaultPasswordProvider() {
7472

7573
@Override
7674
public char[] getPassword(Map<Parameter, CharSequence> parameterValues) {
77-
78-
ParameterSet parameterSet = parseParameterValues(parameterValues);
79-
80-
return SecretFactory.getInstance()
81-
.request(parameterSet)
82-
.getContent()
83-
.toCharArray();
75+
return getVaultSecret(parameterValues)
76+
.toCharArray();
8477
}
8578

8679
}

ojdbc-provider-oci/src/main/java/oracle/jdbc/provider/oci/resource/VaultSEPSProvider.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
package oracle.jdbc.provider.oci.resource;
4040

4141
import oracle.jdbc.provider.oci.vault.Secret;
42-
import oracle.jdbc.provider.oci.vault.SecretFactory;
4342
import oracle.jdbc.provider.parameter.ParameterSet;
4443
import oracle.jdbc.provider.resource.ResourceParameter;
4544
import oracle.jdbc.provider.util.WalletUtils;
@@ -112,9 +111,7 @@ private WalletUtils.Credentials getWalletCredentials(
112111
Map<OracleResourceProvider.Parameter, CharSequence> parameterValues) {
113112

114113
ParameterSet parameterSet = parseParameterValues(parameterValues);
115-
Secret secret = SecretFactory.getInstance()
116-
.request(parameterSet)
117-
.getContent();
114+
Secret secret = getVaultSecret(parameterValues);
118115

119116
char[] walletPassword = parameterSet.getOptional(PASSWORD) != null
120117
? parameterSet.getOptional(PASSWORD).toCharArray()

ojdbc-provider-oci/src/main/java/oracle/jdbc/provider/oci/resource/VaultTCPSProvider.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
package oracle.jdbc.provider.oci.resource;
4040

4141
import oracle.jdbc.provider.oci.vault.Secret;
42-
import oracle.jdbc.provider.oci.vault.SecretFactory;
4342
import oracle.jdbc.provider.parameter.ParameterSet;
4443
import oracle.jdbc.provider.resource.ResourceParameter;
4544
import oracle.jdbc.provider.util.TlsUtils;
@@ -114,10 +113,8 @@ public VaultTCPSProvider() {
114113
public SSLContext getSSLContext(Map<Parameter, CharSequence> parameterValues) {
115114
try {
116115
ParameterSet parameterSet = parseParameterValues(parameterValues);
117-
Secret secret = SecretFactory
118-
.getInstance()
119-
.request(parameterSet)
120-
.getContent();
116+
117+
Secret secret = getVaultSecret(parameterValues);
121118

122119
byte[] fileBytes = Base64
123120
.getDecoder()

ojdbc-provider-oci/src/main/java/oracle/jdbc/provider/oci/resource/VaultUsernameProvider.java

+4-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
** Copyright (c) 2023 Oracle and/or its affiliates.
2+
** Copyright (c) 2024 Oracle and/or its affiliates.
33
**
44
** The Universal Permissive License (UPL), Version 1.0
55
**
@@ -37,8 +37,7 @@
3737
*/
3838
package oracle.jdbc.provider.oci.resource;
3939

40-
import oracle.jdbc.provider.oci.vault.SecretFactory;
41-
import oracle.jdbc.provider.parameter.ParameterSet;
40+
import oracle.jdbc.provider.oci.vault.Secret;
4241
import oracle.jdbc.provider.resource.ResourceParameter;
4342
import oracle.jdbc.spi.UsernameProvider;
4443

@@ -75,14 +74,9 @@ public VaultUsernameProvider() {
7574
@Override
7675
public String getUsername(Map<Parameter, CharSequence> parameterValues) {
7776

78-
ParameterSet parameterSet = parseParameterValues(parameterValues);
77+
Secret secret = getVaultSecret(parameterValues);
7978

80-
char[] username = SecretFactory.getInstance()
81-
.request(parameterSet)
82-
.getContent()
83-
.toCharArray();
84-
85-
return new String(username);
79+
return new String(secret.toCharArray());
8680
}
8781

8882
}

ojdbc-provider-oci/src/test/java/oracle/jdbc/provider/oci/OciTestProperty.java

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public enum OciTestProperty {
6060

6161
OCI_PASSWORD_OCID,
6262

63+
OCI_USERNAME_OCID,
64+
6365
OCI_DATABASE_OCID,
6466

6567
OCI_OBJECT_STORAGE_URL,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
** Copyright (c) 2023 Oracle and/or its affiliates.
3+
**
4+
** The Universal Permissive License (UPL), Version 1.0
5+
**
6+
** Subject to the condition set forth below, permission is hereby granted to any
7+
** person obtaining a copy of this software, associated documentation and/or data
8+
** (collectively the "Software"), free of charge and under any and all copyright
9+
** rights in the Software, and any and all patent rights owned or freely
10+
** licensable by each licensor hereunder covering either (i) the unmodified
11+
** Software as contributed to or provided by such licensor, or (ii) the Larger
12+
** Works (as defined below), to deal in both
13+
**
14+
** (a) the Software, and
15+
** (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
16+
** one is included with the Software (each a "Larger Work" to which the Software
17+
** is contributed by such licensors),
18+
**
19+
** without restriction, including without limitation the rights to copy, create
20+
** derivative works of, display, perform, and distribute the Software and make,
21+
** use, sell, offer for sale, import, export, have made, and have sold the
22+
** Software and the Larger Work(s), and to sublicense the foregoing rights on
23+
** either these or other terms.
24+
**
25+
** This license is subject to the following condition:
26+
** The above copyright notice and either this complete permission notice or at
27+
** a minimum a reference to the UPL must be included in all copies or
28+
** substantial portions of the Software.
29+
**
30+
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
31+
** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
32+
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
33+
** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
34+
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
35+
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
36+
** SOFTWARE.
37+
*/
38+
39+
package oracle.jdbc.provider.oci.resource;
40+
41+
import oracle.jdbc.provider.TestProperties;
42+
import oracle.jdbc.provider.oci.OciTestProperty;
43+
import oracle.jdbc.spi.OracleResourceProvider.Parameter;
44+
import oracle.jdbc.spi.UsernameProvider;
45+
import org.junit.jupiter.api.Test;
46+
47+
import java.util.HashMap;
48+
import java.util.Map;
49+
50+
import static oracle.jdbc.provider.resource.ResourceProviderTestUtil.createParameterValues;
51+
import static oracle.jdbc.provider.resource.ResourceProviderTestUtil.findProvider;
52+
import static org.junit.jupiter.api.Assertions.assertNotNull;
53+
54+
public class VaultUsernameProviderTest {
55+
56+
private static final UsernameProvider PROVIDER =
57+
findProvider(UsernameProvider.class, "ojdbc-provider-oci-vault-username");
58+
59+
@Test
60+
public void test() {
61+
Map<String, CharSequence> testParameters = new HashMap<>();
62+
testParameters.put("authenticationMethod", "config-file");
63+
testParameters.put("configFile", TestProperties.getOrAbort(
64+
OciTestProperty.OCI_CONFIG_FILE));
65+
testParameters.put("profile", TestProperties.getOrAbort(
66+
OciTestProperty.OCI_CONFIG_PROFILE));
67+
testParameters.put("ocid", TestProperties.getOrAbort(
68+
OciTestProperty.OCI_USERNAME_OCID));
69+
70+
Map<Parameter, CharSequence> parameterValues =
71+
createParameterValues(PROVIDER, testParameters);
72+
73+
String username = PROVIDER.getUsername(parameterValues);
74+
assertNotNull(username);
75+
}
76+
}

0 commit comments

Comments
 (0)