grpc 1.18.0 → 1.22.0
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.
- checksums.yaml +4 -4
- data/Makefile +4731 -7404
- data/etc/roots.pem +146 -0
- data/include/grpc/grpc.h +11 -6
- data/include/grpc/grpc_security.h +297 -4
- data/include/grpc/grpc_security_constants.h +1 -1
- data/include/grpc/impl/codegen/byte_buffer.h +13 -0
- data/include/grpc/impl/codegen/gpr_types.h +1 -1
- data/include/grpc/impl/codegen/grpc_types.h +30 -7
- data/include/grpc/impl/codegen/port_platform.h +88 -7
- data/include/grpc/impl/codegen/slice.h +2 -22
- data/include/grpc/impl/codegen/status.h +2 -1
- data/include/grpc/impl/codegen/sync_posix.h +18 -0
- data/include/grpc/slice.h +3 -3
- data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
- data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
- data/src/core/ext/filters/client_channel/client_channel.h +2 -10
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
- data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
- data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
- data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
- data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
- data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
- data/src/core/ext/filters/client_channel/resolver.cc +54 -1
- data/src/core/ext/filters/client_channel/resolver.h +52 -23
- data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
- data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
- data/src/core/ext/filters/client_channel/server_address.cc +4 -54
- data/src/core/ext/filters/client_channel/server_address.h +1 -13
- data/src/core/ext/filters/client_channel/service_config.cc +329 -0
- data/src/core/ext/filters/client_channel/service_config.h +205 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
- data/src/core/ext/filters/client_channel/subchannel.h +295 -128
- data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
- data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
- data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
- data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
- data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
- data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
- data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
- data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
- data/src/core/lib/channel/channel_args.cc +2 -101
- data/src/core/lib/channel/channel_args.h +3 -37
- data/src/core/lib/channel/channel_stack.h +10 -6
- data/src/core/lib/channel/channel_trace.cc +4 -4
- data/src/core/lib/channel/channel_trace.h +4 -4
- data/src/core/lib/channel/channelz.cc +168 -38
- data/src/core/lib/channel/channelz.h +40 -44
- data/src/core/lib/channel/channelz_registry.cc +75 -107
- data/src/core/lib/channel/channelz_registry.h +10 -28
- data/src/core/lib/channel/connected_channel.cc +2 -2
- data/src/core/lib/channel/context.h +2 -2
- data/src/core/lib/channel/handshaker.cc +151 -218
- data/src/core/lib/channel/handshaker.h +110 -101
- data/src/core/lib/channel/handshaker_factory.h +11 -19
- data/src/core/lib/channel/handshaker_registry.cc +67 -51
- data/src/core/lib/channel/handshaker_registry.h +21 -16
- data/src/core/lib/compression/algorithm_metadata.h +3 -3
- data/src/core/lib/compression/compression.cc +14 -9
- data/src/core/lib/compression/compression_args.cc +127 -0
- data/src/core/lib/compression/compression_args.h +55 -0
- data/src/core/lib/compression/compression_internal.cc +16 -12
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/compression/stream_compression.cc +3 -2
- data/src/core/lib/compression/stream_compression.h +2 -2
- data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
- data/src/core/lib/debug/trace.cc +13 -7
- data/src/core/lib/debug/trace.h +14 -1
- data/src/core/lib/gpr/arena.h +13 -9
- data/src/core/lib/gpr/cpu_posix.cc +5 -3
- data/src/core/lib/gpr/env.h +3 -6
- data/src/core/lib/gpr/env_linux.cc +6 -1
- data/src/core/lib/gpr/env_posix.cc +5 -0
- data/src/core/lib/gpr/env_windows.cc +7 -5
- data/src/core/lib/gpr/log.cc +9 -13
- data/src/core/lib/gpr/log_posix.cc +2 -1
- data/src/core/lib/gpr/string.cc +20 -7
- data/src/core/lib/gpr/string.h +10 -3
- data/src/core/lib/gpr/sync_posix.cc +65 -4
- data/src/core/lib/gpr/time.cc +8 -0
- data/src/core/lib/gpr/time_posix.cc +21 -2
- data/src/core/lib/gprpp/arena.cc +103 -0
- data/src/core/lib/gprpp/arena.h +121 -0
- data/src/core/lib/gprpp/atomic.h +75 -5
- data/src/core/lib/gprpp/fork.cc +13 -32
- data/src/core/lib/gprpp/fork.h +5 -1
- data/src/core/lib/gprpp/global_config.h +96 -0
- data/src/core/lib/gprpp/global_config_custom.h +29 -0
- data/src/core/lib/gprpp/global_config_env.cc +135 -0
- data/src/core/lib/gprpp/global_config_env.h +131 -0
- data/src/core/lib/gprpp/global_config_generic.h +44 -0
- data/src/core/lib/gprpp/inlined_vector.h +8 -0
- data/src/core/lib/gprpp/map.h +436 -0
- data/src/core/lib/gprpp/memory.h +2 -2
- data/src/core/lib/gprpp/optional.h +48 -0
- data/src/core/lib/gprpp/orphanable.h +6 -5
- data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
- data/src/core/lib/gprpp/ref_counted.h +36 -17
- data/src/core/lib/gprpp/sync.h +126 -0
- data/src/core/lib/gprpp/thd.h +42 -7
- data/src/core/lib/gprpp/thd_posix.cc +31 -13
- data/src/core/lib/gprpp/thd_windows.cc +47 -34
- data/src/core/lib/http/httpcli.cc +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +13 -15
- data/src/core/lib/http/parser.cc +3 -2
- data/src/core/lib/http/parser.h +2 -1
- data/src/core/lib/iomgr/buffer_list.cc +182 -24
- data/src/core/lib/iomgr/buffer_list.h +72 -10
- data/src/core/lib/iomgr/call_combiner.cc +84 -90
- data/src/core/lib/iomgr/call_combiner.h +75 -82
- data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
- data/src/core/lib/iomgr/cfstream_handle.h +86 -0
- data/src/core/lib/iomgr/combiner.cc +11 -3
- data/src/core/lib/iomgr/combiner.h +1 -1
- data/src/core/lib/iomgr/endpoint.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +3 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
- data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
- data/src/core/lib/iomgr/error.cc +21 -17
- data/src/core/lib/iomgr/error.h +36 -6
- data/src/core/lib/iomgr/error_cfstream.cc +52 -0
- data/src/core/lib/iomgr/error_cfstream.h +31 -0
- data/src/core/lib/iomgr/error_internal.h +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
- data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
- data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
- data/src/core/lib/iomgr/ev_posix.cc +29 -19
- data/src/core/lib/iomgr/ev_posix.h +19 -3
- data/src/core/lib/iomgr/ev_windows.cc +2 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -0
- data/src/core/lib/iomgr/exec_ctx.h +137 -8
- data/src/core/lib/iomgr/executor.cc +147 -95
- data/src/core/lib/iomgr/executor.h +55 -49
- data/src/core/lib/iomgr/fork_posix.cc +6 -5
- data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
- data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
- data/src/core/lib/iomgr/internal_errqueue.h +105 -3
- data/src/core/lib/iomgr/iomgr.cc +20 -13
- data/src/core/lib/iomgr/iomgr.h +15 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
- data/src/core/lib/iomgr/iomgr_custom.h +2 -0
- data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
- data/src/core/lib/iomgr/iomgr_internal.h +12 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
- data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
- data/src/core/lib/iomgr/lockfree_event.cc +4 -4
- data/src/core/lib/iomgr/port.h +35 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
- data/src/core/lib/iomgr/resource_quota.cc +40 -37
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
- data/src/core/lib/iomgr/socket_windows.cc +19 -0
- data/src/core/lib/iomgr/socket_windows.h +8 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
- data/src/core/lib/iomgr/tcp_custom.cc +10 -14
- data/src/core/lib/iomgr/tcp_posix.cc +256 -140
- data/src/core/lib/iomgr/tcp_server.cc +5 -0
- data/src/core/lib/iomgr/tcp_server.h +24 -0
- data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
- data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
- data/src/core/lib/iomgr/tcp_uv.cc +5 -7
- data/src/core/lib/iomgr/tcp_windows.cc +8 -14
- data/src/core/lib/iomgr/timer.h +2 -1
- data/src/core/lib/iomgr/timer_generic.cc +16 -16
- data/src/core/lib/iomgr/timer_manager.cc +20 -11
- data/src/core/lib/iomgr/udp_server.cc +8 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
- data/src/core/lib/json/json.cc +1 -4
- data/src/core/lib/profiling/basic_timers.cc +10 -4
- data/src/core/lib/security/context/security_context.cc +6 -7
- data/src/core/lib/security/context/security_context.h +3 -4
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
- data/src/core/lib/security/credentials/credentials.h +9 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/security_connector.cc +0 -1
- data/src/core/lib/security/security_connector/security_connector.h +3 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
- data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
- data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
- data/src/core/lib/security/transport/auth_filters.h +5 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
- data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
- data/src/core/lib/security/transport/security_handshaker.cc +271 -303
- data/src/core/lib/security/transport/security_handshaker.h +11 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
- data/src/core/lib/slice/b64.h +2 -2
- data/src/core/lib/slice/percent_encoding.cc +3 -3
- data/src/core/lib/slice/percent_encoding.h +3 -3
- data/src/core/lib/slice/slice.cc +174 -122
- data/src/core/lib/slice/slice_buffer.cc +54 -21
- data/src/core/lib/slice/slice_hash_table.h +4 -4
- data/src/core/lib/slice/slice_intern.cc +49 -107
- data/src/core/lib/slice/slice_internal.h +264 -3
- data/src/core/lib/slice/slice_string_helpers.cc +10 -1
- data/src/core/lib/slice/slice_string_helpers.h +3 -1
- data/src/core/lib/slice/slice_utils.h +50 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
- data/src/core/lib/surface/api_trace.h +1 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
- data/src/core/lib/surface/call.cc +67 -46
- data/src/core/lib/surface/call.h +7 -2
- data/src/core/lib/surface/call_details.cc +0 -1
- data/src/core/lib/surface/channel.cc +89 -97
- data/src/core/lib/surface/channel.h +60 -6
- data/src/core/lib/surface/channel_init.h +5 -0
- data/src/core/lib/surface/completion_queue.cc +221 -216
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/init.cc +82 -33
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.cc +1 -1
- data/src/core/lib/surface/lame_client.cc +5 -7
- data/src/core/lib/surface/server.cc +42 -47
- data/src/core/lib/surface/validate_metadata.cc +14 -8
- data/src/core/lib/surface/validate_metadata.h +13 -2
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/bdp_estimator.cc +3 -3
- data/src/core/lib/transport/bdp_estimator.h +2 -2
- data/src/core/lib/transport/connectivity_state.cc +10 -40
- data/src/core/lib/transport/connectivity_state.h +0 -8
- data/src/core/lib/transport/error_utils.cc +12 -0
- data/src/core/lib/transport/metadata.cc +258 -267
- data/src/core/lib/transport/metadata.h +227 -16
- data/src/core/lib/transport/metadata_batch.cc +1 -1
- data/src/core/lib/transport/metadata_batch.h +1 -1
- data/src/core/lib/transport/static_metadata.cc +477 -399
- data/src/core/lib/transport/static_metadata.h +273 -182
- data/src/core/lib/transport/status_metadata.cc +3 -3
- data/src/core/lib/transport/timeout_encoding.cc +1 -1
- data/src/core/lib/transport/timeout_encoding.h +1 -1
- data/src/core/lib/transport/transport.cc +39 -72
- data/src/core/lib/transport/transport.h +59 -24
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
- data/src/core/tsi/fake_transport_security.cc +4 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +12 -10
- data/src/core/tsi/ssl_transport_security.h +24 -4
- data/src/ruby/bin/math_pb.rb +18 -16
- data/src/ruby/ext/grpc/extconf.rb +12 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
- data/src/ruby/ext/grpc/rb_channel.c +14 -10
- data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
- data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
- data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc.c +23 -24
- data/src/ruby/ext/grpc/rb_grpc.h +4 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
- data/src/ruby/ext/grpc/rb_server.c +8 -4
- data/src/ruby/lib/grpc/errors.rb +22 -3
- data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
- data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +1 -1
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
- data/src/ruby/spec/errors_spec.rb +141 -0
- data/third_party/cares/cares/ares.h +12 -0
- data/third_party/cares/cares/ares_create_query.c +5 -1
- data/third_party/cares/cares/ares_data.c +74 -73
- data/third_party/cares/cares/ares_destroy.c +6 -1
- data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
- data/third_party/cares/cares/ares_gethostbyname.c +15 -4
- data/third_party/cares/cares/ares_getnameinfo.c +11 -0
- data/third_party/cares/cares/ares_init.c +274 -173
- data/third_party/cares/cares/ares_library_init.c +21 -3
- data/third_party/cares/cares/ares_options.c +6 -2
- data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
- data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
- data/third_party/cares/cares/ares_platform.c +7 -0
- data/third_party/cares/cares/ares_private.h +19 -11
- data/third_party/cares/cares/ares_process.c +27 -2
- data/third_party/cares/cares/ares_rules.h +1 -1
- data/third_party/cares/cares/ares_search.c +7 -0
- data/third_party/cares/cares/ares_send.c +6 -0
- data/third_party/cares/cares/ares_strsplit.c +174 -0
- data/third_party/cares/cares/ares_strsplit.h +43 -0
- data/third_party/cares/cares/ares_version.h +4 -4
- data/third_party/cares/cares/config-win32.h +1 -1
- data/third_party/cares/cares/inet_ntop.c +2 -3
- data/third_party/cares/config_darwin/ares_config.h +3 -0
- data/third_party/cares/config_freebsd/ares_config.h +3 -0
- data/third_party/cares/config_linux/ares_config.h +3 -0
- data/third_party/cares/config_openbsd/ares_config.h +3 -0
- metadata +83 -48
- data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
- data/src/core/ext/filters/client_channel/request_routing.h +0 -177
- data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
- data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
- data/src/core/lib/channel/handshaker_factory.cc +0 -42
- data/src/core/lib/gpr/arena.cc +0 -192
- data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
- data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
- data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
- data/src/core/lib/transport/service_config.cc +0 -106
- data/src/core/lib/transport/service_config.h +0 -249
@@ -26,15 +26,39 @@
|
|
26
26
|
#include <grpc/grpc_security.h>
|
27
27
|
#include <grpc/slice_buffer.h>
|
28
28
|
|
29
|
+
#include "src/core/lib/gprpp/global_config.h"
|
29
30
|
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
31
|
+
#include "src/core/lib/iomgr/error.h"
|
32
|
+
#include "src/core/lib/security/security_connector/security_connector.h"
|
30
33
|
#include "src/core/tsi/ssl_transport_security.h"
|
34
|
+
#include "src/core/tsi/transport_security.h"
|
31
35
|
#include "src/core/tsi/transport_security_interface.h"
|
32
36
|
|
33
|
-
|
37
|
+
GPR_GLOBAL_CONFIG_DECLARE_STRING(grpc_default_ssl_roots_file_path);
|
38
|
+
GPR_GLOBAL_CONFIG_DECLARE_BOOL(grpc_not_use_system_ssl_roots);
|
39
|
+
|
40
|
+
/* --- Util --- */
|
34
41
|
|
35
42
|
/* --- URL schemes. --- */
|
36
43
|
#define GRPC_SSL_URL_SCHEME "https"
|
37
44
|
|
45
|
+
/* Check ALPN information returned from SSL handshakes. */
|
46
|
+
grpc_error* grpc_ssl_check_alpn(const tsi_peer* peer);
|
47
|
+
|
48
|
+
/* Check peer name information returned from SSL handshakes. */
|
49
|
+
grpc_error* grpc_ssl_check_peer_name(const char* peer_name,
|
50
|
+
const tsi_peer* peer);
|
51
|
+
/* Compare targer_name information extracted from SSL security connectors. */
|
52
|
+
bool grpc_ssl_cmp_target_name(const char* target_name,
|
53
|
+
const char* other_target_name,
|
54
|
+
const char* overridden_target_name,
|
55
|
+
const char* other_overridden_target_name);
|
56
|
+
/* Check the host that will be set for a call is acceptable.*/
|
57
|
+
bool grpc_ssl_check_call_host(const char* host, const char* target_name,
|
58
|
+
const char* overridden_target_name,
|
59
|
+
grpc_auth_context* auth_context,
|
60
|
+
grpc_closure* on_call_host_checked,
|
61
|
+
grpc_error** error);
|
38
62
|
/* Return HTTP2-compliant cipher suites that gRPC accepts by default. */
|
39
63
|
const char* grpc_get_ssl_cipher_suites(void);
|
40
64
|
|
@@ -47,6 +71,18 @@ grpc_get_tsi_client_certificate_request_type(
|
|
47
71
|
/* Return an array of strings containing alpn protocols. */
|
48
72
|
const char** grpc_fill_alpn_protocol_strings(size_t* num_alpn_protocols);
|
49
73
|
|
74
|
+
/* Initialize TSI SSL server/client handshaker factory. */
|
75
|
+
grpc_security_status grpc_ssl_tsi_client_handshaker_factory_init(
|
76
|
+
tsi_ssl_pem_key_cert_pair* key_cert_pair, const char* pem_root_certs,
|
77
|
+
tsi_ssl_session_cache* ssl_session_cache,
|
78
|
+
tsi_ssl_client_handshaker_factory** handshaker_factory);
|
79
|
+
|
80
|
+
grpc_security_status grpc_ssl_tsi_server_handshaker_factory_init(
|
81
|
+
tsi_ssl_pem_key_cert_pair* key_cert_pairs, size_t num_key_cert_pairs,
|
82
|
+
const char* pem_root_certs,
|
83
|
+
grpc_ssl_client_certificate_request_type client_certificate_request,
|
84
|
+
tsi_ssl_server_handshaker_factory** handshaker_factory);
|
85
|
+
|
50
86
|
/* Exposed for testing only. */
|
51
87
|
grpc_core::RefCountedPtr<grpc_auth_context> grpc_ssl_peer_to_auth_context(
|
52
88
|
const tsi_peer* peer);
|
@@ -89,6 +125,39 @@ class DefaultSslRootStore {
|
|
89
125
|
static grpc_slice default_pem_root_certs_;
|
90
126
|
};
|
91
127
|
|
128
|
+
class PemKeyCertPair {
|
129
|
+
public:
|
130
|
+
// Construct from the C struct. We steal its members and then immediately
|
131
|
+
// free it.
|
132
|
+
explicit PemKeyCertPair(grpc_ssl_pem_key_cert_pair* pair)
|
133
|
+
: private_key_(const_cast<char*>(pair->private_key)),
|
134
|
+
cert_chain_(const_cast<char*>(pair->cert_chain)) {
|
135
|
+
gpr_free(pair);
|
136
|
+
}
|
137
|
+
|
138
|
+
// Movable.
|
139
|
+
PemKeyCertPair(PemKeyCertPair&& other) {
|
140
|
+
private_key_ = std::move(other.private_key_);
|
141
|
+
cert_chain_ = std::move(other.cert_chain_);
|
142
|
+
}
|
143
|
+
PemKeyCertPair& operator=(PemKeyCertPair&& other) {
|
144
|
+
private_key_ = std::move(other.private_key_);
|
145
|
+
cert_chain_ = std::move(other.cert_chain_);
|
146
|
+
return *this;
|
147
|
+
}
|
148
|
+
|
149
|
+
// Not copyable.
|
150
|
+
PemKeyCertPair(const PemKeyCertPair&) = delete;
|
151
|
+
PemKeyCertPair& operator=(const PemKeyCertPair&) = delete;
|
152
|
+
|
153
|
+
char* private_key() const { return private_key_.get(); }
|
154
|
+
char* cert_chain() const { return cert_chain_.get(); }
|
155
|
+
|
156
|
+
private:
|
157
|
+
grpc_core::UniquePtr<char> private_key_;
|
158
|
+
grpc_core::UniquePtr<char> cert_chain_;
|
159
|
+
};
|
160
|
+
|
92
161
|
} // namespace grpc_core
|
93
162
|
|
94
163
|
#endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_SSL_UTILS_H \
|
@@ -0,0 +1,426 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2018 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#include "src/core/lib/security/security_connector/tls/spiffe_security_connector.h"
|
22
|
+
|
23
|
+
#include <stdbool.h>
|
24
|
+
#include <string.h>
|
25
|
+
|
26
|
+
#include <grpc/grpc.h>
|
27
|
+
#include <grpc/support/alloc.h>
|
28
|
+
#include <grpc/support/log.h>
|
29
|
+
#include <grpc/support/string_util.h>
|
30
|
+
|
31
|
+
#include "src/core/lib/gpr/host_port.h"
|
32
|
+
#include "src/core/lib/security/credentials/ssl/ssl_credentials.h"
|
33
|
+
#include "src/core/lib/security/credentials/tls/spiffe_credentials.h"
|
34
|
+
#include "src/core/lib/security/security_connector/ssl_utils.h"
|
35
|
+
#include "src/core/lib/security/transport/security_handshaker.h"
|
36
|
+
#include "src/core/lib/slice/slice_internal.h"
|
37
|
+
#include "src/core/lib/transport/transport.h"
|
38
|
+
#include "src/core/tsi/ssl_transport_security.h"
|
39
|
+
#include "src/core/tsi/transport_security.h"
|
40
|
+
|
41
|
+
namespace {
|
42
|
+
|
43
|
+
tsi_ssl_pem_key_cert_pair* ConvertToTsiPemKeyCertPair(
|
44
|
+
const grpc_tls_key_materials_config::PemKeyCertPairList& cert_pair_list) {
|
45
|
+
tsi_ssl_pem_key_cert_pair* tsi_pairs = nullptr;
|
46
|
+
size_t num_key_cert_pairs = cert_pair_list.size();
|
47
|
+
if (num_key_cert_pairs > 0) {
|
48
|
+
GPR_ASSERT(cert_pair_list.data() != nullptr);
|
49
|
+
tsi_pairs = static_cast<tsi_ssl_pem_key_cert_pair*>(
|
50
|
+
gpr_zalloc(num_key_cert_pairs * sizeof(tsi_ssl_pem_key_cert_pair)));
|
51
|
+
}
|
52
|
+
for (size_t i = 0; i < num_key_cert_pairs; i++) {
|
53
|
+
GPR_ASSERT(cert_pair_list[i].private_key() != nullptr);
|
54
|
+
GPR_ASSERT(cert_pair_list[i].cert_chain() != nullptr);
|
55
|
+
tsi_pairs[i].cert_chain = gpr_strdup(cert_pair_list[i].cert_chain());
|
56
|
+
tsi_pairs[i].private_key = gpr_strdup(cert_pair_list[i].private_key());
|
57
|
+
}
|
58
|
+
return tsi_pairs;
|
59
|
+
}
|
60
|
+
|
61
|
+
/** -- Util function to populate SPIFFE server/channel credentials. -- */
|
62
|
+
grpc_core::RefCountedPtr<grpc_tls_key_materials_config>
|
63
|
+
PopulateSpiffeCredentials(const grpc_tls_credentials_options& options) {
|
64
|
+
GPR_ASSERT(options.credential_reload_config() != nullptr ||
|
65
|
+
options.key_materials_config() != nullptr);
|
66
|
+
grpc_core::RefCountedPtr<grpc_tls_key_materials_config> key_materials_config;
|
67
|
+
/* Use credential reload config to fetch credentials. */
|
68
|
+
if (options.credential_reload_config() != nullptr) {
|
69
|
+
grpc_tls_credential_reload_arg* arg =
|
70
|
+
grpc_core::New<grpc_tls_credential_reload_arg>();
|
71
|
+
key_materials_config = grpc_tls_key_materials_config_create()->Ref();
|
72
|
+
arg->key_materials_config = key_materials_config.get();
|
73
|
+
int result = options.credential_reload_config()->Schedule(arg);
|
74
|
+
if (result) {
|
75
|
+
/* Do not support async credential reload. */
|
76
|
+
gpr_log(GPR_ERROR, "Async credential reload is unsupported now.");
|
77
|
+
} else {
|
78
|
+
grpc_ssl_certificate_config_reload_status status = arg->status;
|
79
|
+
if (status == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED) {
|
80
|
+
gpr_log(GPR_DEBUG, "Credential does not change after reload.");
|
81
|
+
} else if (status == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL) {
|
82
|
+
gpr_log(GPR_ERROR, "Credential reload failed with an error: %s",
|
83
|
+
arg->error_details);
|
84
|
+
}
|
85
|
+
}
|
86
|
+
gpr_free((void*)arg->error_details);
|
87
|
+
grpc_core::Delete(arg);
|
88
|
+
/* Use existing key materials config. */
|
89
|
+
} else {
|
90
|
+
key_materials_config = options.key_materials_config()->Ref();
|
91
|
+
}
|
92
|
+
return key_materials_config;
|
93
|
+
}
|
94
|
+
|
95
|
+
} // namespace
|
96
|
+
|
97
|
+
SpiffeChannelSecurityConnector::SpiffeChannelSecurityConnector(
|
98
|
+
grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
|
99
|
+
grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
|
100
|
+
const char* target_name, const char* overridden_target_name)
|
101
|
+
: grpc_channel_security_connector(GRPC_SSL_URL_SCHEME,
|
102
|
+
std::move(channel_creds),
|
103
|
+
std::move(request_metadata_creds)),
|
104
|
+
overridden_target_name_(overridden_target_name == nullptr
|
105
|
+
? nullptr
|
106
|
+
: gpr_strdup(overridden_target_name)) {
|
107
|
+
check_arg_ = ServerAuthorizationCheckArgCreate(this);
|
108
|
+
char* port;
|
109
|
+
gpr_split_host_port(target_name, &target_name_, &port);
|
110
|
+
gpr_free(port);
|
111
|
+
}
|
112
|
+
|
113
|
+
SpiffeChannelSecurityConnector::~SpiffeChannelSecurityConnector() {
|
114
|
+
if (target_name_ != nullptr) {
|
115
|
+
gpr_free(target_name_);
|
116
|
+
}
|
117
|
+
if (overridden_target_name_ != nullptr) {
|
118
|
+
gpr_free(overridden_target_name_);
|
119
|
+
}
|
120
|
+
if (client_handshaker_factory_ != nullptr) {
|
121
|
+
tsi_ssl_client_handshaker_factory_unref(client_handshaker_factory_);
|
122
|
+
}
|
123
|
+
ServerAuthorizationCheckArgDestroy(check_arg_);
|
124
|
+
}
|
125
|
+
|
126
|
+
void SpiffeChannelSecurityConnector::add_handshakers(
|
127
|
+
grpc_pollset_set* interested_parties,
|
128
|
+
grpc_core::HandshakeManager* handshake_mgr) {
|
129
|
+
// Instantiate TSI handshaker.
|
130
|
+
tsi_handshaker* tsi_hs = nullptr;
|
131
|
+
tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker(
|
132
|
+
client_handshaker_factory_,
|
133
|
+
overridden_target_name_ != nullptr ? overridden_target_name_
|
134
|
+
: target_name_,
|
135
|
+
&tsi_hs);
|
136
|
+
if (result != TSI_OK) {
|
137
|
+
gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
|
138
|
+
tsi_result_to_string(result));
|
139
|
+
return;
|
140
|
+
}
|
141
|
+
// Create handshakers.
|
142
|
+
handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this));
|
143
|
+
}
|
144
|
+
|
145
|
+
void SpiffeChannelSecurityConnector::check_peer(
|
146
|
+
tsi_peer peer, grpc_endpoint* ep,
|
147
|
+
grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
|
148
|
+
grpc_closure* on_peer_checked) {
|
149
|
+
const char* target_name = overridden_target_name_ != nullptr
|
150
|
+
? overridden_target_name_
|
151
|
+
: target_name_;
|
152
|
+
grpc_error* error = grpc_ssl_check_alpn(&peer);
|
153
|
+
if (error != GRPC_ERROR_NONE) {
|
154
|
+
GRPC_CLOSURE_SCHED(on_peer_checked, error);
|
155
|
+
tsi_peer_destruct(&peer);
|
156
|
+
return;
|
157
|
+
}
|
158
|
+
*auth_context = grpc_ssl_peer_to_auth_context(&peer);
|
159
|
+
const SpiffeCredentials* creds =
|
160
|
+
static_cast<const SpiffeCredentials*>(channel_creds());
|
161
|
+
const grpc_tls_server_authorization_check_config* config =
|
162
|
+
creds->options().server_authorization_check_config();
|
163
|
+
/* If server authorization config is not null, use it to perform
|
164
|
+
* server authorization check. */
|
165
|
+
if (config != nullptr) {
|
166
|
+
const tsi_peer_property* p =
|
167
|
+
tsi_peer_get_property_by_name(&peer, TSI_X509_PEM_CERT_PROPERTY);
|
168
|
+
if (p == nullptr) {
|
169
|
+
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
170
|
+
"Cannot check peer: missing pem cert property.");
|
171
|
+
} else {
|
172
|
+
char* peer_pem = static_cast<char*>(gpr_malloc(p->value.length + 1));
|
173
|
+
memcpy(peer_pem, p->value.data, p->value.length);
|
174
|
+
peer_pem[p->value.length] = '\0';
|
175
|
+
GPR_ASSERT(check_arg_ != nullptr);
|
176
|
+
check_arg_->peer_cert = check_arg_->peer_cert == nullptr
|
177
|
+
? gpr_strdup(peer_pem)
|
178
|
+
: check_arg_->peer_cert;
|
179
|
+
check_arg_->target_name = check_arg_->target_name == nullptr
|
180
|
+
? gpr_strdup(target_name)
|
181
|
+
: check_arg_->target_name;
|
182
|
+
on_peer_checked_ = on_peer_checked;
|
183
|
+
gpr_free(peer_pem);
|
184
|
+
int callback_status = config->Schedule(check_arg_);
|
185
|
+
/* Server authorization check is handled asynchronously. */
|
186
|
+
if (callback_status) {
|
187
|
+
tsi_peer_destruct(&peer);
|
188
|
+
return;
|
189
|
+
}
|
190
|
+
/* Server authorization check is handled synchronously. */
|
191
|
+
error = ProcessServerAuthorizationCheckResult(check_arg_);
|
192
|
+
}
|
193
|
+
}
|
194
|
+
GRPC_CLOSURE_SCHED(on_peer_checked, error);
|
195
|
+
tsi_peer_destruct(&peer);
|
196
|
+
}
|
197
|
+
|
198
|
+
int SpiffeChannelSecurityConnector::cmp(
|
199
|
+
const grpc_security_connector* other_sc) const {
|
200
|
+
auto* other =
|
201
|
+
reinterpret_cast<const SpiffeChannelSecurityConnector*>(other_sc);
|
202
|
+
int c = channel_security_connector_cmp(other);
|
203
|
+
if (c != 0) {
|
204
|
+
return c;
|
205
|
+
}
|
206
|
+
return grpc_ssl_cmp_target_name(target_name_, other->target_name_,
|
207
|
+
overridden_target_name_,
|
208
|
+
other->overridden_target_name_);
|
209
|
+
}
|
210
|
+
|
211
|
+
bool SpiffeChannelSecurityConnector::check_call_host(
|
212
|
+
const char* host, grpc_auth_context* auth_context,
|
213
|
+
grpc_closure* on_call_host_checked, grpc_error** error) {
|
214
|
+
return grpc_ssl_check_call_host(host, target_name_, overridden_target_name_,
|
215
|
+
auth_context, on_call_host_checked, error);
|
216
|
+
}
|
217
|
+
|
218
|
+
void SpiffeChannelSecurityConnector::cancel_check_call_host(
|
219
|
+
grpc_closure* on_call_host_checked, grpc_error* error) {
|
220
|
+
GRPC_ERROR_UNREF(error);
|
221
|
+
}
|
222
|
+
|
223
|
+
grpc_core::RefCountedPtr<grpc_channel_security_connector>
|
224
|
+
SpiffeChannelSecurityConnector::CreateSpiffeChannelSecurityConnector(
|
225
|
+
grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
|
226
|
+
grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
|
227
|
+
const char* target_name, const char* overridden_target_name,
|
228
|
+
tsi_ssl_session_cache* ssl_session_cache) {
|
229
|
+
if (channel_creds == nullptr) {
|
230
|
+
gpr_log(GPR_ERROR,
|
231
|
+
"channel_creds is nullptr in "
|
232
|
+
"SpiffeChannelSecurityConnectorCreate()");
|
233
|
+
return nullptr;
|
234
|
+
}
|
235
|
+
if (target_name == nullptr) {
|
236
|
+
gpr_log(GPR_ERROR,
|
237
|
+
"target_name is nullptr in "
|
238
|
+
"SpiffeChannelSecurityConnectorCreate()");
|
239
|
+
return nullptr;
|
240
|
+
}
|
241
|
+
grpc_core::RefCountedPtr<SpiffeChannelSecurityConnector> c =
|
242
|
+
grpc_core::MakeRefCounted<SpiffeChannelSecurityConnector>(
|
243
|
+
std::move(channel_creds), std::move(request_metadata_creds),
|
244
|
+
target_name, overridden_target_name);
|
245
|
+
if (c->InitializeHandshakerFactory(ssl_session_cache) != GRPC_SECURITY_OK) {
|
246
|
+
return nullptr;
|
247
|
+
}
|
248
|
+
return c;
|
249
|
+
}
|
250
|
+
|
251
|
+
grpc_security_status
|
252
|
+
SpiffeChannelSecurityConnector::InitializeHandshakerFactory(
|
253
|
+
tsi_ssl_session_cache* ssl_session_cache) {
|
254
|
+
const SpiffeCredentials* creds =
|
255
|
+
static_cast<const SpiffeCredentials*>(channel_creds());
|
256
|
+
auto key_materials_config = PopulateSpiffeCredentials(creds->options());
|
257
|
+
if (key_materials_config->pem_key_cert_pair_list().empty()) {
|
258
|
+
key_materials_config->Unref();
|
259
|
+
return GRPC_SECURITY_ERROR;
|
260
|
+
}
|
261
|
+
tsi_ssl_pem_key_cert_pair* pem_key_cert_pair = ConvertToTsiPemKeyCertPair(
|
262
|
+
key_materials_config->pem_key_cert_pair_list());
|
263
|
+
grpc_security_status status = grpc_ssl_tsi_client_handshaker_factory_init(
|
264
|
+
pem_key_cert_pair, key_materials_config->pem_root_certs(),
|
265
|
+
ssl_session_cache, &client_handshaker_factory_);
|
266
|
+
// Free memory.
|
267
|
+
key_materials_config->Unref();
|
268
|
+
grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pair, 1);
|
269
|
+
return status;
|
270
|
+
}
|
271
|
+
|
272
|
+
void SpiffeChannelSecurityConnector::ServerAuthorizationCheckDone(
|
273
|
+
grpc_tls_server_authorization_check_arg* arg) {
|
274
|
+
GPR_ASSERT(arg != nullptr);
|
275
|
+
grpc_core::ExecCtx exec_ctx;
|
276
|
+
grpc_error* error = ProcessServerAuthorizationCheckResult(arg);
|
277
|
+
SpiffeChannelSecurityConnector* connector =
|
278
|
+
static_cast<SpiffeChannelSecurityConnector*>(arg->cb_user_data);
|
279
|
+
GRPC_CLOSURE_SCHED(connector->on_peer_checked_, error);
|
280
|
+
}
|
281
|
+
|
282
|
+
grpc_error*
|
283
|
+
SpiffeChannelSecurityConnector::ProcessServerAuthorizationCheckResult(
|
284
|
+
grpc_tls_server_authorization_check_arg* arg) {
|
285
|
+
grpc_error* error = GRPC_ERROR_NONE;
|
286
|
+
char* msg = nullptr;
|
287
|
+
/* Server authorization check is cancelled by caller. */
|
288
|
+
if (arg->status == GRPC_STATUS_CANCELLED) {
|
289
|
+
gpr_asprintf(&msg,
|
290
|
+
"Server authorization check is cancelled by the caller with "
|
291
|
+
"error: %s",
|
292
|
+
arg->error_details);
|
293
|
+
error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
|
294
|
+
} else if (arg->status == GRPC_STATUS_OK) {
|
295
|
+
/* Server authorization check completed successfully but returned check
|
296
|
+
* failure. */
|
297
|
+
if (!arg->success) {
|
298
|
+
gpr_asprintf(&msg, "Server authorization check failed with error: %s",
|
299
|
+
arg->error_details);
|
300
|
+
error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
|
301
|
+
}
|
302
|
+
/* Server authorization check did not complete correctly. */
|
303
|
+
} else {
|
304
|
+
gpr_asprintf(
|
305
|
+
&msg,
|
306
|
+
"Server authorization check did not finish correctly with error: %s",
|
307
|
+
arg->error_details);
|
308
|
+
error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
|
309
|
+
}
|
310
|
+
gpr_free(msg);
|
311
|
+
return error;
|
312
|
+
}
|
313
|
+
|
314
|
+
grpc_tls_server_authorization_check_arg*
|
315
|
+
SpiffeChannelSecurityConnector::ServerAuthorizationCheckArgCreate(
|
316
|
+
void* user_data) {
|
317
|
+
grpc_tls_server_authorization_check_arg* arg =
|
318
|
+
grpc_core::New<grpc_tls_server_authorization_check_arg>();
|
319
|
+
arg->cb = ServerAuthorizationCheckDone;
|
320
|
+
arg->cb_user_data = user_data;
|
321
|
+
arg->status = GRPC_STATUS_OK;
|
322
|
+
return arg;
|
323
|
+
}
|
324
|
+
|
325
|
+
void SpiffeChannelSecurityConnector::ServerAuthorizationCheckArgDestroy(
|
326
|
+
grpc_tls_server_authorization_check_arg* arg) {
|
327
|
+
if (arg == nullptr) {
|
328
|
+
return;
|
329
|
+
}
|
330
|
+
gpr_free((void*)arg->target_name);
|
331
|
+
gpr_free((void*)arg->peer_cert);
|
332
|
+
gpr_free((void*)arg->error_details);
|
333
|
+
grpc_core::Delete(arg);
|
334
|
+
}
|
335
|
+
|
336
|
+
SpiffeServerSecurityConnector::SpiffeServerSecurityConnector(
|
337
|
+
grpc_core::RefCountedPtr<grpc_server_credentials> server_creds)
|
338
|
+
: grpc_server_security_connector(GRPC_SSL_URL_SCHEME,
|
339
|
+
std::move(server_creds)) {}
|
340
|
+
|
341
|
+
SpiffeServerSecurityConnector::~SpiffeServerSecurityConnector() {
|
342
|
+
if (server_handshaker_factory_ != nullptr) {
|
343
|
+
tsi_ssl_server_handshaker_factory_unref(server_handshaker_factory_);
|
344
|
+
}
|
345
|
+
}
|
346
|
+
|
347
|
+
void SpiffeServerSecurityConnector::add_handshakers(
|
348
|
+
grpc_pollset_set* interested_parties,
|
349
|
+
grpc_core::HandshakeManager* handshake_mgr) {
|
350
|
+
/* Create a TLS SPIFFE TSI handshaker for server. */
|
351
|
+
RefreshServerHandshakerFactory();
|
352
|
+
tsi_handshaker* tsi_hs = nullptr;
|
353
|
+
tsi_result result = tsi_ssl_server_handshaker_factory_create_handshaker(
|
354
|
+
server_handshaker_factory_, &tsi_hs);
|
355
|
+
if (result != TSI_OK) {
|
356
|
+
gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
|
357
|
+
tsi_result_to_string(result));
|
358
|
+
return;
|
359
|
+
}
|
360
|
+
handshake_mgr->Add(grpc_core::SecurityHandshakerCreate(tsi_hs, this));
|
361
|
+
}
|
362
|
+
|
363
|
+
void SpiffeServerSecurityConnector::check_peer(
|
364
|
+
tsi_peer peer, grpc_endpoint* ep,
|
365
|
+
grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
|
366
|
+
grpc_closure* on_peer_checked) {
|
367
|
+
grpc_error* error = grpc_ssl_check_alpn(&peer);
|
368
|
+
*auth_context = grpc_ssl_peer_to_auth_context(&peer);
|
369
|
+
tsi_peer_destruct(&peer);
|
370
|
+
GRPC_CLOSURE_SCHED(on_peer_checked, error);
|
371
|
+
}
|
372
|
+
|
373
|
+
int SpiffeServerSecurityConnector::cmp(
|
374
|
+
const grpc_security_connector* other) const {
|
375
|
+
return server_security_connector_cmp(
|
376
|
+
static_cast<const grpc_server_security_connector*>(other));
|
377
|
+
}
|
378
|
+
|
379
|
+
grpc_core::RefCountedPtr<grpc_server_security_connector>
|
380
|
+
SpiffeServerSecurityConnector::CreateSpiffeServerSecurityConnector(
|
381
|
+
grpc_core::RefCountedPtr<grpc_server_credentials> server_creds) {
|
382
|
+
if (server_creds == nullptr) {
|
383
|
+
gpr_log(GPR_ERROR,
|
384
|
+
"server_creds is nullptr in "
|
385
|
+
"SpiffeServerSecurityConnectorCreate()");
|
386
|
+
return nullptr;
|
387
|
+
}
|
388
|
+
grpc_core::RefCountedPtr<SpiffeServerSecurityConnector> c =
|
389
|
+
grpc_core::MakeRefCounted<SpiffeServerSecurityConnector>(
|
390
|
+
std::move(server_creds));
|
391
|
+
if (c->RefreshServerHandshakerFactory() != GRPC_SECURITY_OK) {
|
392
|
+
return nullptr;
|
393
|
+
}
|
394
|
+
return c;
|
395
|
+
}
|
396
|
+
|
397
|
+
grpc_security_status
|
398
|
+
SpiffeServerSecurityConnector::RefreshServerHandshakerFactory() {
|
399
|
+
const SpiffeServerCredentials* creds =
|
400
|
+
static_cast<const SpiffeServerCredentials*>(server_creds());
|
401
|
+
auto key_materials_config = PopulateSpiffeCredentials(creds->options());
|
402
|
+
/* Credential reload does NOT take effect and we need to keep using
|
403
|
+
* the existing handshaker factory. */
|
404
|
+
if (key_materials_config->pem_key_cert_pair_list().empty()) {
|
405
|
+
key_materials_config->Unref();
|
406
|
+
return GRPC_SECURITY_ERROR;
|
407
|
+
}
|
408
|
+
/* Credential reload takes effect and we need to free the existing
|
409
|
+
* handshaker library. */
|
410
|
+
if (server_handshaker_factory_) {
|
411
|
+
tsi_ssl_server_handshaker_factory_unref(server_handshaker_factory_);
|
412
|
+
}
|
413
|
+
tsi_ssl_pem_key_cert_pair* pem_key_cert_pairs = ConvertToTsiPemKeyCertPair(
|
414
|
+
key_materials_config->pem_key_cert_pair_list());
|
415
|
+
size_t num_key_cert_pairs =
|
416
|
+
key_materials_config->pem_key_cert_pair_list().size();
|
417
|
+
grpc_security_status status = grpc_ssl_tsi_server_handshaker_factory_init(
|
418
|
+
pem_key_cert_pairs, num_key_cert_pairs,
|
419
|
+
key_materials_config->pem_root_certs(),
|
420
|
+
creds->options().cert_request_type(), &server_handshaker_factory_);
|
421
|
+
// Free memory.
|
422
|
+
key_materials_config->Unref();
|
423
|
+
grpc_tsi_ssl_pem_key_cert_pairs_destroy(pem_key_cert_pairs,
|
424
|
+
num_key_cert_pairs);
|
425
|
+
return status;
|
426
|
+
}
|
@@ -0,0 +1,122 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2018 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#ifndef GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_TLS_SPIFFE_SECURITY_CONNECTOR_H
|
20
|
+
#define GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_TLS_SPIFFE_SECURITY_CONNECTOR_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include "src/core/lib/security/context/security_context.h"
|
25
|
+
#include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h"
|
26
|
+
|
27
|
+
#define GRPC_TLS_SPIFFE_TRANSPORT_SECURITY_TYPE "spiffe"
|
28
|
+
|
29
|
+
// Spiffe channel security connector.
|
30
|
+
class SpiffeChannelSecurityConnector final
|
31
|
+
: public grpc_channel_security_connector {
|
32
|
+
public:
|
33
|
+
// static factory method to create a SPIFFE channel security connector.
|
34
|
+
static grpc_core::RefCountedPtr<grpc_channel_security_connector>
|
35
|
+
CreateSpiffeChannelSecurityConnector(
|
36
|
+
grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
|
37
|
+
grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
|
38
|
+
const char* target_name, const char* overridden_target_name,
|
39
|
+
tsi_ssl_session_cache* ssl_session_cache);
|
40
|
+
|
41
|
+
SpiffeChannelSecurityConnector(
|
42
|
+
grpc_core::RefCountedPtr<grpc_channel_credentials> channel_creds,
|
43
|
+
grpc_core::RefCountedPtr<grpc_call_credentials> request_metadata_creds,
|
44
|
+
const char* target_name, const char* overridden_target_name);
|
45
|
+
~SpiffeChannelSecurityConnector() override;
|
46
|
+
|
47
|
+
void add_handshakers(grpc_pollset_set* interested_parties,
|
48
|
+
grpc_core::HandshakeManager* handshake_mgr) override;
|
49
|
+
|
50
|
+
void check_peer(tsi_peer peer, grpc_endpoint* ep,
|
51
|
+
grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
|
52
|
+
grpc_closure* on_peer_checked) override;
|
53
|
+
|
54
|
+
int cmp(const grpc_security_connector* other_sc) const override;
|
55
|
+
|
56
|
+
bool check_call_host(const char* host, grpc_auth_context* auth_context,
|
57
|
+
grpc_closure* on_call_host_checked,
|
58
|
+
grpc_error** error) override;
|
59
|
+
|
60
|
+
void cancel_check_call_host(grpc_closure* on_call_host_checked,
|
61
|
+
grpc_error* error) override;
|
62
|
+
|
63
|
+
private:
|
64
|
+
// Initialize SSL TSI client handshaker factory.
|
65
|
+
grpc_security_status InitializeHandshakerFactory(
|
66
|
+
tsi_ssl_session_cache* ssl_session_cache);
|
67
|
+
|
68
|
+
// gRPC-provided callback executed by application, which servers to bring the
|
69
|
+
// control back to gRPC core.
|
70
|
+
static void ServerAuthorizationCheckDone(
|
71
|
+
grpc_tls_server_authorization_check_arg* arg);
|
72
|
+
|
73
|
+
// A util function to process server authorization check result.
|
74
|
+
static grpc_error* ProcessServerAuthorizationCheckResult(
|
75
|
+
grpc_tls_server_authorization_check_arg* arg);
|
76
|
+
|
77
|
+
// A util function to create a server authorization check arg instance.
|
78
|
+
static grpc_tls_server_authorization_check_arg*
|
79
|
+
ServerAuthorizationCheckArgCreate(void* user_data);
|
80
|
+
|
81
|
+
// A util function to destroy a server authorization check arg instance.
|
82
|
+
static void ServerAuthorizationCheckArgDestroy(
|
83
|
+
grpc_tls_server_authorization_check_arg* arg);
|
84
|
+
|
85
|
+
grpc_closure* on_peer_checked_;
|
86
|
+
char* target_name_;
|
87
|
+
char* overridden_target_name_;
|
88
|
+
tsi_ssl_client_handshaker_factory* client_handshaker_factory_ = nullptr;
|
89
|
+
grpc_tls_server_authorization_check_arg* check_arg_;
|
90
|
+
};
|
91
|
+
|
92
|
+
// Spiffe server security connector.
|
93
|
+
class SpiffeServerSecurityConnector final
|
94
|
+
: public grpc_server_security_connector {
|
95
|
+
public:
|
96
|
+
// static factory method to create a SPIFFE server security connector.
|
97
|
+
static grpc_core::RefCountedPtr<grpc_server_security_connector>
|
98
|
+
CreateSpiffeServerSecurityConnector(
|
99
|
+
grpc_core::RefCountedPtr<grpc_server_credentials> server_creds);
|
100
|
+
|
101
|
+
explicit SpiffeServerSecurityConnector(
|
102
|
+
grpc_core::RefCountedPtr<grpc_server_credentials> server_creds);
|
103
|
+
~SpiffeServerSecurityConnector() override;
|
104
|
+
|
105
|
+
void add_handshakers(grpc_pollset_set* interested_parties,
|
106
|
+
grpc_core::HandshakeManager* handshake_mgr) override;
|
107
|
+
|
108
|
+
void check_peer(tsi_peer peer, grpc_endpoint* ep,
|
109
|
+
grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
|
110
|
+
grpc_closure* on_peer_checked) override;
|
111
|
+
|
112
|
+
int cmp(const grpc_security_connector* other) const override;
|
113
|
+
|
114
|
+
private:
|
115
|
+
// A util function to refresh SSL TSI server handshaker factory with a valid
|
116
|
+
// credential.
|
117
|
+
grpc_security_status RefreshServerHandshakerFactory();
|
118
|
+
tsi_ssl_server_handshaker_factory* server_handshaker_factory_ = nullptr;
|
119
|
+
};
|
120
|
+
|
121
|
+
#endif /* GRPC_CORE_LIB_SECURITY_SECURITY_CONNECTOR_TLS_SPIFFE_SECURITY_CONNECTOR_H \
|
122
|
+
*/
|
@@ -28,10 +28,13 @@ extern const grpc_channel_filter grpc_client_auth_filter;
|
|
28
28
|
extern const grpc_channel_filter grpc_server_auth_filter;
|
29
29
|
|
30
30
|
void grpc_auth_metadata_context_build(
|
31
|
-
const char* url_scheme, grpc_slice call_host,
|
32
|
-
grpc_auth_context* auth_context,
|
31
|
+
const char* url_scheme, const grpc_slice& call_host,
|
32
|
+
const grpc_slice& call_method, grpc_auth_context* auth_context,
|
33
33
|
grpc_auth_metadata_context* auth_md_context);
|
34
34
|
|
35
|
+
void grpc_auth_metadata_context_copy(grpc_auth_metadata_context* from,
|
36
|
+
grpc_auth_metadata_context* to);
|
37
|
+
|
35
38
|
void grpc_auth_metadata_context_reset(grpc_auth_metadata_context* context);
|
36
39
|
|
37
40
|
#endif /* GRPC_CORE_LIB_SECURITY_TRANSPORT_AUTH_FILTERS_H */
|