| Index: chrome/browser/chromeos/certificate_provider/thread_safe_certificate_map.cc
|
| diff --git a/chrome/browser/chromeos/certificate_provider/thread_safe_certificate_map.cc b/chrome/browser/chromeos/certificate_provider/thread_safe_certificate_map.cc
|
| index e6352d3eba54ac3cd8755a53dce8fc57d814a633..3c020e9f0de6b7f2785fc3f5a08de6169a4c13e6 100644
|
| --- a/chrome/browser/chromeos/certificate_provider/thread_safe_certificate_map.cc
|
| +++ b/chrome/browser/chromeos/certificate_provider/thread_safe_certificate_map.cc
|
| @@ -14,21 +14,29 @@ namespace {
|
| void BuildFingerprintsMap(
|
| const std::map<std::string, certificate_provider::CertificateInfoList>&
|
| extension_to_certificates,
|
| - ThreadSafeCertificateMap::ExtensionToFingerprintsMap* ext_to_certs_map) {
|
| + ThreadSafeCertificateMap::FingerprintToCertAndExtensionMap*
|
| + fingerprint_to_cert) {
|
| for (const auto& entry : extension_to_certificates) {
|
| const std::string& extension_id = entry.first;
|
| - auto& fingerprint_to_cert = (*ext_to_certs_map)[extension_id];
|
| for (const CertificateInfo& cert_info : entry.second) {
|
| const net::SHA256HashValue fingerprint =
|
| net::X509Certificate::CalculateFingerprint256(
|
| cert_info.certificate->os_cert_handle());
|
| - fingerprint_to_cert[fingerprint] = cert_info;
|
| + fingerprint_to_cert->insert(
|
| + fingerprint, make_scoped_ptr(new ThreadSafeCertificateMap::MapValue(
|
| + cert_info, extension_id)));
|
| }
|
| }
|
| }
|
|
|
| } // namespace
|
|
|
| +ThreadSafeCertificateMap::MapValue::MapValue(const CertificateInfo& cert_info,
|
| + const std::string& extension_id)
|
| + : cert_info(cert_info), extension_id(extension_id) {}
|
| +
|
| +ThreadSafeCertificateMap::MapValue::~MapValue() {}
|
| +
|
| ThreadSafeCertificateMap::ThreadSafeCertificateMap() {}
|
|
|
| ThreadSafeCertificateMap::~ThreadSafeCertificateMap() {}
|
| @@ -36,37 +44,53 @@ ThreadSafeCertificateMap::~ThreadSafeCertificateMap() {}
|
| void ThreadSafeCertificateMap::Update(
|
| const std::map<std::string, certificate_provider::CertificateInfoList>&
|
| extension_to_certificates) {
|
| - ExtensionToFingerprintsMap new_ext_to_certs_map;
|
| - BuildFingerprintsMap(extension_to_certificates, &new_ext_to_certs_map);
|
| + FingerprintToCertAndExtensionMap new_fingerprint_map;
|
| + BuildFingerprintsMap(extension_to_certificates, &new_fingerprint_map);
|
|
|
| base::AutoLock auto_lock(lock_);
|
| - extension_to_certificates_.swap(new_ext_to_certs_map);
|
| + // Keep all old fingerprints from |fingerprint_to_cert_and_extension_| but
|
| + // remove the association to any extension.
|
| + for (const auto& entry : fingerprint_to_cert_and_extension_) {
|
| + const net::SHA256HashValue& fingerprint = entry.first;
|
| + // This doesn't modify the map if it already contains the key |fingerprint|.
|
| + new_fingerprint_map.insert(fingerprint, nullptr);
|
| + }
|
| + fingerprint_to_cert_and_extension_.swap(new_fingerprint_map);
|
| }
|
|
|
| bool ThreadSafeCertificateMap::LookUpCertificate(
|
| const net::X509Certificate& cert,
|
| + bool* is_currently_provided,
|
| CertificateInfo* info,
|
| std::string* extension_id) {
|
| + *is_currently_provided = false;
|
| const net::SHA256HashValue fingerprint =
|
| net::X509Certificate::CalculateFingerprint256(cert.os_cert_handle());
|
|
|
| base::AutoLock auto_lock(lock_);
|
| - for (const auto& entry : extension_to_certificates_) {
|
| - const FingerprintToCertMap& certs = entry.second;
|
| - const auto it = certs.find(fingerprint);
|
| - if (it != certs.end()) {
|
| - *info = it->second;
|
| - *extension_id = entry.first;
|
| - return true;
|
| - }
|
| + const auto it = fingerprint_to_cert_and_extension_.find(fingerprint);
|
| + if (it == fingerprint_to_cert_and_extension_.end())
|
| + return false;
|
| +
|
| + MapValue* const value = it->second;
|
| + if (value) {
|
| + *is_currently_provided = true;
|
| + *info = value->cert_info;
|
| + *extension_id = value->extension_id;
|
| }
|
| - return false;
|
| + return true;
|
| }
|
|
|
| void ThreadSafeCertificateMap::RemoveExtension(
|
| const std::string& extension_id) {
|
| base::AutoLock auto_lock(lock_);
|
| - extension_to_certificates_.erase(extension_id);
|
| + for (auto& entry : fingerprint_to_cert_and_extension_) {
|
| + MapValue* const value = entry.second;
|
| + // Only remove the association of the fingerprint to the extension, but keep
|
| + // the fingerprint.
|
| + if (value && value->extension_id == extension_id)
|
| + fingerprint_to_cert_and_extension_.set(entry.first, nullptr);
|
| + }
|
| }
|
|
|
| } // namespace certificate_provider
|
|
|