Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: net/cert/internal/trust_store_collection.cc

Issue 2126803004: WIP: NSS trust store integration for path builder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@cert-command-line-path-builder-add_certpathbuilder
Patch Set: . Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
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/cert/internal/trust_store_collection.h"
6
7 #include "base/bind.h"
8 #include "base/callback_helpers.h"
9 #include "net/cert/internal/parsed_certificate.h"
10
11 namespace net {
12
13 namespace {
14
15 class CollectionRequest : public TrustStore::Request {
16 public:
17 explicit CollectionRequest(const TrustStore::TrustCallback& callback);
18 ~CollectionRequest() override;
19
20 void AddRequest(std::unique_ptr<TrustStore::Request> request);
21 bool has_requests() const { return num_pending_requests_; }
22
23 void OnGotTrust(bool is_trusted);
24
25 private:
26 TrustStore::TrustCallback callback_;
27
28 size_t num_pending_requests_ = 0;
29 std::vector<std::unique_ptr<TrustStore::Request>> requests_;
30
31 DISALLOW_COPY_AND_ASSIGN(CollectionRequest);
32 };
33
34 CollectionRequest::CollectionRequest(const TrustStore::TrustCallback& callback)
35 : callback_(callback) {}
36
37 CollectionRequest::~CollectionRequest() = default;
38
39 void CollectionRequest::AddRequest(
40 std::unique_ptr<TrustStore::Request> request) {
41 requests_.push_back(std::move(request));
42 num_pending_requests_++;
43 }
44
45 void CollectionRequest::OnGotTrust(bool is_trusted) {
46 DCHECK_GT(num_pending_requests_, 0U);
47 num_pending_requests_--;
48
49 if (is_trusted || num_pending_requests_ == 0U) {
50 // Got a positive trust result, or all the requests completed without a
51 // positive result. Delete all the Request handles so that any remaining
52 // sub-requests are cancelled.
53 requests_.clear();
54 num_pending_requests_ = 0;
55 // Run the callback last, since it may delete |this|.
56 base::ResetAndReturn(&callback_).Run(is_trusted);
57 // |this| may be deleted here.
58 }
59 }
60
61 } // namespace
62
63 TrustStoreCollection::TrustStoreCollection() = default;
64 TrustStoreCollection::~TrustStoreCollection() = default;
65
66 void TrustStoreCollection::AddStore(TrustStore* store) {
67 stores_.push_back(store);
68 cert_sources_.AddSource(store);
69 }
70
71 void TrustStoreCollection::IsTrustedCertificate(
72 scoped_refptr<ParsedCertificate> cert,
73 const TrustCallback& callback,
74 bool* out_trusted,
75 std::unique_ptr<TrustStore::Request>* out_req) const {
76 std::unique_ptr<CollectionRequest> collection_req(
77 new CollectionRequest(callback));
78
79 *out_trusted = false;
80 out_req->reset();
81
82 for (TrustStore* store : stores_) {
83 std::unique_ptr<TrustStore::Request> req;
84 store->IsTrustedCertificate(
85 cert, base::Bind(&CollectionRequest::OnGotTrust,
86 base::Unretained(collection_req.get())),
87 out_trusted, &req);
88 if (!req && *out_trusted) {
89 // Got a synchronous trust result. Return immediately.
90 return;
91 }
92 if (req)
93 collection_req->AddRequest(std::move(req));
94 }
95
96 if (collection_req->has_requests())
97 *out_req = std::move(collection_req);
98 }
99
100 void TrustStoreCollection::SyncGetIssuersOf(const ParsedCertificate* cert,
101 ParsedCertificateList* issuers) {
102 cert_sources_.SyncGetIssuersOf(std::move(cert), issuers);
103 }
104
105 void TrustStoreCollection::AsyncGetIssuersOf(
106 scoped_refptr<ParsedCertificate> cert,
107 const IssuerCallback& callback,
108 std::unique_ptr<CertIssuerSource::Request>* out_req) {
109 cert_sources_.AsyncGetIssuersOf(std::move(cert), callback, out_req);
110 }
111
112 } // namespace net
OLDNEW
« no previous file with comments | « net/cert/internal/trust_store_collection.h ('k') | net/cert/internal/trust_store_collection_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698