diff --git a/ojdbc-provider-azure/src/main/java/oracle/jdbc/provider/azure/configuration/AzureVaultURLParser.java b/ojdbc-provider-azure/src/main/java/oracle/jdbc/provider/azure/configuration/AzureVaultURLParser.java index f4a6cd98..faf92e00 100644 --- a/ojdbc-provider-azure/src/main/java/oracle/jdbc/provider/azure/configuration/AzureVaultURLParser.java +++ b/ojdbc-provider-azure/src/main/java/oracle/jdbc/provider/azure/configuration/AzureVaultURLParser.java @@ -70,12 +70,15 @@ static void parseVaultSecretUri( String path = urlBuilder.getPath(); - if (!path.contains("/secrets")) + if (!path.contains("/secrets/")) throw new IllegalArgumentException("The Vault Secret URI should " + - "contain \"/secrets\" following by the name of the Secret: " + + "contain \"/secrets\" followed by the name of the Secret: " + vaultSecretUri); - String secretName = path.replace("/secrets", ""); + String secretName = path.replace("/secrets/", ""); + if (secretName.trim().isEmpty()){ + throw new IllegalArgumentException("Missing secret name in Vault URI: " + vaultSecretUri); + } builder.add("value", KeyVaultSecretFactory.SECRET_NAME, secretName); } } diff --git a/ojdbc-provider-azure/src/test/java/oracle/jdbc/provider/azure/configuration/AzureVaultSecretProviderTest.java b/ojdbc-provider-azure/src/test/java/oracle/jdbc/provider/azure/configuration/AzureVaultSecretProviderTest.java index 3a24c93a..67c644f6 100644 --- a/ojdbc-provider-azure/src/test/java/oracle/jdbc/provider/azure/configuration/AzureVaultSecretProviderTest.java +++ b/ojdbc-provider-azure/src/test/java/oracle/jdbc/provider/azure/configuration/AzureVaultSecretProviderTest.java @@ -75,6 +75,32 @@ public void test() { ))); } + /** + * Verifies that calling getSecret(...) with an empty secret name + * is rejected by throwing an IllegalArgumentException whose message + * indicates a missing secret name. + */ + @Test + public void testEmptySecretNameThrows() { + IllegalArgumentException ex = Assertions.assertThrows( + IllegalArgumentException.class, + () -> PROVIDER.getSecret( + constructSecretProperties( + TestProperties.getOrAbort(AzureTestProperty.AZURE_KEY_VAULT_URL), + "", // <— empty secret path + TestProperties.getOrAbort(AzureTestProperty.AZURE_CLIENT_ID), + TestProperties.getOrAbort(AzureTestProperty.AZURE_CLIENT_SECRET), + TestProperties.getOrAbort(AzureTestProperty.AZURE_TENANT_ID) + ) + ), + "Expected getSecret(...) to throw when secret name is empty" + ); + Assertions.assertTrue( + ex.getMessage().toLowerCase().contains("missing secret name"), + "Exception message should mention 'secret name', but was: " + ex.getMessage() + ); + } + private Map constructSecretProperties( String vaultUrl, String secretName, String clientId, String clientSecret, String tenantId) { Map secretProperties = new HashMap<>();