1 // Copyright 2018 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/http/transport_security_state_test_util.h" 6 7 #include <iterator> 8 #include <string_view> 9 10 #include "base/stl_util.h" 11 #include "base/strings/string_number_conversions.h" 12 #include "net/http/transport_security_state.h" 13 #include "url/gurl.h" 14 15 namespace net { 16 17 namespace test_default { 18 #include "net/http/transport_security_state_static_unittest_default.h" 19 } // namespace test_default 20 ScopedTransportSecurityStateSource()21ScopedTransportSecurityStateSource::ScopedTransportSecurityStateSource() { 22 // TODO(mattm): allow using other source? 23 net::SetTransportSecurityStateSourceForTesting( 24 &net::test_default::kHSTSSource); 25 } 26 ScopedTransportSecurityStateSource(uint16_t reporting_port)27ScopedTransportSecurityStateSource::ScopedTransportSecurityStateSource( 28 uint16_t reporting_port) { 29 // TODO(mattm): allow using other source? 30 const TransportSecurityStateSource* base_source = 31 &net::test_default::kHSTSSource; 32 std::string reporting_port_string = base::NumberToString(reporting_port); 33 GURL::Replacements replace_port; 34 replace_port.SetPortStr(reporting_port_string); 35 36 const char* last_report_uri = nullptr; 37 for (size_t i = 0; i < base_source->pinsets_count; ++i) { 38 const auto* pinset = &base_source->pinsets[i]; 39 if (pinset->report_uri == kNoReportURI) 40 continue; 41 // Currently only one PKP report URI is supported. 42 if (last_report_uri) 43 DCHECK_EQ(std::string_view(last_report_uri), pinset->report_uri); 44 else 45 last_report_uri = pinset->report_uri; 46 pkp_report_uri_ = 47 GURL(pinset->report_uri).ReplaceComponents(replace_port).spec(); 48 } 49 for (size_t i = 0; i < base_source->pinsets_count; ++i) { 50 const auto* pinset = &base_source->pinsets[i]; 51 pinsets_.push_back({pinset->accepted_pins, pinset->rejected_pins, 52 pinset->report_uri == kNoReportURI 53 ? kNoReportURI 54 : pkp_report_uri_.c_str()}); 55 } 56 57 const net::TransportSecurityStateSource new_source = { 58 base_source->huffman_tree, base_source->huffman_tree_size, 59 base_source->preloaded_data, base_source->preloaded_bits, 60 base_source->root_position, pinsets_.data(), 61 base_source->pinsets_count}; 62 63 source_ = std::make_unique<TransportSecurityStateSource>(new_source); 64 65 net::SetTransportSecurityStateSourceForTesting(source_.get()); 66 } 67 ~ScopedTransportSecurityStateSource()68ScopedTransportSecurityStateSource::~ScopedTransportSecurityStateSource() { 69 net::SetTransportSecurityStateSourceForTesting(nullptr); 70 } 71 72 } // namespace net 73