grpc 1.43.1 → 1.44.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -0,0 +1,563 @@
1
+ //
2
+ // Copyright 2021 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/ext/xds/xds_http_rbac_filter.h"
20
+
21
+ #include "absl/strings/str_format.h"
22
+ #include "envoy/config/core/v3/address.upb.h"
23
+ #include "envoy/config/rbac/v3/rbac.upb.h"
24
+ #include "envoy/config/route/v3/route_components.upb.h"
25
+ #include "envoy/extensions/filters/http/rbac/v3/rbac.upb.h"
26
+ #include "envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h"
27
+ #include "envoy/type/matcher/v3/metadata.upb.h"
28
+ #include "envoy/type/matcher/v3/path.upb.h"
29
+ #include "envoy/type/matcher/v3/regex.upb.h"
30
+ #include "envoy/type/matcher/v3/string.upb.h"
31
+ #include "envoy/type/v3/range.upb.h"
32
+ #include "google/protobuf/wrappers.upb.h"
33
+
34
+ #include "src/core/ext/filters/rbac/rbac_filter.h"
35
+ #include "src/core/ext/filters/rbac/rbac_service_config_parser.h"
36
+ #include "src/core/ext/xds/upb_utils.h"
37
+ #include "src/core/lib/channel/channel_args.h"
38
+
39
+ namespace grpc_core {
40
+
41
+ const char* kXdsHttpRbacFilterConfigName =
42
+ "envoy.extensions.filters.http.rbac.v3.RBAC";
43
+
44
+ const char* kXdsHttpRbacFilterConfigOverrideName =
45
+ "envoy.extensions.filters.http.rbac.v3.RBACPerRoute";
46
+
47
+ namespace {
48
+
49
+ Json ParseRegexMatcherToJson(
50
+ const envoy_type_matcher_v3_RegexMatcher* regex_matcher) {
51
+ return Json::Object(
52
+ {{"regex", UpbStringToStdString(envoy_type_matcher_v3_RegexMatcher_regex(
53
+ regex_matcher))}});
54
+ }
55
+
56
+ Json ParseInt64RangeToJson(const envoy_type_v3_Int64Range* range) {
57
+ return Json::Object{{"start", envoy_type_v3_Int64Range_start(range)},
58
+ {"end", envoy_type_v3_Int64Range_end(range)}};
59
+ }
60
+
61
+ absl::StatusOr<Json> ParseHeaderMatcherToJson(
62
+ const envoy_config_route_v3_HeaderMatcher* header) {
63
+ Json::Object header_json;
64
+ std::vector<absl::Status> error_list;
65
+ std::string name =
66
+ UpbStringToStdString(envoy_config_route_v3_HeaderMatcher_name(header));
67
+ if (name == ":scheme") {
68
+ error_list.push_back(
69
+ absl::InvalidArgumentError("':scheme' not allowed in header"));
70
+ } else if (absl::StartsWith(name, "grpc-")) {
71
+ error_list.push_back(
72
+ absl::InvalidArgumentError("'grpc-' prefixes not allowed in header"));
73
+ }
74
+ header_json.emplace("name", std::move(name));
75
+ if (envoy_config_route_v3_HeaderMatcher_has_exact_match(header)) {
76
+ header_json.emplace(
77
+ "exactMatch",
78
+ UpbStringToStdString(
79
+ envoy_config_route_v3_HeaderMatcher_exact_match(header)));
80
+ } else if (envoy_config_route_v3_HeaderMatcher_has_safe_regex_match(header)) {
81
+ header_json.emplace(
82
+ "safeRegexMatch",
83
+ ParseRegexMatcherToJson(
84
+ envoy_config_route_v3_HeaderMatcher_safe_regex_match(header)));
85
+ } else if (envoy_config_route_v3_HeaderMatcher_has_range_match(header)) {
86
+ header_json.emplace(
87
+ "rangeMatch",
88
+ ParseInt64RangeToJson(
89
+ envoy_config_route_v3_HeaderMatcher_range_match(header)));
90
+ } else if (envoy_config_route_v3_HeaderMatcher_has_present_match(header)) {
91
+ header_json.emplace(
92
+ "presentMatch",
93
+ envoy_config_route_v3_HeaderMatcher_present_match(header));
94
+ } else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
95
+ header_json.emplace(
96
+ "prefixMatch",
97
+ UpbStringToStdString(
98
+ envoy_config_route_v3_HeaderMatcher_prefix_match(header)));
99
+ } else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
100
+ header_json.emplace(
101
+ "suffixMatch",
102
+ UpbStringToStdString(
103
+ envoy_config_route_v3_HeaderMatcher_suffix_match(header)));
104
+ } else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
105
+ header_json.emplace(
106
+ "containsMatch",
107
+ UpbStringToStdString(
108
+ envoy_config_route_v3_HeaderMatcher_contains_match(header)));
109
+ } else {
110
+ error_list.push_back(
111
+ absl::InvalidArgumentError("Invalid route header matcher specified."));
112
+ }
113
+ if (!error_list.empty()) {
114
+ return StatusCreate(absl::StatusCode::kInvalidArgument,
115
+ "Error parsing HeaderMatcher", DEBUG_LOCATION,
116
+ std::move(error_list));
117
+ }
118
+ header_json.emplace("invertMatch",
119
+ envoy_config_route_v3_HeaderMatcher_invert_match(header));
120
+ return header_json;
121
+ }
122
+
123
+ absl::StatusOr<Json> ParseStringMatcherToJson(
124
+ const envoy_type_matcher_v3_StringMatcher* matcher) {
125
+ Json::Object json;
126
+ if (envoy_type_matcher_v3_StringMatcher_has_exact(matcher)) {
127
+ json.emplace("exact",
128
+ UpbStringToStdString(
129
+ envoy_type_matcher_v3_StringMatcher_exact(matcher)));
130
+ } else if (envoy_type_matcher_v3_StringMatcher_has_prefix(matcher)) {
131
+ json.emplace("prefix",
132
+ UpbStringToStdString(
133
+ envoy_type_matcher_v3_StringMatcher_prefix(matcher)));
134
+ } else if (envoy_type_matcher_v3_StringMatcher_has_suffix(matcher)) {
135
+ json.emplace("suffix",
136
+ UpbStringToStdString(
137
+ envoy_type_matcher_v3_StringMatcher_suffix(matcher)));
138
+ } else if (envoy_type_matcher_v3_StringMatcher_has_safe_regex(matcher)) {
139
+ json.emplace("safeRegex",
140
+ ParseRegexMatcherToJson(
141
+ envoy_type_matcher_v3_StringMatcher_safe_regex(matcher)));
142
+ } else if (envoy_type_matcher_v3_StringMatcher_has_contains(matcher)) {
143
+ json.emplace("contains",
144
+ UpbStringToStdString(
145
+ envoy_type_matcher_v3_StringMatcher_contains(matcher)));
146
+ } else {
147
+ return absl::InvalidArgumentError("StringMatcher: Invalid match pattern");
148
+ }
149
+ json.emplace("ignoreCase",
150
+ envoy_type_matcher_v3_StringMatcher_ignore_case(matcher));
151
+ return json;
152
+ }
153
+
154
+ absl::StatusOr<Json> ParsePathMatcherToJson(
155
+ const envoy_type_matcher_v3_PathMatcher* matcher) {
156
+ const auto* path = envoy_type_matcher_v3_PathMatcher_path(matcher);
157
+ if (path == nullptr) {
158
+ return absl::InvalidArgumentError("PathMatcher has empty path");
159
+ }
160
+ Json::Object json;
161
+ auto path_json = ParseStringMatcherToJson(path);
162
+ if (!path_json.ok()) {
163
+ return path_json;
164
+ }
165
+ json.emplace("path", std::move(*path_json));
166
+ return json;
167
+ }
168
+
169
+ Json ParseUInt32ValueToJson(const google_protobuf_UInt32Value* value) {
170
+ return Json::Object{{"value", google_protobuf_UInt32Value_value(value)}};
171
+ }
172
+
173
+ Json ParseCidrRangeToJson(const envoy_config_core_v3_CidrRange* range) {
174
+ Json::Object json;
175
+ json.emplace("addressPrefix",
176
+ UpbStringToStdString(
177
+ envoy_config_core_v3_CidrRange_address_prefix(range)));
178
+ const auto* prefix_len = envoy_config_core_v3_CidrRange_prefix_len(range);
179
+ if (prefix_len != nullptr) {
180
+ json.emplace("prefixLen", ParseUInt32ValueToJson(prefix_len));
181
+ }
182
+ return json;
183
+ }
184
+
185
+ Json ParseMetadataMatcherToJson(
186
+ const envoy_type_matcher_v3_MetadataMatcher* metadata_matcher) {
187
+ Json::Object json;
188
+ // The fields "filter", "path" and "value" are irrelevant to gRPC as per
189
+ // https://github.com/grpc/proposal/blob/master/A41-xds-rbac.md and are not
190
+ // being parsed.
191
+ json.emplace("invert",
192
+ envoy_type_matcher_v3_MetadataMatcher_invert(metadata_matcher));
193
+ return json;
194
+ }
195
+
196
+ absl::StatusOr<Json> ParsePermissionToJson(
197
+ const envoy_config_rbac_v3_Permission* permission) {
198
+ Json::Object permission_json;
199
+ // Helper function to parse Permission::Set to JSON. Used by `and_rules` and
200
+ // `or_rules`.
201
+ auto parse_permission_set_to_json =
202
+ [](const envoy_config_rbac_v3_Permission_Set* set)
203
+ -> absl::StatusOr<Json> {
204
+ std::vector<absl::Status> error_list;
205
+ Json::Array rules_json;
206
+ size_t size;
207
+ const envoy_config_rbac_v3_Permission* const* rules =
208
+ envoy_config_rbac_v3_Permission_Set_rules(set, &size);
209
+ for (size_t i = 0; i < size; ++i) {
210
+ auto permission_json = ParsePermissionToJson(rules[i]);
211
+ if (!permission_json.ok()) {
212
+ error_list.push_back(permission_json.status());
213
+ } else {
214
+ rules_json.emplace_back(std::move(*permission_json));
215
+ }
216
+ }
217
+ if (!error_list.empty()) {
218
+ return StatusCreate(absl::StatusCode::kInvalidArgument,
219
+ "Error parsing Set", DEBUG_LOCATION,
220
+ std::move(error_list));
221
+ }
222
+ return Json::Object({{"rules", std::move(rules_json)}});
223
+ };
224
+ if (envoy_config_rbac_v3_Permission_has_and_rules(permission)) {
225
+ const auto* and_rules =
226
+ envoy_config_rbac_v3_Permission_and_rules(permission);
227
+ auto permission_set_json = parse_permission_set_to_json(and_rules);
228
+ if (!permission_set_json.ok()) {
229
+ return permission_set_json;
230
+ }
231
+ permission_json.emplace("andRules", std::move(*permission_set_json));
232
+ } else if (envoy_config_rbac_v3_Permission_has_or_rules(permission)) {
233
+ const auto* or_rules = envoy_config_rbac_v3_Permission_or_rules(permission);
234
+ auto permission_set_json = parse_permission_set_to_json(or_rules);
235
+ if (!permission_set_json.ok()) {
236
+ return permission_set_json;
237
+ }
238
+ permission_json.emplace("orRules", std::move(*permission_set_json));
239
+ } else if (envoy_config_rbac_v3_Permission_has_any(permission)) {
240
+ permission_json.emplace("any",
241
+ envoy_config_rbac_v3_Permission_any(permission));
242
+ } else if (envoy_config_rbac_v3_Permission_has_header(permission)) {
243
+ auto header_json = ParseHeaderMatcherToJson(
244
+ envoy_config_rbac_v3_Permission_header(permission));
245
+ if (!header_json.ok()) {
246
+ return header_json;
247
+ }
248
+ permission_json.emplace("header", std::move(*header_json));
249
+ } else if (envoy_config_rbac_v3_Permission_has_url_path(permission)) {
250
+ auto url_path_json = ParsePathMatcherToJson(
251
+ envoy_config_rbac_v3_Permission_url_path(permission));
252
+ if (!url_path_json.ok()) {
253
+ return url_path_json;
254
+ }
255
+ permission_json.emplace("urlPath", std::move(*url_path_json));
256
+ } else if (envoy_config_rbac_v3_Permission_has_destination_ip(permission)) {
257
+ permission_json.emplace(
258
+ "destinationIp",
259
+ ParseCidrRangeToJson(
260
+ envoy_config_rbac_v3_Permission_destination_ip(permission)));
261
+ } else if (envoy_config_rbac_v3_Permission_has_destination_port(permission)) {
262
+ permission_json.emplace(
263
+ "destinationPort",
264
+ envoy_config_rbac_v3_Permission_destination_port(permission));
265
+ } else if (envoy_config_rbac_v3_Permission_has_metadata(permission)) {
266
+ permission_json.emplace(
267
+ "metadata", ParseMetadataMatcherToJson(
268
+ envoy_config_rbac_v3_Permission_metadata(permission)));
269
+ } else if (envoy_config_rbac_v3_Permission_has_not_rule(permission)) {
270
+ auto not_rule_json = ParsePermissionToJson(
271
+ envoy_config_rbac_v3_Permission_not_rule(permission));
272
+ if (!not_rule_json.ok()) {
273
+ return not_rule_json;
274
+ }
275
+ permission_json.emplace("notRule", std::move(*not_rule_json));
276
+ } else if (envoy_config_rbac_v3_Permission_has_requested_server_name(
277
+ permission)) {
278
+ auto requested_server_name_json = ParseStringMatcherToJson(
279
+ envoy_config_rbac_v3_Permission_requested_server_name(permission));
280
+ if (!requested_server_name_json.ok()) {
281
+ return requested_server_name_json;
282
+ }
283
+ permission_json.emplace("requestedServerName",
284
+ std::move(*requested_server_name_json));
285
+ } else {
286
+ return absl::InvalidArgumentError("Permission: Invalid rule");
287
+ }
288
+ return permission_json;
289
+ }
290
+
291
+ absl::StatusOr<Json> ParsePrincipalToJson(
292
+ const envoy_config_rbac_v3_Principal* principal) {
293
+ Json::Object principal_json;
294
+ // Helper function to parse Principal::Set to JSON. Used by `and_ids` and
295
+ // `or_ids`.
296
+ auto parse_principal_set_to_json =
297
+ [](const envoy_config_rbac_v3_Principal_Set* set)
298
+ -> absl::StatusOr<Json> {
299
+ Json::Object json;
300
+ std::vector<absl::Status> error_list;
301
+ Json::Array ids_json;
302
+ size_t size;
303
+ const envoy_config_rbac_v3_Principal* const* ids =
304
+ envoy_config_rbac_v3_Principal_Set_ids(set, &size);
305
+ for (size_t i = 0; i < size; ++i) {
306
+ auto principal_json = ParsePrincipalToJson(ids[i]);
307
+ if (!principal_json.ok()) {
308
+ error_list.push_back(principal_json.status());
309
+ } else {
310
+ ids_json.emplace_back(std::move(*principal_json));
311
+ }
312
+ }
313
+ if (!error_list.empty()) {
314
+ return StatusCreate(absl::StatusCode::kInvalidArgument,
315
+ "Error parsing Set", DEBUG_LOCATION,
316
+ std::move(error_list));
317
+ }
318
+ return Json::Object({{"ids", std::move(ids_json)}});
319
+ };
320
+ if (envoy_config_rbac_v3_Principal_has_and_ids(principal)) {
321
+ const auto* and_rules = envoy_config_rbac_v3_Principal_and_ids(principal);
322
+ auto principal_set_json = parse_principal_set_to_json(and_rules);
323
+ if (!principal_set_json.ok()) {
324
+ return principal_set_json;
325
+ }
326
+ principal_json.emplace("andIds", std::move(*principal_set_json));
327
+ } else if (envoy_config_rbac_v3_Principal_has_or_ids(principal)) {
328
+ const auto* or_rules = envoy_config_rbac_v3_Principal_or_ids(principal);
329
+ auto principal_set_json = parse_principal_set_to_json(or_rules);
330
+ if (!principal_set_json.ok()) {
331
+ return principal_set_json;
332
+ }
333
+ principal_json.emplace("orIds", std::move(*principal_set_json));
334
+ } else if (envoy_config_rbac_v3_Principal_has_any(principal)) {
335
+ principal_json.emplace("any",
336
+ envoy_config_rbac_v3_Principal_any(principal));
337
+ } else if (envoy_config_rbac_v3_Principal_has_authenticated(principal)) {
338
+ auto* authenticated_json =
339
+ principal_json.emplace("authenticated", Json::Object())
340
+ .first->second.mutable_object();
341
+ const auto* principal_name =
342
+ envoy_config_rbac_v3_Principal_Authenticated_principal_name(
343
+ envoy_config_rbac_v3_Principal_authenticated(principal));
344
+ if (principal_name != nullptr) {
345
+ auto principal_name_json = ParseStringMatcherToJson(principal_name);
346
+ if (!principal_name_json.ok()) {
347
+ return principal_name_json;
348
+ }
349
+ authenticated_json->emplace("principalName",
350
+ std::move(*principal_name_json));
351
+ }
352
+ } else if (envoy_config_rbac_v3_Principal_has_source_ip(principal)) {
353
+ principal_json.emplace(
354
+ "sourceIp", ParseCidrRangeToJson(
355
+ envoy_config_rbac_v3_Principal_source_ip(principal)));
356
+ } else if (envoy_config_rbac_v3_Principal_has_direct_remote_ip(principal)) {
357
+ principal_json.emplace(
358
+ "directRemoteIp",
359
+ ParseCidrRangeToJson(
360
+ envoy_config_rbac_v3_Principal_direct_remote_ip(principal)));
361
+ } else if (envoy_config_rbac_v3_Principal_has_remote_ip(principal)) {
362
+ principal_json.emplace(
363
+ "remoteIp", ParseCidrRangeToJson(
364
+ envoy_config_rbac_v3_Principal_remote_ip(principal)));
365
+ } else if (envoy_config_rbac_v3_Principal_has_header(principal)) {
366
+ auto header_json = ParseHeaderMatcherToJson(
367
+ envoy_config_rbac_v3_Principal_header(principal));
368
+ if (!header_json.ok()) {
369
+ return header_json;
370
+ }
371
+ principal_json.emplace("header", std::move(*header_json));
372
+ } else if (envoy_config_rbac_v3_Principal_has_url_path(principal)) {
373
+ auto url_path_json = ParsePathMatcherToJson(
374
+ envoy_config_rbac_v3_Principal_url_path(principal));
375
+ if (!url_path_json.ok()) {
376
+ return url_path_json;
377
+ }
378
+ principal_json.emplace("urlPath", std::move(*url_path_json));
379
+ } else if (envoy_config_rbac_v3_Principal_has_metadata(principal)) {
380
+ principal_json.emplace(
381
+ "metadata", ParseMetadataMatcherToJson(
382
+ envoy_config_rbac_v3_Principal_metadata(principal)));
383
+ } else if (envoy_config_rbac_v3_Principal_has_not_id(principal)) {
384
+ auto not_id_json =
385
+ ParsePrincipalToJson(envoy_config_rbac_v3_Principal_not_id(principal));
386
+ if (!not_id_json.ok()) {
387
+ return not_id_json;
388
+ }
389
+ principal_json.emplace("notId", std::move(*not_id_json));
390
+ } else {
391
+ return absl::InvalidArgumentError("Principal: Invalid rule");
392
+ }
393
+ return principal_json;
394
+ }
395
+
396
+ absl::StatusOr<Json> ParsePolicyToJson(
397
+ const envoy_config_rbac_v3_Policy* policy) {
398
+ Json::Object policy_json;
399
+ std::vector<absl::Status> error_list;
400
+ size_t size;
401
+ Json::Array permissions_json;
402
+ const envoy_config_rbac_v3_Permission* const* permissions =
403
+ envoy_config_rbac_v3_Policy_permissions(policy, &size);
404
+ for (size_t i = 0; i < size; ++i) {
405
+ auto permission_json = ParsePermissionToJson(permissions[i]);
406
+ if (!permission_json.ok()) {
407
+ error_list.push_back(permission_json.status());
408
+ } else {
409
+ permissions_json.emplace_back(std::move(*permission_json));
410
+ }
411
+ }
412
+ policy_json.emplace("permissions", std::move(permissions_json));
413
+ Json::Array principals_json;
414
+ const envoy_config_rbac_v3_Principal* const* principals =
415
+ envoy_config_rbac_v3_Policy_principals(policy, &size);
416
+ for (size_t i = 0; i < size; ++i) {
417
+ auto principal_json = ParsePrincipalToJson(principals[i]);
418
+ if (!principal_json.ok()) {
419
+ error_list.push_back(principal_json.status());
420
+ } else {
421
+ principals_json.emplace_back(std::move(*principal_json));
422
+ }
423
+ }
424
+ policy_json.emplace("principals", std::move(principals_json));
425
+ if (envoy_config_rbac_v3_Policy_has_condition(policy)) {
426
+ error_list.push_back(
427
+ absl::InvalidArgumentError("Policy: condition not supported"));
428
+ }
429
+ if (envoy_config_rbac_v3_Policy_has_checked_condition(policy)) {
430
+ error_list.push_back(
431
+ absl::InvalidArgumentError("Policy: checked condition not supported"));
432
+ }
433
+ if (!error_list.empty()) {
434
+ return StatusCreate(absl::StatusCode::kInvalidArgument,
435
+ "Error parsing Policy", DEBUG_LOCATION,
436
+ std::move(error_list));
437
+ }
438
+ return policy_json;
439
+ }
440
+
441
+ absl::StatusOr<Json> ParseHttpRbacToJson(
442
+ const envoy_extensions_filters_http_rbac_v3_RBAC* rbac) {
443
+ Json::Object rbac_json;
444
+ std::vector<absl::Status> error_list;
445
+ const auto* rules = envoy_extensions_filters_http_rbac_v3_RBAC_rules(rbac);
446
+ if (rules != nullptr) {
447
+ int action = envoy_config_rbac_v3_RBAC_action(rules);
448
+ // Treat Log action as RBAC being absent
449
+ if (action == envoy_config_rbac_v3_RBAC_LOG) {
450
+ return rbac_json;
451
+ }
452
+ Json::Object inner_rbac_json;
453
+ inner_rbac_json.emplace("action", envoy_config_rbac_v3_RBAC_action(rules));
454
+ if (envoy_config_rbac_v3_RBAC_has_policies(rules)) {
455
+ Json::Object policies_object;
456
+ size_t iter = UPB_MAP_BEGIN;
457
+ while (true) {
458
+ auto* entry = envoy_config_rbac_v3_RBAC_policies_next(rules, &iter);
459
+ if (entry == nullptr) {
460
+ break;
461
+ }
462
+ auto policy = ParsePolicyToJson(
463
+ envoy_config_rbac_v3_RBAC_PoliciesEntry_value(entry));
464
+ if (!policy.ok()) {
465
+ error_list.push_back(StatusCreate(
466
+ absl::StatusCode::kInvalidArgument,
467
+ absl::StrFormat(
468
+ "RBAC PoliciesEntry key:%s",
469
+ UpbStringToStdString(
470
+ envoy_config_rbac_v3_RBAC_PoliciesEntry_key(entry))),
471
+ DEBUG_LOCATION, {policy.status()}));
472
+ } else {
473
+ policies_object.emplace(
474
+ UpbStringToStdString(
475
+ envoy_config_rbac_v3_RBAC_PoliciesEntry_key(entry)),
476
+ std::move(*policy));
477
+ }
478
+ }
479
+ inner_rbac_json.emplace("policies", std::move(policies_object));
480
+ }
481
+ rbac_json.emplace("rules", std::move(inner_rbac_json));
482
+ }
483
+ if (!error_list.empty()) {
484
+ return StatusCreate(absl::StatusCode::kInvalidArgument,
485
+ "Error parsing RBAC", DEBUG_LOCATION,
486
+ std::move(error_list));
487
+ }
488
+ return rbac_json;
489
+ }
490
+
491
+ } // namespace
492
+
493
+ void XdsHttpRbacFilter::PopulateSymtab(upb_symtab* symtab) const {
494
+ envoy_extensions_filters_http_rbac_v3_RBAC_getmsgdef(symtab);
495
+ }
496
+
497
+ absl::StatusOr<XdsHttpFilterImpl::FilterConfig>
498
+ XdsHttpRbacFilter::GenerateFilterConfig(upb_strview serialized_filter_config,
499
+ upb_arena* arena) const {
500
+ absl::StatusOr<Json> rbac_json;
501
+ auto* rbac = envoy_extensions_filters_http_rbac_v3_RBAC_parse(
502
+ serialized_filter_config.data, serialized_filter_config.size, arena);
503
+ if (rbac == nullptr) {
504
+ return absl::InvalidArgumentError(
505
+ "could not parse HTTP RBAC filter config");
506
+ }
507
+ rbac_json = ParseHttpRbacToJson(rbac);
508
+ if (!rbac_json.ok()) {
509
+ return rbac_json.status();
510
+ }
511
+ return FilterConfig{kXdsHttpRbacFilterConfigName, std::move(*rbac_json)};
512
+ }
513
+
514
+ absl::StatusOr<XdsHttpFilterImpl::FilterConfig>
515
+ XdsHttpRbacFilter::GenerateFilterConfigOverride(
516
+ upb_strview serialized_filter_config, upb_arena* arena) const {
517
+ auto* rbac_per_route =
518
+ envoy_extensions_filters_http_rbac_v3_RBACPerRoute_parse(
519
+ serialized_filter_config.data, serialized_filter_config.size, arena);
520
+ if (rbac_per_route == nullptr) {
521
+ return absl::InvalidArgumentError("could not parse RBACPerRoute");
522
+ }
523
+ absl::StatusOr<Json> rbac_json;
524
+ const auto* rbac =
525
+ envoy_extensions_filters_http_rbac_v3_RBACPerRoute_rbac(rbac_per_route);
526
+ if (rbac == nullptr) {
527
+ rbac_json = Json::Object();
528
+ } else {
529
+ rbac_json = ParseHttpRbacToJson(rbac);
530
+ if (!rbac_json.ok()) {
531
+ return rbac_json.status();
532
+ }
533
+ }
534
+ return FilterConfig{kXdsHttpRbacFilterConfigOverrideName,
535
+ std::move(*rbac_json)};
536
+ }
537
+
538
+ const grpc_channel_filter* XdsHttpRbacFilter::channel_filter() const {
539
+ return &RbacFilter::kFilterVtable;
540
+ }
541
+
542
+ grpc_channel_args* XdsHttpRbacFilter::ModifyChannelArgs(
543
+ grpc_channel_args* args) const {
544
+ grpc_arg arg_to_add = grpc_channel_arg_integer_create(
545
+ const_cast<char*>(GRPC_ARG_PARSE_RBAC_METHOD_CONFIG), 1);
546
+ grpc_channel_args* new_args =
547
+ grpc_channel_args_copy_and_add(args, &arg_to_add, 1);
548
+ grpc_channel_args_destroy(args);
549
+ return new_args;
550
+ }
551
+
552
+ absl::StatusOr<XdsHttpFilterImpl::ServiceConfigJsonEntry>
553
+ XdsHttpRbacFilter::GenerateServiceConfig(
554
+ const FilterConfig& hcm_filter_config,
555
+ const FilterConfig* filter_config_override) const {
556
+ Json policy_json = filter_config_override != nullptr
557
+ ? filter_config_override->config
558
+ : hcm_filter_config.config;
559
+ // The policy JSON may be empty, that's allowed.
560
+ return ServiceConfigJsonEntry{"rbacPolicy", policy_json.Dump()};
561
+ }
562
+
563
+ } // namespace grpc_core
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2021 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_CORE_EXT_XDS_XDS_HTTP_RBAC_FILTER_H
18
+ #define GRPC_CORE_EXT_XDS_XDS_HTTP_RBAC_FILTER_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include "src/core/ext/xds/xds_http_filters.h"
23
+
24
+ namespace grpc_core {
25
+
26
+ extern const char* kXdsHttpRbacFilterConfigName;
27
+ extern const char* kXdsHttpRbacFilterConfigOverrideName;
28
+
29
+ class XdsHttpRbacFilter : public XdsHttpFilterImpl {
30
+ public:
31
+ void PopulateSymtab(upb_symtab* symtab) const override;
32
+
33
+ absl::StatusOr<FilterConfig> GenerateFilterConfig(
34
+ upb_strview serialized_filter_config, upb_arena* arena) const override;
35
+
36
+ absl::StatusOr<FilterConfig> GenerateFilterConfigOverride(
37
+ upb_strview serialized_filter_config, upb_arena* arena) const override;
38
+
39
+ const grpc_channel_filter* channel_filter() const override;
40
+
41
+ grpc_channel_args* ModifyChannelArgs(grpc_channel_args* args) const override;
42
+
43
+ absl::StatusOr<ServiceConfigJsonEntry> GenerateServiceConfig(
44
+ const FilterConfig& hcm_filter_config,
45
+ const FilterConfig* filter_config_override) const override;
46
+
47
+ bool IsSupportedOnClients() const override { return false; }
48
+
49
+ bool IsSupportedOnServers() const override { return true; }
50
+ };
51
+
52
+ } // namespace grpc_core
53
+
54
+ #endif // GRPC_CORE_EXT_XDS_XDS_HTTP_RBAC_FILTER_H