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,211 @@
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_MATCHERS_H
16
+ #define GRPC_CORE_LIB_SECURITY_AUTHORIZATION_MATCHERS_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <memory>
21
+
22
+ #include "src/core/lib/matchers/matchers.h"
23
+ #include "src/core/lib/security/authorization/evaluate_args.h"
24
+ #include "src/core/lib/security/authorization/rbac_policy.h"
25
+
26
+ namespace grpc_core {
27
+
28
+ // Describes the rules for matching permission or principal.
29
+ class AuthorizationMatcher {
30
+ public:
31
+ virtual ~AuthorizationMatcher() = default;
32
+
33
+ // Returns whether or not the permission/principal matches the rules of the
34
+ // matcher.
35
+ virtual bool Matches(const EvaluateArgs& args) const = 0;
36
+
37
+ // Creates an instance of a matcher based off the rules defined in Permission
38
+ // config.
39
+ static std::unique_ptr<AuthorizationMatcher> Create(
40
+ Rbac::Permission permission);
41
+
42
+ // Creates an instance of a matcher based off the rules defined in Principal
43
+ // config.
44
+ static std::unique_ptr<AuthorizationMatcher> Create(
45
+ Rbac::Principal principal);
46
+ };
47
+
48
+ class AlwaysAuthorizationMatcher : public AuthorizationMatcher {
49
+ public:
50
+ explicit AlwaysAuthorizationMatcher() = default;
51
+
52
+ bool Matches(const EvaluateArgs&) const override { return true; }
53
+ };
54
+
55
+ class AndAuthorizationMatcher : public AuthorizationMatcher {
56
+ public:
57
+ explicit AndAuthorizationMatcher(
58
+ std::vector<std::unique_ptr<AuthorizationMatcher>> matchers)
59
+ : matchers_(std::move(matchers)) {}
60
+
61
+ bool Matches(const EvaluateArgs& args) const override;
62
+
63
+ private:
64
+ std::vector<std::unique_ptr<AuthorizationMatcher>> matchers_;
65
+ };
66
+
67
+ class OrAuthorizationMatcher : public AuthorizationMatcher {
68
+ public:
69
+ explicit OrAuthorizationMatcher(
70
+ std::vector<std::unique_ptr<AuthorizationMatcher>> matchers)
71
+ : matchers_(std::move(matchers)) {}
72
+
73
+ bool Matches(const EvaluateArgs& args) const override;
74
+
75
+ private:
76
+ std::vector<std::unique_ptr<AuthorizationMatcher>> matchers_;
77
+ };
78
+
79
+ // Negates matching the provided permission/principal.
80
+ class NotAuthorizationMatcher : public AuthorizationMatcher {
81
+ public:
82
+ explicit NotAuthorizationMatcher(
83
+ std::unique_ptr<AuthorizationMatcher> matcher)
84
+ : matcher_(std::move(matcher)) {}
85
+
86
+ bool Matches(const EvaluateArgs& args) const override;
87
+
88
+ private:
89
+ std::unique_ptr<AuthorizationMatcher> matcher_;
90
+ };
91
+
92
+ class MetadataAuthorizationMatcher : public AuthorizationMatcher {
93
+ public:
94
+ explicit MetadataAuthorizationMatcher(bool invert) : invert_(invert) {}
95
+
96
+ // In RBAC, metadata refers to the Envoy metadata which has no relation to
97
+ // gRPC metadata. Envoy metadata is a generic state shared between filters,
98
+ // which has no gRPC equivalent. RBAC implementations in gRPC will treat Envoy
99
+ // metadata as an empty map. Since ValueMatcher can only match if a value is
100
+ // present (even NullMatch), the metadata matcher will not match unless invert
101
+ // is set to true.
102
+ bool Matches(const EvaluateArgs&) const override { return invert_; }
103
+
104
+ private:
105
+ const bool invert_;
106
+ };
107
+
108
+ // Perform a match against HTTP headers.
109
+ class HeaderAuthorizationMatcher : public AuthorizationMatcher {
110
+ public:
111
+ explicit HeaderAuthorizationMatcher(HeaderMatcher matcher)
112
+ : matcher_(std::move(matcher)) {}
113
+
114
+ bool Matches(const EvaluateArgs& args) const override;
115
+
116
+ private:
117
+ const HeaderMatcher matcher_;
118
+ };
119
+
120
+ // Perform a match against IP Cidr Range.
121
+ class IpAuthorizationMatcher : public AuthorizationMatcher {
122
+ public:
123
+ enum class Type {
124
+ kDestIp,
125
+ kSourceIp,
126
+ kDirectRemoteIp,
127
+ kRemoteIp,
128
+ };
129
+
130
+ IpAuthorizationMatcher(Type type, Rbac::CidrRange range);
131
+
132
+ bool Matches(const EvaluateArgs& args) const override;
133
+
134
+ private:
135
+ const Type type_;
136
+ // Subnet masked address.
137
+ grpc_resolved_address subnet_address_;
138
+ const uint32_t prefix_len_;
139
+ };
140
+
141
+ // Perform a match against port number of the destination (local) address.
142
+ class PortAuthorizationMatcher : public AuthorizationMatcher {
143
+ public:
144
+ explicit PortAuthorizationMatcher(int port) : port_(port) {}
145
+
146
+ bool Matches(const EvaluateArgs& args) const override;
147
+
148
+ private:
149
+ const int port_;
150
+ };
151
+
152
+ // Matches the principal name as described in the peer certificate. Uses URI SAN
153
+ // or DNS SAN in that order, otherwise uses subject field.
154
+ class AuthenticatedAuthorizationMatcher : public AuthorizationMatcher {
155
+ public:
156
+ explicit AuthenticatedAuthorizationMatcher(StringMatcher auth)
157
+ : matcher_(std::move(auth)) {}
158
+
159
+ bool Matches(const EvaluateArgs& args) const override;
160
+
161
+ private:
162
+ const StringMatcher matcher_;
163
+ };
164
+
165
+ // Perform a match against the request server from the client's connection
166
+ // request. This is typically TLS SNI. Currently unsupported.
167
+ class ReqServerNameAuthorizationMatcher : public AuthorizationMatcher {
168
+ public:
169
+ explicit ReqServerNameAuthorizationMatcher(
170
+ StringMatcher requested_server_name)
171
+ : matcher_(std::move(requested_server_name)) {}
172
+
173
+ bool Matches(const EvaluateArgs&) const override;
174
+
175
+ private:
176
+ const StringMatcher matcher_;
177
+ };
178
+
179
+ // Perform a match against the path header of HTTP request.
180
+ class PathAuthorizationMatcher : public AuthorizationMatcher {
181
+ public:
182
+ explicit PathAuthorizationMatcher(StringMatcher path)
183
+ : matcher_(std::move(path)) {}
184
+
185
+ bool Matches(const EvaluateArgs& args) const override;
186
+
187
+ private:
188
+ const StringMatcher matcher_;
189
+ };
190
+
191
+ // Performs a match for policy field in RBAC, which is a collection of
192
+ // permission and principal matchers. Policy matches iff, we find a match in one
193
+ // of its permissions and a match in one of its principals.
194
+ class PolicyAuthorizationMatcher : public AuthorizationMatcher {
195
+ public:
196
+ explicit PolicyAuthorizationMatcher(Rbac::Policy policy)
197
+ : permissions_(
198
+ AuthorizationMatcher::Create(std::move(policy.permissions))),
199
+ principals_(
200
+ AuthorizationMatcher::Create(std::move(policy.principals))) {}
201
+
202
+ bool Matches(const EvaluateArgs& args) const override;
203
+
204
+ private:
205
+ std::unique_ptr<AuthorizationMatcher> permissions_;
206
+ std::unique_ptr<AuthorizationMatcher> principals_;
207
+ };
208
+
209
+ } // namespace grpc_core
210
+
211
+ #endif // GRPC_CORE_LIB_SECURITY_AUTHORIZATION_MATCHERS_H
@@ -0,0 +1,442 @@
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/rbac_policy.h"
18
+
19
+ #include "absl/strings/str_format.h"
20
+ #include "absl/strings/str_join.h"
21
+
22
+ namespace grpc_core {
23
+
24
+ //
25
+ // Rbac
26
+ //
27
+
28
+ Rbac::Rbac(Rbac::Action action, std::map<std::string, Policy> policies)
29
+ : action(action), policies(std::move(policies)) {}
30
+
31
+ Rbac::Rbac(Rbac&& other) noexcept
32
+ : action(other.action), policies(std::move(other.policies)) {}
33
+
34
+ Rbac& Rbac::operator=(Rbac&& other) noexcept {
35
+ action = other.action;
36
+ policies = std::move(other.policies);
37
+ return *this;
38
+ }
39
+
40
+ std::string Rbac::ToString() const {
41
+ std::vector<std::string> contents;
42
+ contents.push_back(absl::StrFormat(
43
+ "Rbac action=%s{", action == Rbac::Action::kAllow ? "Allow" : "Deny"));
44
+ for (const auto& p : policies) {
45
+ contents.push_back(absl::StrFormat("{\n policy_name=%s\n%s\n}", p.first,
46
+ p.second.ToString()));
47
+ }
48
+ contents.push_back("}");
49
+ return absl::StrJoin(contents, "\n");
50
+ }
51
+
52
+ //
53
+ // CidrRange
54
+ //
55
+
56
+ Rbac::CidrRange::CidrRange(std::string address_prefix, uint32_t prefix_len)
57
+ : address_prefix(std::move(address_prefix)), prefix_len(prefix_len) {}
58
+
59
+ Rbac::CidrRange::CidrRange(Rbac::CidrRange&& other) noexcept
60
+ : address_prefix(std::move(other.address_prefix)),
61
+ prefix_len(other.prefix_len) {}
62
+
63
+ Rbac::CidrRange& Rbac::CidrRange::operator=(Rbac::CidrRange&& other) noexcept {
64
+ address_prefix = std::move(other.address_prefix);
65
+ prefix_len = other.prefix_len;
66
+ return *this;
67
+ }
68
+
69
+ std::string Rbac::CidrRange::ToString() const {
70
+ return absl::StrFormat("CidrRange{address_prefix=%s,prefix_len=%d}",
71
+ address_prefix, prefix_len);
72
+ }
73
+
74
+ //
75
+ // Permission
76
+ //
77
+
78
+ Rbac::Permission Rbac::Permission::MakeAndPermission(
79
+ std::vector<std::unique_ptr<Permission>> permissions) {
80
+ Permission permission;
81
+ permission.type = Permission::RuleType::kAnd;
82
+ permission.permissions = std::move(permissions);
83
+ return permission;
84
+ }
85
+
86
+ Rbac::Permission Rbac::Permission::MakeOrPermission(
87
+ std::vector<std::unique_ptr<Permission>> permissions) {
88
+ Permission permission;
89
+ permission.type = Permission::RuleType::kOr;
90
+ permission.permissions = std::move(permissions);
91
+ return permission;
92
+ }
93
+
94
+ Rbac::Permission Rbac::Permission::MakeNotPermission(Permission permission) {
95
+ Permission not_permission;
96
+ not_permission.type = Permission::RuleType::kNot;
97
+ not_permission.permissions.push_back(
98
+ absl::make_unique<Rbac::Permission>(std::move(permission)));
99
+ return not_permission;
100
+ }
101
+
102
+ Rbac::Permission Rbac::Permission::MakeAnyPermission() {
103
+ Permission permission;
104
+ permission.type = Permission::RuleType::kAny;
105
+ return permission;
106
+ }
107
+
108
+ Rbac::Permission Rbac::Permission::MakeHeaderPermission(
109
+ HeaderMatcher header_matcher) {
110
+ Permission permission;
111
+ permission.type = Permission::RuleType::kHeader;
112
+ permission.header_matcher = std::move(header_matcher);
113
+ return permission;
114
+ }
115
+
116
+ Rbac::Permission Rbac::Permission::MakePathPermission(
117
+ StringMatcher string_matcher) {
118
+ Permission permission;
119
+ permission.type = Permission::RuleType::kPath;
120
+ permission.string_matcher = std::move(string_matcher);
121
+ return permission;
122
+ }
123
+
124
+ Rbac::Permission Rbac::Permission::MakeDestIpPermission(CidrRange ip) {
125
+ Permission permission;
126
+ permission.type = Permission::RuleType::kDestIp;
127
+ permission.ip = std::move(ip);
128
+ return permission;
129
+ }
130
+
131
+ Rbac::Permission Rbac::Permission::MakeDestPortPermission(int port) {
132
+ Permission permission;
133
+ permission.type = Permission::RuleType::kDestPort;
134
+ permission.port = port;
135
+ return permission;
136
+ }
137
+
138
+ Rbac::Permission Rbac::Permission::MakeMetadataPermission(bool invert) {
139
+ Permission permission;
140
+ permission.type = Permission::RuleType::kMetadata;
141
+ permission.invert = invert;
142
+ return permission;
143
+ }
144
+
145
+ Rbac::Permission Rbac::Permission::MakeReqServerNamePermission(
146
+ StringMatcher string_matcher) {
147
+ Permission permission;
148
+ permission.type = Permission::RuleType::kReqServerName;
149
+ permission.string_matcher = std::move(string_matcher);
150
+ return permission;
151
+ }
152
+
153
+ Rbac::Permission::Permission(Rbac::Permission&& other) noexcept
154
+ : type(other.type), invert(other.invert) {
155
+ switch (type) {
156
+ case RuleType::kAnd:
157
+ case RuleType::kOr:
158
+ case RuleType::kNot:
159
+ permissions = std::move(other.permissions);
160
+ break;
161
+ case RuleType::kAny:
162
+ break;
163
+ case RuleType::kHeader:
164
+ header_matcher = std::move(other.header_matcher);
165
+ break;
166
+ case RuleType::kPath:
167
+ case RuleType::kReqServerName:
168
+ string_matcher = std::move(other.string_matcher);
169
+ break;
170
+ case RuleType::kDestIp:
171
+ ip = std::move(other.ip);
172
+ break;
173
+ default:
174
+ port = other.port;
175
+ }
176
+ }
177
+
178
+ Rbac::Permission& Rbac::Permission::operator=(
179
+ Rbac::Permission&& other) noexcept {
180
+ type = other.type;
181
+ invert = other.invert;
182
+ switch (type) {
183
+ case RuleType::kAnd:
184
+ case RuleType::kOr:
185
+ case RuleType::kNot:
186
+ permissions = std::move(other.permissions);
187
+ break;
188
+ case RuleType::kAny:
189
+ break;
190
+ case RuleType::kHeader:
191
+ header_matcher = std::move(other.header_matcher);
192
+ break;
193
+ case RuleType::kPath:
194
+ case RuleType::kReqServerName:
195
+ string_matcher = std::move(other.string_matcher);
196
+ break;
197
+ case RuleType::kDestIp:
198
+ ip = std::move(other.ip);
199
+ break;
200
+ default:
201
+ port = other.port;
202
+ }
203
+ return *this;
204
+ }
205
+
206
+ std::string Rbac::Permission::ToString() const {
207
+ switch (type) {
208
+ case RuleType::kAnd: {
209
+ std::vector<std::string> contents;
210
+ contents.reserve(permissions.size());
211
+ for (const auto& permission : permissions) {
212
+ contents.push_back(permission->ToString());
213
+ }
214
+ return absl::StrFormat("and=[%s]", absl::StrJoin(contents, ","));
215
+ }
216
+ case RuleType::kOr: {
217
+ std::vector<std::string> contents;
218
+ contents.reserve(permissions.size());
219
+ for (const auto& permission : permissions) {
220
+ contents.push_back(permission->ToString());
221
+ }
222
+ return absl::StrFormat("or=[%s]", absl::StrJoin(contents, ","));
223
+ }
224
+ case RuleType::kNot:
225
+ return absl::StrFormat("not %s", permissions[0]->ToString());
226
+ case RuleType::kAny:
227
+ return "any";
228
+ case RuleType::kHeader:
229
+ return absl::StrFormat("header=%s", header_matcher.ToString());
230
+ case RuleType::kPath:
231
+ return absl::StrFormat("path=%s", string_matcher.ToString());
232
+ case RuleType::kDestIp:
233
+ return absl::StrFormat("dest_ip=%s", ip.ToString());
234
+ case RuleType::kDestPort:
235
+ return absl::StrFormat("dest_port=%d", port);
236
+ case RuleType::kMetadata:
237
+ return absl::StrFormat("%smetadata", invert ? "invert " : "");
238
+ case RuleType::kReqServerName:
239
+ return absl::StrFormat("requested_server_name=%s",
240
+ string_matcher.ToString());
241
+ default:
242
+ return "";
243
+ }
244
+ }
245
+
246
+ //
247
+ // Principal
248
+ //
249
+
250
+ Rbac::Principal Rbac::Principal::MakeAndPrincipal(
251
+ std::vector<std::unique_ptr<Principal>> principals) {
252
+ Principal principal;
253
+ principal.type = Principal::RuleType::kAnd;
254
+ principal.principals = std::move(principals);
255
+ return principal;
256
+ }
257
+
258
+ Rbac::Principal Rbac::Principal::MakeOrPrincipal(
259
+ std::vector<std::unique_ptr<Principal>> principals) {
260
+ Principal principal;
261
+ principal.type = Principal::RuleType::kOr;
262
+ principal.principals = std::move(principals);
263
+ return principal;
264
+ }
265
+
266
+ Rbac::Principal Rbac::Principal::MakeNotPrincipal(Principal principal) {
267
+ Principal not_principal;
268
+ not_principal.type = Principal::RuleType::kNot;
269
+ not_principal.principals.push_back(
270
+ absl::make_unique<Rbac::Principal>(std::move(principal)));
271
+ return not_principal;
272
+ }
273
+
274
+ Rbac::Principal Rbac::Principal::MakeAnyPrincipal() {
275
+ Principal principal;
276
+ principal.type = Principal::RuleType::kAny;
277
+ return principal;
278
+ }
279
+
280
+ Rbac::Principal Rbac::Principal::MakeAuthenticatedPrincipal(
281
+ StringMatcher string_matcher) {
282
+ Principal principal;
283
+ principal.type = Principal::RuleType::kPrincipalName;
284
+ principal.string_matcher = std::move(string_matcher);
285
+ return principal;
286
+ }
287
+
288
+ Rbac::Principal Rbac::Principal::MakeSourceIpPrincipal(CidrRange ip) {
289
+ Principal principal;
290
+ principal.type = Principal::RuleType::kSourceIp;
291
+ principal.ip = std::move(ip);
292
+ return principal;
293
+ }
294
+
295
+ Rbac::Principal Rbac::Principal::MakeDirectRemoteIpPrincipal(CidrRange ip) {
296
+ Principal principal;
297
+ principal.type = Principal::RuleType::kDirectRemoteIp;
298
+ principal.ip = std::move(ip);
299
+ return principal;
300
+ }
301
+
302
+ Rbac::Principal Rbac::Principal::MakeRemoteIpPrincipal(CidrRange ip) {
303
+ Principal principal;
304
+ principal.type = Principal::RuleType::kRemoteIp;
305
+ principal.ip = std::move(ip);
306
+ return principal;
307
+ }
308
+
309
+ Rbac::Principal Rbac::Principal::MakeHeaderPrincipal(
310
+ HeaderMatcher header_matcher) {
311
+ Principal principal;
312
+ principal.type = Principal::RuleType::kHeader;
313
+ principal.header_matcher = std::move(header_matcher);
314
+ return principal;
315
+ }
316
+
317
+ Rbac::Principal Rbac::Principal::MakePathPrincipal(
318
+ StringMatcher string_matcher) {
319
+ Principal principal;
320
+ principal.type = Principal::RuleType::kPath;
321
+ principal.string_matcher = std::move(string_matcher);
322
+ return principal;
323
+ }
324
+
325
+ Rbac::Principal Rbac::Principal::MakeMetadataPrincipal(bool invert) {
326
+ Principal principal;
327
+ principal.type = Principal::RuleType::kMetadata;
328
+ principal.invert = invert;
329
+ return principal;
330
+ }
331
+
332
+ Rbac::Principal::Principal(Rbac::Principal&& other) noexcept
333
+ : type(other.type), invert(other.invert) {
334
+ switch (type) {
335
+ case RuleType::kAnd:
336
+ case RuleType::kOr:
337
+ case RuleType::kNot:
338
+ principals = std::move(other.principals);
339
+ break;
340
+ case RuleType::kAny:
341
+ break;
342
+ case RuleType::kHeader:
343
+ header_matcher = std::move(other.header_matcher);
344
+ break;
345
+ case RuleType::kPrincipalName:
346
+ case RuleType::kPath:
347
+ string_matcher = std::move(other.string_matcher);
348
+ break;
349
+ default:
350
+ ip = std::move(other.ip);
351
+ }
352
+ }
353
+
354
+ Rbac::Principal& Rbac::Principal::operator=(Rbac::Principal&& other) noexcept {
355
+ type = other.type;
356
+ invert = other.invert;
357
+ switch (type) {
358
+ case RuleType::kAnd:
359
+ case RuleType::kOr:
360
+ case RuleType::kNot:
361
+ principals = std::move(other.principals);
362
+ break;
363
+ case RuleType::kAny:
364
+ break;
365
+ case RuleType::kHeader:
366
+ header_matcher = std::move(other.header_matcher);
367
+ break;
368
+ case RuleType::kPrincipalName:
369
+ case RuleType::kPath:
370
+ string_matcher = std::move(other.string_matcher);
371
+ break;
372
+ default:
373
+ ip = std::move(other.ip);
374
+ }
375
+ return *this;
376
+ }
377
+
378
+ std::string Rbac::Principal::ToString() const {
379
+ switch (type) {
380
+ case RuleType::kAnd: {
381
+ std::vector<std::string> contents;
382
+ contents.reserve(principals.size());
383
+ for (const auto& principal : principals) {
384
+ contents.push_back(principal->ToString());
385
+ }
386
+ return absl::StrFormat("and=[%s]", absl::StrJoin(contents, ","));
387
+ }
388
+ case RuleType::kOr: {
389
+ std::vector<std::string> contents;
390
+ contents.reserve(principals.size());
391
+ for (const auto& principal : principals) {
392
+ contents.push_back(principal->ToString());
393
+ }
394
+ return absl::StrFormat("or=[%s]", absl::StrJoin(contents, ","));
395
+ }
396
+ case RuleType::kNot:
397
+ return absl::StrFormat("not %s", principals[0]->ToString());
398
+ case RuleType::kAny:
399
+ return "any";
400
+ case RuleType::kPrincipalName:
401
+ return absl::StrFormat("principal_name=%s", string_matcher.ToString());
402
+ case RuleType::kSourceIp:
403
+ return absl::StrFormat("source_ip=%s", ip.ToString());
404
+ case RuleType::kDirectRemoteIp:
405
+ return absl::StrFormat("direct_remote_ip=%s", ip.ToString());
406
+ case RuleType::kRemoteIp:
407
+ return absl::StrFormat("remote_ip=%s", ip.ToString());
408
+ case RuleType::kHeader:
409
+ return absl::StrFormat("header=%s", header_matcher.ToString());
410
+ case RuleType::kPath:
411
+ return absl::StrFormat("path=%s", string_matcher.ToString());
412
+ case RuleType::kMetadata:
413
+ return absl::StrFormat("%smetadata", invert ? "invert " : "");
414
+ default:
415
+ return "";
416
+ }
417
+ }
418
+
419
+ //
420
+ // Policy
421
+ //
422
+
423
+ Rbac::Policy::Policy(Permission permissions, Principal principals)
424
+ : permissions(std::move(permissions)), principals(std::move(principals)) {}
425
+
426
+ Rbac::Policy::Policy(Rbac::Policy&& other) noexcept
427
+ : permissions(std::move(other.permissions)),
428
+ principals(std::move(other.principals)) {}
429
+
430
+ Rbac::Policy& Rbac::Policy::operator=(Rbac::Policy&& other) noexcept {
431
+ permissions = std::move(other.permissions);
432
+ principals = std::move(other.principals);
433
+ return *this;
434
+ }
435
+
436
+ std::string Rbac::Policy::ToString() const {
437
+ return absl::StrFormat(
438
+ " Policy {\n Permissions{%s}\n Principals{%s}\n }",
439
+ permissions.ToString(), principals.ToString());
440
+ }
441
+
442
+ } // namespace grpc_core