grpc 1.74.0 → 1.75.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +83 -41
  3. data/include/grpc/credentials.h +7 -1
  4. data/src/core/call/client_call.cc +4 -4
  5. data/src/core/call/filter_fusion.h +1230 -0
  6. data/src/core/call/metadata.cc +22 -0
  7. data/src/core/call/metadata.h +24 -2
  8. data/src/core/channelz/channelz.cc +10 -17
  9. data/src/core/channelz/channelz.h +58 -19
  10. data/src/core/channelz/channelz_registry.cc +0 -162
  11. data/src/core/channelz/channelz_registry.h +14 -7
  12. data/src/core/channelz/property_list.cc +19 -23
  13. data/src/core/channelz/property_list.h +3 -1
  14. data/src/core/channelz/v2tov1/convert.cc +683 -0
  15. data/src/core/channelz/v2tov1/convert.h +58 -0
  16. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  17. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  18. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  19. data/src/core/channelz/v2tov1/property_list.h +52 -0
  20. data/src/core/client_channel/client_channel_filter.cc +5 -4
  21. data/src/core/client_channel/client_channel_filter.h +2 -2
  22. data/src/core/client_channel/client_channel_internal.h +2 -1
  23. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  24. data/src/core/client_channel/subchannel.cc +14 -6
  25. data/src/core/client_channel/subchannel.h +2 -0
  26. data/src/core/config/core_configuration.cc +3 -1
  27. data/src/core/config/core_configuration.h +12 -0
  28. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  29. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  30. data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
  31. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  32. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  33. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  34. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  37. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  38. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  39. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  40. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  41. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  42. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  43. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  44. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  45. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  46. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  47. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  48. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  49. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  50. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  51. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
  53. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  54. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  55. data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
  56. data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
  57. data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
  61. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  62. data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
  63. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  64. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  65. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
  66. data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
  67. data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
  68. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  69. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
  70. data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  72. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  73. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
  74. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  75. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  76. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  77. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
  78. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
  79. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
  80. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  81. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  82. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
  83. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
  84. data/src/core/filter/auth/auth_filters.h +2 -2
  85. data/src/core/filter/fused_filters.cc +154 -0
  86. data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
  87. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  88. data/src/core/handshaker/security/secure_endpoint.cc +28 -13
  89. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  90. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  91. data/src/core/lib/channel/promise_based_filter.h +6 -5
  92. data/src/core/lib/event_engine/ares_resolver.h +3 -1
  93. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
  94. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
  95. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  96. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  97. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  98. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
  99. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
  100. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
  101. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
  102. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
  103. data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
  104. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
  105. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  106. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
  107. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  108. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  109. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
  110. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
  111. data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
  112. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
  113. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  114. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
  115. data/src/core/lib/experiments/experiments.cc +120 -6
  116. data/src/core/lib/experiments/experiments.h +46 -3
  117. data/src/core/lib/iomgr/combiner.cc +1 -1
  118. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  119. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  120. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  121. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  123. data/src/core/lib/iomgr/tcp_posix.cc +3 -3
  124. data/src/core/lib/promise/activity.h +2 -2
  125. data/src/core/lib/promise/mpsc.cc +8 -8
  126. data/src/core/lib/promise/party.cc +7 -7
  127. data/src/core/lib/promise/party.h +4 -4
  128. data/src/core/lib/promise/poll.h +10 -0
  129. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  130. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  131. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  132. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  133. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  134. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  135. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  136. data/src/core/lib/surface/call.cc +5 -5
  137. data/src/core/lib/surface/call.h +6 -5
  138. data/src/core/lib/surface/completion_queue.cc +2 -4
  139. data/src/core/lib/surface/filter_stack_call.cc +1 -1
  140. data/src/core/lib/surface/version.cc +2 -2
  141. data/src/core/lib/transport/promise_endpoint.cc +2 -2
  142. data/src/core/lib/transport/promise_endpoint.h +3 -3
  143. data/src/core/load_balancing/endpoint_list.cc +29 -2
  144. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  145. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  146. data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
  147. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  148. data/src/core/net/socket_mutator.cc +19 -0
  149. data/src/core/net/socket_mutator.h +25 -0
  150. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  151. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  152. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  153. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  154. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  155. data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
  156. data/src/core/server/server.cc +1 -1
  157. data/src/core/server/server_call_tracer_filter.cc +0 -66
  158. data/src/core/server/server_call_tracer_filter.h +64 -0
  159. data/src/core/server/server_config_selector_filter.cc +1 -1
  160. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  161. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  162. data/src/core/telemetry/call_tracer.cc +20 -14
  163. data/src/core/telemetry/call_tracer.h +22 -17
  164. data/src/core/telemetry/metrics.h +8 -8
  165. data/src/core/telemetry/stats_data.cc +151 -151
  166. data/src/core/telemetry/stats_data.h +87 -87
  167. data/src/core/transport/auth_context.cc +20 -0
  168. data/src/core/transport/auth_context.h +4 -0
  169. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  170. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  171. data/src/core/tsi/ssl_transport_security.cc +202 -32
  172. data/src/core/tsi/ssl_transport_security.h +19 -10
  173. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  174. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  175. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  176. data/src/core/util/latent_see.cc +178 -146
  177. data/src/core/util/latent_see.h +245 -188
  178. data/src/core/util/single_set_ptr.h +5 -2
  179. data/src/core/util/useful.h +91 -0
  180. data/src/core/util/windows/directory_reader.cc +1 -0
  181. data/src/core/util/windows/thd.cc +1 -3
  182. data/src/core/util/work_serializer.cc +1 -1
  183. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  184. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  185. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  186. data/src/ruby/ext/grpc/rb_channel.c +15 -6
  187. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  188. data/src/ruby/lib/grpc/version.rb +1 -1
  189. data/third_party/cares/cares/include/ares.h +925 -460
  190. data/third_party/cares/cares/include/ares_dns.h +86 -71
  191. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  192. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  193. data/third_party/cares/cares/include/ares_version.h +37 -14
  194. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  195. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  196. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  197. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  198. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  199. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  200. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  201. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  202. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  203. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  204. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  205. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  206. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  207. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  208. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  209. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  210. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  211. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  212. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  213. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  214. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  215. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  216. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  217. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  218. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  219. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  220. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  221. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  222. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  223. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  224. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  225. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  226. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  227. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  228. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  229. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  230. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  231. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  232. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  233. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  234. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  235. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  236. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  237. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  238. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  239. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  240. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  241. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  242. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  243. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  244. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  245. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  246. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  247. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  248. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  249. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  250. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  251. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  252. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  253. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  254. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  255. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  256. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  257. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  258. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  259. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  260. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  261. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  262. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  263. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  264. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  265. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  266. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  267. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  268. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  269. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  270. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  271. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  272. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  273. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  274. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  275. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  276. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  277. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  278. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  279. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  280. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  281. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  282. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  283. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  284. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  285. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  286. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  287. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  288. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  289. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  290. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  291. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  292. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  293. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  294. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  295. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  296. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  297. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  298. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  299. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  300. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  301. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  302. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  303. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  304. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  305. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  306. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  307. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  308. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  309. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  310. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  311. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  312. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  313. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  314. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  315. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  316. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  317. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  318. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  319. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  320. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  321. metadata +121 -49
  322. data/src/core/util/ring_buffer.h +0 -122
  323. data/third_party/cares/cares/include/ares_rules.h +0 -125
  324. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  325. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  326. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  327. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  328. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  329. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  330. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  331. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  332. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  333. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  334. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  335. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  336. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  337. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  338. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  339. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  340. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  341. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  342. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  343. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  344. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  345. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  346. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  347. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  348. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  349. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  350. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  351. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  352. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  353. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  354. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  355. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  356. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  357. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  358. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  359. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  360. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  361. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  362. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  363. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  364. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  365. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  366. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  367. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  368. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  369. data/third_party/cares/cares/src/tools/ares_getopt.h +0 -53
@@ -31,6 +31,7 @@
31
31
  #include "absl/log/log.h"
32
32
  #include "absl/status/status.h"
33
33
  #include "absl/strings/string_view.h"
34
+ #include "src/core/credentials/transport/tls/spiffe_utils.h"
34
35
  #include "src/core/credentials/transport/tls/ssl_utils.h"
35
36
  #include "src/core/lib/debug/trace.h"
36
37
  #include "src/core/lib/iomgr/error.h"
@@ -39,26 +40,37 @@
39
40
  #include "src/core/lib/slice/slice_internal.h"
40
41
  #include "src/core/tsi/ssl_transport_security_utils.h"
41
42
  #include "src/core/util/load_file.h"
43
+ #include "src/core/util/match.h"
42
44
  #include "src/core/util/stat.h"
43
45
  #include "src/core/util/status_helper.h"
44
46
 
45
47
  namespace grpc_core {
46
48
  namespace {
47
49
 
48
- absl::Status ValidateRootCertificates(absl::string_view root_certificates) {
49
- if (root_certificates.empty()) return absl::OkStatus();
50
- absl::StatusOr<std::vector<X509*>> parsed_roots =
51
- ParsePemCertificateChain(root_certificates);
52
- if (!parsed_roots.ok()) {
53
- return absl::Status(
54
- parsed_roots.status().code(),
55
- absl::StrCat("Failed to parse root certificates as PEM: ",
56
- parsed_roots.status().message()));
57
- }
58
- for (X509* x509 : *parsed_roots) {
59
- X509_free(x509);
60
- }
61
- return absl::OkStatus();
50
+ absl::Status ValidateRootCertificates(const RootCertInfo* root_cert_info) {
51
+ if (root_cert_info == nullptr) return absl::OkStatus();
52
+ return Match(
53
+ *root_cert_info,
54
+ [&](const std::string& root_certificates) {
55
+ if (root_certificates.empty()) return absl::OkStatus();
56
+ absl::StatusOr<std::vector<X509*>> parsed_roots =
57
+ ParsePemCertificateChain(root_certificates);
58
+ if (!parsed_roots.ok()) {
59
+ return absl::Status(
60
+ parsed_roots.status().code(),
61
+ absl::StrCat("Failed to parse root certificates as PEM: ",
62
+ parsed_roots.status().message()));
63
+ }
64
+ for (X509* x509 : *parsed_roots) {
65
+ X509_free(x509);
66
+ }
67
+ return absl::OkStatus();
68
+ },
69
+ [&](const SpiffeBundleMap&) {
70
+ // SpiffeBundleMap validation is done when it is created - a value here
71
+ // inherently means that it is valid.
72
+ return absl::OkStatus();
73
+ });
62
74
  }
63
75
 
64
76
  absl::Status ValidatePemKeyCertPair(absl::string_view cert_chain,
@@ -88,23 +100,35 @@ absl::Status ValidatePemKeyCertPair(absl::string_view cert_chain,
88
100
  return absl::OkStatus();
89
101
  }
90
102
 
103
+ bool HasRootCertInfoChanged(
104
+ const absl::StatusOr<std::shared_ptr<RootCertInfo>>& old,
105
+ const absl::StatusOr<std::shared_ptr<RootCertInfo>>& updated) {
106
+ if (old.status() != updated.status()) return true; // Status changed.
107
+ if (!old.ok()) return false; // Both have same non-OK status.
108
+ // Both have OK status.
109
+ if (*old == nullptr) return *updated != nullptr;
110
+ if (*updated == nullptr) return true;
111
+ // Both have non-null value.
112
+ return **old != **updated;
113
+ }
114
+
91
115
  } // namespace
92
116
 
93
117
  StaticDataCertificateProvider::StaticDataCertificateProvider(
94
118
  std::string root_certificate, PemKeyCertPairList pem_key_cert_pairs)
95
119
  : distributor_(MakeRefCounted<grpc_tls_certificate_distributor>()),
96
- root_certificate_(std::move(root_certificate)),
120
+ root_cert_info_(std::make_shared<RootCertInfo>(root_certificate)),
97
121
  pem_key_cert_pairs_(std::move(pem_key_cert_pairs)) {
98
122
  distributor_->SetWatchStatusCallback([this](std::string cert_name,
99
123
  bool root_being_watched,
100
124
  bool identity_being_watched) {
101
125
  MutexLock lock(&mu_);
102
- std::optional<std::string> root_certificate;
126
+ std::shared_ptr<RootCertInfo> root_cert_info;
103
127
  std::optional<PemKeyCertPairList> pem_key_cert_pairs;
104
128
  StaticDataCertificateProvider::WatcherInfo& info = watcher_info_[cert_name];
105
129
  if (!info.root_being_watched && root_being_watched &&
106
- !root_certificate_.empty()) {
107
- root_certificate = root_certificate_;
130
+ !IsRootCertInfoEmpty(root_cert_info_.get())) {
131
+ root_cert_info = root_cert_info_;
108
132
  }
109
133
  info.root_being_watched = root_being_watched;
110
134
  if (!info.identity_being_watched && identity_being_watched &&
@@ -115,10 +139,10 @@ StaticDataCertificateProvider::StaticDataCertificateProvider(
115
139
  if (!info.root_being_watched && !info.identity_being_watched) {
116
140
  watcher_info_.erase(cert_name);
117
141
  }
118
- const bool root_has_update = root_certificate.has_value();
142
+ const bool root_has_update = root_cert_info != nullptr;
119
143
  const bool identity_has_update = pem_key_cert_pairs.has_value();
120
144
  if (root_has_update || identity_has_update) {
121
- distributor_->SetKeyMaterials(cert_name, std::move(root_certificate),
145
+ distributor_->SetKeyMaterials(cert_name, std::move(root_cert_info),
122
146
  std::move(pem_key_cert_pairs));
123
147
  }
124
148
  grpc_error_handle root_cert_error;
@@ -150,7 +174,7 @@ UniqueTypeName StaticDataCertificateProvider::type() const {
150
174
  }
151
175
 
152
176
  absl::Status StaticDataCertificateProvider::ValidateCredentials() const {
153
- absl::Status status = ValidateRootCertificates(root_certificate_);
177
+ absl::Status status = ValidateRootCertificates(root_cert_info_.get());
154
178
  if (!status.ok()) {
155
179
  return status;
156
180
  }
@@ -177,10 +201,12 @@ static constexpr int64_t kMinimumFileWatcherRefreshIntervalSeconds = 1;
177
201
 
178
202
  FileWatcherCertificateProvider::FileWatcherCertificateProvider(
179
203
  std::string private_key_path, std::string identity_certificate_path,
180
- std::string root_cert_path, int64_t refresh_interval_sec)
204
+ std::string root_cert_path, std::string spiffe_bundle_map_path,
205
+ int64_t refresh_interval_sec)
181
206
  : private_key_path_(std::move(private_key_path)),
182
207
  identity_certificate_path_(std::move(identity_certificate_path)),
183
208
  root_cert_path_(std::move(root_cert_path)),
209
+ spiffe_bundle_map_path_(std::move(spiffe_bundle_map_path)),
184
210
  refresh_interval_sec_(refresh_interval_sec),
185
211
  distributor_(MakeRefCounted<grpc_tls_certificate_distributor>()) {
186
212
  if (refresh_interval_sec_ < kMinimumFileWatcherRefreshIntervalSeconds) {
@@ -192,7 +218,9 @@ FileWatcherCertificateProvider::FileWatcherCertificateProvider(
192
218
  // Private key and identity cert files must be both set or both unset.
193
219
  CHECK(private_key_path_.empty() == identity_certificate_path_.empty());
194
220
  // Must be watching either root or identity certs.
195
- CHECK(!private_key_path_.empty() || !root_cert_path_.empty());
221
+ bool watching_root =
222
+ !root_cert_path_.empty() || !spiffe_bundle_map_path_.empty();
223
+ CHECK(!private_key_path_.empty() || watching_root);
196
224
  gpr_event_init(&shutdown_event_);
197
225
  ForceUpdate();
198
226
  auto thread_lambda = [](void* arg) {
@@ -216,13 +244,13 @@ FileWatcherCertificateProvider::FileWatcherCertificateProvider(
216
244
  bool root_being_watched,
217
245
  bool identity_being_watched) {
218
246
  MutexLock lock(&mu_);
219
- std::optional<std::string> root_certificate;
247
+ absl::StatusOr<std::shared_ptr<RootCertInfo>> roots = nullptr;
220
248
  std::optional<PemKeyCertPairList> pem_key_cert_pairs;
221
249
  FileWatcherCertificateProvider::WatcherInfo& info =
222
250
  watcher_info_[cert_name];
223
251
  if (!info.root_being_watched && root_being_watched &&
224
- !root_certificate_.empty()) {
225
- root_certificate = root_certificate_;
252
+ root_cert_info_.ok() && *root_cert_info_ != nullptr) {
253
+ roots = root_cert_info_;
226
254
  }
227
255
  info.root_being_watched = root_being_watched;
228
256
  if (!info.identity_being_watched && identity_being_watched &&
@@ -234,13 +262,13 @@ FileWatcherCertificateProvider::FileWatcherCertificateProvider(
234
262
  watcher_info_.erase(cert_name);
235
263
  }
236
264
  ExecCtx exec_ctx;
237
- if (root_certificate.has_value() || pem_key_cert_pairs.has_value()) {
238
- distributor_->SetKeyMaterials(cert_name, root_certificate,
265
+ if ((roots.ok() && *roots != nullptr) || pem_key_cert_pairs.has_value()) {
266
+ distributor_->SetKeyMaterials(cert_name, roots.ok() ? *roots : nullptr,
239
267
  pem_key_cert_pairs);
240
268
  }
241
269
  grpc_error_handle root_cert_error;
242
270
  grpc_error_handle identity_cert_error;
243
- if (root_being_watched && !root_certificate.has_value()) {
271
+ if (root_being_watched && (!roots.ok() || *roots == nullptr)) {
244
272
  root_cert_error =
245
273
  GRPC_ERROR_CREATE("Unable to get latest root certificates.");
246
274
  }
@@ -270,7 +298,10 @@ UniqueTypeName FileWatcherCertificateProvider::type() const {
270
298
 
271
299
  absl::Status FileWatcherCertificateProvider::ValidateCredentials() const {
272
300
  MutexLock lock(&mu_);
273
- absl::Status status = ValidateRootCertificates(root_certificate_);
301
+ if (!root_cert_info_.ok()) {
302
+ return root_cert_info_.status();
303
+ }
304
+ absl::Status status = ValidateRootCertificates(root_cert_info_->get());
274
305
  if (!status.ok()) {
275
306
  return status;
276
307
  }
@@ -285,25 +316,34 @@ absl::Status FileWatcherCertificateProvider::ValidateCredentials() const {
285
316
  }
286
317
 
287
318
  void FileWatcherCertificateProvider::ForceUpdate() {
288
- std::optional<std::string> root_certificate;
319
+ absl::StatusOr<std::shared_ptr<RootCertInfo>> root_cert_info = nullptr;
289
320
  std::optional<PemKeyCertPairList> pem_key_cert_pairs;
290
- if (!root_cert_path_.empty()) {
291
- root_certificate = ReadRootCertificatesFromFile(root_cert_path_);
321
+ if (!spiffe_bundle_map_path_.empty()) {
322
+ auto map = SpiffeBundleMap::FromFile(spiffe_bundle_map_path_);
323
+ if (map.ok()) {
324
+ root_cert_info = std::make_shared<RootCertInfo>(std::move(*map));
325
+ } else {
326
+ root_cert_info = absl::InvalidArgumentError(
327
+ absl::StrFormat("spiffe bundle map file %s failed to load: %s",
328
+ spiffe_bundle_map_path_, map.status().ToString()));
329
+ }
330
+ } else if (!root_cert_path_.empty()) {
331
+ std::optional<std::string> root_certificate =
332
+ ReadRootCertificatesFromFile(root_cert_path_);
333
+ if (root_certificate.has_value()) {
334
+ root_cert_info =
335
+ std::make_shared<RootCertInfo>(std::move(*root_certificate));
336
+ }
292
337
  }
293
338
  if (!private_key_path_.empty()) {
294
339
  pem_key_cert_pairs = ReadIdentityKeyCertPairFromFiles(
295
340
  private_key_path_, identity_certificate_path_);
296
341
  }
297
342
  MutexLock lock(&mu_);
298
- const bool root_cert_changed =
299
- (!root_certificate.has_value() && !root_certificate_.empty()) ||
300
- (root_certificate.has_value() && root_certificate_ != *root_certificate);
301
- if (root_cert_changed) {
302
- if (root_certificate.has_value()) {
303
- root_certificate_ = std::move(*root_certificate);
304
- } else {
305
- root_certificate_ = "";
306
- }
343
+ const bool root_changed =
344
+ HasRootCertInfoChanged(root_cert_info_, root_cert_info);
345
+ if (root_changed) {
346
+ root_cert_info_ = std::move(root_cert_info);
307
347
  }
308
348
  const bool identity_cert_changed =
309
349
  (!pem_key_cert_pairs.has_value() && !pem_key_cert_pairs_.empty()) ||
@@ -316,7 +356,7 @@ void FileWatcherCertificateProvider::ForceUpdate() {
316
356
  pem_key_cert_pairs_ = {};
317
357
  }
318
358
  }
319
- if (root_cert_changed || identity_cert_changed) {
359
+ if (root_changed || identity_cert_changed) {
320
360
  ExecCtx exec_ctx;
321
361
  grpc_error_handle root_cert_error =
322
362
  GRPC_ERROR_CREATE("Unable to get latest root certificates.");
@@ -325,24 +365,24 @@ void FileWatcherCertificateProvider::ForceUpdate() {
325
365
  for (const auto& p : watcher_info_) {
326
366
  const std::string& cert_name = p.first;
327
367
  const WatcherInfo& info = p.second;
328
- std::optional<std::string> root_to_report;
368
+ std::shared_ptr<RootCertInfo> root_to_report;
329
369
  std::optional<PemKeyCertPairList> identity_to_report;
330
370
  // Set key materials to the distributor if their contents changed.
331
- if (info.root_being_watched && !root_certificate_.empty() &&
332
- root_cert_changed) {
333
- root_to_report = root_certificate_;
371
+ if (info.root_being_watched && root_changed) {
372
+ root_to_report = root_cert_info_.ok() ? *root_cert_info_ : nullptr;
334
373
  }
335
374
  if (info.identity_being_watched && !pem_key_cert_pairs_.empty() &&
336
375
  identity_cert_changed) {
337
376
  identity_to_report = pem_key_cert_pairs_;
338
377
  }
339
- if (root_to_report.has_value() || identity_to_report.has_value()) {
378
+ if (root_to_report != nullptr || identity_to_report.has_value()) {
340
379
  distributor_->SetKeyMaterials(cert_name, std::move(root_to_report),
341
380
  std::move(identity_to_report));
342
381
  }
343
382
  // Report errors to the distributor if the contents are empty.
344
383
  const bool report_root_error =
345
- info.root_being_watched && root_certificate_.empty();
384
+ info.root_being_watched &&
385
+ (!root_cert_info_.ok() || *root_cert_info_ == nullptr);
346
386
  const bool report_identity_error =
347
387
  info.identity_being_watched && pem_key_cert_pairs_.empty();
348
388
  if (report_root_error || report_identity_error) {
@@ -369,9 +409,8 @@ FileWatcherCertificateProvider::ReadRootCertificatesFromFile(
369
409
  }
370
410
 
371
411
  namespace {
372
-
373
- // This helper function gets the last-modified time of |filename|. When failed,
374
- // it logs the error and returns 0.
412
+ // This helper function gets the last-modified time of |filename|. When
413
+ // failed, it logs the error and returns 0.
375
414
  time_t GetModificationTime(const char* filename) {
376
415
  time_t ts = 0;
377
416
  (void)GetFileModificationTime(filename, &ts);
@@ -473,12 +512,15 @@ grpc_tls_certificate_provider* grpc_tls_certificate_provider_static_data_create(
473
512
  grpc_tls_certificate_provider*
474
513
  grpc_tls_certificate_provider_file_watcher_create(
475
514
  const char* private_key_path, const char* identity_certificate_path,
476
- const char* root_cert_path, unsigned int refresh_interval_sec) {
515
+ const char* root_cert_path, const char* spiffe_bundle_map_path,
516
+ unsigned int refresh_interval_sec) {
477
517
  grpc_core::ExecCtx exec_ctx;
478
518
  return new grpc_core::FileWatcherCertificateProvider(
479
519
  private_key_path == nullptr ? "" : private_key_path,
480
520
  identity_certificate_path == nullptr ? "" : identity_certificate_path,
481
- root_cert_path == nullptr ? "" : root_cert_path, refresh_interval_sec);
521
+ root_cert_path == nullptr ? "" : root_cert_path,
522
+ spiffe_bundle_map_path == nullptr ? "" : spiffe_bundle_map_path,
523
+ refresh_interval_sec);
482
524
  }
483
525
 
484
526
  void grpc_tls_certificate_provider_release(
@@ -31,6 +31,7 @@
31
31
  #include "absl/status/statusor.h"
32
32
  #include "absl/strings/string_view.h"
33
33
  #include "src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h"
34
+ #include "src/core/credentials/transport/tls/spiffe_utils.h"
34
35
  #include "src/core/credentials/transport/tls/ssl_utils.h"
35
36
  #include "src/core/util/ref_counted.h"
36
37
  #include "src/core/util/ref_counted_ptr.h"
@@ -121,7 +122,7 @@ class StaticDataCertificateProvider final
121
122
  }
122
123
 
123
124
  RefCountedPtr<grpc_tls_certificate_distributor> distributor_;
124
- std::string root_certificate_;
125
+ std::shared_ptr<RootCertInfo> root_cert_info_;
125
126
  PemKeyCertPairList pem_key_cert_pairs_;
126
127
  // Guards members below.
127
128
  Mutex mu_;
@@ -137,6 +138,7 @@ class FileWatcherCertificateProvider final
137
138
  FileWatcherCertificateProvider(std::string private_key_path,
138
139
  std::string identity_certificate_path,
139
140
  std::string root_cert_path,
141
+ std::string spiffe_bundle_map_path,
140
142
  int64_t refresh_interval_sec);
141
143
 
142
144
  ~FileWatcherCertificateProvider() override;
@@ -178,6 +180,7 @@ class FileWatcherCertificateProvider final
178
180
  std::string private_key_path_;
179
181
  std::string identity_certificate_path_;
180
182
  std::string root_cert_path_;
183
+ std::string spiffe_bundle_map_path_;
181
184
  int64_t refresh_interval_sec_ = 0;
182
185
 
183
186
  RefCountedPtr<grpc_tls_certificate_distributor> distributor_;
@@ -188,8 +191,18 @@ class FileWatcherCertificateProvider final
188
191
  mutable Mutex mu_;
189
192
  // The most-recent credential data. It will be empty if the most recent read
190
193
  // attempt failed.
191
- std::string root_certificate_ ABSL_GUARDED_BY(mu_);
192
194
  PemKeyCertPairList pem_key_cert_pairs_ ABSL_GUARDED_BY(mu_);
195
+ // The most-recent root data.
196
+ // - If unset, the status will be OK and the value will be nullptr
197
+ // - If a SPIFFE Bundle Map is configured and fails to read, the status will
198
+ // be not-Ok
199
+ // - If a string root cert is configured and fails to read, the status will be
200
+ // OK with a nullptr
201
+ // - Otherwise, holds either a SpiffeBundleMap or a string root cert
202
+ // TODO(gtcooke94) - refactor the handling for string root cert files such
203
+ // that their failure is a non-ok status rather than a nullptr
204
+ absl::StatusOr<std::shared_ptr<RootCertInfo>> root_cert_info_
205
+ ABSL_GUARDED_BY(mu_) = nullptr;
193
206
  // Stores each cert_name we get from the distributor callback and its watcher
194
207
  // information.
195
208
  std::map<std::string, WatcherInfo> watcher_info_ ABSL_GUARDED_BY(mu_);