Index: chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.cc |
diff --git a/chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.cc b/chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.cc |
index 26c425e3a10cde47197553b563a4a457c9d5a508..3ae118ba7a7b2a81d7b593c2836fe62485f4eee9 100644 |
--- a/chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.cc |
+++ b/chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.cc |
@@ -19,11 +19,9 @@ namespace extensions { |
// Class verifies certificate by its fingerprint received using different |
// channel. It's the only know information about device with self-signed |
// certificate. |
-class FingerprintVerifier : public net::CertVerifier { |
+class PrivetV3ContextGetter::CertVerifier : public net::CertVerifier { |
public: |
- explicit FingerprintVerifier( |
- const net::SHA256HashValue& certificate_fingerprint) |
- : certificate_fingerprint_(certificate_fingerprint) {} |
+ CertVerifier() {} |
int Verify(net::X509Certificate* cert, |
const std::string& hostname, |
@@ -39,45 +37,73 @@ class FingerprintVerifier : public net::CertVerifier { |
verify_result->verified_cert = cert; |
verify_result->cert_status = net::CERT_STATUS_INVALID; |
+ auto it = fingerprints_.find(hostname); |
+ if (it == fingerprints_.end()) |
+ return net::ERR_CERT_INVALID; |
+ |
auto fingerprint = |
net::X509Certificate::CalculateFingerprint256(cert->os_cert_handle()); |
+ return it->second.Equals(fingerprint) ? net::OK : net::ERR_CERT_INVALID; |
+ } |
- return certificate_fingerprint_.Equals(fingerprint) ? net::OK |
- : net::ERR_CERT_INVALID; |
+ void AddPairedHost(const std::string& host, |
+ const net::SHA256HashValue& certificate_fingerprint) { |
+ fingerprints_[host] = certificate_fingerprint; |
} |
private: |
- net::SHA256HashValue certificate_fingerprint_; |
+ std::map<std::string, net::SHA256HashValue> fingerprints_; |
- DISALLOW_COPY_AND_ASSIGN(FingerprintVerifier); |
+ DISALLOW_COPY_AND_ASSIGN(CertVerifier); |
}; |
PrivetV3ContextGetter::PrivetV3ContextGetter( |
- const scoped_refptr<base::SingleThreadTaskRunner>& net_task_runner, |
- const net::SHA256HashValue& certificate_fingerprint) |
- : verifier_(new FingerprintVerifier(certificate_fingerprint)), |
- net_task_runner_(net_task_runner) { |
+ const scoped_refptr<base::SingleThreadTaskRunner>& net_task_runner) |
+ : net_task_runner_(net_task_runner), weak_ptr_factory_(this) { |
CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnablePrivetV3)); |
} |
net::URLRequestContext* PrivetV3ContextGetter::GetURLRequestContext() { |
+ InitOnNetThread(); |
+ return context_.get(); |
+} |
+ |
+scoped_refptr<base::SingleThreadTaskRunner> |
+PrivetV3ContextGetter::GetNetworkTaskRunner() const { |
+ return net_task_runner_; |
+} |
+ |
+void PrivetV3ContextGetter::InitOnNetThread() { |
DCHECK(net_task_runner_->BelongsToCurrentThread()); |
if (!context_) { |
net::URLRequestContextBuilder builder; |
builder.set_proxy_service(net::ProxyService::CreateDirect()); |
builder.SetSpdyAndQuicEnabled(false, false); |
builder.DisableHttpCache(); |
- builder.SetCertVerifier(verifier_.Pass()); |
+ cert_verifier_ = new CertVerifier(); |
+ builder.SetCertVerifier(make_scoped_ptr(cert_verifier_)); |
builder.set_user_agent(::GetUserAgent()); |
context_ = builder.Build(); |
} |
- return context_.get(); |
} |
-scoped_refptr<base::SingleThreadTaskRunner> |
-PrivetV3ContextGetter::GetNetworkTaskRunner() const { |
- return net_task_runner_; |
+void PrivetV3ContextGetter::AddPairedHost( |
+ const std::string& host, |
+ const net::SHA256HashValue& certificate_fingerprint, |
+ const base::Closure& callback) { |
+ net_task_runner_->PostTaskAndReply( |
+ FROM_HERE, |
+ base::Bind(&PrivetV3ContextGetter::AddPairedHostOnNetThread, |
+ weak_ptr_factory_.GetWeakPtr(), host, certificate_fingerprint), |
+ callback); |
+} |
+ |
+void PrivetV3ContextGetter::AddPairedHostOnNetThread( |
+ const std::string& host, |
+ const net::SHA256HashValue& certificate_fingerprint) { |
+ InitOnNetThread(); |
+ cert_verifier_->AddPairedHost(host, certificate_fingerprint); |
} |
PrivetV3ContextGetter::~PrivetV3ContextGetter() { |