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
@@ -22,8 +22,8 @@
22
22
  // Tracks the total memory allocated against it, so that future arenas can
23
23
  // pre-allocate the right amount of memory
24
24
 
25
- #ifndef GRPC_CORE_LIB_GPRPP_ARENA_H
26
- #define GRPC_CORE_LIB_GPRPP_ARENA_H
25
+ #ifndef GRPC_CORE_LIB_RESOURCE_QUOTA_ARENA_H
26
+ #define GRPC_CORE_LIB_RESOURCE_QUOTA_ARENA_H
27
27
 
28
28
  #include <grpc/support/port_platform.h>
29
29
 
@@ -38,20 +38,22 @@
38
38
  #include <grpc/support/sync.h>
39
39
 
40
40
  #include "src/core/lib/gpr/alloc.h"
41
- #include "src/core/lib/gpr/spinlock.h"
41
+ #include "src/core/lib/promise/context.h"
42
+ #include "src/core/lib/resource_quota/memory_quota.h"
42
43
 
43
44
  namespace grpc_core {
44
45
 
45
46
  class Arena {
46
47
  public:
47
48
  // Create an arena, with \a initial_size bytes in the first allocated buffer.
48
- static Arena* Create(size_t initial_size);
49
+ static Arena* Create(size_t initial_size, MemoryAllocator* memory_allocator);
49
50
 
50
51
  // Create an arena, with \a initial_size bytes in the first allocated buffer,
51
52
  // and return both a void pointer to the returned arena and a void* with the
52
53
  // first allocation.
53
- static std::pair<Arena*, void*> CreateWithAlloc(size_t initial_size,
54
- size_t alloc_size);
54
+ static std::pair<Arena*, void*> CreateWithAlloc(
55
+ size_t initial_size, size_t alloc_size,
56
+ MemoryAllocator* memory_allocator);
55
57
 
56
58
  // Destroy an arena, returning the total number of bytes allocated.
57
59
  size_t Destroy();
@@ -96,9 +98,11 @@ class Arena {
96
98
  // quick optimization (avoiding an atomic fetch-add) for the common case
97
99
  // where we wish to create an arena and then perform an immediate
98
100
  // allocation.
99
- explicit Arena(size_t initial_size, size_t initial_alloc = 0)
101
+ explicit Arena(size_t initial_size, size_t initial_alloc,
102
+ MemoryAllocator* memory_allocator)
100
103
  : total_used_(GPR_ROUND_UP_TO_ALIGNMENT_SIZE(initial_alloc)),
101
- initial_zone_size_(initial_size) {}
104
+ initial_zone_size_(initial_size),
105
+ memory_allocator_(memory_allocator) {}
102
106
 
103
107
  ~Arena();
104
108
 
@@ -107,14 +111,16 @@ class Arena {
107
111
  // Keep track of the total used size. We use this in our call sizing
108
112
  // hysteresis.
109
113
  std::atomic<size_t> total_used_{0};
114
+ std::atomic<size_t> total_allocated_{0};
110
115
  const size_t initial_zone_size_;
111
- gpr_spinlock arena_growth_spinlock_ = GPR_SPINLOCK_STATIC_INITIALIZER;
112
116
  // If the initial arena allocation wasn't enough, we allocate additional zones
113
117
  // in a reverse linked list. Each additional zone consists of (1) a pointer to
114
118
  // the zone added before this zone (null if this is the first additional zone)
115
119
  // and (2) the allocated memory. The arena itself maintains a pointer to the
116
120
  // last zone; the zone list is reverse-walked during arena destruction only.
117
- Zone* last_zone_ = nullptr;
121
+ std::atomic<Zone*> last_zone_{nullptr};
122
+ // The backing memory quota
123
+ MemoryAllocator* const memory_allocator_;
118
124
  };
119
125
 
120
126
  // Smart pointer for arenas when the final size is not required.
@@ -122,10 +128,15 @@ struct ScopedArenaDeleter {
122
128
  void operator()(Arena* arena) { arena->Destroy(); }
123
129
  };
124
130
  using ScopedArenaPtr = std::unique_ptr<Arena, ScopedArenaDeleter>;
125
- inline ScopedArenaPtr MakeScopedArena(size_t initial_size) {
126
- return ScopedArenaPtr(Arena::Create(initial_size));
131
+ inline ScopedArenaPtr MakeScopedArena(size_t initial_size,
132
+ MemoryAllocator* memory_allocator) {
133
+ return ScopedArenaPtr(Arena::Create(initial_size, memory_allocator));
127
134
  }
128
135
 
136
+ // Arenas form a context for activities
137
+ template <>
138
+ struct ContextType<Arena> {};
139
+
129
140
  } // namespace grpc_core
130
141
 
131
- #endif /* GRPC_CORE_LIB_GPRPP_ARENA_H */
142
+ #endif /* GRPC_CORE_LIB_RESOURCE_QUOTA_ARENA_H */
@@ -81,14 +81,13 @@ EvaluateArgs::PerChannelArgs::PerChannelArgs(grpc_auth_context* auth_context,
81
81
  }
82
82
 
83
83
  absl::string_view EvaluateArgs::GetPath() const {
84
- absl::string_view path;
85
- if (metadata_ != nullptr &&
86
- metadata_->legacy_index()->named.path != nullptr) {
87
- grpc_linked_mdelem* elem = metadata_->legacy_index()->named.path;
88
- const grpc_slice& val = GRPC_MDVALUE(elem->md);
89
- path = StringViewFromSlice(val);
84
+ if (metadata_ != nullptr) {
85
+ const auto* path = metadata_->get_pointer(HttpPathMetadata());
86
+ if (path != nullptr) {
87
+ return path->as_string_view();
88
+ }
90
89
  }
91
- return path;
90
+ return absl::string_view();
92
91
  }
93
92
 
94
93
  absl::string_view EvaluateArgs::GetHost() const {
@@ -101,15 +100,24 @@ absl::string_view EvaluateArgs::GetHost() const {
101
100
  return host;
102
101
  }
103
102
 
103
+ absl::string_view EvaluateArgs::GetAuthority() const {
104
+ absl::string_view authority;
105
+ if (metadata_ != nullptr) {
106
+ if (auto* authority_md = metadata_->get_pointer(HttpAuthorityMetadata())) {
107
+ authority = authority_md->as_string_view();
108
+ }
109
+ }
110
+ return authority;
111
+ }
112
+
104
113
  absl::string_view EvaluateArgs::GetMethod() const {
105
- absl::string_view method;
106
- if (metadata_ != nullptr &&
107
- metadata_->legacy_index()->named.method != nullptr) {
108
- grpc_linked_mdelem* elem = metadata_->legacy_index()->named.method;
109
- const grpc_slice& val = GRPC_MDVALUE(elem->md);
110
- method = StringViewFromSlice(val);
114
+ if (metadata_ != nullptr) {
115
+ auto method_md = metadata_->get(HttpMethodMetadata());
116
+ if (method_md.has_value()) {
117
+ return HttpMethodMetadata::Encode(*method_md).as_string_view();
118
+ }
111
119
  }
112
- return method;
120
+ return absl::string_view();
113
121
  }
114
122
 
115
123
  absl::optional<absl::string_view> EvaluateArgs::GetHeaderValue(
@@ -117,7 +125,14 @@ absl::optional<absl::string_view> EvaluateArgs::GetHeaderValue(
117
125
  if (metadata_ == nullptr) {
118
126
  return absl::nullopt;
119
127
  }
120
- return metadata_->GetValue(key, concatenated_value);
128
+ if (absl::EqualsIgnoreCase(key, "te")) {
129
+ return absl::nullopt;
130
+ }
131
+ if (absl::EqualsIgnoreCase(key, "host")) {
132
+ // Maps legacy host header to :authority.
133
+ return GetAuthority();
134
+ }
135
+ return metadata_->GetStringValue(key, concatenated_value);
121
136
  }
122
137
 
123
138
  grpc_resolved_address EvaluateArgs::GetLocalAddress() const {
@@ -58,6 +58,7 @@ class EvaluateArgs {
58
58
 
59
59
  absl::string_view GetPath() const;
60
60
  absl::string_view GetHost() const;
61
+ absl::string_view GetAuthority() const;
61
62
  absl::string_view GetMethod() const;
62
63
  // Returns metadata value(s) for the specified key.
63
64
  // If the key is not present in the batch, returns absl::nullopt.
@@ -0,0 +1,60 @@
1
+ // Copyright 2021 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/lib/security/authorization/grpc_authorization_engine.h"
18
+
19
+ namespace grpc_core {
20
+
21
+ GrpcAuthorizationEngine::GrpcAuthorizationEngine(Rbac policy)
22
+ : action_(policy.action) {
23
+ for (auto& sub_policy : policy.policies) {
24
+ Policy policy;
25
+ policy.name = sub_policy.first;
26
+ policy.matcher = absl::make_unique<PolicyAuthorizationMatcher>(
27
+ std::move(sub_policy.second));
28
+ policies_.push_back(std::move(policy));
29
+ }
30
+ }
31
+
32
+ GrpcAuthorizationEngine::GrpcAuthorizationEngine(
33
+ GrpcAuthorizationEngine&& other) noexcept
34
+ : action_(other.action_), policies_(std::move(other.policies_)) {}
35
+
36
+ GrpcAuthorizationEngine& GrpcAuthorizationEngine::operator=(
37
+ GrpcAuthorizationEngine&& other) noexcept {
38
+ action_ = other.action_;
39
+ policies_ = std::move(other.policies_);
40
+ return *this;
41
+ }
42
+
43
+ AuthorizationEngine::Decision GrpcAuthorizationEngine::Evaluate(
44
+ const EvaluateArgs& args) const {
45
+ Decision decision;
46
+ bool matches = false;
47
+ for (const auto& policy : policies_) {
48
+ if (policy.matcher->Matches(args)) {
49
+ matches = true;
50
+ decision.matching_policy_name = policy.name;
51
+ break;
52
+ }
53
+ }
54
+ decision.type = (matches == (action_ == Rbac::Action::kAllow))
55
+ ? Decision::Type::kAllow
56
+ : Decision::Type::kDeny;
57
+ return decision;
58
+ }
59
+
60
+ } // namespace grpc_core
@@ -0,0 +1,62 @@
1
+ // Copyright 2021 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_CORE_LIB_SECURITY_AUTHORIZATION_GRPC_AUTHORIZATION_ENGINE_H
16
+ #define GRPC_CORE_LIB_SECURITY_AUTHORIZATION_GRPC_AUTHORIZATION_ENGINE_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include "src/core/lib/security/authorization/authorization_engine.h"
21
+ #include "src/core/lib/security/authorization/matchers.h"
22
+ #include "src/core/lib/security/authorization/rbac_policy.h"
23
+
24
+ namespace grpc_core {
25
+
26
+ // GrpcAuthorizationEngine can be either an Allow engine or Deny engine. This
27
+ // engine makes authorization decisions to Allow or Deny incoming RPC request
28
+ // based on permission and principal configs in the provided RBAC policy and the
29
+ // engine type. This engine ignores condition field in RBAC config. It is the
30
+ // caller's responsibility to provide RBAC policies that are compatible with
31
+ // this engine.
32
+ class GrpcAuthorizationEngine : public AuthorizationEngine {
33
+ public:
34
+ // Builds GrpcAuthorizationEngine without any policies.
35
+ explicit GrpcAuthorizationEngine(Rbac::Action action) : action_(action) {}
36
+ // Builds GrpcAuthorizationEngine with allow/deny RBAC policy.
37
+ explicit GrpcAuthorizationEngine(Rbac policy);
38
+
39
+ GrpcAuthorizationEngine(GrpcAuthorizationEngine&& other) noexcept;
40
+ GrpcAuthorizationEngine& operator=(GrpcAuthorizationEngine&& other) noexcept;
41
+
42
+ Rbac::Action action() const { return action_; }
43
+
44
+ // Required only for testing purpose.
45
+ size_t num_policies() const { return policies_.size(); }
46
+
47
+ // Evaluates incoming request against RBAC policy and makes a decision to
48
+ // whether allow/deny this request.
49
+ Decision Evaluate(const EvaluateArgs& args) const override;
50
+
51
+ private:
52
+ struct Policy {
53
+ std::string name;
54
+ std::unique_ptr<AuthorizationMatcher> matcher;
55
+ };
56
+ Rbac::Action action_;
57
+ std::vector<Policy> policies_;
58
+ };
59
+
60
+ } // namespace grpc_core
61
+
62
+ #endif // GRPC_CORE_LIB_SECURITY_AUTHORIZATION_GRPC_AUTHORIZATION_ENGINE_H
@@ -0,0 +1,227 @@
1
+ // Copyright 2021 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/lib/security/authorization/matchers.h"
18
+
19
+ #include <grpc/grpc_security_constants.h>
20
+
21
+ #include "src/core/lib/address_utils/parse_address.h"
22
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
23
+
24
+ namespace grpc_core {
25
+
26
+ std::unique_ptr<AuthorizationMatcher> AuthorizationMatcher::Create(
27
+ Rbac::Permission permission) {
28
+ switch (permission.type) {
29
+ case Rbac::Permission::RuleType::kAnd: {
30
+ std::vector<std::unique_ptr<AuthorizationMatcher>> matchers;
31
+ for (const auto& rule : permission.permissions) {
32
+ matchers.push_back(AuthorizationMatcher::Create(std::move(*rule)));
33
+ }
34
+ return absl::make_unique<AndAuthorizationMatcher>(std::move(matchers));
35
+ }
36
+ case Rbac::Permission::RuleType::kOr: {
37
+ std::vector<std::unique_ptr<AuthorizationMatcher>> matchers;
38
+ for (const auto& rule : permission.permissions) {
39
+ matchers.push_back(AuthorizationMatcher::Create(std::move(*rule)));
40
+ }
41
+ return absl::make_unique<OrAuthorizationMatcher>(std::move(matchers));
42
+ }
43
+ case Rbac::Permission::RuleType::kNot:
44
+ return absl::make_unique<NotAuthorizationMatcher>(
45
+ AuthorizationMatcher::Create(std::move(*permission.permissions[0])));
46
+ case Rbac::Permission::RuleType::kAny:
47
+ return absl::make_unique<AlwaysAuthorizationMatcher>();
48
+ case Rbac::Permission::RuleType::kHeader:
49
+ return absl::make_unique<HeaderAuthorizationMatcher>(
50
+ std::move(permission.header_matcher));
51
+ case Rbac::Permission::RuleType::kPath:
52
+ return absl::make_unique<PathAuthorizationMatcher>(
53
+ std::move(permission.string_matcher));
54
+ case Rbac::Permission::RuleType::kDestIp:
55
+ return absl::make_unique<IpAuthorizationMatcher>(
56
+ IpAuthorizationMatcher::Type::kDestIp, std::move(permission.ip));
57
+ case Rbac::Permission::RuleType::kDestPort:
58
+ return absl::make_unique<PortAuthorizationMatcher>(permission.port);
59
+ case Rbac::Permission::RuleType::kMetadata:
60
+ return absl::make_unique<MetadataAuthorizationMatcher>(permission.invert);
61
+ case Rbac::Permission::RuleType::kReqServerName:
62
+ return absl::make_unique<ReqServerNameAuthorizationMatcher>(
63
+ std::move(permission.string_matcher));
64
+ }
65
+ return nullptr;
66
+ }
67
+
68
+ std::unique_ptr<AuthorizationMatcher> AuthorizationMatcher::Create(
69
+ Rbac::Principal principal) {
70
+ switch (principal.type) {
71
+ case Rbac::Principal::RuleType::kAnd: {
72
+ std::vector<std::unique_ptr<AuthorizationMatcher>> matchers;
73
+ for (const auto& id : principal.principals) {
74
+ matchers.push_back(AuthorizationMatcher::Create(std::move(*id)));
75
+ }
76
+ return absl::make_unique<AndAuthorizationMatcher>(std::move(matchers));
77
+ }
78
+ case Rbac::Principal::RuleType::kOr: {
79
+ std::vector<std::unique_ptr<AuthorizationMatcher>> matchers;
80
+ for (const auto& id : principal.principals) {
81
+ matchers.push_back(AuthorizationMatcher::Create(std::move(*id)));
82
+ }
83
+ return absl::make_unique<OrAuthorizationMatcher>(std::move(matchers));
84
+ }
85
+ case Rbac::Principal::RuleType::kNot:
86
+ return absl::make_unique<NotAuthorizationMatcher>(
87
+ AuthorizationMatcher::Create(std::move(*principal.principals[0])));
88
+ case Rbac::Principal::RuleType::kAny:
89
+ return absl::make_unique<AlwaysAuthorizationMatcher>();
90
+ case Rbac::Principal::RuleType::kPrincipalName:
91
+ return absl::make_unique<AuthenticatedAuthorizationMatcher>(
92
+ std::move(principal.string_matcher));
93
+ case Rbac::Principal::RuleType::kSourceIp:
94
+ return absl::make_unique<IpAuthorizationMatcher>(
95
+ IpAuthorizationMatcher::Type::kSourceIp, std::move(principal.ip));
96
+ case Rbac::Principal::RuleType::kDirectRemoteIp:
97
+ return absl::make_unique<IpAuthorizationMatcher>(
98
+ IpAuthorizationMatcher::Type::kDirectRemoteIp,
99
+ std::move(principal.ip));
100
+ case Rbac::Principal::RuleType::kRemoteIp:
101
+ return absl::make_unique<IpAuthorizationMatcher>(
102
+ IpAuthorizationMatcher::Type::kRemoteIp, std::move(principal.ip));
103
+ case Rbac::Principal::RuleType::kHeader:
104
+ return absl::make_unique<HeaderAuthorizationMatcher>(
105
+ std::move(principal.header_matcher));
106
+ case Rbac::Principal::RuleType::kPath:
107
+ return absl::make_unique<PathAuthorizationMatcher>(
108
+ std::move(principal.string_matcher));
109
+ case Rbac::Principal::RuleType::kMetadata:
110
+ return absl::make_unique<MetadataAuthorizationMatcher>(principal.invert);
111
+ }
112
+ return nullptr;
113
+ }
114
+
115
+ bool AndAuthorizationMatcher::Matches(const EvaluateArgs& args) const {
116
+ for (const auto& matcher : matchers_) {
117
+ if (!matcher->Matches(args)) {
118
+ return false;
119
+ }
120
+ }
121
+ return true;
122
+ }
123
+
124
+ bool OrAuthorizationMatcher::Matches(const EvaluateArgs& args) const {
125
+ for (const auto& matcher : matchers_) {
126
+ if (matcher->Matches(args)) {
127
+ return true;
128
+ }
129
+ }
130
+ return false;
131
+ }
132
+
133
+ bool NotAuthorizationMatcher::Matches(const EvaluateArgs& args) const {
134
+ return !matcher_->Matches(args);
135
+ }
136
+
137
+ bool HeaderAuthorizationMatcher::Matches(const EvaluateArgs& args) const {
138
+ std::string concatenated_value;
139
+ return matcher_.Match(
140
+ args.GetHeaderValue(matcher_.name(), &concatenated_value));
141
+ }
142
+
143
+ IpAuthorizationMatcher::IpAuthorizationMatcher(Type type, Rbac::CidrRange range)
144
+ : type_(type), prefix_len_(range.prefix_len) {
145
+ grpc_error_handle error =
146
+ grpc_string_to_sockaddr(&subnet_address_, range.address_prefix.c_str(),
147
+ /*port does not matter here*/ 0);
148
+ if (error == GRPC_ERROR_NONE) {
149
+ grpc_sockaddr_mask_bits(&subnet_address_, prefix_len_);
150
+ } else {
151
+ gpr_log(GPR_DEBUG, "CidrRange address %s is not IPv4/IPv6. Error: %s",
152
+ range.address_prefix.c_str(), grpc_error_std_string(error).c_str());
153
+ }
154
+ GRPC_ERROR_UNREF(error);
155
+ }
156
+
157
+ bool IpAuthorizationMatcher::Matches(const EvaluateArgs& args) const {
158
+ grpc_resolved_address address;
159
+ switch (type_) {
160
+ case Type::kDestIp: {
161
+ address = args.GetLocalAddress();
162
+ break;
163
+ }
164
+ case Type::kSourceIp:
165
+ case Type::kDirectRemoteIp:
166
+ case Type::kRemoteIp: {
167
+ address = args.GetPeerAddress();
168
+ break;
169
+ }
170
+ default:
171
+ return false;
172
+ }
173
+ return grpc_sockaddr_match_subnet(&address, &subnet_address_, prefix_len_);
174
+ }
175
+
176
+ bool PortAuthorizationMatcher::Matches(const EvaluateArgs& args) const {
177
+ return port_ == args.GetLocalPort();
178
+ }
179
+
180
+ bool AuthenticatedAuthorizationMatcher::Matches(
181
+ const EvaluateArgs& args) const {
182
+ if (args.GetTransportSecurityType() != GRPC_SSL_TRANSPORT_SECURITY_TYPE &&
183
+ args.GetTransportSecurityType() != GRPC_TLS_TRANSPORT_SECURITY_TYPE) {
184
+ // Connection is not authenticated.
185
+ return false;
186
+ }
187
+ if (matcher_.string_matcher().empty()) {
188
+ // Allows any authenticated user.
189
+ return true;
190
+ }
191
+ std::vector<absl::string_view> uri_sans = args.GetUriSans();
192
+ if (!uri_sans.empty()) {
193
+ for (const auto& uri : uri_sans) {
194
+ if (matcher_.Match(uri)) {
195
+ return true;
196
+ }
197
+ }
198
+ }
199
+ std::vector<absl::string_view> dns_sans = args.GetDnsSans();
200
+ if (!dns_sans.empty()) {
201
+ for (const auto& dns : dns_sans) {
202
+ if (matcher_.Match(dns)) {
203
+ return true;
204
+ }
205
+ }
206
+ }
207
+ return matcher_.Match(args.GetSubject());
208
+ }
209
+
210
+ bool ReqServerNameAuthorizationMatcher::Matches(const EvaluateArgs&) const {
211
+ // Currently we only support matching against an empty string.
212
+ return matcher_.Match("");
213
+ }
214
+
215
+ bool PathAuthorizationMatcher::Matches(const EvaluateArgs& args) const {
216
+ absl::string_view path = args.GetPath();
217
+ if (!path.empty()) {
218
+ return matcher_.Match(path);
219
+ }
220
+ return false;
221
+ }
222
+
223
+ bool PolicyAuthorizationMatcher::Matches(const EvaluateArgs& args) const {
224
+ return permissions_->Matches(args) && principals_->Matches(args);
225
+ }
226
+
227
+ } // namespace grpc_core