Commit 2054aecd authored by Fabian Sommer's avatar Fabian Sommer Committed by Commit Bot

Extend observer of CertificateProviderService

The observer for CertificateProviderService now also observes when an
extension updates the certificates it provides.

Add equality comparator for CertificateInfo for testing purposes.

Bug: 1131450
Change-Id: I7efdb3f2b372e3aba279d52fda8e123050403af2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2481022Reviewed-by: default avatarMaksim Ivanov <emaxx@chromium.org>
Commit-Queue: Fabian Sommer <fabiansommer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#819288}
parent f7e31c9d
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "chrome/browser/chromeos/certificate_provider/certificate_info.h" #include "chrome/browser/chromeos/certificate_provider/certificate_info.h"
#include "net/cert/x509_certificate.h"
namespace chromeos { namespace chromeos {
namespace certificate_provider { namespace certificate_provider {
...@@ -13,5 +15,13 @@ CertificateInfo::CertificateInfo(const CertificateInfo& other) = default; ...@@ -13,5 +15,13 @@ CertificateInfo::CertificateInfo(const CertificateInfo& other) = default;
CertificateInfo::~CertificateInfo() {} CertificateInfo::~CertificateInfo() {}
bool CertificateInfo::operator==(const CertificateInfo& other) const {
return net::X509Certificate::CalculateFingerprint256(
this->certificate->cert_buffer()) ==
net::X509Certificate::CalculateFingerprint256(
other.certificate->cert_buffer()) &&
this->supported_algorithms == other.supported_algorithms;
}
} // namespace certificate_provider } // namespace certificate_provider
} // namespace chromeos } // namespace chromeos
...@@ -23,6 +23,8 @@ struct CertificateInfo { ...@@ -23,6 +23,8 @@ struct CertificateInfo {
CertificateInfo(const CertificateInfo& other); CertificateInfo(const CertificateInfo& other);
~CertificateInfo(); ~CertificateInfo();
bool operator==(const CertificateInfo& other) const;
scoped_refptr<net::X509Certificate> certificate; scoped_refptr<net::X509Certificate> certificate;
// Contains the list of supported signature algorithms, using TLS 1.3's // Contains the list of supported signature algorithms, using TLS 1.3's
// SignatureScheme values. See net::SSLPrivateKey documentation for details. // SignatureScheme values. See net::SSLPrivateKey documentation for details.
......
...@@ -221,6 +221,8 @@ void CertificateProviderService::SetCertificatesProvidedByExtension( ...@@ -221,6 +221,8 @@ void CertificateProviderService::SetCertificatesProvidedByExtension(
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
certificate_map_.UpdateCertificatesForExtension(extension_id, certificate_map_.UpdateCertificatesForExtension(extension_id,
certificate_infos); certificate_infos);
for (auto& observer : observers_)
observer.OnCertificatesUpdated(extension_id, certificate_infos);
} }
bool CertificateProviderService::SetExtensionCertificateReplyReceived( bool CertificateProviderService::SetExtensionCertificateReplyReceived(
......
...@@ -99,6 +99,11 @@ class CertificateProviderService : public KeyedService { ...@@ -99,6 +99,11 @@ class CertificateProviderService : public KeyedService {
class Observer : public base::CheckedObserver { class Observer : public base::CheckedObserver {
public: public:
// Called when an extension updates the certificates it provides.
virtual void OnCertificatesUpdated(
const std::string& extension_id,
const CertificateInfoList& certificate_infos) {}
// Called when a sign request gets successfully completed. // Called when a sign request gets successfully completed.
virtual void OnSignCompleted( virtual void OnSignCompleted(
const scoped_refptr<net::X509Certificate>& certificate, const scoped_refptr<net::X509Certificate>& certificate,
......
...@@ -138,6 +138,10 @@ class TestDelegate : public CertificateProviderService::Delegate { ...@@ -138,6 +138,10 @@ class TestDelegate : public CertificateProviderService::Delegate {
class MockObserver : public CertificateProviderService::Observer { class MockObserver : public CertificateProviderService::Observer {
public: public:
MOCK_METHOD2(
OnCertificatesUpdated,
void(const std::string& extension_id,
const certificate_provider::CertificateInfoList& certificate_infos));
MOCK_METHOD2(OnSignCompleted, MOCK_METHOD2(OnSignCompleted,
void(const scoped_refptr<net::X509Certificate>& certificate, void(const scoped_refptr<net::X509Certificate>& certificate,
const std::string& extension_id)); const std::string& extension_id));
...@@ -209,6 +213,7 @@ class CertificateProviderServiceTest : public testing::Test { ...@@ -209,6 +213,7 @@ class CertificateProviderServiceTest : public testing::Test {
const certificate_provider::CertificateInfo& cert_info) { const certificate_provider::CertificateInfo& cert_info) {
certificate_provider::CertificateInfoList infos; certificate_provider::CertificateInfoList infos;
infos.push_back(cert_info); infos.push_back(cert_info);
EXPECT_CALL(observer_, OnCertificatesUpdated(extension_id, infos));
service_->SetCertificatesProvidedByExtension(extension_id, infos); service_->SetCertificatesProvidedByExtension(extension_id, infos);
service_->SetExtensionCertificateReplyReceived(extension_id, service_->SetExtensionCertificateReplyReceived(extension_id,
cert_request_id); cert_request_id);
...@@ -316,6 +321,9 @@ TEST_F(CertificateProviderServiceTest, LookUpCertificate) { ...@@ -316,6 +321,9 @@ TEST_F(CertificateProviderServiceTest, LookUpCertificate) {
test_delegate_->provider_extensions_.insert(kExtension2); test_delegate_->provider_extensions_.insert(kExtension2);
{ {
const int cert_request_id = RequestCertificatesFromExtensions(nullptr); const int cert_request_id = RequestCertificatesFromExtensions(nullptr);
EXPECT_CALL(observer_,
OnCertificatesUpdated(
kExtension1, certificate_provider::CertificateInfoList()));
service_->SetCertificatesProvidedByExtension( service_->SetCertificatesProvidedByExtension(
kExtension1, certificate_provider::CertificateInfoList()); kExtension1, certificate_provider::CertificateInfoList());
service_->SetExtensionCertificateReplyReceived(kExtension1, service_->SetExtensionCertificateReplyReceived(kExtension1,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment