diff --git a/sdk/core/azure-core-test/src/test_proxy_manager.cpp b/sdk/core/azure-core-test/src/test_proxy_manager.cpp index 518103289e..313845e2ff 100644 --- a/sdk/core/azure-core-test/src/test_proxy_manager.cpp +++ b/sdk/core/azure-core-test/src/test_proxy_manager.cpp @@ -166,44 +166,26 @@ std::unique_ptr TestProxyManager::GetTe return std::make_unique(this); } +namespace { +const char* g_accountRegex = "https://(?[a-zA-Z0-9\\-]+)\\."; +} + bool TestProxyManager::CheckSanitizers() { Azure::Core::Url checkRequest(m_proxy); - checkRequest.AppendPath("Info"); checkRequest.AppendPath("Active"); - { - Azure::Core::Http::Request request(Azure::Core::Http::HttpMethod::Get, checkRequest); - Azure::Core::Context ctx; - auto response = m_privatePipeline->Send(request, ctx); + Azure::Core::Http::Request request(Azure::Core::Http::HttpMethod::Get, checkRequest); + Azure::Core::Context ctx; + auto response = m_privatePipeline->Send(request, ctx); - auto rawResponse = response->GetBody(); - std::string stringBody(rawResponse.begin(), rawResponse.end()); - std::string regex = "\"https://(?[a-zA-Z0-9\\-]+).\""; - std::vector stringsInOrder - = {"UriRegexSanitizer", - regex, - "BodyRegexSanitizer", - regex, - "HeaderRegexSanitizer", - regex, - "GeneralRegexSanitizer", - regex, - "CustomDefaultMatcher"}; - - size_t position = 0; - - for (auto& part : stringsInOrder) - { - position = stringBody.find(part, position); - if (position == std::string::npos) - { - return false; - } - } + auto rawResponse = response->GetBody(); + std::string stringBody(rawResponse.begin(), rawResponse.end()); + if (stringBody.find(g_accountRegex) == std::string::npos) + { + return false; } - return true; } @@ -213,25 +195,62 @@ void TestProxyManager::SetProxySanitizer() { return; } - Azure::Core::Url sanitizerRequest(m_proxy); - sanitizerRequest.AppendPath("Admin"); - sanitizerRequest.AppendPath("AddSanitizer"); - const std::string urlAccountRegex = R"json( - { - "key": "Location", - "value": "REDACTED", - "regex": "https://(?[a-zA-Z0-9\\-]+).", - "groupForReplace": "account" - } - )json"; - const std::string bodyClientSecretRegex = R"json( + // we have 3 types of sanitizer, + // see + // https://github.com/Azure/azure-sdk-tools/blob/main/tools/test-proxy/Azure.Sdk.Tools.TestProxy/README.md#a-note-about-where-sanitizers-apply + enum class SanitizerType + { + Uri, + Header, + Body, + General, + }; + auto addSanitizer = [&](SanitizerType type, + const std::string& regex, + const std::string& groupName, + const std::string& headerName = std::string()) { + const std::map abstractionIdentifierValues = { + {SanitizerType::Uri, "UriRegexSanitizer"}, + {SanitizerType::Header, "HeaderRegexSanitizer"}, + {SanitizerType::Body, "BodyRegexSanitizer"}, + {SanitizerType::General, "GeneralRegexSanitizer"}, + }; + + Azure::Core::Url sanitizerRequest(m_proxy); + sanitizerRequest.AppendPath("Admin"); + sanitizerRequest.AppendPath("AddSanitizer"); + + auto jsonRoot = Json::_internal::json::object(); + jsonRoot["value"] = "REDACTED"; + jsonRoot["regex"] = regex; + jsonRoot["groupForReplace"] = groupName; + if (!headerName.empty()) { - "key": "Location", - "value": "REDACTED", - "regex": "client_secret=(?[a-zA-Z0-9\\%]+)", - "groupForReplace": "clientsecret" + jsonRoot["key"] = headerName; } - )json"; + auto jsonString = jsonRoot.dump(); + + Azure::Core::IO::MemoryBodyStream payloadStream( + reinterpret_cast(jsonString.data()), jsonString.size()); + Azure::Core::Http::Request request( + Azure::Core::Http::HttpMethod::Post, sanitizerRequest, &payloadStream); + request.SetHeader("x-abstraction-identifier", abstractionIdentifierValues.at(type)); + Azure::Core::Context ctx; + auto response = m_privatePipeline->Send(request, ctx); + (void)response; + }; + + addSanitizer(SanitizerType::General, g_accountRegex, "account"); + addSanitizer( + SanitizerType::Body, "client_secret=(?[a-zA-Z0-9\\%]+)", "clientsecret"); + const std::string storageSasSignatureRegex = "\\?.*sig=(?[a-zA-Z0-9\\%\\/+=]+)"; + addSanitizer(SanitizerType::Uri, storageSasSignatureRegex, "sassig"); + addSanitizer(SanitizerType::Header, storageSasSignatureRegex, "sassig", "x-ms-copy-source"); + addSanitizer(SanitizerType::Header, storageSasSignatureRegex, "sassig", "x-ms-rename-source"); + const std::string storageUserDelegationKeyRegex + = "\\u003CValue\\u003E(?[a-zA-Z0-9\\/=+]+).*\\u003C\\/" + "UserDelegationKey\\u003E"; + addSanitizer(SanitizerType::Body, storageUserDelegationKeyRegex, "userdelegationkey"); Azure::Core::Url matcherRequest(m_proxy); matcherRequest.AppendPath("Admin"); @@ -280,53 +299,6 @@ void TestProxyManager::SetProxySanitizer() }); matcherBody = jsonRoot.dump(); } - - { - Azure::Core::IO::MemoryBodyStream payloadStream( - reinterpret_cast(urlAccountRegex.data()), urlAccountRegex.size()); - Azure::Core::Http::Request request( - Azure::Core::Http::HttpMethod::Post, sanitizerRequest, &payloadStream); - request.SetHeader("x-abstraction-identifier", "UriRegexSanitizer"); - Azure::Core::Context ctx; - auto response = m_privatePipeline->Send(request, ctx); - } - { - Azure::Core::IO::MemoryBodyStream payloadStream( - reinterpret_cast(urlAccountRegex.data()), urlAccountRegex.size()); - Azure::Core::Http::Request request( - Azure::Core::Http::HttpMethod::Post, sanitizerRequest, &payloadStream); - request.SetHeader("x-abstraction-identifier", "BodyRegexSanitizer"); - Azure::Core::Context ctx; - auto response = m_privatePipeline->Send(request, ctx); - } - { - Azure::Core::IO::MemoryBodyStream payloadStream( - reinterpret_cast(bodyClientSecretRegex.data()), - bodyClientSecretRegex.size()); - Azure::Core::Http::Request request( - Azure::Core::Http::HttpMethod::Post, sanitizerRequest, &payloadStream); - request.SetHeader("x-abstraction-identifier", "BodyRegexSanitizer"); - Azure::Core::Context ctx; - auto response = m_privatePipeline->Send(request, ctx); - } - { - Azure::Core::IO::MemoryBodyStream payloadStream( - reinterpret_cast(urlAccountRegex.data()), urlAccountRegex.size()); - Azure::Core::Http::Request request( - Azure::Core::Http::HttpMethod::Post, sanitizerRequest, &payloadStream); - request.SetHeader("x-abstraction-identifier", "HeaderRegexSanitizer"); - Azure::Core::Context ctx; - auto response = m_privatePipeline->Send(request, ctx); - } - { - Azure::Core::IO::MemoryBodyStream payloadStream( - reinterpret_cast(urlAccountRegex.data()), urlAccountRegex.size()); - Azure::Core::Http::Request request( - Azure::Core::Http::HttpMethod::Post, sanitizerRequest, &payloadStream); - request.SetHeader("x-abstraction-identifier", "GeneralRegexSanitizer"); - Azure::Core::Context ctx; - auto response = m_privatePipeline->Send(request, ctx); - } { Azure::Core::IO::MemoryBodyStream payloadStream( reinterpret_cast(matcherBody.data()), matcherBody.size());