From 9ea9ea61f127389598ec78b5258b7cc0c92de8b4 Mon Sep 17 00:00:00 2001 From: Victor Colin Amador Date: Wed, 30 Sep 2020 20:24:07 -0500 Subject: [PATCH 1/8] Created model classes for certificates, keys and secrets identifiers. --- .../CertificateClientBuilder.java | 5 +- .../models/KeyVaultCertificateIdentifier.java | 86 +++++++++++++++++++ .../keyvault/keys/KeyClientBuilder.java | 6 +- .../keys/models/KeyVaultKeyIdentifier.java | 86 +++++++++++++++++++ .../keyvault/secrets/SecretClientBuilder.java | 5 +- .../models/KeyVaultSecretIdentifier.java | 86 +++++++++++++++++++ 6 files changed, 271 insertions(+), 3 deletions(-) create mode 100644 sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java create mode 100644 sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java create mode 100644 sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateClientBuilder.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateClientBuilder.java index 5c1c2e8d97e2..7f43800009e3 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateClientBuilder.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateClientBuilder.java @@ -19,6 +19,7 @@ import com.azure.core.util.Configuration; import com.azure.core.util.logging.ClientLogger; import com.azure.security.keyvault.certificates.implementation.KeyVaultCredentialPolicy; +import com.azure.security.keyvault.certificates.models.KeyVaultCertificateIdentifier; import java.net.MalformedURLException; import java.net.URL; @@ -162,7 +163,9 @@ public CertificateAsyncClient buildAsyncClient() { /** * Sets the vault endpoint url to send HTTP requests to. * - * @param vaultUrl The vault endpoint url is used as destination on Azure to send requests to. + * @param vaultUrl The vault endpoint url is used as destination on Azure to send requests to. If you have a + * certificate identifier, use {@link KeyVaultCertificateIdentifier#parse(String)} to parse it and obtain the + * {@code vaultUrl} and other information. * @return the updated ServiceClientBuilder object. * @throws IllegalArgumentException if {@code vaultUrl} is null or it cannot be parsed into a valid URL. */ diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java new file mode 100644 index 000000000000..1b83dc5ddfb7 --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.security.keyvault.certificates.models; + +import com.azure.security.keyvault.certificates.CertificateAsyncClient; +import com.azure.security.keyvault.certificates.CertificateClient; + +import java.net.MalformedURLException; +import java.net.URL; + +/** + * Information about a {@link KeyVaultCertificate} parsed from the key URL. You can use this information when calling + * methods of {@link CertificateClient} or {@link CertificateAsyncClient}. + */ +public class KeyVaultCertificateIdentifier { + private final String certificateId, vaultUrl, name, version; + + private KeyVaultCertificateIdentifier(String certificateId, String vaultUrl, String name, String version) { + this.certificateId = certificateId; + this.vaultUrl = vaultUrl; + this.name = name; + this.version = version; + } + + /** + * Gets the key identifier used to create this object + * + * @return The certificate identifier. + */ + public String getCertificateId() { + return certificateId; + } + + /** + * Gets the URL of the Key Vault. + * + * @return The Key Vault URL. + */ + public String getVaultUrl() { + return vaultUrl; + } + + /** + * Gets the name of the certificate. + * + * @return The certificate name. + */ + public String getName() { + return name; + } + + /** + * Gets the optional version of the certificate. + * + * @return The certificate version. + */ + public String getVersion() { + return version; + } + + /** + * Create a new {@link KeyVaultCertificateIdentifier} from a given certificate identifier. + * + * @param certificateId The certificate identifier to extract information from. + * @return a new instance of {@link KeyVaultCertificateIdentifier}. + * @throws IllegalArgumentException if the given identifier is {@code null}. + * @throws MalformedURLException if the given identifier is not a valid Key Vault Certificate identifier + */ + public static KeyVaultCertificateIdentifier parse(String certificateId) throws IllegalArgumentException, MalformedURLException { + if (certificateId == null) { + throw new IllegalArgumentException("certificateId cannot be null"); + } + + URL url = new URL(certificateId); + // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] + String[] pathSegments = url.getPath().split("/"); + + if ((pathSegments.length != 2 && pathSegments.length != 3) || !"certificates".equals(pathSegments[0])) { + throw new IllegalArgumentException("certificateId is not a valid Key Vault Certificate identifier"); + } + + return new KeyVaultCertificateIdentifier(certificateId, url.getProtocol() + "://" + url.getHost(), pathSegments[0], + pathSegments.length == 3 ? pathSegments[2] : null); + } +} diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyClientBuilder.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyClientBuilder.java index b58733b35d9d..de657f8fbff8 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyClientBuilder.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyClientBuilder.java @@ -19,6 +19,8 @@ import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; import com.azure.security.keyvault.keys.implementation.KeyVaultCredentialPolicy; +import com.azure.security.keyvault.keys.models.KeyVaultKeyIdentifier; + import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; @@ -163,7 +165,9 @@ public KeyAsyncClient buildAsyncClient() { /** * Sets the vault url to send HTTP requests to. * - * @param vaultUrl The vault url is used as destination on Azure to send requests to. + * @param vaultUrl The vault url is used as destination on Azure to send requests to. If you have a key identifier, + * use {@link KeyVaultKeyIdentifier#parse(String)} to parse it and obtain the {@code vaultUrl} and other + * information. * @return the updated ServiceClientBuilder object. * @throws IllegalArgumentException if {@code vaultUrl} is null or it cannot be parsed into a valid URL. */ diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java new file mode 100644 index 000000000000..f894814d35f3 --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.security.keyvault.keys.models; + +import com.azure.security.keyvault.keys.KeyAsyncClient; +import com.azure.security.keyvault.keys.KeyClient; + +import java.net.MalformedURLException; +import java.net.URL; + +/** + * Information about a {@link KeyVaultKey} parsed from the key URL. You can use this information when calling methods + * of {@link KeyClient} or {@link KeyAsyncClient}. + */ +public class KeyVaultKeyIdentifier { + private final String keyId, vaultUrl, name, version; + + private KeyVaultKeyIdentifier(String keyId, String vaultUrl, String name, String version) { + this.keyId = keyId; + this.vaultUrl = vaultUrl; + this.name = name; + this.version = version; + } + + /** + * Gets the key identifier used to create this object. + * + * @return The key identifier. + */ + public String getKeyId() { + return keyId; + } + + /** + * Gets the URL of the Key Vault. + * + * @return The Key Vault URL. + */ + public String getVaultUrl() { + return vaultUrl; + } + + /** + * Gets the name of the key. + * + * @return The key name. + */ + public String getName() { + return name; + } + + /** + * Gets the optional version of the key. + * + * @return The key version. + */ + public String getVersion() { + return version; + } + + /** + * Create a new {@link KeyVaultKeyIdentifier} from a given key identifier. + * + * @param keyId The key identifier to extract information from. + * @return a new instance of {@link KeyVaultKeyIdentifier}. + * @throws IllegalArgumentException if the given identifier is {@code null}. + * @throws MalformedURLException if the given identifier is not a valid Key Vault Key identifier + */ + public static KeyVaultKeyIdentifier parse(String keyId) throws IllegalArgumentException, MalformedURLException { + if (keyId == null) { + throw new IllegalArgumentException("keyId cannot be null"); + } + + URL url = new URL(keyId); + // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] + String[] pathSegments = url.getPath().split("/"); + + if ((pathSegments.length != 2 && pathSegments.length != 3) || !"keys".equals(pathSegments[0])) { + throw new IllegalArgumentException("keyId is not a valid Key Vault Key identifier"); + } + + return new KeyVaultKeyIdentifier(keyId, url.getProtocol() + "://" + url.getHost(), pathSegments[0], + pathSegments.length == 3 ? pathSegments[2] : null); + } +} diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretClientBuilder.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretClientBuilder.java index 669720ee1341..5a530a705d2d 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretClientBuilder.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretClientBuilder.java @@ -19,6 +19,7 @@ import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; import com.azure.security.keyvault.secrets.implementation.KeyVaultCredentialPolicy; +import com.azure.security.keyvault.secrets.models.KeyVaultSecretIdentifier; import java.net.MalformedURLException; import java.net.URL; @@ -166,7 +167,9 @@ public SecretAsyncClient buildAsyncClient() { /** * Sets the vault url to send HTTP requests to. * - * @param vaultUrl The vault url is used as destination on Azure to send requests to. + * @param vaultUrl The vault url is used as destination on Azure to send requests to. If you have a secret + * identifier, use {@link KeyVaultSecretIdentifier#parse(String)} to parse it and obtain the {@code vaultUrl} and + * other information. * @return the updated {@link SecretClientBuilder} object. * @throws IllegalArgumentException if {@code vaultUrl} is null or it cannot be parsed into a valid URL. */ diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java new file mode 100644 index 000000000000..17581830b825 --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.security.keyvault.secrets.models; + +import com.azure.security.keyvault.secrets.SecretAsyncClient; +import com.azure.security.keyvault.secrets.SecretClient; + +import java.net.MalformedURLException; +import java.net.URL; + +/** + * Information about a {@link KeyVaultSecret} parsed from the key URL. You can use this information when calling + * methods of {@link SecretClient} or {@link SecretAsyncClient}. + */ +public class KeyVaultSecretIdentifier { + private final String secretId, vaultUrl, name, version; + + private KeyVaultSecretIdentifier(String secretId, String vaultUrl, String name, String version) { + this.secretId = secretId; + this.vaultUrl = vaultUrl; + this.name = name; + this.version = version; + } + + /** + * Gets the key identifier used to create this object + * + * @return The secret identifier. + */ + public String getSecretId() { + return secretId; + } + + /** + * Gets the URL of the Key Vault. + * + * @return The Key Vault URL. + */ + public String getVaultUrl() { + return vaultUrl; + } + + /** + * Gets the name of the secret. + * + * @return The secret name. + */ + public String getName() { + return name; + } + + /** + * Gets the optional version of the secret. + * + * @return The secret version. + */ + public String getVersion() { + return version; + } + + /** + * Create a new {@link KeyVaultSecretIdentifier} from a given secret identifier. + * + * @param secretId The secret identifier to extract information from. + * @return a new instance of {@link KeyVaultSecretIdentifier}. + * @throws IllegalArgumentException if the given identifier is {@code null}. + * @throws MalformedURLException if the given identifier is not a valid Key Vault Secret identifier + */ + public static KeyVaultSecretIdentifier parse(String secretId) throws IllegalArgumentException, MalformedURLException { + if (secretId == null) { + throw new IllegalArgumentException("secretId cannot be null"); + } + + URL url = new URL(secretId); + // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] + String[] pathSegments = url.getPath().split("/"); + + if ((pathSegments.length != 2 && pathSegments.length != 3) || !"secrets".equals(pathSegments[0])) { + throw new IllegalArgumentException("secretId is not a valid Key Vault Secret identifier"); + } + + return new KeyVaultSecretIdentifier(secretId, url.getProtocol() + "://" + url.getHost(), pathSegments[0], + pathSegments.length == 3 ? pathSegments[2] : null); + } +} From de1a8c6ba5f96a3fe24bb802fd746b17d93ac794 Mon Sep 17 00:00:00 2001 From: Victor Colin Amador Date: Thu, 1 Oct 2020 13:14:18 -0500 Subject: [PATCH 2/8] Fixed spotbugs issues. --- .../certificates/models/KeyVaultCertificateIdentifier.java | 2 +- .../security/keyvault/keys/models/KeyVaultKeyIdentifier.java | 2 +- .../keyvault/secrets/models/KeyVaultSecretIdentifier.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java index 1b83dc5ddfb7..8f29046e7441 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java @@ -13,7 +13,7 @@ * Information about a {@link KeyVaultCertificate} parsed from the key URL. You can use this information when calling * methods of {@link CertificateClient} or {@link CertificateAsyncClient}. */ -public class KeyVaultCertificateIdentifier { +public final class KeyVaultCertificateIdentifier { private final String certificateId, vaultUrl, name, version; private KeyVaultCertificateIdentifier(String certificateId, String vaultUrl, String name, String version) { diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java index f894814d35f3..07129f39a4bd 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java @@ -13,7 +13,7 @@ * Information about a {@link KeyVaultKey} parsed from the key URL. You can use this information when calling methods * of {@link KeyClient} or {@link KeyAsyncClient}. */ -public class KeyVaultKeyIdentifier { +public final class KeyVaultKeyIdentifier { private final String keyId, vaultUrl, name, version; private KeyVaultKeyIdentifier(String keyId, String vaultUrl, String name, String version) { diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java index 17581830b825..72ac25e636bf 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java @@ -13,7 +13,7 @@ * Information about a {@link KeyVaultSecret} parsed from the key URL. You can use this information when calling * methods of {@link SecretClient} or {@link SecretAsyncClient}. */ -public class KeyVaultSecretIdentifier { +public final class KeyVaultSecretIdentifier { private final String secretId, vaultUrl, name, version; private KeyVaultSecretIdentifier(String secretId, String vaultUrl, String name, String version) { From 7005cbf1b7509c1849759aab0656ed0291f4474a Mon Sep 17 00:00:00 2001 From: Victor Colin Amador Date: Thu, 1 Oct 2020 13:51:22 -0500 Subject: [PATCH 3/8] Added unit tests. --- .../models/KeyVaultCertificateIdentifier.java | 6 +- .../KeyVaultCertificateIdentifierTest.java | 59 +++++++++++++++++++ .../keys/models/KeyVaultKeyIdentifier.java | 6 +- .../models/KeyVaultKeyIdentifierTest.java | 54 +++++++++++++++++ .../models/KeyVaultSecretIdentifier.java | 6 +- .../models/KeyVaultSecretIdentifierTest.java | 56 ++++++++++++++++++ 6 files changed, 178 insertions(+), 9 deletions(-) create mode 100644 sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java create mode 100644 sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java create mode 100644 sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java index 8f29046e7441..b88acdd50705 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java @@ -76,11 +76,11 @@ public static KeyVaultCertificateIdentifier parse(String certificateId) throws I // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 2 && pathSegments.length != 3) || !"certificates".equals(pathSegments[0])) { + if ((pathSegments.length != 3 && pathSegments.length != 4) || !"certificates".equals(pathSegments[1])) { throw new IllegalArgumentException("certificateId is not a valid Key Vault Certificate identifier"); } - return new KeyVaultCertificateIdentifier(certificateId, url.getProtocol() + "://" + url.getHost(), pathSegments[0], - pathSegments.length == 3 ? pathSegments[2] : null); + return new KeyVaultCertificateIdentifier(certificateId, url.getProtocol() + "://" + url.getHost(), + pathSegments[2], pathSegments.length == 4 ? pathSegments[3] : null); } } diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java new file mode 100644 index 000000000000..75b47ed770bb --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java @@ -0,0 +1,59 @@ +package com.azure.security.keyvault.certificates.models; + +import org.junit.jupiter.api.Test; + +import java.net.MalformedURLException; + +import static org.junit.jupiter.api.Assertions.*; + +class KeyVaultCertificateIdentifierTest { + @Test + void parse_withoutVersion() throws MalformedURLException { + String certificateId = "https://test-key-vault.vault.azure.net/certificates/test-certificate"; + KeyVaultCertificateIdentifier keyVaultCertificateIdentifier = + KeyVaultCertificateIdentifier.parse(certificateId); + + assertEquals(certificateId, keyVaultCertificateIdentifier.getCertificateId()); + assertEquals("https://test-key-vault.vault.azure.net", keyVaultCertificateIdentifier.getVaultUrl()); + assertEquals("test-certificate", keyVaultCertificateIdentifier.getName()); + assertNull(keyVaultCertificateIdentifier.getVersion()); + } + + @Test + void parse_withVersion() throws MalformedURLException { + String certificateId = "https://test-key-vault.vault.azure.net/certificates/test-certificate/test-version"; + KeyVaultCertificateIdentifier keyVaultCertificateIdentifier = + KeyVaultCertificateIdentifier.parse(certificateId); + + assertEquals(certificateId, keyVaultCertificateIdentifier.getCertificateId()); + assertEquals("https://test-key-vault.vault.azure.net", keyVaultCertificateIdentifier.getVaultUrl()); + assertEquals("test-certificate", keyVaultCertificateIdentifier.getName()); + assertEquals("test-version", keyVaultCertificateIdentifier.getVersion()); + } + + @Test + void parse_invalidIdentifier_thatIsNull() { + Exception exception = assertThrows(IllegalArgumentException.class, + () -> KeyVaultCertificateIdentifier.parse(null)); + + assertEquals("certificateId cannot be null", exception.getMessage()); + } + + @Test + void parse_invalidIdentifier_withWrongCollection() { + String certificateId = "https://test-key-vault.vault.azure.net/keys/test-certificate"; + Exception exception = assertThrows(IllegalArgumentException.class, + () -> KeyVaultCertificateIdentifier.parse(certificateId)); + + assertEquals("certificateId is not a valid Key Vault Certificate identifier", exception.getMessage()); + } + + @Test + void parse_invalidIdentifier_withExtraSegment() { + String certificateId = "https://test-key-vault.vault.azure.net/keys/test-certificate/test-version/extra"; + Exception exception = assertThrows(IllegalArgumentException.class, + () -> KeyVaultCertificateIdentifier.parse(certificateId)); + + assertEquals("certificateId is not a valid Key Vault Certificate identifier", exception.getMessage()); + } +} diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java index 07129f39a4bd..f4573d1a4986 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java @@ -76,11 +76,11 @@ public static KeyVaultKeyIdentifier parse(String keyId) throws IllegalArgumentEx // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 2 && pathSegments.length != 3) || !"keys".equals(pathSegments[0])) { + if ((pathSegments.length != 3 && pathSegments.length != 4) || !"keys".equals(pathSegments[1])) { throw new IllegalArgumentException("keyId is not a valid Key Vault Key identifier"); } - return new KeyVaultKeyIdentifier(keyId, url.getProtocol() + "://" + url.getHost(), pathSegments[0], - pathSegments.length == 3 ? pathSegments[2] : null); + return new KeyVaultKeyIdentifier(keyId, url.getProtocol() + "://" + url.getHost(), pathSegments[2], + pathSegments.length == 4 ? pathSegments[3] : null); } } diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java new file mode 100644 index 000000000000..6a6f87be09bb --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java @@ -0,0 +1,54 @@ +package com.azure.security.keyvault.keys.models; + +import org.junit.jupiter.api.Test; + +import java.net.MalformedURLException; + +import static org.junit.jupiter.api.Assertions.*; + +class KeyVaultKeyIdentifierTest { + @Test + void parse_withoutVersion() throws MalformedURLException { + String keyId = "https://test-key-vault.vault.azure.net/keys/test-key"; + KeyVaultKeyIdentifier keyVaultKeyIdentifier = KeyVaultKeyIdentifier.parse(keyId); + + assertEquals(keyId, keyVaultKeyIdentifier.getKeyId()); + assertEquals("https://test-key-vault.vault.azure.net", keyVaultKeyIdentifier.getVaultUrl()); + assertEquals("test-key", keyVaultKeyIdentifier.getName()); + assertNull(keyVaultKeyIdentifier.getVersion()); + } + + @Test + void parse_withVersion() throws MalformedURLException { + String keyId = "https://test-key-vault.vault.azure.net/keys/test-key/test-version"; + KeyVaultKeyIdentifier keyVaultkeyIdentifier = KeyVaultKeyIdentifier.parse(keyId); + + assertEquals(keyId, keyVaultkeyIdentifier.getKeyId()); + assertEquals("https://test-key-vault.vault.azure.net", keyVaultkeyIdentifier.getVaultUrl()); + assertEquals("test-key", keyVaultkeyIdentifier.getName()); + assertEquals("test-version", keyVaultkeyIdentifier.getVersion()); + } + + @Test + void parse_invalidIdentifier_thatIsNull() { + Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(null)); + + assertEquals("keyId cannot be null", exception.getMessage()); + } + + @Test + void parse_invalidIdentifier_withWrongCollection() { + String keyId = "https://test-key-vault.vault.azure.net/secrets/test-key"; + Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(keyId)); + + assertEquals("keyId is not a valid Key Vault Key identifier", exception.getMessage()); + } + + @Test + void parse_invalidIdentifier_withExtraSegment() { + String keyId = "https://test-key-vault.vault.azure.net/keys/test-key/test-key/extra"; + Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(keyId)); + + assertEquals("keyId is not a valid Key Vault Key identifier", exception.getMessage()); + } +} diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java index 72ac25e636bf..593826b610ae 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java @@ -76,11 +76,11 @@ public static KeyVaultSecretIdentifier parse(String secretId) throws IllegalArgu // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 2 && pathSegments.length != 3) || !"secrets".equals(pathSegments[0])) { + if ((pathSegments.length != 3 && pathSegments.length != 4) || !"secrets".equals(pathSegments[1])) { throw new IllegalArgumentException("secretId is not a valid Key Vault Secret identifier"); } - return new KeyVaultSecretIdentifier(secretId, url.getProtocol() + "://" + url.getHost(), pathSegments[0], - pathSegments.length == 3 ? pathSegments[2] : null); + return new KeyVaultSecretIdentifier(secretId, url.getProtocol() + "://" + url.getHost(), pathSegments[2], + pathSegments.length == 4 ? pathSegments[3] : null); } } diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java new file mode 100644 index 000000000000..90d55dd05bba --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java @@ -0,0 +1,56 @@ +package com.azure.security.keyvault.secrets.models; + +import org.junit.jupiter.api.Test; + +import java.net.MalformedURLException; + +import static org.junit.jupiter.api.Assertions.*; + +class KeyVaultSecretIdentifierTest { + @Test + void parse_withoutVersion() throws MalformedURLException { + String secretId = "https://test-secret-vault.vault.azure.net/secrets/test-secret"; + KeyVaultSecretIdentifier keyVaultSecretIdentifier = KeyVaultSecretIdentifier.parse(secretId); + + assertEquals(secretId, keyVaultSecretIdentifier.getSecretId()); + assertEquals("https://test-secret-vault.vault.azure.net", keyVaultSecretIdentifier.getVaultUrl()); + assertEquals("test-secret", keyVaultSecretIdentifier.getName()); + assertNull(keyVaultSecretIdentifier.getVersion()); + } + + @Test + void parse_withVersion() throws MalformedURLException { + String secretId = "https://test-secret-vault.vault.azure.net/secrets/test-secret/test-version"; + KeyVaultSecretIdentifier keyVaultSecretIdentifier = KeyVaultSecretIdentifier.parse(secretId); + + assertEquals(secretId, keyVaultSecretIdentifier.getSecretId()); + assertEquals("https://test-secret-vault.vault.azure.net", keyVaultSecretIdentifier.getVaultUrl()); + assertEquals("test-secret", keyVaultSecretIdentifier.getName()); + assertEquals("test-version", keyVaultSecretIdentifier.getVersion()); + } + + @Test + void parse_invalidIdentifier_thatIsNull() { + Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(null)); + + assertEquals("secretId cannot be null", exception.getMessage()); + } + + @Test + void parse_invalidIdentifier_withWrongCollection() { + String secretId = "https://test-secret-vault.vault.azure.net/certificates/test-secret"; + Exception exception = assertThrows(IllegalArgumentException.class, + () -> KeyVaultSecretIdentifier.parse(secretId)); + + assertEquals("secretId is not a valid Key Vault Secret identifier", exception.getMessage()); + } + + @Test + void parse_invalidIdentifier_withExtraSegment() { + String secretId = "https://test-secret-vault.vault.azure.net/secrets/test-secret/test-secret/extra"; + Exception exception = assertThrows(IllegalArgumentException.class, + () -> KeyVaultSecretIdentifier.parse(secretId)); + + assertEquals("secretId is not a valid Key Vault Secret identifier", exception.getMessage()); + } +} From 0064f044e8cd3bce1619de5b9c68dfdb8b5fc2c4 Mon Sep 17 00:00:00 2001 From: Victor Colin Amador Date: Thu, 1 Oct 2020 16:30:00 -0500 Subject: [PATCH 4/8] Fixed checkstyle and build issues. --- .../pom.xml | 1 + .../KeyVaultCertificateIdentifierTest.java | 17 +++++++++++------ .../azure-security-keyvault-keys/pom.xml | 1 + .../keys/models/KeyVaultKeyIdentifierTest.java | 17 +++++++++++------ .../azure-security-keyvault-secrets/pom.xml | 1 + .../models/KeyVaultSecretIdentifierTest.java | 17 +++++++++++------ 6 files changed, 36 insertions(+), 18 deletions(-) diff --git a/sdk/keyvault/azure-security-keyvault-certificates/pom.xml b/sdk/keyvault/azure-security-keyvault-certificates/pom.xml index b12616654d9b..36f6c171c82e 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/pom.xml +++ b/sdk/keyvault/azure-security-keyvault-certificates/pom.xml @@ -127,6 +127,7 @@ --add-exports com.azure.core/com.azure.core.implementation.http=ALL-UNNAMED --add-opens com.azure.security.keyvault.certificates/com.azure.security.keyvault.certificates=ALL-UNNAMED + --add-opens com.azure.security.keyvault.certificates/com.azure.security.keyvault.certificates.models=ALL-UNNAMED diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java index 75b47ed770bb..b2f9a716b4e6 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java @@ -1,14 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + package com.azure.security.keyvault.certificates.models; import org.junit.jupiter.api.Test; import java.net.MalformedURLException; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class KeyVaultCertificateIdentifierTest { @Test - void parse_withoutVersion() throws MalformedURLException { + void parseWithoutVersion() throws MalformedURLException { String certificateId = "https://test-key-vault.vault.azure.net/certificates/test-certificate"; KeyVaultCertificateIdentifier keyVaultCertificateIdentifier = KeyVaultCertificateIdentifier.parse(certificateId); @@ -20,7 +25,7 @@ void parse_withoutVersion() throws MalformedURLException { } @Test - void parse_withVersion() throws MalformedURLException { + void parseWithVersion() throws MalformedURLException { String certificateId = "https://test-key-vault.vault.azure.net/certificates/test-certificate/test-version"; KeyVaultCertificateIdentifier keyVaultCertificateIdentifier = KeyVaultCertificateIdentifier.parse(certificateId); @@ -32,7 +37,7 @@ void parse_withVersion() throws MalformedURLException { } @Test - void parse_invalidIdentifier_thatIsNull() { + void parseNullIdentifier() { Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultCertificateIdentifier.parse(null)); @@ -40,7 +45,7 @@ void parse_invalidIdentifier_thatIsNull() { } @Test - void parse_invalidIdentifier_withWrongCollection() { + void parseInvalidIdentifierWithWrongCollection() { String certificateId = "https://test-key-vault.vault.azure.net/keys/test-certificate"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultCertificateIdentifier.parse(certificateId)); @@ -49,7 +54,7 @@ void parse_invalidIdentifier_withWrongCollection() { } @Test - void parse_invalidIdentifier_withExtraSegment() { + void parseInvalidIdentifierWithExtraSegment() { String certificateId = "https://test-key-vault.vault.azure.net/keys/test-certificate/test-version/extra"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultCertificateIdentifier.parse(certificateId)); diff --git a/sdk/keyvault/azure-security-keyvault-keys/pom.xml b/sdk/keyvault/azure-security-keyvault-keys/pom.xml index 8d9903091077..add790fd73f8 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/pom.xml +++ b/sdk/keyvault/azure-security-keyvault-keys/pom.xml @@ -134,6 +134,7 @@ --add-opens com.azure.security.keyvault.keys/com.azure.security.keyvault.keys=ALL-UNNAMED --add-opens com.azure.security.keyvault.keys/com.azure.security.keyvault.keys.cryptography=ALL-UNNAMED + --add-opens com.azure.security.keyvault.keys/com.azure.security.keyvault.keys.models=ALL-UNNAMED diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java index 6a6f87be09bb..bc1535e4afcf 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java @@ -1,14 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + package com.azure.security.keyvault.keys.models; import org.junit.jupiter.api.Test; import java.net.MalformedURLException; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class KeyVaultKeyIdentifierTest { @Test - void parse_withoutVersion() throws MalformedURLException { + void parseWithoutVersion() throws MalformedURLException { String keyId = "https://test-key-vault.vault.azure.net/keys/test-key"; KeyVaultKeyIdentifier keyVaultKeyIdentifier = KeyVaultKeyIdentifier.parse(keyId); @@ -19,7 +24,7 @@ void parse_withoutVersion() throws MalformedURLException { } @Test - void parse_withVersion() throws MalformedURLException { + void parseWithVersion() throws MalformedURLException { String keyId = "https://test-key-vault.vault.azure.net/keys/test-key/test-version"; KeyVaultKeyIdentifier keyVaultkeyIdentifier = KeyVaultKeyIdentifier.parse(keyId); @@ -30,14 +35,14 @@ void parse_withVersion() throws MalformedURLException { } @Test - void parse_invalidIdentifier_thatIsNull() { + void parseNullIdentifier() { Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(null)); assertEquals("keyId cannot be null", exception.getMessage()); } @Test - void parse_invalidIdentifier_withWrongCollection() { + void parseInvalidIdentifierWithWrongCollection() { String keyId = "https://test-key-vault.vault.azure.net/secrets/test-key"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(keyId)); @@ -45,7 +50,7 @@ void parse_invalidIdentifier_withWrongCollection() { } @Test - void parse_invalidIdentifier_withExtraSegment() { + void parseInvalidIdentifierWithExtraSegment() { String keyId = "https://test-key-vault.vault.azure.net/keys/test-key/test-key/extra"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(keyId)); diff --git a/sdk/keyvault/azure-security-keyvault-secrets/pom.xml b/sdk/keyvault/azure-security-keyvault-secrets/pom.xml index 0e92b0619a20..ea0e09f4963c 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/pom.xml +++ b/sdk/keyvault/azure-security-keyvault-secrets/pom.xml @@ -134,6 +134,7 @@ --add-exports com.azure.core/com.azure.core.implementation.http=ALL-UNNAMED --add-opens com.azure.security.keyvault.secrets/com.azure.security.keyvault.secrets=ALL-UNNAMED + --add-opens com.azure.security.keyvault.secrets/com.azure.security.keyvault.secrets.models=ALL-UNNAMED diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java index 90d55dd05bba..a6812e7621a6 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java @@ -1,14 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + package com.azure.security.keyvault.secrets.models; import org.junit.jupiter.api.Test; import java.net.MalformedURLException; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class KeyVaultSecretIdentifierTest { @Test - void parse_withoutVersion() throws MalformedURLException { + void parseWithoutVersion() throws MalformedURLException { String secretId = "https://test-secret-vault.vault.azure.net/secrets/test-secret"; KeyVaultSecretIdentifier keyVaultSecretIdentifier = KeyVaultSecretIdentifier.parse(secretId); @@ -19,7 +24,7 @@ void parse_withoutVersion() throws MalformedURLException { } @Test - void parse_withVersion() throws MalformedURLException { + void parseWithVersion() throws MalformedURLException { String secretId = "https://test-secret-vault.vault.azure.net/secrets/test-secret/test-version"; KeyVaultSecretIdentifier keyVaultSecretIdentifier = KeyVaultSecretIdentifier.parse(secretId); @@ -30,14 +35,14 @@ void parse_withVersion() throws MalformedURLException { } @Test - void parse_invalidIdentifier_thatIsNull() { + void parseNullIdentifier() { Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(null)); assertEquals("secretId cannot be null", exception.getMessage()); } @Test - void parse_invalidIdentifier_withWrongCollection() { + void parseInvalidIdentifierWithWrongCollection() { String secretId = "https://test-secret-vault.vault.azure.net/certificates/test-secret"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(secretId)); @@ -46,7 +51,7 @@ void parse_invalidIdentifier_withWrongCollection() { } @Test - void parse_invalidIdentifier_withExtraSegment() { + void parseInvalidIdentifierWithExtraSegment() { String secretId = "https://test-secret-vault.vault.azure.net/secrets/test-secret/test-secret/extra"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(secretId)); From e400d2960ab99cb7cbdf99c471a55235d2a2a75c Mon Sep 17 00:00:00 2001 From: Victor Colin Amador Date: Fri, 2 Oct 2020 14:02:19 -0500 Subject: [PATCH 5/8] Added support for deleted collections ("deletedcertificates", "deletedkeys" and "deletedsecrets"). --- .../models/KeyVaultCertificateIdentifier.java | 3 ++- .../KeyVaultCertificateIdentifierTest.java | 10 +++++++++ .../keys/models/KeyVaultKeyIdentifier.java | 3 ++- .../models/KeyVaultKeyIdentifierTest.java | 10 +++++++++ .../models/KeyVaultSecretIdentifier.java | 3 ++- .../models/KeyVaultSecretIdentifierTest.java | 22 ++++++++++++++----- 6 files changed, 42 insertions(+), 9 deletions(-) diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java index b88acdd50705..2beb8b571508 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java @@ -76,7 +76,8 @@ public static KeyVaultCertificateIdentifier parse(String certificateId) throws I // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 3 && pathSegments.length != 4) || !"certificates".equals(pathSegments[1])) { + if ((pathSegments.length != 3 && pathSegments.length != 4) + || (!"certificates".equals(pathSegments[1])) && !"deletedcertificates".equals(pathSegments[1])) { throw new IllegalArgumentException("certificateId is not a valid Key Vault Certificate identifier"); } diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java index b2f9a716b4e6..cf1169ca5de3 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java @@ -36,6 +36,16 @@ void parseWithVersion() throws MalformedURLException { assertEquals("test-version", keyVaultCertificateIdentifier.getVersion()); } + @Test + void parseForDeletedObject() throws MalformedURLException { + String certificateId = "https://test-key-vault.vault.azure.net/deletedcertificates/test-certificate"; + KeyVaultCertificateIdentifier keyVaultCertificateIdentifier = KeyVaultCertificateIdentifier.parse(certificateId); + + assertEquals(certificateId, keyVaultCertificateIdentifier.getCertificateId()); + assertEquals("https://test-key-vault.vault.azure.net", keyVaultCertificateIdentifier.getVaultUrl()); + assertEquals("test-certificate", keyVaultCertificateIdentifier.getName()); + } + @Test void parseNullIdentifier() { Exception exception = assertThrows(IllegalArgumentException.class, diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java index f4573d1a4986..e74e8dde121c 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java @@ -76,7 +76,8 @@ public static KeyVaultKeyIdentifier parse(String keyId) throws IllegalArgumentEx // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 3 && pathSegments.length != 4) || !"keys".equals(pathSegments[1])) { + if ((pathSegments.length != 3 && pathSegments.length != 4) + || (!"keys".equals(pathSegments[1])) && !"deletedkeys".equals(pathSegments[1])) { throw new IllegalArgumentException("keyId is not a valid Key Vault Key identifier"); } diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java index bc1535e4afcf..dabc27a55129 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java @@ -34,6 +34,16 @@ void parseWithVersion() throws MalformedURLException { assertEquals("test-version", keyVaultkeyIdentifier.getVersion()); } + @Test + void parseForDeletedObject() throws MalformedURLException { + String keyId = "https://test-key-vault.vault.azure.net/deletedkeys/test-key"; + KeyVaultKeyIdentifier keyVaultKeyIdentifier = KeyVaultKeyIdentifier.parse(keyId); + + assertEquals(keyId, keyVaultKeyIdentifier.getKeyId()); + assertEquals("https://test-key-vault.vault.azure.net", keyVaultKeyIdentifier.getVaultUrl()); + assertEquals("test-key", keyVaultKeyIdentifier.getName()); + } + @Test void parseNullIdentifier() { Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(null)); diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java index 593826b610ae..cbf8ebd9038a 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java @@ -76,7 +76,8 @@ public static KeyVaultSecretIdentifier parse(String secretId) throws IllegalArgu // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 3 && pathSegments.length != 4) || !"secrets".equals(pathSegments[1])) { + if ((pathSegments.length != 3 && pathSegments.length != 4) + || (!"secrets".equals(pathSegments[1])) && !"deletedsecrets".equals(pathSegments[1])) { throw new IllegalArgumentException("secretId is not a valid Key Vault Secret identifier"); } diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java index a6812e7621a6..949e299e8b5a 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java @@ -14,26 +14,36 @@ class KeyVaultSecretIdentifierTest { @Test void parseWithoutVersion() throws MalformedURLException { - String secretId = "https://test-secret-vault.vault.azure.net/secrets/test-secret"; + String secretId = "https://test-key-vault.vault.azure.net/secrets/test-secret"; KeyVaultSecretIdentifier keyVaultSecretIdentifier = KeyVaultSecretIdentifier.parse(secretId); assertEquals(secretId, keyVaultSecretIdentifier.getSecretId()); - assertEquals("https://test-secret-vault.vault.azure.net", keyVaultSecretIdentifier.getVaultUrl()); + assertEquals("https://test-key-vault.vault.azure.net", keyVaultSecretIdentifier.getVaultUrl()); assertEquals("test-secret", keyVaultSecretIdentifier.getName()); assertNull(keyVaultSecretIdentifier.getVersion()); } @Test void parseWithVersion() throws MalformedURLException { - String secretId = "https://test-secret-vault.vault.azure.net/secrets/test-secret/test-version"; + String secretId = "https://test-key-vault.vault.azure.net/secrets/test-secret/test-version"; KeyVaultSecretIdentifier keyVaultSecretIdentifier = KeyVaultSecretIdentifier.parse(secretId); assertEquals(secretId, keyVaultSecretIdentifier.getSecretId()); - assertEquals("https://test-secret-vault.vault.azure.net", keyVaultSecretIdentifier.getVaultUrl()); + assertEquals("https://test-key-vault.vault.azure.net", keyVaultSecretIdentifier.getVaultUrl()); assertEquals("test-secret", keyVaultSecretIdentifier.getName()); assertEquals("test-version", keyVaultSecretIdentifier.getVersion()); } + @Test + void parseForDeletedObject() throws MalformedURLException { + String secretId = "https://test-key-vault.vault.azure.net/deletedsecrets/test-secret"; + KeyVaultSecretIdentifier keyVaultSecretIdentifier = KeyVaultSecretIdentifier.parse(secretId); + + assertEquals(secretId, keyVaultSecretIdentifier.getSecretId()); + assertEquals("https://test-key-vault.vault.azure.net", keyVaultSecretIdentifier.getVaultUrl()); + assertEquals("test-secret", keyVaultSecretIdentifier.getName()); + } + @Test void parseNullIdentifier() { Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(null)); @@ -43,7 +53,7 @@ void parseNullIdentifier() { @Test void parseInvalidIdentifierWithWrongCollection() { - String secretId = "https://test-secret-vault.vault.azure.net/certificates/test-secret"; + String secretId = "https://test-key-vault.vault.azure.net/certificates/test-secret"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(secretId)); @@ -52,7 +62,7 @@ void parseInvalidIdentifierWithWrongCollection() { @Test void parseInvalidIdentifierWithExtraSegment() { - String secretId = "https://test-secret-vault.vault.azure.net/secrets/test-secret/test-secret/extra"; + String secretId = "https://test-key-vault.vault.azure.net/secrets/test-secret/test-secret/extra"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(secretId)); From afbc426c6fff6f382d9536cc4a1f13145d5ac9eb Mon Sep 17 00:00:00 2001 From: Victor Colin Amador Date: Fri, 2 Oct 2020 15:02:22 -0500 Subject: [PATCH 6/8] Added more validity checks and modified unit tests. --- .../models/KeyVaultCertificateIdentifier.java | 21 ++++++++++++++----- .../KeyVaultCertificateIdentifierTest.java | 17 +++++++++++---- .../keys/models/KeyVaultKeyIdentifier.java | 17 ++++++++++++--- .../models/KeyVaultKeyIdentifierTest.java | 16 ++++++++++---- .../models/KeyVaultSecretIdentifier.java | 19 +++++++++++++---- .../models/KeyVaultSecretIdentifierTest.java | 16 ++++++++++---- 6 files changed, 82 insertions(+), 24 deletions(-) diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java index 2beb8b571508..3423d75606fe 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java @@ -10,8 +10,8 @@ import java.net.URL; /** - * Information about a {@link KeyVaultCertificate} parsed from the key URL. You can use this information when calling - * methods of {@link CertificateClient} or {@link CertificateAsyncClient}. + * Information about a {@link KeyVaultCertificate} parsed from the certificate URL. You can use this information when + * calling methods of {@link CertificateClient} or {@link CertificateAsyncClient}. */ public final class KeyVaultCertificateIdentifier { private final String certificateId, vaultUrl, name, version; @@ -62,6 +62,15 @@ public String getVersion() { /** * Create a new {@link KeyVaultCertificateIdentifier} from a given certificate identifier. * + *

Valid examples are: + * + *

    + *
  • https://{key-vault-name}.vault.azure.net/certificates/{certificate-name}
  • + *
  • https://{key-vault-name}.vault.azure.net/certificates/{certificate-name}/pending
  • + *
  • https://{key-vault-name}.vault.azure.net/certificates/{certificate-name}/{unique-version-id}
  • + *
  • https://{key-vault-name}.vault.azure.net/deletedcertificates/{deleted-certificate-name}
  • + *
+ * * @param certificateId The certificate identifier to extract information from. * @return a new instance of {@link KeyVaultCertificateIdentifier}. * @throws IllegalArgumentException if the given identifier is {@code null}. @@ -76,9 +85,11 @@ public static KeyVaultCertificateIdentifier parse(String certificateId) throws I // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 3 && pathSegments.length != 4) - || (!"certificates".equals(pathSegments[1])) && !"deletedcertificates".equals(pathSegments[1])) { - throw new IllegalArgumentException("certificateId is not a valid Key Vault Certificate identifier"); + if ((pathSegments.length != 3 && pathSegments.length != 4) // More or less segments in the URI than expected. + || !"https".equals(url.getProtocol()) // Invalid protocol. + || (!"certificates".equals(pathSegments[1]) && !"deletedcertificates".equals(pathSegments[1])) // Invalid collection. + || ("deletedcertificates".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. + throw new IllegalArgumentException("certificateId is not a valid Key Vault Certificate identifier"); } return new KeyVaultCertificateIdentifier(certificateId, url.getProtocol() + "://" + url.getHost(), diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java index cf1169ca5de3..371f16920bec 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifierTest.java @@ -26,18 +26,18 @@ void parseWithoutVersion() throws MalformedURLException { @Test void parseWithVersion() throws MalformedURLException { - String certificateId = "https://test-key-vault.vault.azure.net/certificates/test-certificate/test-version"; + String certificateId = "https://test-key-vault.vault.azure.net/certificates/test-certificate/version"; KeyVaultCertificateIdentifier keyVaultCertificateIdentifier = KeyVaultCertificateIdentifier.parse(certificateId); assertEquals(certificateId, keyVaultCertificateIdentifier.getCertificateId()); assertEquals("https://test-key-vault.vault.azure.net", keyVaultCertificateIdentifier.getVaultUrl()); assertEquals("test-certificate", keyVaultCertificateIdentifier.getName()); - assertEquals("test-version", keyVaultCertificateIdentifier.getVersion()); + assertEquals("version", keyVaultCertificateIdentifier.getVersion()); } @Test - void parseForDeletedObject() throws MalformedURLException { + void parseForDeletedCertificate() throws MalformedURLException { String certificateId = "https://test-key-vault.vault.azure.net/deletedcertificates/test-certificate"; KeyVaultCertificateIdentifier keyVaultCertificateIdentifier = KeyVaultCertificateIdentifier.parse(certificateId); @@ -46,6 +46,15 @@ void parseForDeletedObject() throws MalformedURLException { assertEquals("test-certificate", keyVaultCertificateIdentifier.getName()); } + @Test + void parseInvalidIdentifierForDeletedCertificate() { + String certificateId = "https://test-key-vault.vault.azure.net/deletedcertificates/test-certificate/version"; + Exception exception = assertThrows(IllegalArgumentException.class, + () -> KeyVaultCertificateIdentifier.parse(certificateId)); + + assertEquals("certificateId is not a valid Key Vault Certificate identifier", exception.getMessage()); + } + @Test void parseNullIdentifier() { Exception exception = assertThrows(IllegalArgumentException.class, @@ -65,7 +74,7 @@ void parseInvalidIdentifierWithWrongCollection() { @Test void parseInvalidIdentifierWithExtraSegment() { - String certificateId = "https://test-key-vault.vault.azure.net/keys/test-certificate/test-version/extra"; + String certificateId = "https://test-key-vault.vault.azure.net/keys/test-certificate/version/extra-segment"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultCertificateIdentifier.parse(certificateId)); diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java index e74e8dde121c..677cdc710800 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java @@ -62,6 +62,15 @@ public String getVersion() { /** * Create a new {@link KeyVaultKeyIdentifier} from a given key identifier. * + *

Valid examples are: + * + *

    + *
  • https://{key-vault-name}.vault.azure.net/keys/{key-name}
  • + *
  • https://{key-vault-name}.vault.azure.net/keys/{key-name}/pending
  • + *
  • https://{key-vault-name}.vault.azure.net/keys/{key-name}/{unique-version-id}
  • + *
  • https://{key-vault-name}.vault.azure.net/deletedkeys/{deleted-key-name}
  • + *
+ * * @param keyId The key identifier to extract information from. * @return a new instance of {@link KeyVaultKeyIdentifier}. * @throws IllegalArgumentException if the given identifier is {@code null}. @@ -76,9 +85,11 @@ public static KeyVaultKeyIdentifier parse(String keyId) throws IllegalArgumentEx // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 3 && pathSegments.length != 4) - || (!"keys".equals(pathSegments[1])) && !"deletedkeys".equals(pathSegments[1])) { - throw new IllegalArgumentException("keyId is not a valid Key Vault Key identifier"); + if ((pathSegments.length != 3 && pathSegments.length != 4) // More or less segments in the URI than expected. + || !"https".equals(url.getProtocol()) // Invalid protocol. + || (!"keys".equals(pathSegments[1]) && !"deletedkeys".equals(pathSegments[1])) // Invalid collection. + || ("deletedkeys".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. + throw new IllegalArgumentException("keyId is not a valid Key Vault Key identifier"); } return new KeyVaultKeyIdentifier(keyId, url.getProtocol() + "://" + url.getHost(), pathSegments[2], diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java index dabc27a55129..0b067d469305 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifierTest.java @@ -25,17 +25,17 @@ void parseWithoutVersion() throws MalformedURLException { @Test void parseWithVersion() throws MalformedURLException { - String keyId = "https://test-key-vault.vault.azure.net/keys/test-key/test-version"; + String keyId = "https://test-key-vault.vault.azure.net/keys/test-key/version"; KeyVaultKeyIdentifier keyVaultkeyIdentifier = KeyVaultKeyIdentifier.parse(keyId); assertEquals(keyId, keyVaultkeyIdentifier.getKeyId()); assertEquals("https://test-key-vault.vault.azure.net", keyVaultkeyIdentifier.getVaultUrl()); assertEquals("test-key", keyVaultkeyIdentifier.getName()); - assertEquals("test-version", keyVaultkeyIdentifier.getVersion()); + assertEquals("version", keyVaultkeyIdentifier.getVersion()); } @Test - void parseForDeletedObject() throws MalformedURLException { + void parseForDeletedKey() throws MalformedURLException { String keyId = "https://test-key-vault.vault.azure.net/deletedkeys/test-key"; KeyVaultKeyIdentifier keyVaultKeyIdentifier = KeyVaultKeyIdentifier.parse(keyId); @@ -44,6 +44,14 @@ void parseForDeletedObject() throws MalformedURLException { assertEquals("test-key", keyVaultKeyIdentifier.getName()); } + @Test + void parseInvalidIdentifierForDeletedKey() { + String keyId = "https://test-key-vault.vault.azure.net/deletedkeys/test-key/version"; + Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(keyId)); + + assertEquals("keyId is not a valid Key Vault Key identifier", exception.getMessage()); + } + @Test void parseNullIdentifier() { Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(null)); @@ -61,7 +69,7 @@ void parseInvalidIdentifierWithWrongCollection() { @Test void parseInvalidIdentifierWithExtraSegment() { - String keyId = "https://test-key-vault.vault.azure.net/keys/test-key/test-key/extra"; + String keyId = "https://test-key-vault.vault.azure.net/keys/test-key/version/extra"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultKeyIdentifier.parse(keyId)); assertEquals("keyId is not a valid Key Vault Key identifier", exception.getMessage()); diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java index cbf8ebd9038a..a73b412726cc 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java @@ -10,7 +10,7 @@ import java.net.URL; /** - * Information about a {@link KeyVaultSecret} parsed from the key URL. You can use this information when calling + * Information about a {@link KeyVaultSecret} parsed from the secret URL. You can use this information when calling * methods of {@link SecretClient} or {@link SecretAsyncClient}. */ public final class KeyVaultSecretIdentifier { @@ -62,6 +62,15 @@ public String getVersion() { /** * Create a new {@link KeyVaultSecretIdentifier} from a given secret identifier. * + *

Valid examples are: + * + *

    + *
  • https://{key-vault-name}.vault.azure.net/secrets/{secret-name}
  • + *
  • https://{key-vault-name}.vault.azure.net/secrets/{secret-name}/pending
  • + *
  • https://{key-vault-name}.vault.azure.net/secrets/{secret-name}/{unique-version-id}
  • + *
  • https://{key-vault-name}.vault.azure.net/deletedsecrets/{deleted-secret-name}
  • + *
+ * * @param secretId The secret identifier to extract information from. * @return a new instance of {@link KeyVaultSecretIdentifier}. * @throws IllegalArgumentException if the given identifier is {@code null}. @@ -76,9 +85,11 @@ public static KeyVaultSecretIdentifier parse(String secretId) throws IllegalArgu // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 3 && pathSegments.length != 4) - || (!"secrets".equals(pathSegments[1])) && !"deletedsecrets".equals(pathSegments[1])) { - throw new IllegalArgumentException("secretId is not a valid Key Vault Secret identifier"); + if ((pathSegments.length != 3 && pathSegments.length != 4) // More or less segments in the URI than expected. + || !"https".equals(url.getProtocol()) // Invalid protocol. + || (!"secrets".equals(pathSegments[1]) && !"deletedsecrets".equals(pathSegments[1])) // Invalid collection. + || ("deletedsecrets".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. + throw new IllegalArgumentException("secretId is not a valid Key Vault Secret identifier"); } return new KeyVaultSecretIdentifier(secretId, url.getProtocol() + "://" + url.getHost(), pathSegments[2], diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java index 949e299e8b5a..c3c1f4f50add 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifierTest.java @@ -25,17 +25,17 @@ void parseWithoutVersion() throws MalformedURLException { @Test void parseWithVersion() throws MalformedURLException { - String secretId = "https://test-key-vault.vault.azure.net/secrets/test-secret/test-version"; + String secretId = "https://test-key-vault.vault.azure.net/secrets/test-secret/version"; KeyVaultSecretIdentifier keyVaultSecretIdentifier = KeyVaultSecretIdentifier.parse(secretId); assertEquals(secretId, keyVaultSecretIdentifier.getSecretId()); assertEquals("https://test-key-vault.vault.azure.net", keyVaultSecretIdentifier.getVaultUrl()); assertEquals("test-secret", keyVaultSecretIdentifier.getName()); - assertEquals("test-version", keyVaultSecretIdentifier.getVersion()); + assertEquals("version", keyVaultSecretIdentifier.getVersion()); } @Test - void parseForDeletedObject() throws MalformedURLException { + void parseForDeletedSecret() throws MalformedURLException { String secretId = "https://test-key-vault.vault.azure.net/deletedsecrets/test-secret"; KeyVaultSecretIdentifier keyVaultSecretIdentifier = KeyVaultSecretIdentifier.parse(secretId); @@ -44,6 +44,14 @@ void parseForDeletedObject() throws MalformedURLException { assertEquals("test-secret", keyVaultSecretIdentifier.getName()); } + @Test + void parseInvalidIdentifierForDeletedSecret() { + String secretId = "https://test-key-vault.vault.azure.net/deletedsecrets/test-secret/version"; + Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(secretId)); + + assertEquals("secretId is not a valid Key Vault Secret identifier", exception.getMessage()); + } + @Test void parseNullIdentifier() { Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(null)); @@ -62,7 +70,7 @@ void parseInvalidIdentifierWithWrongCollection() { @Test void parseInvalidIdentifierWithExtraSegment() { - String secretId = "https://test-key-vault.vault.azure.net/secrets/test-secret/test-secret/extra"; + String secretId = "https://test-key-vault.vault.azure.net/secrets/test-secret/version/extra"; Exception exception = assertThrows(IllegalArgumentException.class, () -> KeyVaultSecretIdentifier.parse(secretId)); From 6eb4b28f2788eb64ff1b7f385b46ef3debb809c0 Mon Sep 17 00:00:00 2001 From: Victor Colin Amador Date: Fri, 2 Oct 2020 15:17:18 -0500 Subject: [PATCH 7/8] Fixed checkstyle issues. --- .../certificates/models/KeyVaultCertificateIdentifier.java | 2 +- .../security/keyvault/keys/models/KeyVaultKeyIdentifier.java | 2 +- .../keyvault/secrets/models/KeyVaultSecretIdentifier.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java index 3423d75606fe..58496dadab62 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java @@ -89,7 +89,7 @@ public static KeyVaultCertificateIdentifier parse(String certificateId) throws I || !"https".equals(url.getProtocol()) // Invalid protocol. || (!"certificates".equals(pathSegments[1]) && !"deletedcertificates".equals(pathSegments[1])) // Invalid collection. || ("deletedcertificates".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. - throw new IllegalArgumentException("certificateId is not a valid Key Vault Certificate identifier"); + throw new IllegalArgumentException("certificateId is not a valid Key Vault Certificate identifier"); } return new KeyVaultCertificateIdentifier(certificateId, url.getProtocol() + "://" + url.getHost(), diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java index 677cdc710800..61c1639910b8 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java @@ -89,7 +89,7 @@ public static KeyVaultKeyIdentifier parse(String keyId) throws IllegalArgumentEx || !"https".equals(url.getProtocol()) // Invalid protocol. || (!"keys".equals(pathSegments[1]) && !"deletedkeys".equals(pathSegments[1])) // Invalid collection. || ("deletedkeys".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. - throw new IllegalArgumentException("keyId is not a valid Key Vault Key identifier"); + throw new IllegalArgumentException("keyId is not a valid Key Vault Key identifier"); } return new KeyVaultKeyIdentifier(keyId, url.getProtocol() + "://" + url.getHost(), pathSegments[2], diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java index a73b412726cc..629fef1601b5 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java @@ -89,7 +89,7 @@ public static KeyVaultSecretIdentifier parse(String secretId) throws IllegalArgu || !"https".equals(url.getProtocol()) // Invalid protocol. || (!"secrets".equals(pathSegments[1]) && !"deletedsecrets".equals(pathSegments[1])) // Invalid collection. || ("deletedsecrets".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. - throw new IllegalArgumentException("secretId is not a valid Key Vault Secret identifier"); + throw new IllegalArgumentException("secretId is not a valid Key Vault Secret identifier"); } return new KeyVaultSecretIdentifier(secretId, url.getProtocol() + "://" + url.getHost(), pathSegments[2], From 9c6a2acbfd766c37954862225018b77ad241cad7 Mon Sep 17 00:00:00 2001 From: Victor Colin Amador Date: Fri, 2 Oct 2020 22:15:26 -0500 Subject: [PATCH 8/8] Applied PR feedback. --- .../models/KeyVaultCertificateIdentifier.java | 35 +++++++++++-------- .../keys/models/KeyVaultKeyIdentifier.java | 34 ++++++++++-------- .../models/KeyVaultSecretIdentifier.java | 35 +++++++++++-------- 3 files changed, 62 insertions(+), 42 deletions(-) diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java index 58496dadab62..493181645d99 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/KeyVaultCertificateIdentifier.java @@ -73,26 +73,33 @@ public String getVersion() { * * @param certificateId The certificate identifier to extract information from. * @return a new instance of {@link KeyVaultCertificateIdentifier}. - * @throws IllegalArgumentException if the given identifier is {@code null}. - * @throws MalformedURLException if the given identifier is not a valid Key Vault Certificate identifier + * @throws IllegalArgumentException if the given identifier is {@code null} or an invalid Key Vault Certificate + * identifier. */ - public static KeyVaultCertificateIdentifier parse(String certificateId) throws IllegalArgumentException, MalformedURLException { + public static KeyVaultCertificateIdentifier parse(String certificateId) throws IllegalArgumentException { if (certificateId == null) { throw new IllegalArgumentException("certificateId cannot be null"); } - URL url = new URL(certificateId); - // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] - String[] pathSegments = url.getPath().split("/"); + try { + final URL url = new URL(certificateId); + // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] + final String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 3 && pathSegments.length != 4) // More or less segments in the URI than expected. - || !"https".equals(url.getProtocol()) // Invalid protocol. - || (!"certificates".equals(pathSegments[1]) && !"deletedcertificates".equals(pathSegments[1])) // Invalid collection. - || ("deletedcertificates".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. - throw new IllegalArgumentException("certificateId is not a valid Key Vault Certificate identifier"); - } + if ((pathSegments.length != 3 && pathSegments.length != 4) // More or less segments in the URI than expected. + || !"https".equals(url.getProtocol()) // Invalid protocol. + || (!"certificates".equals(pathSegments[1]) && !"deletedcertificates".equals(pathSegments[1])) // Invalid collection. + || ("deletedcertificates".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. + throw new IllegalArgumentException("certificateId is not a valid Key Vault Certificate identifier"); + } + + final String vaultUrl = String.format("%s://%s", url.getProtocol(), url.getHost()); + final String certificateName = pathSegments[2]; + final String certificateVersion = pathSegments.length == 4 ? pathSegments[3] : null; - return new KeyVaultCertificateIdentifier(certificateId, url.getProtocol() + "://" + url.getHost(), - pathSegments[2], pathSegments.length == 4 ? pathSegments[3] : null); + return new KeyVaultCertificateIdentifier(certificateId, vaultUrl, certificateName, certificateVersion); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Could not parse certificateId", e); + } } } diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java index 61c1639910b8..683c30997e19 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/models/KeyVaultKeyIdentifier.java @@ -73,26 +73,32 @@ public String getVersion() { * * @param keyId The key identifier to extract information from. * @return a new instance of {@link KeyVaultKeyIdentifier}. - * @throws IllegalArgumentException if the given identifier is {@code null}. - * @throws MalformedURLException if the given identifier is not a valid Key Vault Key identifier + * @throws IllegalArgumentException if the given identifier is {@code null} or an invalid Key Vault Key identifier. */ - public static KeyVaultKeyIdentifier parse(String keyId) throws IllegalArgumentException, MalformedURLException { + public static KeyVaultKeyIdentifier parse(String keyId) throws IllegalArgumentException { if (keyId == null) { throw new IllegalArgumentException("keyId cannot be null"); } - URL url = new URL(keyId); - // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] - String[] pathSegments = url.getPath().split("/"); + try { + final URL url = new URL(keyId); + // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] + final String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 3 && pathSegments.length != 4) // More or less segments in the URI than expected. - || !"https".equals(url.getProtocol()) // Invalid protocol. - || (!"keys".equals(pathSegments[1]) && !"deletedkeys".equals(pathSegments[1])) // Invalid collection. - || ("deletedkeys".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. - throw new IllegalArgumentException("keyId is not a valid Key Vault Key identifier"); - } + if ((pathSegments.length != 3 && pathSegments.length != 4) // More or less segments in the URI than expected. + || !"https".equals(url.getProtocol()) // Invalid protocol. + || (!"keys".equals(pathSegments[1]) && !"deletedkeys".equals(pathSegments[1])) // Invalid collection. + || ("deletedkeys".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. + throw new IllegalArgumentException("keyId is not a valid Key Vault Key identifier"); + } + + final String vaultUrl = String.format("%s://%s", url.getProtocol(), url.getHost()); + final String keyName = pathSegments[2]; + final String keyVersion = pathSegments.length == 4 ? pathSegments[3] : null; - return new KeyVaultKeyIdentifier(keyId, url.getProtocol() + "://" + url.getHost(), pathSegments[2], - pathSegments.length == 4 ? pathSegments[3] : null); + return new KeyVaultKeyIdentifier(keyId, vaultUrl, keyName, keyVersion); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Could not parse keyId", e); + } } } diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java index 629fef1601b5..8192ac6aeede 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/models/KeyVaultSecretIdentifier.java @@ -73,26 +73,33 @@ public String getVersion() { * * @param secretId The secret identifier to extract information from. * @return a new instance of {@link KeyVaultSecretIdentifier}. - * @throws IllegalArgumentException if the given identifier is {@code null}. - * @throws MalformedURLException if the given identifier is not a valid Key Vault Secret identifier + * @throws IllegalArgumentException if the given identifier is {@code null} or an invalid Key Vault Secret + * identifier. */ - public static KeyVaultSecretIdentifier parse(String secretId) throws IllegalArgumentException, MalformedURLException { + public static KeyVaultSecretIdentifier parse(String secretId) throws IllegalArgumentException { if (secretId == null) { throw new IllegalArgumentException("secretId cannot be null"); } - URL url = new URL(secretId); - // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] - String[] pathSegments = url.getPath().split("/"); + try { + final URL url = new URL(secretId); + // We expect an identifier with either 2 or 3 path segments: collection + name [+ version] + final String[] pathSegments = url.getPath().split("/"); - if ((pathSegments.length != 3 && pathSegments.length != 4) // More or less segments in the URI than expected. - || !"https".equals(url.getProtocol()) // Invalid protocol. - || (!"secrets".equals(pathSegments[1]) && !"deletedsecrets".equals(pathSegments[1])) // Invalid collection. - || ("deletedsecrets".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. - throw new IllegalArgumentException("secretId is not a valid Key Vault Secret identifier"); - } + if ((pathSegments.length != 3 && pathSegments.length != 4) // More or less segments in the URI than expected. + || !"https".equals(url.getProtocol()) // Invalid protocol. + || (!"secrets".equals(pathSegments[1]) && !"deletedsecrets".equals(pathSegments[1])) // Invalid collection. + || ("deletedsecrets".equals(pathSegments[1]) && pathSegments.length == 4)) { // Deleted items do not include a version. + throw new IllegalArgumentException("secretId is not a valid Key Vault Secret identifier"); + } + + final String vaultUrl = String.format("%s://%s", url.getProtocol(), url.getHost()); + final String secretName = pathSegments[2]; + final String secretVersion = pathSegments.length == 4 ? pathSegments[3] : null; - return new KeyVaultSecretIdentifier(secretId, url.getProtocol() + "://" + url.getHost(), pathSegments[2], - pathSegments.length == 4 ? pathSegments[3] : null); + return new KeyVaultSecretIdentifier(secretId, vaultUrl, secretName, secretVersion); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Could not parse secretId", e); + } } }