25 #include "absl/functional/bind_front.h"
26 #include "absl/memory/memory.h"
27 #include "absl/types/optional.h"
39 class RootCertificatesWatcher
47 RootCertificatesWatcher(
48 RefCountedPtr<grpc_tls_certificate_distributor> parent,
71 RefCountedPtr<grpc_tls_certificate_distributor>
parent_;
75 class IdentityCertificatesWatcher
83 IdentityCertificatesWatcher(
84 RefCountedPtr<grpc_tls_certificate_distributor> parent,
88 void OnCertificatesChanged(
100 identity_cert_error );
106 RefCountedPtr<grpc_tls_certificate_distributor>
parent_;
127 return !watching_root_certs_ && !watching_identity_certs_ &&
128 root_cert_distributor_ ==
nullptr &&
129 identity_cert_distributor_ ==
nullptr;
136 if (root_cert_name_ == root_cert_name &&
137 root_cert_distributor_ == root_cert_distributor) {
141 if (watching_root_certs_) {
143 if (root_cert_distributor_ !=
nullptr) {
144 root_cert_distributor_->CancelTlsCertificatesWatch(root_cert_watcher_);
146 if (root_cert_distributor !=
nullptr) {
147 UpdateRootCertWatcher(cert_name, root_cert_distributor.
get());
149 root_cert_watcher_ =
nullptr;
153 "No certificate provider available for root certificates"),
158 root_cert_distributor_ =
std::move(root_cert_distributor);
165 identity_cert_distributor) {
166 if (identity_cert_name_ == identity_cert_name &&
167 identity_cert_distributor_ == identity_cert_distributor) {
170 identity_cert_name_ =
std::string(identity_cert_name);
171 if (watching_identity_certs_) {
173 if (identity_cert_distributor_ !=
nullptr) {
174 identity_cert_distributor_->CancelTlsCertificatesWatch(
175 identity_cert_watcher_);
177 if (identity_cert_distributor !=
nullptr) {
178 UpdateIdentityCertWatcher(cert_name, identity_cert_distributor.
get());
180 identity_cert_watcher_ =
nullptr;
184 "No certificate provider available for identity certificates"));
188 identity_cert_distributor_ =
std::move(identity_cert_distributor);
194 auto watcher = absl::make_unique<RootCertificatesWatcher>(
196 root_cert_watcher_ =
watcher.get();
198 root_cert_name_, absl::nullopt);
204 auto watcher = absl::make_unique<IdentityCertificatesWatcher>(
206 identity_cert_watcher_ =
watcher.get();
212 const std::string& cert_name,
bool root_being_watched,
213 bool identity_being_watched) {
219 if (root_being_watched && !watching_root_certs_) {
221 watching_root_certs_ =
true;
222 if (root_cert_distributor_ ==
nullptr) {
226 "No certificate provider available for root certificates"),
229 UpdateRootCertWatcher(cert_name, root_cert_distributor_.get());
231 }
else if (!root_being_watched && watching_root_certs_) {
233 watching_root_certs_ =
false;
234 if (root_cert_distributor_ !=
nullptr) {
235 root_cert_distributor_->CancelTlsCertificatesWatch(root_cert_watcher_);
236 root_cert_watcher_ =
nullptr;
240 if (identity_being_watched && !watching_identity_certs_) {
241 watching_identity_certs_ =
true;
242 if (identity_cert_distributor_ ==
nullptr) {
244 cert_name, absl::nullopt,
246 "No certificate provider available for identity certificates"));
248 UpdateIdentityCertWatcher(cert_name, identity_cert_distributor_.get());
250 }
else if (!identity_being_watched && watching_identity_certs_) {
251 watching_identity_certs_ =
false;
252 if (identity_cert_distributor_ !=
nullptr) {
253 identity_cert_distributor_->CancelTlsCertificatesWatch(
254 identity_cert_watcher_);
255 identity_cert_watcher_ =
nullptr;
257 GPR_ASSERT(identity_cert_watcher_ ==
nullptr);
282 auto it = certificate_state_map_.find(cert_name);
283 if (
it == certificate_state_map_.end())
return false;
284 return it->second->ProvidesRootCerts();
291 auto it = certificate_state_map_.find(cert_name);
292 if (
it == certificate_state_map_.end()) {
293 it = certificate_state_map_
295 absl::make_unique<ClusterCertificateState>(
this))
298 it->second->UpdateRootCertNameAndDistributor(cert_name, root_cert_name,
299 root_cert_distributor);
301 if (
it->second->IsSafeToRemove()) certificate_state_map_.erase(
it);
307 auto it = certificate_state_map_.find(cert_name);
308 if (
it == certificate_state_map_.end())
return false;
309 return it->second->ProvidesIdentityCerts();
316 auto it = certificate_state_map_.find(cert_name);
317 if (
it == certificate_state_map_.end()) {
318 it = certificate_state_map_
320 absl::make_unique<ClusterCertificateState>(
this))
323 it->second->UpdateIdentityCertNameAndDistributor(
324 cert_name, identity_cert_name, identity_cert_distributor);
326 if (
it->second->IsSafeToRemove()) certificate_state_map_.erase(
it);
332 auto it = certificate_state_map_.find(cert_name);
333 if (
it == certificate_state_map_.end())
return false;
334 return it->second->require_client_certificate();
338 const std::string& cert_name,
bool require_client_certificate) {
340 auto it = certificate_state_map_.find(cert_name);
341 if (
it == certificate_state_map_.end())
return;
342 it->second->set_require_client_certificate(require_client_certificate);
348 auto it = san_matcher_map_.find(
cluster);
349 if (
it == san_matcher_map_.end())
return {};
357 san_matcher_map_.erase(
cluster);
364 bool root_being_watched,
365 bool identity_being_watched) {
367 auto it = certificate_state_map_.find(cert_name);
368 if (
it == certificate_state_map_.end()) {
369 it = certificate_state_map_
371 absl::make_unique<ClusterCertificateState>(
this))
374 it->second->WatchStatusCallback(cert_name, root_being_watched,
375 identity_being_watched);
377 if (
it->second->IsSafeToRemove()) certificate_state_map_.erase(
it);
382 void* XdsCertificateProviderArgCopy(
void* p) {
385 return xds_certificate_provider->
Ref().
release();
388 void XdsCertificateProviderArgDestroy(
void* p) {
389 XdsCertificateProvider* xds_certificate_provider =
390 static_cast<XdsCertificateProvider*
>(p);
391 xds_certificate_provider->
Unref();
394 int XdsCertificateProviderArgCmp(
void* p,
void* q) {
399 XdsCertificateProviderArgCopy, XdsCertificateProviderArgDestroy,
400 XdsCertificateProviderArgCmp};
413 grpc_channel_args_find_pointer<XdsCertificateProvider>(
415 return xds_certificate_provider !=
nullptr ? xds_certificate_provider->
Ref()