diff --git a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client.hpp b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client.hpp index e170a1bd7..b3c8c6904 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client.hpp @@ -66,7 +66,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat explicit CertificateClient(CertificateClient const& keyClient) = default; /** - * @brief Returns the latest version of the KeyVaultCertificate along with its + * @brief Return the latest version of the KeyVaultCertificate along with its * CertificatePolicy. * * @remark This operation requires the certificates/get permission. @@ -81,7 +81,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat Azure::Core::Context const& context = Azure::Core::Context()) const; /** - * @brief Returns a specific version of the certificate without its CertificatePolicy. + * @brief Return a specific version of the certificate without its CertificatePolicy. * * @details If the version is not set in the options, the latest version is returned. * @@ -99,7 +99,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat Azure::Core::Context const& context = Azure::Core::Context()) const; /** - * @brief Creates a new certificate. + * @brief Create a new certificate. * * @details If this is the first version, the certificate resource is created. * @@ -116,7 +116,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat Azure::Core::Context const& context = Azure::Core::Context()) const; /** - * @brief Creates a new certificate issuer. + * @brief Create a new certificate issuer. * * @details The operation adds or updates the specified certificate issuer. * @@ -131,7 +131,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat Azure::Core::Context const& context = Azure::Core::Context()) const; /** - * @brief Lists the specified certificate issuer. + * @brief List the specified certificate issuer. * * @details The GetCertificateIssuer operation returns the specified * certificate issuer resources in the specified key vault. @@ -147,7 +147,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat Azure::Core::Context const& context = Azure::Core::Context()) const; /** - * @brief Updates the specified certificate issuer. + * @brief Update the specified certificate issuer. * * @details The operation performs an update on the specified certificate issuer entity. * @@ -162,7 +162,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat Azure::Core::Context const& context = Azure::Core::Context()) const; /** - * @brief Deletes the specified certificate issuer. + * @brief Delete the specified certificate issuer. * * @details The operation permanently removes the specified certificate issuer from the vault. * @@ -176,6 +176,48 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat std::string const& name, Azure::Core::Context const& context = Azure::Core::Context()) const; + /** + * @brief List the certificate contacts for a specified key vault. + * + * @details The GetContacts operation returns the set of certificate contact + * resources in the specified key vault. + * + * @remark This operation requires the certificates/managecontacts permission. + * + * @param context The context for the operation can be used for request cancellation. + * @return The contacts list for the key vault certificate. + */ + Azure::Response> GetContacts( + Azure::Core::Context const& context = Azure::Core::Context()) const; + + /** + * @brief Delete the certificate contacts for a specified key vault. + * + * @details Deletes the certificate contacts for a specified key vault certificate. + * + * @remark This operation requires the certificates/managecontacts permission. + * + * @param context The context for the operation can be used for request cancellation. + * @return The contacts for the key vault certificate. + */ + Azure::Response> DeleteContacts( + Azure::Core::Context const& context = Azure::Core::Context()) const; + + /** + * @brief Set certificate contacts. + * + * @details Set the certificate contacts for the specified key vault. + * + * @remark This operation requires the certificates/managecontacts permission. + * + * @param contacts The contacts for the key vault certificate. + * @param context The context for the operation can be used for request cancellation. + * @return The contacts for the key vault certificate. + */ + Azure::Response> SetContacts( + std::vector const& contacts, + Azure::Core::Context const& context = Azure::Core::Context()) const; + private: std::unique_ptr SendRequest( Azure::Core::Http::Request& request, diff --git a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_models.hpp b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_models.hpp index a5fdbdd8b..4c33bda38 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_models.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_models.hpp @@ -970,4 +970,28 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat IssuerProperties Properties; }; + /** + * @brief The contact information for the vault certificates. + * + */ + struct CertificateContact + { + /** + * @brief Contact e-mail address. + * + */ + std::string EmailAddress; + + /** + * @brief Contact name. + * + */ + Azure::Nullable Name; + + /** + * @brief Contact phone number. + * + */ + Azure::Nullable Phone; + }; }}}} // namespace Azure::Security::KeyVault::Certificates diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client.cpp b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client.cpp index c257df10f..caf0036ae 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: MIT #include "azure/keyvault/certificates/certificate_client.hpp" + #include "private/certificate_constants.hpp" #include "private/certificate_serializers.hpp" #include "private/keyvault_certificates_common_request.hpp" @@ -27,7 +28,6 @@ using namespace Azure::Core::Http::_internal; using namespace Azure::Security::KeyVault::_detail; namespace { - // This is a Key-Vault only patch to calculate token scope/audience std::string GetScopeFromUrl(Azure::Core::Url const& url) { @@ -201,4 +201,41 @@ Azure::Response CertificateClient::UpdateIssuer( return Azure::Response(std::move(value), std::move(rawResponse)); } +Response> CertificateClient::GetContacts( + Azure::Core::Context const& context) const +{ + auto request = CreateRequest(HttpMethod::Get, {CertificatesPath, ContactsPath}); + + // Send and parse respone + auto rawResponse = SendRequest(request, context); + auto value = CertificateContactsSerializer::Deserialize(*rawResponse); + return Azure::Response>(std::move(value), std::move(rawResponse)); +} + +Response> CertificateClient::DeleteContacts( + Azure::Core::Context const& context) const +{ + auto request = CreateRequest(HttpMethod::Delete, {CertificatesPath, ContactsPath}); + + // Send and parse respone + auto rawResponse = SendRequest(request, context); + auto value = CertificateContactsSerializer::Deserialize(*rawResponse); + return Azure::Response>(std::move(value), std::move(rawResponse)); +} + +Response> CertificateClient::SetContacts( + std::vector const& contacts, + Azure::Core::Context const& context) const +{ + auto payload = CertificateContactsSerializer::Serialize(contacts); + Azure::Core::IO::MemoryBodyStream payloadStream( + reinterpret_cast(payload.data()), payload.size()); + + auto request = CreateRequest(HttpMethod::Put, {CertificatesPath, ContactsPath}, &payloadStream); + + auto rawResponse = SendRequest(request, context); + auto value = CertificateContactsSerializer::Deserialize(*rawResponse); + return Azure::Response>(std::move(value), std::move(rawResponse)); +} + const ServiceVersion ServiceVersion::V7_2("7.2"); diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_serializers.cpp b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_serializers.cpp index d826107c3..5645cd69c 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_serializers.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_serializers.cpp @@ -489,3 +489,47 @@ std::string CertificateIssuerSerializer::Serialize(CertificateIssuer const& issu return jsonResponse.dump(); } + +std::string CertificateContactsSerializer::Serialize( + std::vector const& contacts) +{ + json payload; + + for (auto contact : contacts) + { + json contactJson; + + contactJson[EmailPropertyName] = contact.EmailAddress; + JsonOptional::SetFromNullable(contact.Name, contactJson, NamePropertyName); + JsonOptional::SetFromNullable(contact.Phone, contactJson, PhonePropertyName); + + payload[ContactsPropertyName].emplace_back(contactJson); + } + + return payload.dump(); +} + +std::vector CertificateContactsSerializer::Deserialize( + Azure::Core::Http::RawResponse const& rawResponse) +{ + std::vector response; + + auto const& body = rawResponse.GetBody(); + auto jsonResponse = json::parse(body); + + if (jsonResponse.contains(ContactsPropertyName)) + { + for (auto contactJson : jsonResponse[ContactsPropertyName]) + { + CertificateContact contact; + + contact.EmailAddress = contactJson[EmailPropertyName]; + JsonOptional::SetIfExists(contact.Name, contactJson, NamePropertyName); + JsonOptional::SetIfExists(contact.Phone, contactJson, PhonePropertyName); + + response.emplace_back(contact); + } + } + + return response; +} diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_constants.hpp b/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_constants.hpp index cd3330c16..f5d50bcba 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_constants.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_constants.hpp @@ -17,6 +17,8 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat constexpr static const char CertificatesPath[] = "certificates"; constexpr static const char CertificatesCreatePath[] = "create"; constexpr static const char IssuersPath[] = "issuers"; + constexpr static const char ContactsPath[] = "contacts"; + constexpr static const char ContactsPropertyName[] = "contacts"; /***************** Certificates Properties *****************/ constexpr static const char IdName[] = "id"; @@ -107,4 +109,8 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat constexpr static const char EmailPropertyValue[] = "email"; constexpr static const char PhonePropertyValue[] = "phone"; + /***************** Certificates Contact *****************/ + constexpr static const char EmailPropertyName[] = "email"; + constexpr static const char NamePropertyName[] = "name"; + constexpr static const char PhonePropertyName[] = "phone"; }}}}} // namespace Azure::Security::KeyVault::Certificates::_detail diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_serializers.hpp b/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_serializers.hpp index 2a3cae2b1..e1af24fc3 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_serializers.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_serializers.hpp @@ -109,4 +109,13 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat static std::string Serialize(CertificateIssuer const& issuer); }; + + class CertificateContactsSerializer final { + CertificateContactsSerializer() = delete; + + public: + static std::string Serialize(std::vector const& constacts); + static std::vector Deserialize( + Azure::Core::Http::RawResponse const& rawResponse); + }; }}}}} // namespace Azure::Security::KeyVault::Certificates::_detail diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_base_test.hpp b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_base_test.hpp index 1f99fbd81..1eecdf55b 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_base_test.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_base_test.hpp @@ -179,6 +179,43 @@ namespace Azure { EXPECT_EQ(adminLocal.LastName.Value(), adminRemote.LastName.Value()); EXPECT_EQ(adminLocal.PhoneNumber.Value(), adminRemote.PhoneNumber.Value()); } + + static inline void CheckContactsCollections( + std::vector contacts, + std::vector results) + { + EXPECT_EQ(results.size(), contacts.size()); + + for (auto c2 : results) + { + bool found = false; + for (auto c1 : contacts) + { + if (c1.EmailAddress == c2.EmailAddress && c1.Name.HasValue() == c2.Name.HasValue() + && c1.Phone.HasValue() == c2.Phone.HasValue()) + { + found = true; + break; + } + } + EXPECT_TRUE(found); + } + + for (auto c1 : contacts) + { + bool found = false; + for (auto c2 : results) + { + if (c1.EmailAddress == c2.EmailAddress && c1.Name.HasValue() == c2.Name.HasValue() + && c1.Phone.HasValue() == c2.Phone.HasValue()) + { + found = true; + break; + } + } + EXPECT_TRUE(found); + } + } }; }}}}} // namespace Azure::Security::KeyVault::Certificates::Test diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_test.cpp b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_test.cpp index 28f20bb45..c89a9bd64 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_test.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_test.cpp @@ -266,3 +266,130 @@ TEST_F(KeyVaultCertificateClientTest, UpdateIssuer) CheckIssuers(result.Value, issuer); } } + +TEST_F(KeyVaultCertificateClientTest, SetContacts) +{ + auto const& client + = GetClientForTest(::testing::UnitTest::GetInstance()->current_test_info()->name()); + + std::vector contacts; + + CertificateContact ctt; + + ctt.EmailAddress = "one@two.org"; + ctt.Name = "giqu"; // cspell:disable-line + ctt.Phone = "1234567890"; + contacts.emplace_back(ctt); + + CertificateContact ctt2; + + ctt2.EmailAddress = "two@three.org"; + ctt2.Name = "giqu2"; // cspell:disable-line + ctt2.Phone = "1234567891"; + contacts.emplace_back(ctt2); + + auto response = client.SetContacts(contacts); + + CheckContactsCollections(contacts, response.Value); + + auto response2 = client.DeleteContacts(); + + CheckContactsCollections(contacts, response2.Value); +} + +TEST_F(KeyVaultCertificateClientTest, GetContacts) +{ + auto const& client + = GetClientForTest(::testing::UnitTest::GetInstance()->current_test_info()->name()); + + std::vector contacts; + + CertificateContact ctt; + + ctt.EmailAddress = "one@two.org"; + ctt.Name = "giqu"; // cspell:disable-line + ctt.Phone = "1234567890"; + contacts.emplace_back(ctt); + + CertificateContact ctt2; + + ctt2.EmailAddress = "two@three.org"; + ctt2.Name = "giqu2"; // cspell:disable-line + ctt2.Phone = "1234567891"; + contacts.emplace_back(ctt2); + + client.SetContacts(contacts); + auto response = client.GetContacts(); + + CheckContactsCollections(contacts, response.Value); + + auto response2 = client.DeleteContacts(); + + CheckContactsCollections(contacts, response2.Value); +} + +TEST_F(KeyVaultCertificateClientTest, GetContactsPartial) +{ + auto const& client + = GetClientForTest(::testing::UnitTest::GetInstance()->current_test_info()->name()); + + std::vector contacts; + + CertificateContact ctt; + + ctt.EmailAddress = "one1@two.org"; + contacts.emplace_back(ctt); + + CertificateContact ctt2, ctt3; + + ctt2.EmailAddress = "two2@three.org"; + ctt2.Name = "giqu2"; // cspell:disable-line + contacts.emplace_back(ctt2); + + ctt3.EmailAddress = "two3@three.org"; + ctt3.Phone = "1234567891"; + + contacts.emplace_back(ctt3); + + client.SetContacts(contacts); + auto response = client.GetContacts(); + + CheckContactsCollections(contacts, response.Value); + + auto response2 = client.DeleteContacts(); + + CheckContactsCollections(contacts, response2.Value); +} + +TEST_F(KeyVaultCertificateClientTest, GetContactsDuplicateEmail) +{ + auto const& client + = GetClientForTest(::testing::UnitTest::GetInstance()->current_test_info()->name()); + + std::vector contacts; + + CertificateContact ctt; + + ctt.EmailAddress = "one1@two.org"; + contacts.emplace_back(ctt); + + CertificateContact ctt2, ctt3; + + ctt2.EmailAddress = "two@three.org"; + ctt2.Name = "giqu2"; // cspell:disable-line + contacts.emplace_back(ctt2); + + ctt3.EmailAddress = "two@three.org"; + ctt3.Phone = "1234567891"; + + contacts.emplace_back(ctt3); + + client.SetContacts(contacts); + auto response = client.GetContacts(); + + CheckContactsCollections(contacts, response.Value); + + auto response2 = client.DeleteContacts(); + + CheckContactsCollections(contacts, response2.Value); +} diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.GetContacts.json b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.GetContacts.json new file mode 100644 index 000000000..32e7dbb29 --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.GetContacts.json @@ -0,0 +1,85 @@ +{ + "networkCallRecords": [ + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "cb835e83-7191-495b-63ef-d07366443a0c" + }, + "Method": "PUT", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one@two.org\",\"name\":\"giqu\",\"phone\":\"1234567890\"},{\"email\":\"two@three.org\",\"name\":\"giqu2\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "202", + "content-type": "application/json; charset=utf-8", + "date": "Sun, 19 Sep 2021 19:21:46 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "cb835e83-7191-495b-63ef-d07366443a0c", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.79.2", + "x-ms-request-id": "f0d670d2-8cc8-49dc-8317-ba7021419d55", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + }, + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "f29dad38-641c-4c0e-49f3-6850a18624e3" + }, + "Method": "GET", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one@two.org\",\"name\":\"giqu\",\"phone\":\"1234567890\"},{\"email\":\"two@three.org\",\"name\":\"giqu2\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "202", + "content-type": "application/json; charset=utf-8", + "date": "Sun, 19 Sep 2021 19:21:46 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "f29dad38-641c-4c0e-49f3-6850a18624e3", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.79.2", + "x-ms-request-id": "255653c0-ad75-4a67-8b86-f3a2dd609ce2", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + }, + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "8e1cb98e-014c-4146-42fa-230813e03d17" + }, + "Method": "DELETE", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one@two.org\",\"name\":\"giqu\",\"phone\":\"1234567890\"},{\"email\":\"two@three.org\",\"name\":\"giqu2\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "202", + "content-type": "application/json; charset=utf-8", + "date": "Sun, 19 Sep 2021 19:21:46 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "8e1cb98e-014c-4146-42fa-230813e03d17", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.79.2", + "x-ms-request-id": "bbd2d766-037f-4cf4-a65e-db0b62bf9425", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + } + ] +} diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.GetContactsDuplicateEmail.json b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.GetContactsDuplicateEmail.json new file mode 100644 index 000000000..a186e0af8 --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.GetContactsDuplicateEmail.json @@ -0,0 +1,85 @@ +{ + "networkCallRecords": [ + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "3d785e99-3d70-4951-52e5-70c235ac8471" + }, + "Method": "PUT", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one1@two.org\"},{\"email\":\"two@three.org\",\"name\":\"giqu2\"},{\"email\":\"two@three.org\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "194", + "content-type": "application/json; charset=utf-8", + "date": "Wed, 06 Oct 2021 00:52:57 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "3d785e99-3d70-4951-52e5-70c235ac8471", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.132.3", + "x-ms-request-id": "1862182f-39d1-404a-ba52-7a5279ef4fc0", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + }, + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "1f3daa27-8294-4f95-53e4-b2690c5eb0db" + }, + "Method": "GET", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one1@two.org\"},{\"email\":\"two@three.org\",\"name\":\"giqu2\"},{\"email\":\"two@three.org\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "194", + "content-type": "application/json; charset=utf-8", + "date": "Wed, 06 Oct 2021 00:52:57 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "1f3daa27-8294-4f95-53e4-b2690c5eb0db", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.132.3", + "x-ms-request-id": "58ddf982-40e9-45a4-bce4-49b5a35a008e", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + }, + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "37e206db-2ad6-4dc4-4f79-8aa54f786652" + }, + "Method": "DELETE", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one1@two.org\"},{\"email\":\"two@three.org\",\"name\":\"giqu2\"},{\"email\":\"two@three.org\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "194", + "content-type": "application/json; charset=utf-8", + "date": "Wed, 06 Oct 2021 00:52:57 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "37e206db-2ad6-4dc4-4f79-8aa54f786652", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.132.3", + "x-ms-request-id": "c5cbe37f-c5dd-4be4-a475-e683f9fe25f9", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + } + ] +} diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.GetContactsPartial.json b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.GetContactsPartial.json new file mode 100644 index 000000000..8ea78bcf6 --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.GetContactsPartial.json @@ -0,0 +1,85 @@ +{ + "networkCallRecords": [ + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "80531cf7-0d91-4f2c-6d1d-b4bbdea36a30" + }, + "Method": "PUT", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one1@two.org\"},{\"email\":\"two2@three.org\",\"name\":\"giqu2\"},{\"email\":\"two3@three.org\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "196", + "content-type": "application/json; charset=utf-8", + "date": "Tue, 05 Oct 2021 19:42:09 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "80531cf7-0d91-4f2c-6d1d-b4bbdea36a30", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.132.3", + "x-ms-request-id": "9331f3c8-71d1-4c16-8085-fef5a916d669", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + }, + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "90a2965b-6b4b-4a03-5ee6-48feca219008" + }, + "Method": "GET", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one1@two.org\"},{\"email\":\"two2@three.org\",\"name\":\"giqu2\"},{\"email\":\"two3@three.org\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "196", + "content-type": "application/json; charset=utf-8", + "date": "Tue, 05 Oct 2021 19:42:09 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "90a2965b-6b4b-4a03-5ee6-48feca219008", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.132.3", + "x-ms-request-id": "d4888d0e-7200-4197-b723-f83754ad6be6", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + }, + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "7779f57d-a028-407a-59f9-cb5ca75477d1" + }, + "Method": "DELETE", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one1@two.org\"},{\"email\":\"two2@three.org\",\"name\":\"giqu2\"},{\"email\":\"two3@three.org\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "196", + "content-type": "application/json; charset=utf-8", + "date": "Tue, 05 Oct 2021 19:42:09 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "7779f57d-a028-407a-59f9-cb5ca75477d1", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.132.3", + "x-ms-request-id": "b0566e3b-8aac-4798-8763-34f999145e1e", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + } + ] +} diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.SetContacts.json b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.SetContacts.json new file mode 100644 index 000000000..97e9ed9a5 --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/recordings/KeyVaultCertificateClientTest.SetContacts.json @@ -0,0 +1,58 @@ +{ + "networkCallRecords": [ + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "d7803f72-bca6-4073-4a0a-05b0f015ea72" + }, + "Method": "PUT", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one@two.org\",\"name\":\"giqu\",\"phone\":\"1234567890\"},{\"email\":\"two@three.org\",\"name\":\"giqu2\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "202", + "content-type": "application/json; charset=utf-8", + "date": "Sun, 19 Sep 2021 19:21:46 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "d7803f72-bca6-4073-4a0a-05b0f015ea72", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.79.2", + "x-ms-request-id": "e73d3be7-feef-4581-8c29-f0f889df6190", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + }, + { + "Headers": { + "content-type": "application/json", + "user-agent": "azsdk-cpp-keyvault-certificates/4.0.0-beta.1 (Windows 10 Enterprise 6.3 19043 19041.1.amd64fre.vb_release.191206-1406)", + "x-ms-client-request-id": "a8eefe63-08cd-4a04-5fd7-2168e15508cb" + }, + "Method": "DELETE", + "Response": { + "BODY": "{\"id\":\"https://REDACTED.vault.azure.net/certificates/contacts\",\"contacts\":[{\"email\":\"one@two.org\",\"name\":\"giqu\",\"phone\":\"1234567890\"},{\"email\":\"two@three.org\",\"name\":\"giqu2\",\"phone\":\"1234567891\"}]}", + "STATUS_CODE": "200", + "cache-control": "no-cache", + "content-length": "202", + "content-type": "application/json; charset=utf-8", + "date": "Sun, 19 Sep 2021 19:21:46 GMT", + "expires": "-1", + "pragma": "no-cache", + "strict-transport-security": "max-age=31536000;includeSubDomains", + "x-content-type-options": "nosniff", + "x-ms-client-request-id": "a8eefe63-08cd-4a04-5fd7-2168e15508cb", + "x-ms-keyvault-network-info": "conn_type=Ipv4;addr=24.22.157.72;act_addr_fam=InterNetwork;", + "x-ms-keyvault-region": "westus2", + "x-ms-keyvault-service-version": "1.9.79.2", + "x-ms-request-id": "7391cc51-6d1d-4a8e-a1ef-61c461668a18", + "x-powered-by": "ASP.NET" + }, + "Url": "https://REDACTED.vault.azure.net/certificates/contacts?api-version=7.2" + } + ] +}