grpc 1.7.3 → 1.8.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 +2106 -2116
- data/include/grpc/census.h +1 -432
- data/include/grpc/compression.h +9 -9
- data/include/grpc/grpc.h +115 -98
- data/include/grpc/grpc_cronet.h +3 -3
- data/include/grpc/grpc_posix.h +4 -4
- data/include/grpc/grpc_security.h +160 -88
- data/include/grpc/grpc_security_constants.h +7 -0
- data/include/grpc/impl/codegen/atm.h +9 -1
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +13 -4
- data/include/grpc/impl/codegen/atm_gcc_sync.h +6 -5
- data/include/grpc/impl/codegen/atm_windows.h +23 -22
- data/include/grpc/impl/codegen/byte_buffer.h +14 -14
- data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -2
- data/include/grpc/impl/codegen/connectivity_state.h +0 -2
- data/include/grpc/impl/codegen/grpc_types.h +32 -28
- data/include/grpc/impl/codegen/port_platform.h +48 -0
- data/include/grpc/impl/codegen/slice.h +10 -10
- data/include/grpc/impl/codegen/sync_generic.h +9 -3
- data/include/grpc/slice.h +16 -17
- data/include/grpc/slice_buffer.h +22 -22
- data/include/grpc/support/alloc.h +11 -11
- data/include/grpc/support/avl.h +28 -20
- data/include/grpc/support/cmdline.h +13 -13
- data/include/grpc/support/histogram.h +17 -17
- data/include/grpc/support/host_port.h +2 -2
- data/include/grpc/support/log.h +9 -9
- data/include/grpc/support/log_windows.h +1 -1
- data/include/grpc/support/string_util.h +2 -2
- data/include/grpc/support/subprocess.h +5 -5
- data/include/grpc/support/sync.h +43 -27
- data/include/grpc/support/thd.h +6 -6
- data/include/grpc/support/tls_gcc.h +1 -1
- data/include/grpc/support/tls_pthread.h +1 -1
- data/src/core/ext/census/{grpc_context.c → grpc_context.cc} +5 -8
- data/src/core/ext/filters/client_channel/backup_poller.cc +165 -0
- data/src/core/ext/{census/grpc_filter.h → filters/client_channel/backup_poller.h} +12 -7
- data/src/core/ext/filters/client_channel/{channel_connectivity.c → channel_connectivity.cc} +45 -42
- data/src/core/ext/filters/client_channel/{client_channel.c → client_channel.cc} +452 -417
- data/src/core/ext/filters/client_channel/client_channel.h +16 -8
- data/src/core/ext/filters/client_channel/{client_channel_factory.c → client_channel_factory.cc} +0 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.h +29 -21
- data/src/core/ext/filters/client_channel/{client_channel_plugin.c → client_channel_plugin.cc} +15 -19
- data/src/core/ext/filters/client_channel/{connector.c → connector.cc} +0 -0
- data/src/core/ext/filters/client_channel/connector.h +29 -21
- data/src/core/ext/filters/client_channel/{http_connect_handshaker.c → http_connect_handshaker.cc} +10 -10
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +8 -0
- data/src/core/ext/filters/client_channel/{http_proxy.c → http_proxy.cc} +14 -14
- data/src/core/ext/filters/client_channel/http_proxy.h +8 -0
- data/src/core/ext/filters/client_channel/{lb_policy.c → lb_policy.cc} +47 -48
- data/src/core/ext/filters/client_channel/lb_policy.h +76 -70
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/{client_load_reporting_filter.c → client_load_reporting_filter.cc} +28 -29
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +9 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/{grpclb.c → grpclb.cc} +554 -563
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +9 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +17 -9
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/{grpclb_channel_secure.c → grpclb_channel_secure.cc} +17 -17
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/{grpclb_client_stats.c → grpclb_client_stats.cc} +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +9 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/{load_balancer_api.c → load_balancer_api.cc} +64 -67
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +20 -21
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +599 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +695 -0
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +270 -0
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +153 -0
- data/src/core/ext/filters/client_channel/{lb_policy_factory.c → lb_policy_factory.cc} +10 -10
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +48 -40
- data/src/core/ext/filters/client_channel/{lb_policy_registry.c → lb_policy_registry.cc} +9 -9
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +11 -3
- data/src/core/ext/filters/client_channel/{parse_address.c → parse_address.cc} +24 -24
- data/src/core/ext/filters/client_channel/parse_address.h +14 -6
- data/src/core/ext/filters/client_channel/{proxy_mapper.c → proxy_mapper.cc} +0 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.h +8 -0
- data/src/core/ext/filters/client_channel/{proxy_mapper_registry.c → proxy_mapper_registry.cc} +0 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +8 -0
- data/src/core/ext/filters/client_channel/{resolver.c → resolver.cc} +21 -23
- data/src/core/ext/filters/client_channel/resolver.h +33 -27
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/{dns_resolver_ares.c → dns_resolver_ares.cc} +133 -133
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +18 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/{grpc_ares_ev_driver_posix.c → grpc_ares_ev_driver_posix.cc} +58 -56
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/{grpc_ares_wrapper.c → grpc_ares_wrapper.cc} +118 -115
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +23 -15
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +60 -0
- data/src/core/ext/filters/client_channel/resolver/dns/native/{dns_resolver.c → dns_resolver.cc} +100 -94
- data/src/core/ext/filters/client_channel/resolver/fake/{fake_resolver.c → fake_resolver.cc} +14 -14
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +9 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/{sockaddr_resolver.c → sockaddr_resolver.cc} +60 -60
- data/src/core/ext/filters/client_channel/{resolver_factory.c → resolver_factory.cc} +2 -2
- data/src/core/ext/filters/client_channel/resolver_factory.h +27 -19
- data/src/core/ext/filters/client_channel/{resolver_registry.c → resolver_registry.cc} +35 -35
- data/src/core/ext/filters/client_channel/resolver_registry.h +18 -10
- data/src/core/ext/filters/client_channel/{retry_throttle.c → retry_throttle.cc} +10 -10
- data/src/core/ext/filters/client_channel/retry_throttle.h +8 -0
- data/src/core/ext/filters/client_channel/{subchannel.c → subchannel.cc} +210 -213
- data/src/core/ext/filters/client_channel/subchannel.h +68 -60
- data/src/core/ext/filters/client_channel/{subchannel_index.c → subchannel_index.cc} +52 -52
- data/src/core/ext/filters/client_channel/subchannel_index.h +22 -14
- data/src/core/ext/filters/client_channel/{uri_parser.c → uri_parser.cc} +29 -27
- data/src/core/ext/filters/client_channel/uri_parser.h +18 -10
- data/src/core/ext/filters/deadline/{deadline_filter.c → deadline_filter.cc} +12 -15
- data/src/core/ext/filters/deadline/deadline_filter.h +11 -2
- data/src/core/ext/filters/http/client/{http_client_filter.c → http_client_filter.cc} +83 -83
- data/src/core/ext/filters/http/client/http_client_filter.h +8 -0
- data/src/core/ext/filters/http/{http_filters_plugin.c → http_filters_plugin.cc} +20 -21
- data/src/core/ext/filters/http/message_compress/{message_compress_filter.c → message_compress_filter.cc} +84 -83
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +9 -1
- data/src/core/ext/filters/http/server/{http_server_filter.c → http_server_filter.cc} +80 -78
- data/src/core/ext/filters/http/server/http_server_filter.h +8 -0
- data/src/core/ext/filters/load_reporting/{server_load_reporting_filter.c → server_load_reporting_filter.cc} +29 -29
- data/src/core/ext/filters/load_reporting/server_load_reporting_filter.h +9 -1
- data/src/core/ext/filters/load_reporting/{server_load_reporting_plugin.c → server_load_reporting_plugin.cc} +11 -11
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +13 -5
- data/src/core/ext/filters/max_age/{max_age_filter.c → max_age_filter.cc} +46 -56
- data/src/core/ext/filters/max_age/max_age_filter.h +8 -0
- data/src/core/ext/filters/message_size/{message_size_filter.c → message_size_filter.cc} +62 -40
- data/src/core/ext/filters/message_size/message_size_filter.h +8 -0
- data/src/core/ext/filters/workarounds/{workaround_cronet_compression_filter.c → workaround_cronet_compression_filter.cc} +11 -11
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +8 -0
- data/src/core/ext/filters/workarounds/{workaround_utils.c → workaround_utils.cc} +7 -7
- data/src/core/ext/filters/workarounds/workaround_utils.h +9 -1
- data/src/core/ext/transport/chttp2/alpn/{alpn.c → alpn.cc} +3 -3
- data/src/core/ext/transport/chttp2/alpn/alpn.h +10 -2
- data/src/core/ext/transport/chttp2/client/{chttp2_connector.c → chttp2_connector.cc} +49 -45
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +8 -0
- data/src/core/ext/transport/chttp2/client/insecure/{channel_create.c → channel_create.cc} +28 -27
- data/src/core/ext/transport/chttp2/client/insecure/{channel_create_posix.c → channel_create_posix.cc} +14 -13
- data/src/core/ext/transport/chttp2/client/secure/{secure_channel_create.c → secure_channel_create.cc} +68 -66
- data/src/core/ext/transport/chttp2/server/{chttp2_server.c → chttp2_server.cc} +76 -77
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -3
- data/src/core/ext/transport/chttp2/server/insecure/{server_chttp2.c → server_chttp2.cc} +3 -3
- data/src/core/ext/transport/chttp2/server/insecure/{server_chttp2_posix.c → server_chttp2_posix.cc} +13 -12
- data/src/core/ext/transport/chttp2/server/secure/{server_secure_chttp2.c → server_secure_chttp2.cc} +12 -10
- data/src/core/ext/transport/chttp2/transport/{bin_decoder.c → bin_decoder.cc} +7 -7
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +15 -7
- data/src/core/ext/transport/chttp2/transport/{bin_encoder.c → bin_encoder.cc} +11 -11
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -0
- data/src/core/ext/transport/chttp2/transport/{chttp2_plugin.c → chttp2_plugin.cc} +2 -9
- data/src/core/ext/transport/chttp2/transport/{chttp2_transport.c → chttp2_transport.cc} +778 -778
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +14 -10
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +385 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +337 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +8 -0
- data/src/core/ext/transport/chttp2/transport/{frame_data.c → frame_data.cc} +34 -34
- data/src/core/ext/transport/chttp2/transport/frame_data.h +25 -17
- data/src/core/ext/transport/chttp2/transport/{frame_goaway.c → frame_goaway.cc} +18 -18
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -10
- data/src/core/ext/transport/chttp2/transport/{frame_ping.c → frame_ping.cc} +18 -19
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +12 -4
- data/src/core/ext/transport/chttp2/transport/{frame_rst_stream.c → frame_rst_stream.cc} +16 -16
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +16 -8
- data/src/core/ext/transport/chttp2/transport/{frame_settings.c → frame_settings.cc} +23 -24
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +17 -9
- data/src/core/ext/transport/chttp2/transport/{frame_window_update.c → frame_window_update.cc} +22 -24
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +14 -6
- data/src/core/ext/transport/chttp2/transport/{hpack_encoder.c → hpack_encoder.cc} +206 -161
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +23 -13
- data/src/core/ext/transport/chttp2/transport/{hpack_parser.c → hpack_parser.cc} +340 -334
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +30 -22
- data/src/core/ext/transport/chttp2/transport/{hpack_table.c → hpack_table.cc} +25 -25
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +19 -11
- data/src/core/ext/transport/chttp2/transport/{http2_settings.c → http2_settings.cc} +1 -1
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +10 -2
- data/src/core/ext/transport/chttp2/transport/{huffsyms.c → huffsyms.cc} +0 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +8 -0
- data/src/core/ext/transport/chttp2/transport/{incoming_metadata.c → incoming_metadata.cc} +14 -13
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +18 -10
- data/src/core/ext/transport/chttp2/transport/internal.h +214 -340
- data/src/core/ext/transport/chttp2/transport/{parsing.c → parsing.cc} +152 -141
- data/src/core/ext/transport/chttp2/transport/{stream_lists.c → stream_lists.cc} +53 -53
- data/src/core/ext/transport/chttp2/transport/{stream_map.c → stream_map.cc} +35 -34
- data/src/core/ext/transport/chttp2/transport/stream_map.h +22 -14
- data/src/core/ext/transport/chttp2/transport/{varint.c → varint.cc} +0 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +8 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +636 -0
- data/src/core/ext/transport/inproc/{inproc_plugin.c → inproc_plugin.cc} +5 -6
- data/src/core/ext/transport/inproc/{inproc_transport.c → inproc_transport.cc} +479 -544
- data/src/core/ext/transport/inproc/inproc_transport.h +4 -4
- data/src/core/lib/backoff/backoff.cc +80 -0
- data/src/core/lib/backoff/backoff.h +83 -0
- data/src/core/lib/channel/{channel_args.c → channel_args.cc} +92 -92
- data/src/core/lib/channel/channel_args.h +45 -37
- data/src/core/lib/channel/{channel_stack.c → channel_stack.cc} +67 -68
- data/src/core/lib/channel/channel_stack.h +76 -75
- data/src/core/lib/channel/{channel_stack_builder.c → channel_stack_builder.cc} +91 -91
- data/src/core/lib/channel/channel_stack_builder.h +45 -45
- data/src/core/lib/channel/{connected_channel.c → connected_channel.cc} +70 -70
- data/src/core/lib/channel/connected_channel.h +12 -4
- data/src/core/lib/channel/context.h +2 -2
- data/src/core/lib/channel/{handshaker.c → handshaker.cc} +7 -9
- data/src/core/lib/channel/handshaker.h +9 -1
- data/src/core/lib/channel/{handshaker_factory.c → handshaker_factory.cc} +7 -7
- data/src/core/lib/channel/handshaker_factory.h +18 -10
- data/src/core/lib/channel/{handshaker_registry.c → handshaker_registry.cc} +0 -0
- data/src/core/lib/channel/handshaker_registry.h +8 -0
- data/src/core/lib/compression/algorithm_metadata.h +8 -0
- data/src/core/lib/compression/{compression.c → compression.cc} +9 -9
- data/src/core/lib/compression/{message_compress.c → message_compress.cc} +0 -0
- data/src/core/lib/compression/message_compress.h +8 -0
- data/src/core/lib/compression/{stream_compression.c → stream_compression.cc} +12 -12
- data/src/core/lib/compression/stream_compression.h +27 -19
- data/src/core/lib/compression/{stream_compression_gzip.c → stream_compression_gzip.cc} +35 -36
- data/src/core/lib/compression/stream_compression_gzip.h +8 -0
- data/src/core/lib/compression/{stream_compression_identity.c → stream_compression_identity.cc} +19 -20
- data/src/core/lib/compression/stream_compression_identity.h +8 -0
- data/src/core/lib/debug/{stats.c → stats.cc} +19 -19
- data/src/core/lib/debug/stats.h +17 -9
- data/src/core/lib/debug/{stats_data.c → stats_data.cc} +45 -22
- data/src/core/lib/debug/stats_data.h +58 -19
- data/src/core/lib/debug/trace.cc +142 -0
- data/src/core/lib/debug/trace.h +74 -14
- data/src/core/lib/http/{format_request.c → format_request.cc} +10 -10
- data/src/core/lib/http/format_request.h +12 -4
- data/src/core/lib/http/{httpcli.c → httpcli.cc} +80 -80
- data/src/core/lib/http/httpcli.h +41 -33
- data/src/core/lib/http/{httpcli_security_connector.c → httpcli_security_connector.cc} +69 -55
- data/src/core/lib/http/{parser.c → parser.cc} +42 -42
- data/src/core/lib/http/parser.h +28 -20
- data/src/core/lib/{support → iomgr}/block_annotate.h +17 -8
- data/src/core/lib/iomgr/{call_combiner.c → call_combiner.cc} +29 -17
- data/src/core/lib/iomgr/call_combiner.h +9 -1
- data/src/core/lib/iomgr/closure.h +220 -62
- data/src/core/lib/iomgr/{combiner.c → combiner.cc} +63 -62
- data/src/core/lib/iomgr/combiner.h +16 -8
- data/src/core/lib/iomgr/{endpoint.c → endpoint.cc} +6 -0
- data/src/core/lib/iomgr/endpoint.h +47 -32
- data/src/core/lib/iomgr/endpoint_pair.h +12 -4
- data/src/core/lib/iomgr/{endpoint_pair_posix.c → endpoint_pair_posix.cc} +3 -3
- data/src/core/lib/iomgr/{endpoint_pair_uv.c → endpoint_pair_uv.cc} +2 -2
- data/src/core/lib/iomgr/{endpoint_pair_windows.c → endpoint_pair_windows.cc} +6 -6
- data/src/core/lib/iomgr/{error.c → error.cc} +125 -124
- data/src/core/lib/iomgr/error.h +32 -27
- data/src/core/lib/iomgr/error_internal.h +11 -2
- data/src/core/lib/iomgr/{ev_epoll1_linux.c → ev_epoll1_linux.cc} +214 -215
- data/src/core/lib/iomgr/ev_epoll1_linux.h +9 -1
- data/src/core/lib/iomgr/ev_epollex_linux.cc +1488 -0
- data/src/core/lib/iomgr/ev_epollex_linux.h +9 -1
- data/src/core/lib/iomgr/{ev_epollsig_linux.c → ev_epollsig_linux.cc} +304 -305
- data/src/core/lib/iomgr/ev_epollsig_linux.h +12 -4
- data/src/core/lib/iomgr/{ev_poll_posix.c → ev_poll_posix.cc} +272 -283
- data/src/core/lib/iomgr/ev_poll_posix.h +10 -2
- data/src/core/lib/iomgr/ev_posix.cc +288 -0
- data/src/core/lib/iomgr/ev_posix.h +75 -67
- data/src/core/lib/iomgr/{ev_windows.c → ev_windows.cc} +2 -2
- data/src/core/lib/iomgr/exec_ctx.cc +177 -0
- data/src/core/lib/iomgr/exec_ctx.h +35 -13
- data/src/core/lib/iomgr/{executor.c → executor.cc} +34 -35
- data/src/core/lib/iomgr/executor.h +12 -4
- data/src/core/lib/iomgr/{fork_posix.c → fork_posix.cc} +0 -0
- data/src/core/lib/iomgr/{fork_windows.c → fork_windows.cc} +0 -0
- data/src/core/lib/iomgr/gethostname.h +9 -1
- data/src/core/lib/iomgr/{gethostname_fallback.c → gethostname_fallback.cc} +2 -1
- data/src/core/lib/iomgr/{gethostname_host_name_max.c → gethostname_host_name_max.cc} +4 -3
- data/src/core/lib/iomgr/{gethostname_sysconf.c → gethostname_sysconf.cc} +3 -2
- data/src/core/lib/iomgr/{iocp_windows.c → iocp_windows.cc} +23 -25
- data/src/core/lib/iomgr/iocp_windows.h +17 -3
- data/src/core/lib/iomgr/{iomgr.c → iomgr.cc} +25 -19
- data/src/core/lib/iomgr/iomgr.h +11 -3
- data/src/core/lib/iomgr/iomgr_internal.h +13 -5
- data/src/core/lib/iomgr/{iomgr_posix.c → iomgr_posix.cc} +0 -1
- data/src/core/lib/iomgr/{iomgr_uv.c → iomgr_uv.cc} +1 -1
- data/src/core/lib/iomgr/iomgr_uv.h +8 -0
- data/src/core/lib/iomgr/{iomgr_windows.c → iomgr_windows.cc} +0 -0
- data/src/core/lib/iomgr/{is_epollexclusive_available.c → is_epollexclusive_available.cc} +1 -1
- data/src/core/lib/iomgr/is_epollexclusive_available.h +8 -0
- data/src/core/lib/iomgr/{load_file.c → load_file.cc} +12 -12
- data/src/core/lib/iomgr/load_file.h +2 -2
- data/src/core/lib/iomgr/{lockfree_event.c → lockfree_event.cc} +76 -68
- data/src/core/lib/iomgr/lockfree_event.h +30 -11
- data/src/core/lib/iomgr/{network_status_tracker.c → network_status_tracker.cc} +3 -2
- data/src/core/lib/iomgr/network_status_tracker.h +2 -2
- data/src/core/lib/iomgr/{polling_entity.c → polling_entity.cc} +18 -18
- data/src/core/lib/iomgr/polling_entity.h +21 -13
- data/src/core/lib/iomgr/pollset.h +17 -11
- data/src/core/lib/iomgr/pollset_set.h +23 -15
- data/src/core/lib/iomgr/{pollset_set_uv.c → pollset_set_uv.cc} +0 -0
- data/src/core/lib/iomgr/{pollset_set_windows.c → pollset_set_windows.cc} +0 -0
- data/src/core/lib/iomgr/{pollset_uv.c → pollset_uv.cc} +31 -29
- data/src/core/lib/iomgr/pollset_uv.h +8 -0
- data/src/core/lib/iomgr/{pollset_windows.c → pollset_windows.cc} +24 -24
- data/src/core/lib/iomgr/pollset_windows.h +17 -4
- data/src/core/lib/iomgr/port.h +10 -0
- data/src/core/lib/iomgr/resolve_address.h +18 -10
- data/src/core/lib/iomgr/{resolve_address_posix.c → resolve_address_posix.cc} +40 -40
- data/src/core/lib/iomgr/{resolve_address_uv.c → resolve_address_uv.cc} +61 -56
- data/src/core/lib/iomgr/{resolve_address_windows.c → resolve_address_windows.cc} +36 -34
- data/src/core/lib/iomgr/{resource_quota.c → resource_quota.cc} +209 -180
- data/src/core/lib/iomgr/resource_quota.h +45 -37
- data/src/core/lib/iomgr/{sockaddr_utils.c → sockaddr_utils.cc} +61 -61
- data/src/core/lib/iomgr/sockaddr_utils.h +23 -15
- data/src/core/lib/iomgr/sockaddr_windows.h +6 -0
- data/src/core/lib/iomgr/{socket_factory_posix.c → socket_factory_posix.cc} +20 -20
- data/src/core/lib/iomgr/socket_factory_posix.h +15 -15
- data/src/core/lib/iomgr/{socket_mutator.c → socket_mutator.cc} +18 -18
- data/src/core/lib/iomgr/socket_mutator.h +11 -11
- data/src/core/lib/iomgr/socket_utils.h +9 -1
- data/src/core/lib/iomgr/{socket_utils_common_posix.c → socket_utils_common_posix.cc} +28 -28
- data/src/core/lib/iomgr/{socket_utils_linux.c → socket_utils_linux.cc} +3 -3
- data/src/core/lib/iomgr/{socket_utils_posix.c → socket_utils_posix.cc} +3 -3
- data/src/core/lib/iomgr/socket_utils_posix.h +26 -18
- data/src/core/lib/iomgr/{socket_utils_uv.c → socket_utils_uv.cc} +1 -1
- data/src/core/lib/iomgr/{socket_utils_windows.c → socket_utils_windows.cc} +2 -2
- data/src/core/lib/iomgr/{socket_windows.c → socket_windows.cc} +18 -18
- data/src/core/lib/iomgr/socket_windows.h +26 -13
- data/src/core/lib/iomgr/tcp_client.h +14 -6
- data/src/core/lib/iomgr/{tcp_client_posix.c → tcp_client_posix.cc} +69 -70
- data/src/core/lib/iomgr/tcp_client_posix.h +11 -3
- data/src/core/lib/iomgr/{tcp_client_uv.c → tcp_client_uv.cc} +47 -48
- data/src/core/lib/iomgr/{tcp_client_windows.c → tcp_client_windows.cc} +46 -44
- data/src/core/lib/iomgr/{tcp_posix.c → tcp_posix.cc} +198 -175
- data/src/core/lib/iomgr/tcp_posix.h +15 -7
- data/src/core/lib/iomgr/tcp_server.h +31 -23
- data/src/core/lib/iomgr/{tcp_server_posix.c → tcp_server_posix.cc} +78 -77
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +27 -19
- data/src/core/lib/iomgr/{tcp_server_utils_posix_common.c → tcp_server_utils_posix_common.cc} +27 -27
- data/src/core/lib/iomgr/{tcp_server_utils_posix_ifaddrs.c → tcp_server_utils_posix_ifaddrs.cc} +25 -25
- data/src/core/lib/iomgr/{tcp_server_utils_posix_noifaddrs.c → tcp_server_utils_posix_noifaddrs.cc} +2 -2
- data/src/core/lib/iomgr/{tcp_server_uv.c → tcp_server_uv.cc} +133 -105
- data/src/core/lib/iomgr/{tcp_server_windows.c → tcp_server_windows.cc} +81 -77
- data/src/core/lib/iomgr/tcp_uv.cc +420 -0
- data/src/core/lib/iomgr/tcp_uv.h +18 -4
- data/src/core/lib/iomgr/{tcp_windows.c → tcp_windows.cc} +90 -79
- data/src/core/lib/iomgr/tcp_windows.h +17 -4
- data/src/core/lib/iomgr/{time_averaged_stats.c → time_averaged_stats.cc} +0 -0
- data/src/core/lib/iomgr/time_averaged_stats.h +8 -0
- data/src/core/lib/iomgr/timer.h +16 -9
- data/src/core/lib/iomgr/{timer_generic.c → timer_generic.cc} +130 -171
- data/src/core/lib/iomgr/timer_generic.h +4 -4
- data/src/core/lib/iomgr/{timer_heap.c → timer_heap.cc} +20 -21
- data/src/core/lib/iomgr/timer_heap.h +16 -8
- data/src/core/lib/iomgr/{timer_manager.c → timer_manager.cc} +54 -52
- data/src/core/lib/iomgr/timer_manager.h +8 -0
- data/src/core/lib/iomgr/{timer_uv.c → timer_uv.cc} +22 -24
- data/src/core/lib/iomgr/timer_uv.h +2 -2
- data/src/core/lib/iomgr/{udp_server.c → udp_server.cc} +75 -75
- data/src/core/lib/iomgr/udp_server.h +25 -17
- data/src/core/lib/iomgr/{unix_sockets_posix.c → unix_sockets_posix.cc} +22 -21
- data/src/core/lib/iomgr/unix_sockets_posix.h +14 -6
- data/src/core/lib/iomgr/{unix_sockets_posix_noop.c → unix_sockets_posix_noop.cc} +5 -5
- data/src/core/lib/iomgr/{wakeup_fd_cv.c → wakeup_fd_cv.cc} +2 -2
- data/src/core/lib/iomgr/wakeup_fd_cv.h +10 -0
- data/src/core/lib/iomgr/{wakeup_fd_eventfd.c → wakeup_fd_eventfd.cc} +0 -0
- data/src/core/lib/iomgr/{wakeup_fd_nospecial.c → wakeup_fd_nospecial.cc} +0 -0
- data/src/core/lib/iomgr/{wakeup_fd_pipe.c → wakeup_fd_pipe.cc} +1 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.h +9 -1
- data/src/core/lib/iomgr/{wakeup_fd_posix.c → wakeup_fd_posix.cc} +6 -7
- data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -0
- data/src/core/lib/json/{json.c → json.cc} +0 -0
- data/src/core/lib/json/json.h +8 -0
- data/src/core/lib/json/{json_reader.c → json_reader.cc} +18 -18
- data/src/core/lib/json/json_reader.h +26 -18
- data/src/core/lib/json/{json_string.c → json_string.cc} +57 -57
- data/src/core/lib/json/{json_writer.c → json_writer.cc} +20 -20
- data/src/core/lib/json/json_writer.h +23 -15
- data/src/core/lib/profiling/{basic_timers.c → basic_timers.cc} +34 -34
- data/src/core/lib/profiling/{stap_timers.c → stap_timers.cc} +5 -5
- data/src/core/lib/profiling/timers.h +6 -6
- data/src/core/lib/security/context/{security_context.c → security_context.cc} +98 -95
- data/src/core/lib/security/context/security_context.h +27 -29
- data/src/core/lib/security/credentials/composite/{composite_credentials.c → composite_credentials.cc} +79 -73
- data/src/core/lib/security/credentials/composite/composite_credentials.h +17 -9
- data/src/core/lib/security/credentials/{credentials.c → credentials.cc} +97 -92
- data/src/core/lib/security/credentials/credentials.h +83 -75
- data/src/core/lib/security/credentials/{credentials_metadata.c → credentials_metadata.cc} +7 -6
- data/src/core/lib/security/credentials/fake/{fake_credentials.c → fake_credentials.cc} +39 -36
- data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -5
- data/src/core/lib/security/credentials/google_default/{credentials_generic.c → credentials_generic.cc} +5 -5
- data/src/core/lib/security/credentials/google_default/{google_default_credentials.c → google_default_credentials.cc} +55 -55
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +9 -1
- data/src/core/lib/security/credentials/iam/{iam_credentials.c → iam_credentials.cc} +19 -18
- data/src/core/lib/security/credentials/jwt/{json_token.c → json_token.cc} +80 -75
- data/src/core/lib/security/credentials/jwt/json_token.h +23 -15
- data/src/core/lib/security/credentials/jwt/{jwt_credentials.c → jwt_credentials.cc} +45 -41
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +11 -3
- data/src/core/lib/security/credentials/jwt/{jwt_verifier.c → jwt_verifier.cc} +262 -252
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +38 -30
- data/src/core/lib/security/credentials/oauth2/{oauth2_credentials.c → oauth2_credentials.cc} +138 -141
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +30 -22
- data/src/core/lib/security/credentials/plugin/{plugin_credentials.c → plugin_credentials.cc} +52 -53
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +7 -7
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +344 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +27 -0
- data/src/core/lib/security/transport/auth_filters.h +16 -0
- data/src/core/lib/security/transport/{client_auth_filter.c → client_auth_filter.cc} +127 -115
- data/src/core/lib/security/transport/{lb_targets_info.c → lb_targets_info.cc} +16 -13
- data/src/core/lib/security/transport/lb_targets_info.h +11 -3
- data/src/core/lib/security/transport/{secure_endpoint.c → secure_endpoint.cc} +84 -76
- data/src/core/lib/security/transport/secure_endpoint.h +13 -5
- data/src/core/lib/security/transport/security_connector.cc +1121 -0
- data/src/core/lib/security/transport/security_connector.h +97 -79
- data/src/core/lib/security/transport/{security_handshaker.c → security_handshaker.cc} +139 -132
- data/src/core/lib/security/transport/security_handshaker.h +11 -3
- data/src/core/lib/security/transport/{server_auth_filter.c → server_auth_filter.cc} +68 -68
- data/src/core/lib/security/transport/{tsi_error.c → tsi_error.cc} +1 -1
- data/src/core/lib/security/transport/tsi_error.h +9 -1
- data/src/core/lib/security/util/{json_util.c → json_util.cc} +11 -11
- data/src/core/lib/security/util/json_util.h +12 -4
- data/src/core/lib/slice/{b64.c → b64.cc} +15 -15
- data/src/core/lib/slice/b64.h +12 -4
- data/src/core/lib/slice/{percent_encoding.c → percent_encoding.cc} +15 -15
- data/src/core/lib/slice/percent_encoding.h +11 -3
- data/src/core/lib/slice/{slice.c → slice.cc} +64 -64
- data/src/core/lib/slice/{slice_buffer.c → slice_buffer.cc} +38 -38
- data/src/core/lib/slice/{slice_hash_table.c → slice_hash_table.cc} +7 -7
- data/src/core/lib/slice/slice_hash_table.h +19 -11
- data/src/core/lib/slice/{slice_intern.c → slice_intern.cc} +35 -34
- data/src/core/lib/slice/slice_internal.h +17 -6
- data/src/core/lib/slice/{slice_string_helpers.c → slice_string_helpers.cc} +9 -9
- data/src/core/lib/slice/slice_string_helpers.h +3 -3
- data/src/core/lib/support/abstract.h +29 -0
- data/src/core/lib/support/{alloc.c → alloc.cc} +22 -22
- data/src/core/lib/support/{arena.c → arena.cc} +12 -12
- data/src/core/lib/support/arena.h +11 -3
- data/src/core/lib/support/{atm.c → atm.cc} +1 -1
- data/src/core/lib/support/{avl.c → avl.cc} +71 -70
- data/src/core/lib/support/{cmdline.c → cmdline.cc} +62 -62
- data/src/core/lib/support/{cpu_iphone.c → cpu_iphone.cc} +2 -0
- data/src/core/lib/support/{cpu_linux.c → cpu_linux.cc} +10 -0
- data/src/core/lib/support/{cpu_posix.c → cpu_posix.cc} +27 -4
- data/src/core/lib/support/{cpu_windows.c → cpu_windows.cc} +1 -0
- data/src/core/lib/support/env.h +3 -3
- data/src/core/lib/support/{env_linux.c → env_linux.cc} +11 -11
- data/src/core/lib/support/{env_posix.c → env_posix.cc} +4 -4
- data/src/core/lib/support/{env_windows.c → env_windows.cc} +5 -5
- data/src/core/lib/support/{fork.c → fork.cc} +2 -2
- data/src/core/lib/support/{histogram.c → histogram.cc} +25 -26
- data/src/core/lib/support/{host_port.c → host_port.cc} +16 -16
- data/src/core/lib/support/{log.c → log.cc} +8 -8
- data/src/core/lib/support/{log_android.c → log_android.cc} +7 -7
- data/src/core/lib/support/{log_linux.c → log_linux.cc} +8 -8
- data/src/core/lib/support/{log_posix.c → log_posix.cc} +9 -10
- data/src/core/lib/support/{log_windows.c → log_windows.cc} +7 -7
- data/src/core/lib/support/manual_constructor.h +211 -0
- data/src/core/lib/support/memory.h +41 -0
- data/src/core/lib/support/mpscq.cc +114 -0
- data/src/core/lib/support/mpscq.h +45 -7
- data/src/core/lib/support/{murmur_hash.c → murmur_hash.cc} +9 -12
- data/src/core/lib/support/murmur_hash.h +9 -1
- data/src/core/lib/support/spinlock.h +8 -1
- data/src/core/lib/support/{string.c → string.cc} +56 -55
- data/src/core/lib/support/string.h +21 -21
- data/src/core/lib/support/{string_posix.c → string_posix.cc} +5 -4
- data/src/core/lib/support/{string_util_windows.c → string_util_windows.cc} +9 -6
- data/src/core/lib/support/{string_windows.c → string_windows.cc} +3 -2
- data/src/core/lib/support/string_windows.h +8 -0
- data/src/core/lib/support/{subprocess_posix.c → subprocess_posix.cc} +13 -13
- data/src/core/lib/support/{subprocess_windows.c → subprocess_windows.cc} +9 -9
- data/src/core/lib/support/{sync.c → sync.cc} +22 -22
- data/src/core/lib/support/{sync_posix.c → sync_posix.cc} +6 -2
- data/src/core/lib/support/{sync_windows.c → sync_windows.cc} +14 -14
- data/src/core/lib/support/{thd.c → thd.cc} +0 -0
- data/src/core/lib/support/{thd_posix.c → thd_posix.cc} +10 -10
- data/src/core/lib/support/{thd_windows.c → thd_windows.cc} +10 -10
- data/src/core/lib/support/{time.c → time.cc} +0 -0
- data/src/core/lib/support/{time_posix.c → time_posix.cc} +5 -6
- data/src/core/lib/support/{time_precise.c → time_precise.cc} +6 -4
- data/src/core/lib/support/time_precise.h +9 -1
- data/src/core/lib/support/{time_windows.c → time_windows.cc} +2 -3
- data/src/core/lib/support/{tls_pthread.c → tls_pthread.cc} +2 -2
- data/src/core/lib/support/tmpfile.h +1 -1
- data/src/core/lib/support/{tmpfile_msys.c → tmpfile_msys.cc} +2 -2
- data/src/core/lib/support/{tmpfile_posix.c → tmpfile_posix.cc} +7 -7
- data/src/core/lib/support/{tmpfile_windows.c → tmpfile_windows.cc} +2 -2
- data/src/core/lib/support/{wrap_memcpy.c → wrap_memcpy.cc} +4 -2
- data/src/core/lib/surface/{alarm.c → alarm.cc} +32 -31
- data/src/core/lib/surface/alarm_internal.h +10 -2
- data/src/core/lib/surface/{api_trace.c → api_trace.cc} +1 -1
- data/src/core/lib/surface/api_trace.h +2 -2
- data/src/core/lib/surface/{byte_buffer.c → byte_buffer.cc} +13 -13
- data/src/core/lib/surface/{byte_buffer_reader.c → byte_buffer_reader.cc} +9 -9
- data/src/core/lib/surface/{call.c → call.cc} +379 -372
- data/src/core/lib/surface/call.h +37 -38
- data/src/core/lib/surface/{call_details.c → call_details.cc} +0 -0
- data/src/core/lib/surface/{call_log_batch.c → call_log_batch.cc} +13 -11
- data/src/core/lib/surface/call_test_only.h +5 -5
- data/src/core/lib/surface/{channel.c → channel.cc} +94 -95
- data/src/core/lib/surface/channel.h +29 -21
- data/src/core/lib/surface/{channel_init.c → channel_init.cc} +13 -13
- data/src/core/lib/surface/channel_init.h +6 -6
- data/src/core/lib/surface/{channel_ping.c → channel_ping.cc} +12 -12
- data/src/core/lib/surface/{channel_stack_type.c → channel_stack_type.cc} +1 -1
- data/src/core/lib/surface/channel_stack_type.h +9 -1
- data/src/core/lib/surface/{completion_queue.c → completion_queue.cc} +416 -379
- data/src/core/lib/surface/completion_queue.h +29 -29
- data/src/core/lib/surface/{completion_queue_factory.c → completion_queue_factory.cc} +1 -1
- data/src/core/lib/surface/completion_queue_factory.h +8 -0
- data/src/core/lib/surface/{event_string.c → event_string.cc} +9 -9
- data/src/core/lib/surface/event_string.h +9 -1
- data/src/core/lib/surface/{init.c → init.cc} +16 -39
- data/src/core/lib/surface/init.h +8 -0
- data/src/core/lib/surface/{init_secure.c → init_secure.cc} +12 -25
- data/src/core/lib/surface/lame_client.cc +38 -40
- data/src/core/lib/surface/lame_client.h +8 -0
- data/src/core/lib/surface/{metadata_array.c → metadata_array.cc} +0 -0
- data/src/core/lib/surface/{server.c → server.cc} +340 -404
- data/src/core/lib/surface/server.h +22 -14
- data/src/core/lib/surface/{validate_metadata.c → validate_metadata.cc} +10 -9
- data/src/core/lib/surface/validate_metadata.h +10 -2
- data/src/core/lib/surface/{version.c → version.cc} +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +84 -0
- data/src/core/lib/transport/bdp_estimator.h +67 -42
- data/src/core/lib/transport/{byte_stream.c → byte_stream.cc} +51 -51
- data/src/core/lib/transport/byte_stream.h +41 -33
- data/src/core/lib/transport/{connectivity_state.c → connectivity_state.cc} +36 -40
- data/src/core/lib/transport/connectivity_state.h +29 -21
- data/src/core/lib/transport/{error_utils.c → error_utils.cc} +26 -22
- data/src/core/lib/transport/error_utils.h +18 -6
- data/src/core/lib/transport/{metadata.c → metadata.cc} +92 -88
- data/src/core/lib/transport/metadata.h +22 -20
- data/src/core/lib/transport/{metadata_batch.c → metadata_batch.cc} +78 -79
- data/src/core/lib/transport/metadata_batch.h +46 -45
- data/src/core/lib/transport/pid_controller.cc +48 -0
- data/src/core/lib/transport/pid_controller.h +84 -32
- data/src/core/lib/transport/{service_config.c → service_config.cc} +66 -48
- data/src/core/lib/transport/service_config.h +11 -2
- data/src/core/lib/transport/{static_metadata.c → static_metadata.cc} +2 -2
- data/src/core/lib/transport/static_metadata.h +30 -23
- data/src/core/lib/transport/{status_conversion.c → status_conversion.cc} +4 -3
- data/src/core/lib/transport/status_conversion.h +12 -2
- data/src/core/lib/transport/{timeout_encoding.c → timeout_encoding.cc} +28 -61
- data/src/core/lib/transport/timeout_encoding.h +11 -2
- data/src/core/lib/transport/{transport.c → transport.cc} +79 -79
- data/src/core/lib/transport/transport.h +78 -80
- data/src/core/lib/transport/transport_impl.h +27 -19
- data/src/core/lib/transport/{transport_op_string.c → transport_op_string.cc} +32 -30
- data/src/core/plugin_registry/{grpc_plugin_registry.c → grpc_plugin_registry.cc} +34 -38
- data/src/core/tsi/{fake_transport_security.c → fake_transport_security.cc} +141 -132
- data/src/core/tsi/fake_transport_security.h +5 -5
- data/src/core/tsi/{gts_transport_security.c → gts_transport_security.cc} +4 -4
- data/src/core/tsi/gts_transport_security.h +11 -3
- data/src/core/tsi/{ssl_transport_security.c → ssl_transport_security.cc} +309 -300
- data/src/core/tsi/ssl_transport_security.h +25 -25
- data/src/core/tsi/ssl_types.h +8 -0
- data/src/core/tsi/{transport_security.c → transport_security.cc} +94 -87
- data/src/core/tsi/transport_security.h +55 -55
- data/src/core/tsi/{transport_security_adapter.c → transport_security_adapter.cc} +58 -55
- data/src/core/tsi/transport_security_adapter.h +2 -2
- data/src/core/tsi/{transport_security_grpc.c → transport_security_grpc.cc} +21 -21
- data/src/core/tsi/transport_security_grpc.h +19 -19
- data/src/core/tsi/transport_security_interface.h +41 -41
- data/src/ruby/ext/grpc/extconf.rb +4 -2
- data/src/ruby/ext/grpc/rb_byte_buffer.c +5 -5
- data/src/ruby/ext/grpc/rb_byte_buffer.h +2 -2
- data/src/ruby/ext/grpc/rb_call.c +41 -42
- data/src/ruby/ext/grpc/rb_call.h +6 -6
- data/src/ruby/ext/grpc/rb_call_credentials.c +30 -30
- data/src/ruby/ext/grpc/rb_channel.c +87 -87
- data/src/ruby/ext/grpc/rb_channel_credentials.c +23 -23
- data/src/ruby/ext/grpc/rb_completion_queue.c +11 -11
- data/src/ruby/ext/grpc/rb_completion_queue.h +3 -3
- data/src/ruby/ext/grpc/rb_compression_options.c +20 -20
- data/src/ruby/ext/grpc/rb_event_thread.c +14 -14
- data/src/ruby/ext/grpc/rb_event_thread.h +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +8 -8
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +16 -58
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +242 -306
- data/src/ruby/ext/grpc/rb_server.c +23 -23
- data/src/ruby/ext/grpc/rb_server_credentials.c +13 -13
- data/src/ruby/lib/grpc/generic/rpc_server.rb +25 -12
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/checker.rb +14 -0
- data/src/ruby/spec/pb/health/checker_spec.rb +29 -0
- data/third_party/cares/config_freebsd/ares_config.h +502 -0
- data/third_party/cares/config_openbsd/ares_config.h +502 -0
- metadata +302 -328
- data/src/core/ext/census/aggregation.h +0 -51
- data/src/core/ext/census/base_resources.c +0 -56
- data/src/core/ext/census/base_resources.h +0 -24
- data/src/core/ext/census/census_interface.h +0 -61
- data/src/core/ext/census/census_rpc_stats.h +0 -86
- data/src/core/ext/census/context.c +0 -496
- data/src/core/ext/census/gen/census.pb.c +0 -161
- data/src/core/ext/census/gen/census.pb.h +0 -280
- data/src/core/ext/census/gen/trace_context.pb.c +0 -39
- data/src/core/ext/census/gen/trace_context.pb.h +0 -78
- data/src/core/ext/census/grpc_filter.c +0 -196
- data/src/core/ext/census/grpc_plugin.c +0 -70
- data/src/core/ext/census/initialize.c +0 -51
- data/src/core/ext/census/intrusive_hash_map.c +0 -305
- data/src/core/ext/census/intrusive_hash_map.h +0 -152
- data/src/core/ext/census/intrusive_hash_map_internal.h +0 -48
- data/src/core/ext/census/mlog.c +0 -586
- data/src/core/ext/census/mlog.h +0 -80
- data/src/core/ext/census/operation.c +0 -48
- data/src/core/ext/census/placeholders.c +0 -49
- data/src/core/ext/census/resource.c +0 -303
- data/src/core/ext/census/resource.h +0 -48
- data/src/core/ext/census/rpc_metric_id.h +0 -36
- data/src/core/ext/census/trace_context.c +0 -71
- data/src/core/ext/census/trace_context.h +0 -56
- data/src/core/ext/census/trace_label.h +0 -46
- data/src/core/ext/census/trace_propagation.h +0 -48
- data/src/core/ext/census/trace_status.h +0 -30
- data/src/core/ext/census/trace_string.h +0 -35
- data/src/core/ext/census/tracing.c +0 -55
- data/src/core/ext/census/tracing.h +0 -109
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +0 -714
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +0 -924
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c +0 -60
- data/src/core/ext/transport/chttp2/transport/flow_control.c +0 -502
- data/src/core/ext/transport/chttp2/transport/writing.c +0 -534
- data/src/core/lib/debug/trace.c +0 -146
- data/src/core/lib/iomgr/closure.c +0 -219
- data/src/core/lib/iomgr/ev_epollex_linux.c +0 -1461
- data/src/core/lib/iomgr/ev_posix.c +0 -266
- data/src/core/lib/iomgr/exec_ctx.c +0 -113
- data/src/core/lib/iomgr/tcp_uv.c +0 -381
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +0 -194
- data/src/core/lib/security/transport/security_connector.c +0 -914
- data/src/core/lib/support/backoff.c +0 -72
- data/src/core/lib/support/backoff.h +0 -56
- data/src/core/lib/support/mpscq.c +0 -79
- data/src/core/lib/support/stack_lockfree.c +0 -137
- data/src/core/lib/support/stack_lockfree.h +0 -38
- data/src/core/lib/transport/bdp_estimator.c +0 -110
- data/src/core/lib/transport/pid_controller.c +0 -63
@@ -19,6 +19,10 @@
|
|
19
19
|
#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
|
20
20
|
#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
|
21
21
|
|
22
|
+
#ifdef __cplusplus
|
23
|
+
extern "C" {
|
24
|
+
#endif
|
25
|
+
|
22
26
|
#include <grpc/slice.h>
|
23
27
|
#include <openssl/rsa.h>
|
24
28
|
|
@@ -31,43 +35,47 @@
|
|
31
35
|
/* --- auth_json_key parsing. --- */
|
32
36
|
|
33
37
|
typedef struct {
|
34
|
-
const char
|
35
|
-
char
|
36
|
-
char
|
37
|
-
char
|
38
|
-
RSA
|
38
|
+
const char* type;
|
39
|
+
char* private_key_id;
|
40
|
+
char* client_id;
|
41
|
+
char* client_email;
|
42
|
+
RSA* private_key;
|
39
43
|
} grpc_auth_json_key;
|
40
44
|
|
41
45
|
/* Returns 1 if the object is valid, 0 otherwise. */
|
42
|
-
int grpc_auth_json_key_is_valid(const grpc_auth_json_key
|
46
|
+
int grpc_auth_json_key_is_valid(const grpc_auth_json_key* json_key);
|
43
47
|
|
44
48
|
/* Creates a json_key object from string. Returns an invalid object if a parsing
|
45
49
|
error has been encountered. */
|
46
50
|
grpc_auth_json_key grpc_auth_json_key_create_from_string(
|
47
|
-
const char
|
51
|
+
const char* json_string);
|
48
52
|
|
49
53
|
/* Creates a json_key object from parsed json. Returns an invalid object if a
|
50
54
|
parsing error has been encountered. */
|
51
|
-
grpc_auth_json_key grpc_auth_json_key_create_from_json(const grpc_json
|
55
|
+
grpc_auth_json_key grpc_auth_json_key_create_from_json(const grpc_json* json);
|
52
56
|
|
53
57
|
/* Destructs the object. */
|
54
|
-
void grpc_auth_json_key_destruct(grpc_auth_json_key
|
58
|
+
void grpc_auth_json_key_destruct(grpc_auth_json_key* json_key);
|
55
59
|
|
56
60
|
/* --- json token encoding and signing. --- */
|
57
61
|
|
58
62
|
/* Caller is responsible for calling gpr_free on the returned value. May return
|
59
63
|
NULL on invalid input. The scope parameter may be NULL. */
|
60
|
-
char
|
61
|
-
const char
|
62
|
-
gpr_timespec token_lifetime, const char
|
64
|
+
char* grpc_jwt_encode_and_sign(const grpc_auth_json_key* json_key,
|
65
|
+
const char* audience,
|
66
|
+
gpr_timespec token_lifetime, const char* scope);
|
63
67
|
|
64
68
|
/* Override encode_and_sign function for testing. */
|
65
|
-
typedef char
|
66
|
-
const grpc_auth_json_key
|
67
|
-
gpr_timespec token_lifetime, const char
|
69
|
+
typedef char* (*grpc_jwt_encode_and_sign_override)(
|
70
|
+
const grpc_auth_json_key* json_key, const char* audience,
|
71
|
+
gpr_timespec token_lifetime, const char* scope);
|
68
72
|
|
69
73
|
/* Set a custom encode_and_sign override for testing. */
|
70
74
|
void grpc_jwt_encode_and_sign_set_override(
|
71
75
|
grpc_jwt_encode_and_sign_override func);
|
72
76
|
|
77
|
+
#ifdef __cplusplus
|
78
|
+
}
|
79
|
+
#endif
|
80
|
+
|
73
81
|
#endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H */
|
@@ -16,8 +16,11 @@
|
|
16
16
|
*
|
17
17
|
*/
|
18
18
|
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
19
21
|
#include "src/core/lib/security/credentials/jwt/jwt_credentials.h"
|
20
22
|
|
23
|
+
#include <inttypes.h>
|
21
24
|
#include <string.h>
|
22
25
|
|
23
26
|
#include "src/core/lib/surface/api_trace.h"
|
@@ -27,35 +30,35 @@
|
|
27
30
|
#include <grpc/support/string_util.h>
|
28
31
|
#include <grpc/support/sync.h>
|
29
32
|
|
30
|
-
static void jwt_reset_cache(grpc_exec_ctx
|
31
|
-
grpc_service_account_jwt_access_credentials
|
33
|
+
static void jwt_reset_cache(grpc_exec_ctx* exec_ctx,
|
34
|
+
grpc_service_account_jwt_access_credentials* c) {
|
32
35
|
GRPC_MDELEM_UNREF(exec_ctx, c->cached.jwt_md);
|
33
36
|
c->cached.jwt_md = GRPC_MDNULL;
|
34
|
-
if (c->cached.service_url !=
|
37
|
+
if (c->cached.service_url != nullptr) {
|
35
38
|
gpr_free(c->cached.service_url);
|
36
|
-
c->cached.service_url =
|
39
|
+
c->cached.service_url = nullptr;
|
37
40
|
}
|
38
41
|
c->cached.jwt_expiration = gpr_inf_past(GPR_CLOCK_REALTIME);
|
39
42
|
}
|
40
43
|
|
41
|
-
static void jwt_destruct(grpc_exec_ctx
|
42
|
-
grpc_call_credentials
|
43
|
-
grpc_service_account_jwt_access_credentials
|
44
|
-
(grpc_service_account_jwt_access_credentials
|
44
|
+
static void jwt_destruct(grpc_exec_ctx* exec_ctx,
|
45
|
+
grpc_call_credentials* creds) {
|
46
|
+
grpc_service_account_jwt_access_credentials* c =
|
47
|
+
(grpc_service_account_jwt_access_credentials*)creds;
|
45
48
|
grpc_auth_json_key_destruct(&c->key);
|
46
49
|
jwt_reset_cache(exec_ctx, c);
|
47
50
|
gpr_mu_destroy(&c->cache_mu);
|
48
51
|
}
|
49
52
|
|
50
|
-
static bool jwt_get_request_metadata(grpc_exec_ctx
|
51
|
-
grpc_call_credentials
|
52
|
-
grpc_polling_entity
|
53
|
+
static bool jwt_get_request_metadata(grpc_exec_ctx* exec_ctx,
|
54
|
+
grpc_call_credentials* creds,
|
55
|
+
grpc_polling_entity* pollent,
|
53
56
|
grpc_auth_metadata_context context,
|
54
|
-
grpc_credentials_mdelem_array
|
55
|
-
grpc_closure
|
56
|
-
grpc_error
|
57
|
-
grpc_service_account_jwt_access_credentials
|
58
|
-
(grpc_service_account_jwt_access_credentials
|
57
|
+
grpc_credentials_mdelem_array* md_array,
|
58
|
+
grpc_closure* on_request_metadata,
|
59
|
+
grpc_error** error) {
|
60
|
+
grpc_service_account_jwt_access_credentials* c =
|
61
|
+
(grpc_service_account_jwt_access_credentials*)creds;
|
59
62
|
gpr_timespec refresh_threshold = gpr_time_from_seconds(
|
60
63
|
GRPC_SECURE_TOKEN_REFRESH_THRESHOLD_SECS, GPR_TIMESPAN);
|
61
64
|
|
@@ -63,7 +66,7 @@ static bool jwt_get_request_metadata(grpc_exec_ctx *exec_ctx,
|
|
63
66
|
grpc_mdelem jwt_md = GRPC_MDNULL;
|
64
67
|
{
|
65
68
|
gpr_mu_lock(&c->cache_mu);
|
66
|
-
if (c->cached.service_url !=
|
69
|
+
if (c->cached.service_url != nullptr &&
|
67
70
|
strcmp(c->cached.service_url, context.service_url) == 0 &&
|
68
71
|
!GRPC_MDISNULL(c->cached.jwt_md) &&
|
69
72
|
(gpr_time_cmp(gpr_time_sub(c->cached.jwt_expiration,
|
@@ -75,14 +78,14 @@ static bool jwt_get_request_metadata(grpc_exec_ctx *exec_ctx,
|
|
75
78
|
}
|
76
79
|
|
77
80
|
if (GRPC_MDISNULL(jwt_md)) {
|
78
|
-
char
|
81
|
+
char* jwt = nullptr;
|
79
82
|
/* Generate a new jwt. */
|
80
83
|
gpr_mu_lock(&c->cache_mu);
|
81
84
|
jwt_reset_cache(exec_ctx, c);
|
82
85
|
jwt = grpc_jwt_encode_and_sign(&c->key, context.service_url,
|
83
|
-
c->jwt_lifetime,
|
84
|
-
if (jwt !=
|
85
|
-
char
|
86
|
+
c->jwt_lifetime, nullptr);
|
87
|
+
if (jwt != nullptr) {
|
88
|
+
char* md_value;
|
86
89
|
gpr_asprintf(&md_value, "Bearer %s", jwt);
|
87
90
|
gpr_free(jwt);
|
88
91
|
c->cached.jwt_expiration =
|
@@ -108,24 +111,25 @@ static bool jwt_get_request_metadata(grpc_exec_ctx *exec_ctx,
|
|
108
111
|
}
|
109
112
|
|
110
113
|
static void jwt_cancel_get_request_metadata(
|
111
|
-
grpc_exec_ctx
|
112
|
-
grpc_credentials_mdelem_array
|
114
|
+
grpc_exec_ctx* exec_ctx, grpc_call_credentials* c,
|
115
|
+
grpc_credentials_mdelem_array* md_array, grpc_error* error) {
|
113
116
|
GRPC_ERROR_UNREF(error);
|
114
117
|
}
|
115
118
|
|
116
119
|
static grpc_call_credentials_vtable jwt_vtable = {
|
117
120
|
jwt_destruct, jwt_get_request_metadata, jwt_cancel_get_request_metadata};
|
118
121
|
|
119
|
-
grpc_call_credentials
|
122
|
+
grpc_call_credentials*
|
120
123
|
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
121
|
-
grpc_exec_ctx
|
124
|
+
grpc_exec_ctx* exec_ctx, grpc_auth_json_key key,
|
122
125
|
gpr_timespec token_lifetime) {
|
123
|
-
grpc_service_account_jwt_access_credentials
|
126
|
+
grpc_service_account_jwt_access_credentials* c;
|
124
127
|
if (!grpc_auth_json_key_is_valid(&key)) {
|
125
128
|
gpr_log(GPR_ERROR, "Invalid input for jwt credentials creation");
|
126
|
-
return
|
129
|
+
return nullptr;
|
127
130
|
}
|
128
|
-
c =
|
131
|
+
c = (grpc_service_account_jwt_access_credentials*)gpr_zalloc(
|
132
|
+
sizeof(grpc_service_account_jwt_access_credentials));
|
129
133
|
c->base.type = GRPC_CALL_CREDENTIALS_TYPE_JWT;
|
130
134
|
gpr_ref_init(&c->base.refcount, 1);
|
131
135
|
c->base.vtable = &jwt_vtable;
|
@@ -143,33 +147,33 @@ grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
|
143
147
|
return &c->base;
|
144
148
|
}
|
145
149
|
|
146
|
-
static char
|
147
|
-
char
|
148
|
-
grpc_json
|
150
|
+
static char* redact_private_key(const char* json_key) {
|
151
|
+
char* json_copy = gpr_strdup(json_key);
|
152
|
+
grpc_json* json = grpc_json_parse_string(json_copy);
|
149
153
|
if (!json) {
|
150
154
|
gpr_free(json_copy);
|
151
155
|
return gpr_strdup("<Json failed to parse.>");
|
152
156
|
}
|
153
|
-
const char
|
154
|
-
grpc_json
|
157
|
+
const char* redacted = "<redacted>";
|
158
|
+
grpc_json* current = json->child;
|
155
159
|
while (current) {
|
156
160
|
if (current->type == GRPC_JSON_STRING &&
|
157
161
|
strcmp(current->key, "private_key") == 0) {
|
158
|
-
current->value = (char
|
162
|
+
current->value = (char*)redacted;
|
159
163
|
break;
|
160
164
|
}
|
161
165
|
current = current->next;
|
162
166
|
}
|
163
|
-
char
|
167
|
+
char* clean_json = grpc_json_dump_to_string(json, 2);
|
164
168
|
gpr_free(json_copy);
|
165
169
|
grpc_json_destroy(json);
|
166
170
|
return clean_json;
|
167
171
|
}
|
168
172
|
|
169
|
-
grpc_call_credentials
|
170
|
-
const char
|
171
|
-
if (
|
172
|
-
char
|
173
|
+
grpc_call_credentials* grpc_service_account_jwt_access_credentials_create(
|
174
|
+
const char* json_key, gpr_timespec token_lifetime, void* reserved) {
|
175
|
+
if (grpc_api_trace.enabled()) {
|
176
|
+
char* clean_json = redact_private_key(json_key);
|
173
177
|
gpr_log(GPR_INFO,
|
174
178
|
"grpc_service_account_jwt_access_credentials_create("
|
175
179
|
"json_key=%s, "
|
@@ -181,9 +185,9 @@ grpc_call_credentials *grpc_service_account_jwt_access_credentials_create(
|
|
181
185
|
(int)token_lifetime.clock_type, reserved);
|
182
186
|
gpr_free(clean_json);
|
183
187
|
}
|
184
|
-
GPR_ASSERT(reserved ==
|
188
|
+
GPR_ASSERT(reserved == nullptr);
|
185
189
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
186
|
-
grpc_call_credentials
|
190
|
+
grpc_call_credentials* creds =
|
187
191
|
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
188
192
|
&exec_ctx, grpc_auth_json_key_create_from_string(json_key),
|
189
193
|
token_lifetime);
|
@@ -22,6 +22,10 @@
|
|
22
22
|
#include "src/core/lib/security/credentials/credentials.h"
|
23
23
|
#include "src/core/lib/security/credentials/jwt/json_token.h"
|
24
24
|
|
25
|
+
#ifdef __cplusplus
|
26
|
+
extern "C" {
|
27
|
+
#endif
|
28
|
+
|
25
29
|
typedef struct {
|
26
30
|
grpc_call_credentials base;
|
27
31
|
|
@@ -30,7 +34,7 @@ typedef struct {
|
|
30
34
|
gpr_mu cache_mu;
|
31
35
|
struct {
|
32
36
|
grpc_mdelem jwt_md;
|
33
|
-
char
|
37
|
+
char* service_url;
|
34
38
|
gpr_timespec jwt_expiration;
|
35
39
|
} cached;
|
36
40
|
|
@@ -40,9 +44,13 @@ typedef struct {
|
|
40
44
|
|
41
45
|
// Private constructor for jwt credentials from an already parsed json key.
|
42
46
|
// Takes ownership of the key.
|
43
|
-
grpc_call_credentials
|
47
|
+
grpc_call_credentials*
|
44
48
|
grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
|
45
|
-
grpc_exec_ctx
|
49
|
+
grpc_exec_ctx* exec_ctx, grpc_auth_json_key key,
|
46
50
|
gpr_timespec token_lifetime);
|
47
51
|
|
52
|
+
#ifdef __cplusplus
|
53
|
+
}
|
54
|
+
#endif
|
55
|
+
|
48
56
|
#endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JWT_CREDENTIALS_H */
|
@@ -26,7 +26,10 @@
|
|
26
26
|
#include <grpc/support/string_util.h>
|
27
27
|
#include <grpc/support/sync.h>
|
28
28
|
#include <grpc/support/useful.h>
|
29
|
+
|
30
|
+
extern "C" {
|
29
31
|
#include <openssl/pem.h>
|
32
|
+
}
|
30
33
|
|
31
34
|
#include "src/core/lib/http/httpcli.h"
|
32
35
|
#include "src/core/lib/iomgr/polling_entity.h"
|
@@ -37,7 +40,7 @@
|
|
37
40
|
|
38
41
|
/* --- Utils. --- */
|
39
42
|
|
40
|
-
const char
|
43
|
+
const char* grpc_jwt_verifier_status_to_string(
|
41
44
|
grpc_jwt_verifier_status status) {
|
42
45
|
switch (status) {
|
43
46
|
case GRPC_JWT_VERIFIER_OK:
|
@@ -59,7 +62,7 @@ const char *grpc_jwt_verifier_status_to_string(
|
|
59
62
|
}
|
60
63
|
}
|
61
64
|
|
62
|
-
static const EVP_MD
|
65
|
+
static const EVP_MD* evp_md_from_alg(const char* alg) {
|
63
66
|
if (strcmp(alg, "RS256") == 0) {
|
64
67
|
return EVP_sha256();
|
65
68
|
} else if (strcmp(alg, "RS384") == 0) {
|
@@ -67,91 +70,91 @@ static const EVP_MD *evp_md_from_alg(const char *alg) {
|
|
67
70
|
} else if (strcmp(alg, "RS512") == 0) {
|
68
71
|
return EVP_sha512();
|
69
72
|
} else {
|
70
|
-
return
|
73
|
+
return nullptr;
|
71
74
|
}
|
72
75
|
}
|
73
76
|
|
74
|
-
static grpc_json
|
75
|
-
const char
|
76
|
-
grpc_slice
|
77
|
-
grpc_json
|
77
|
+
static grpc_json* parse_json_part_from_jwt(grpc_exec_ctx* exec_ctx,
|
78
|
+
const char* str, size_t len,
|
79
|
+
grpc_slice* buffer) {
|
80
|
+
grpc_json* json;
|
78
81
|
|
79
82
|
*buffer = grpc_base64_decode_with_len(exec_ctx, str, len, 1);
|
80
83
|
if (GRPC_SLICE_IS_EMPTY(*buffer)) {
|
81
84
|
gpr_log(GPR_ERROR, "Invalid base64.");
|
82
|
-
return
|
85
|
+
return nullptr;
|
83
86
|
}
|
84
|
-
json = grpc_json_parse_string_with_len((char
|
87
|
+
json = grpc_json_parse_string_with_len((char*)GRPC_SLICE_START_PTR(*buffer),
|
85
88
|
GRPC_SLICE_LENGTH(*buffer));
|
86
|
-
if (json ==
|
89
|
+
if (json == nullptr) {
|
87
90
|
grpc_slice_unref_internal(exec_ctx, *buffer);
|
88
91
|
gpr_log(GPR_ERROR, "JSON parsing error.");
|
89
92
|
}
|
90
93
|
return json;
|
91
94
|
}
|
92
95
|
|
93
|
-
static const char
|
94
|
-
const char
|
96
|
+
static const char* validate_string_field(const grpc_json* json,
|
97
|
+
const char* key) {
|
95
98
|
if (json->type != GRPC_JSON_STRING) {
|
96
99
|
gpr_log(GPR_ERROR, "Invalid %s field [%s]", key, json->value);
|
97
|
-
return
|
100
|
+
return nullptr;
|
98
101
|
}
|
99
102
|
return json->value;
|
100
103
|
}
|
101
104
|
|
102
|
-
static gpr_timespec validate_time_field(const grpc_json
|
103
|
-
const char
|
105
|
+
static gpr_timespec validate_time_field(const grpc_json* json,
|
106
|
+
const char* key) {
|
104
107
|
gpr_timespec result = gpr_time_0(GPR_CLOCK_REALTIME);
|
105
108
|
if (json->type != GRPC_JSON_NUMBER) {
|
106
109
|
gpr_log(GPR_ERROR, "Invalid %s field [%s]", key, json->value);
|
107
110
|
return result;
|
108
111
|
}
|
109
|
-
result.tv_sec = strtol(json->value,
|
112
|
+
result.tv_sec = strtol(json->value, nullptr, 10);
|
110
113
|
return result;
|
111
114
|
}
|
112
115
|
|
113
116
|
/* --- JOSE header. see http://tools.ietf.org/html/rfc7515#section-4 --- */
|
114
117
|
|
115
118
|
typedef struct {
|
116
|
-
const char
|
117
|
-
const char
|
118
|
-
const char
|
119
|
+
const char* alg;
|
120
|
+
const char* kid;
|
121
|
+
const char* typ;
|
119
122
|
/* TODO(jboeuf): Add others as needed (jku, jwk, x5u, x5c and so on...). */
|
120
123
|
grpc_slice buffer;
|
121
124
|
} jose_header;
|
122
125
|
|
123
|
-
static void jose_header_destroy(grpc_exec_ctx
|
126
|
+
static void jose_header_destroy(grpc_exec_ctx* exec_ctx, jose_header* h) {
|
124
127
|
grpc_slice_unref_internal(exec_ctx, h->buffer);
|
125
128
|
gpr_free(h);
|
126
129
|
}
|
127
130
|
|
128
131
|
/* Takes ownership of json and buffer. */
|
129
|
-
static jose_header
|
130
|
-
grpc_json
|
131
|
-
grpc_json
|
132
|
-
jose_header
|
132
|
+
static jose_header* jose_header_from_json(grpc_exec_ctx* exec_ctx,
|
133
|
+
grpc_json* json, grpc_slice buffer) {
|
134
|
+
grpc_json* cur;
|
135
|
+
jose_header* h = (jose_header*)gpr_zalloc(sizeof(jose_header));
|
133
136
|
h->buffer = buffer;
|
134
|
-
for (cur = json->child; cur !=
|
137
|
+
for (cur = json->child; cur != nullptr; cur = cur->next) {
|
135
138
|
if (strcmp(cur->key, "alg") == 0) {
|
136
139
|
/* We only support RSA-1.5 signatures for now.
|
137
140
|
Beware of this if we add HMAC support:
|
138
141
|
https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
|
139
142
|
*/
|
140
143
|
if (cur->type != GRPC_JSON_STRING || strncmp(cur->value, "RS", 2) ||
|
141
|
-
evp_md_from_alg(cur->value) ==
|
144
|
+
evp_md_from_alg(cur->value) == nullptr) {
|
142
145
|
gpr_log(GPR_ERROR, "Invalid alg field [%s]", cur->value);
|
143
146
|
goto error;
|
144
147
|
}
|
145
148
|
h->alg = cur->value;
|
146
149
|
} else if (strcmp(cur->key, "typ") == 0) {
|
147
150
|
h->typ = validate_string_field(cur, "typ");
|
148
|
-
if (h->typ ==
|
151
|
+
if (h->typ == nullptr) goto error;
|
149
152
|
} else if (strcmp(cur->key, "kid") == 0) {
|
150
153
|
h->kid = validate_string_field(cur, "kid");
|
151
|
-
if (h->kid ==
|
154
|
+
if (h->kid == nullptr) goto error;
|
152
155
|
}
|
153
156
|
}
|
154
|
-
if (h->alg ==
|
157
|
+
if (h->alg == nullptr) {
|
155
158
|
gpr_log(GPR_ERROR, "Missing alg field.");
|
156
159
|
goto error;
|
157
160
|
}
|
@@ -162,76 +165,77 @@ static jose_header *jose_header_from_json(grpc_exec_ctx *exec_ctx,
|
|
162
165
|
error:
|
163
166
|
grpc_json_destroy(json);
|
164
167
|
jose_header_destroy(exec_ctx, h);
|
165
|
-
return
|
168
|
+
return nullptr;
|
166
169
|
}
|
167
170
|
|
168
171
|
/* --- JWT claims. see http://tools.ietf.org/html/rfc7519#section-4.1 */
|
169
172
|
|
170
173
|
struct grpc_jwt_claims {
|
171
174
|
/* Well known properties already parsed. */
|
172
|
-
const char
|
173
|
-
const char
|
174
|
-
const char
|
175
|
-
const char
|
175
|
+
const char* sub;
|
176
|
+
const char* iss;
|
177
|
+
const char* aud;
|
178
|
+
const char* jti;
|
176
179
|
gpr_timespec iat;
|
177
180
|
gpr_timespec exp;
|
178
181
|
gpr_timespec nbf;
|
179
182
|
|
180
|
-
grpc_json
|
183
|
+
grpc_json* json;
|
181
184
|
grpc_slice buffer;
|
182
185
|
};
|
183
186
|
|
184
|
-
void grpc_jwt_claims_destroy(grpc_exec_ctx
|
187
|
+
void grpc_jwt_claims_destroy(grpc_exec_ctx* exec_ctx, grpc_jwt_claims* claims) {
|
185
188
|
grpc_json_destroy(claims->json);
|
186
189
|
grpc_slice_unref_internal(exec_ctx, claims->buffer);
|
187
190
|
gpr_free(claims);
|
188
191
|
}
|
189
192
|
|
190
|
-
const grpc_json
|
191
|
-
if (claims ==
|
193
|
+
const grpc_json* grpc_jwt_claims_json(const grpc_jwt_claims* claims) {
|
194
|
+
if (claims == nullptr) return nullptr;
|
192
195
|
return claims->json;
|
193
196
|
}
|
194
197
|
|
195
|
-
const char
|
196
|
-
if (claims ==
|
198
|
+
const char* grpc_jwt_claims_subject(const grpc_jwt_claims* claims) {
|
199
|
+
if (claims == nullptr) return nullptr;
|
197
200
|
return claims->sub;
|
198
201
|
}
|
199
202
|
|
200
|
-
const char
|
201
|
-
if (claims ==
|
203
|
+
const char* grpc_jwt_claims_issuer(const grpc_jwt_claims* claims) {
|
204
|
+
if (claims == nullptr) return nullptr;
|
202
205
|
return claims->iss;
|
203
206
|
}
|
204
207
|
|
205
|
-
const char
|
206
|
-
if (claims ==
|
208
|
+
const char* grpc_jwt_claims_id(const grpc_jwt_claims* claims) {
|
209
|
+
if (claims == nullptr) return nullptr;
|
207
210
|
return claims->jti;
|
208
211
|
}
|
209
212
|
|
210
|
-
const char
|
211
|
-
if (claims ==
|
213
|
+
const char* grpc_jwt_claims_audience(const grpc_jwt_claims* claims) {
|
214
|
+
if (claims == nullptr) return nullptr;
|
212
215
|
return claims->aud;
|
213
216
|
}
|
214
217
|
|
215
|
-
gpr_timespec grpc_jwt_claims_issued_at(const grpc_jwt_claims
|
216
|
-
if (claims ==
|
218
|
+
gpr_timespec grpc_jwt_claims_issued_at(const grpc_jwt_claims* claims) {
|
219
|
+
if (claims == nullptr) return gpr_inf_past(GPR_CLOCK_REALTIME);
|
217
220
|
return claims->iat;
|
218
221
|
}
|
219
222
|
|
220
|
-
gpr_timespec grpc_jwt_claims_expires_at(const grpc_jwt_claims
|
221
|
-
if (claims ==
|
223
|
+
gpr_timespec grpc_jwt_claims_expires_at(const grpc_jwt_claims* claims) {
|
224
|
+
if (claims == nullptr) return gpr_inf_future(GPR_CLOCK_REALTIME);
|
222
225
|
return claims->exp;
|
223
226
|
}
|
224
227
|
|
225
|
-
gpr_timespec grpc_jwt_claims_not_before(const grpc_jwt_claims
|
226
|
-
if (claims ==
|
228
|
+
gpr_timespec grpc_jwt_claims_not_before(const grpc_jwt_claims* claims) {
|
229
|
+
if (claims == nullptr) return gpr_inf_past(GPR_CLOCK_REALTIME);
|
227
230
|
return claims->nbf;
|
228
231
|
}
|
229
232
|
|
230
233
|
/* Takes ownership of json and buffer even in case of failure. */
|
231
|
-
grpc_jwt_claims
|
232
|
-
grpc_json
|
233
|
-
grpc_json
|
234
|
-
grpc_jwt_claims
|
234
|
+
grpc_jwt_claims* grpc_jwt_claims_from_json(grpc_exec_ctx* exec_ctx,
|
235
|
+
grpc_json* json, grpc_slice buffer) {
|
236
|
+
grpc_json* cur;
|
237
|
+
grpc_jwt_claims* claims =
|
238
|
+
(grpc_jwt_claims*)gpr_malloc(sizeof(grpc_jwt_claims));
|
235
239
|
memset(claims, 0, sizeof(grpc_jwt_claims));
|
236
240
|
claims->json = json;
|
237
241
|
claims->buffer = buffer;
|
@@ -240,19 +244,19 @@ grpc_jwt_claims *grpc_jwt_claims_from_json(grpc_exec_ctx *exec_ctx,
|
|
240
244
|
claims->exp = gpr_inf_future(GPR_CLOCK_REALTIME);
|
241
245
|
|
242
246
|
/* Per the spec, all fields are optional. */
|
243
|
-
for (cur = json->child; cur !=
|
247
|
+
for (cur = json->child; cur != nullptr; cur = cur->next) {
|
244
248
|
if (strcmp(cur->key, "sub") == 0) {
|
245
249
|
claims->sub = validate_string_field(cur, "sub");
|
246
|
-
if (claims->sub ==
|
250
|
+
if (claims->sub == nullptr) goto error;
|
247
251
|
} else if (strcmp(cur->key, "iss") == 0) {
|
248
252
|
claims->iss = validate_string_field(cur, "iss");
|
249
|
-
if (claims->iss ==
|
253
|
+
if (claims->iss == nullptr) goto error;
|
250
254
|
} else if (strcmp(cur->key, "aud") == 0) {
|
251
255
|
claims->aud = validate_string_field(cur, "aud");
|
252
|
-
if (claims->aud ==
|
256
|
+
if (claims->aud == nullptr) goto error;
|
253
257
|
} else if (strcmp(cur->key, "jti") == 0) {
|
254
258
|
claims->jti = validate_string_field(cur, "jti");
|
255
|
-
if (claims->jti ==
|
259
|
+
if (claims->jti == nullptr) goto error;
|
256
260
|
} else if (strcmp(cur->key, "iat") == 0) {
|
257
261
|
claims->iat = validate_time_field(cur, "iat");
|
258
262
|
if (gpr_time_cmp(claims->iat, gpr_time_0(GPR_CLOCK_REALTIME)) == 0)
|
@@ -271,15 +275,15 @@ grpc_jwt_claims *grpc_jwt_claims_from_json(grpc_exec_ctx *exec_ctx,
|
|
271
275
|
|
272
276
|
error:
|
273
277
|
grpc_jwt_claims_destroy(exec_ctx, claims);
|
274
|
-
return
|
278
|
+
return nullptr;
|
275
279
|
}
|
276
280
|
|
277
|
-
grpc_jwt_verifier_status grpc_jwt_claims_check(const grpc_jwt_claims
|
278
|
-
const char
|
281
|
+
grpc_jwt_verifier_status grpc_jwt_claims_check(const grpc_jwt_claims* claims,
|
282
|
+
const char* audience) {
|
279
283
|
gpr_timespec skewed_now;
|
280
284
|
int audience_ok;
|
281
285
|
|
282
|
-
GPR_ASSERT(claims !=
|
286
|
+
GPR_ASSERT(claims != nullptr);
|
283
287
|
|
284
288
|
skewed_now =
|
285
289
|
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_clock_skew);
|
@@ -297,23 +301,23 @@ grpc_jwt_verifier_status grpc_jwt_claims_check(const grpc_jwt_claims *claims,
|
|
297
301
|
/* This should be probably up to the upper layer to decide but let's harcode
|
298
302
|
the 99% use case here for email issuers, where the JWT must be self
|
299
303
|
issued. */
|
300
|
-
if (grpc_jwt_issuer_email_domain(claims->iss) !=
|
301
|
-
claims->sub !=
|
304
|
+
if (grpc_jwt_issuer_email_domain(claims->iss) != nullptr &&
|
305
|
+
claims->sub != nullptr && strcmp(claims->iss, claims->sub) != 0) {
|
302
306
|
gpr_log(GPR_ERROR,
|
303
307
|
"Email issuer (%s) cannot assert another subject (%s) than itself.",
|
304
308
|
claims->iss, claims->sub);
|
305
309
|
return GRPC_JWT_VERIFIER_BAD_SUBJECT;
|
306
310
|
}
|
307
311
|
|
308
|
-
if (audience ==
|
309
|
-
audience_ok = claims->aud ==
|
312
|
+
if (audience == nullptr) {
|
313
|
+
audience_ok = claims->aud == nullptr;
|
310
314
|
} else {
|
311
|
-
audience_ok = claims->aud !=
|
315
|
+
audience_ok = claims->aud != nullptr && strcmp(audience, claims->aud) == 0;
|
312
316
|
}
|
313
317
|
if (!audience_ok) {
|
314
318
|
gpr_log(GPR_ERROR, "Audience mismatch: expected %s and found %s.",
|
315
|
-
audience ==
|
316
|
-
claims->aud ==
|
319
|
+
audience == nullptr ? "NULL" : audience,
|
320
|
+
claims->aud == nullptr ? "NULL" : claims->aud);
|
317
321
|
return GRPC_JWT_VERIFIER_BAD_AUDIENCE;
|
318
322
|
}
|
319
323
|
return GRPC_JWT_VERIFIER_OK;
|
@@ -328,26 +332,26 @@ typedef enum {
|
|
328
332
|
} http_response_index;
|
329
333
|
|
330
334
|
typedef struct {
|
331
|
-
grpc_jwt_verifier
|
335
|
+
grpc_jwt_verifier* verifier;
|
332
336
|
grpc_polling_entity pollent;
|
333
|
-
jose_header
|
334
|
-
grpc_jwt_claims
|
335
|
-
char
|
337
|
+
jose_header* header;
|
338
|
+
grpc_jwt_claims* claims;
|
339
|
+
char* audience;
|
336
340
|
grpc_slice signature;
|
337
341
|
grpc_slice signed_data;
|
338
|
-
void
|
342
|
+
void* user_data;
|
339
343
|
grpc_jwt_verification_done_cb user_cb;
|
340
344
|
grpc_http_response responses[HTTP_RESPONSE_COUNT];
|
341
345
|
} verifier_cb_ctx;
|
342
346
|
|
343
347
|
/* Takes ownership of the header, claims and signature. */
|
344
|
-
static verifier_cb_ctx
|
345
|
-
grpc_jwt_verifier
|
346
|
-
grpc_jwt_claims
|
347
|
-
const char
|
348
|
+
static verifier_cb_ctx* verifier_cb_ctx_create(
|
349
|
+
grpc_jwt_verifier* verifier, grpc_pollset* pollset, jose_header* header,
|
350
|
+
grpc_jwt_claims* claims, const char* audience, grpc_slice signature,
|
351
|
+
const char* signed_jwt, size_t signed_jwt_len, void* user_data,
|
348
352
|
grpc_jwt_verification_done_cb cb) {
|
349
353
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
350
|
-
verifier_cb_ctx
|
354
|
+
verifier_cb_ctx* ctx = (verifier_cb_ctx*)gpr_zalloc(sizeof(verifier_cb_ctx));
|
351
355
|
ctx->verifier = verifier;
|
352
356
|
ctx->pollent = grpc_polling_entity_create_from_pollset(pollset);
|
353
357
|
ctx->header = header;
|
@@ -361,9 +365,9 @@ static verifier_cb_ctx *verifier_cb_ctx_create(
|
|
361
365
|
return ctx;
|
362
366
|
}
|
363
367
|
|
364
|
-
void verifier_cb_ctx_destroy(grpc_exec_ctx
|
365
|
-
if (ctx->audience !=
|
366
|
-
if (ctx->claims !=
|
368
|
+
void verifier_cb_ctx_destroy(grpc_exec_ctx* exec_ctx, verifier_cb_ctx* ctx) {
|
369
|
+
if (ctx->audience != nullptr) gpr_free(ctx->audience);
|
370
|
+
if (ctx->claims != nullptr) grpc_jwt_claims_destroy(exec_ctx, ctx->claims);
|
367
371
|
grpc_slice_unref_internal(exec_ctx, ctx->signature);
|
368
372
|
grpc_slice_unref_internal(exec_ctx, ctx->signed_data);
|
369
373
|
jose_header_destroy(exec_ctx, ctx->header);
|
@@ -380,63 +384,63 @@ void verifier_cb_ctx_destroy(grpc_exec_ctx *exec_ctx, verifier_cb_ctx *ctx) {
|
|
380
384
|
gpr_timespec grpc_jwt_verifier_clock_skew = {60, 0, GPR_TIMESPAN};
|
381
385
|
|
382
386
|
/* Max delay defaults to one minute. */
|
383
|
-
|
387
|
+
grpc_millis grpc_jwt_verifier_max_delay = 60 * GPR_MS_PER_SEC;
|
384
388
|
|
385
389
|
typedef struct {
|
386
|
-
char
|
387
|
-
char
|
390
|
+
char* email_domain;
|
391
|
+
char* key_url_prefix;
|
388
392
|
} email_key_mapping;
|
389
393
|
|
390
394
|
struct grpc_jwt_verifier {
|
391
|
-
email_key_mapping
|
395
|
+
email_key_mapping* mappings;
|
392
396
|
size_t num_mappings; /* Should be very few, linear search ok. */
|
393
397
|
size_t allocated_mappings;
|
394
398
|
grpc_httpcli_context http_ctx;
|
395
399
|
};
|
396
400
|
|
397
|
-
static grpc_json
|
398
|
-
grpc_json
|
401
|
+
static grpc_json* json_from_http(const grpc_httpcli_response* response) {
|
402
|
+
grpc_json* json = nullptr;
|
399
403
|
|
400
|
-
if (response ==
|
404
|
+
if (response == nullptr) {
|
401
405
|
gpr_log(GPR_ERROR, "HTTP response is NULL.");
|
402
|
-
return
|
406
|
+
return nullptr;
|
403
407
|
}
|
404
408
|
if (response->status != 200) {
|
405
409
|
gpr_log(GPR_ERROR, "Call to http server failed with error %d.",
|
406
410
|
response->status);
|
407
|
-
return
|
411
|
+
return nullptr;
|
408
412
|
}
|
409
413
|
|
410
414
|
json = grpc_json_parse_string_with_len(response->body, response->body_length);
|
411
|
-
if (json ==
|
415
|
+
if (json == nullptr) {
|
412
416
|
gpr_log(GPR_ERROR, "Invalid JSON found in response.");
|
413
417
|
}
|
414
418
|
return json;
|
415
419
|
}
|
416
420
|
|
417
|
-
static const grpc_json
|
418
|
-
const char
|
419
|
-
const grpc_json
|
420
|
-
for (cur = json->child; cur !=
|
421
|
+
static const grpc_json* find_property_by_name(const grpc_json* json,
|
422
|
+
const char* name) {
|
423
|
+
const grpc_json* cur;
|
424
|
+
for (cur = json->child; cur != nullptr; cur = cur->next) {
|
421
425
|
if (strcmp(cur->key, name) == 0) return cur;
|
422
426
|
}
|
423
|
-
return
|
427
|
+
return nullptr;
|
424
428
|
}
|
425
429
|
|
426
|
-
static EVP_PKEY
|
427
|
-
X509
|
428
|
-
EVP_PKEY
|
429
|
-
BIO
|
430
|
+
static EVP_PKEY* extract_pkey_from_x509(const char* x509_str) {
|
431
|
+
X509* x509 = nullptr;
|
432
|
+
EVP_PKEY* result = nullptr;
|
433
|
+
BIO* bio = BIO_new(BIO_s_mem());
|
430
434
|
size_t len = strlen(x509_str);
|
431
435
|
GPR_ASSERT(len < INT_MAX);
|
432
436
|
BIO_write(bio, x509_str, (int)len);
|
433
|
-
x509 = PEM_read_bio_X509(bio,
|
434
|
-
if (x509 ==
|
437
|
+
x509 = PEM_read_bio_X509(bio, nullptr, nullptr, nullptr);
|
438
|
+
if (x509 == nullptr) {
|
435
439
|
gpr_log(GPR_ERROR, "Unable to parse x509 cert.");
|
436
440
|
goto end;
|
437
441
|
}
|
438
442
|
result = X509_get_pubkey(x509);
|
439
|
-
if (result ==
|
443
|
+
if (result == nullptr) {
|
440
444
|
gpr_log(GPR_ERROR, "Cannot find public key in X509 cert.");
|
441
445
|
}
|
442
446
|
|
@@ -446,18 +450,18 @@ end:
|
|
446
450
|
return result;
|
447
451
|
}
|
448
452
|
|
449
|
-
static BIGNUM
|
450
|
-
BIGNUM
|
453
|
+
static BIGNUM* bignum_from_base64(grpc_exec_ctx* exec_ctx, const char* b64) {
|
454
|
+
BIGNUM* result = nullptr;
|
451
455
|
grpc_slice bin;
|
452
456
|
|
453
|
-
if (b64 ==
|
457
|
+
if (b64 == nullptr) return nullptr;
|
454
458
|
bin = grpc_base64_decode(exec_ctx, b64, 1);
|
455
459
|
if (GRPC_SLICE_IS_EMPTY(bin)) {
|
456
460
|
gpr_log(GPR_ERROR, "Invalid base64 for big num.");
|
457
|
-
return
|
461
|
+
return nullptr;
|
458
462
|
}
|
459
463
|
result = BN_bin2bn(GRPC_SLICE_START_PTR(bin),
|
460
|
-
TSI_SIZE_AS_SIZE(GRPC_SLICE_LENGTH(bin)),
|
464
|
+
TSI_SIZE_AS_SIZE(GRPC_SLICE_LENGTH(bin)), nullptr);
|
461
465
|
grpc_slice_unref_internal(exec_ctx, bin);
|
462
466
|
return result;
|
463
467
|
}
|
@@ -465,24 +469,24 @@ static BIGNUM *bignum_from_base64(grpc_exec_ctx *exec_ctx, const char *b64) {
|
|
465
469
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
466
470
|
|
467
471
|
// Provide compatibility across OpenSSL 1.02 and 1.1.
|
468
|
-
static int RSA_set0_key(RSA
|
472
|
+
static int RSA_set0_key(RSA* r, BIGNUM* n, BIGNUM* e, BIGNUM* d) {
|
469
473
|
/* If the fields n and e in r are NULL, the corresponding input
|
470
474
|
* parameters MUST be non-NULL for n and e. d may be
|
471
475
|
* left NULL (in case only the public key is used).
|
472
476
|
*/
|
473
|
-
if ((r->n ==
|
477
|
+
if ((r->n == nullptr && n == nullptr) || (r->e == nullptr && e == nullptr)) {
|
474
478
|
return 0;
|
475
479
|
}
|
476
480
|
|
477
|
-
if (n !=
|
481
|
+
if (n != nullptr) {
|
478
482
|
BN_free(r->n);
|
479
483
|
r->n = n;
|
480
484
|
}
|
481
|
-
if (e !=
|
485
|
+
if (e != nullptr) {
|
482
486
|
BN_free(r->e);
|
483
487
|
r->e = e;
|
484
488
|
}
|
485
|
-
if (d !=
|
489
|
+
if (d != nullptr) {
|
486
490
|
BN_free(r->d);
|
487
491
|
r->d = d;
|
488
492
|
}
|
@@ -491,46 +495,46 @@ static int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) {
|
|
491
495
|
}
|
492
496
|
#endif // OPENSSL_VERSION_NUMBER < 0x10100000L
|
493
497
|
|
494
|
-
static EVP_PKEY
|
495
|
-
const char
|
496
|
-
const grpc_json
|
497
|
-
RSA
|
498
|
-
EVP_PKEY
|
499
|
-
BIGNUM
|
500
|
-
BIGNUM
|
498
|
+
static EVP_PKEY* pkey_from_jwk(grpc_exec_ctx* exec_ctx, const grpc_json* json,
|
499
|
+
const char* kty) {
|
500
|
+
const grpc_json* key_prop;
|
501
|
+
RSA* rsa = nullptr;
|
502
|
+
EVP_PKEY* result = nullptr;
|
503
|
+
BIGNUM* tmp_n = nullptr;
|
504
|
+
BIGNUM* tmp_e = nullptr;
|
501
505
|
|
502
|
-
GPR_ASSERT(kty !=
|
506
|
+
GPR_ASSERT(kty != nullptr && json != nullptr);
|
503
507
|
if (strcmp(kty, "RSA") != 0) {
|
504
508
|
gpr_log(GPR_ERROR, "Unsupported key type %s.", kty);
|
505
509
|
goto end;
|
506
510
|
}
|
507
511
|
rsa = RSA_new();
|
508
|
-
if (rsa ==
|
512
|
+
if (rsa == nullptr) {
|
509
513
|
gpr_log(GPR_ERROR, "Could not create rsa key.");
|
510
514
|
goto end;
|
511
515
|
}
|
512
|
-
for (key_prop = json->child; key_prop !=
|
516
|
+
for (key_prop = json->child; key_prop != nullptr; key_prop = key_prop->next) {
|
513
517
|
if (strcmp(key_prop->key, "n") == 0) {
|
514
518
|
tmp_n =
|
515
519
|
bignum_from_base64(exec_ctx, validate_string_field(key_prop, "n"));
|
516
|
-
if (tmp_n ==
|
520
|
+
if (tmp_n == nullptr) goto end;
|
517
521
|
} else if (strcmp(key_prop->key, "e") == 0) {
|
518
522
|
tmp_e =
|
519
523
|
bignum_from_base64(exec_ctx, validate_string_field(key_prop, "e"));
|
520
|
-
if (tmp_e ==
|
524
|
+
if (tmp_e == nullptr) goto end;
|
521
525
|
}
|
522
526
|
}
|
523
|
-
if (tmp_e ==
|
527
|
+
if (tmp_e == nullptr || tmp_n == nullptr) {
|
524
528
|
gpr_log(GPR_ERROR, "Missing RSA public key field.");
|
525
529
|
goto end;
|
526
530
|
}
|
527
|
-
if (!RSA_set0_key(rsa, tmp_n, tmp_e,
|
531
|
+
if (!RSA_set0_key(rsa, tmp_n, tmp_e, nullptr)) {
|
528
532
|
gpr_log(GPR_ERROR, "Cannot set RSA key from inputs.");
|
529
533
|
goto end;
|
530
534
|
}
|
531
535
|
/* RSA_set0_key takes ownership on success. */
|
532
|
-
tmp_n =
|
533
|
-
tmp_e =
|
536
|
+
tmp_n = nullptr;
|
537
|
+
tmp_e = nullptr;
|
534
538
|
result = EVP_PKEY_new();
|
535
539
|
EVP_PKEY_set1_RSA(result, rsa); /* uprefs rsa. */
|
536
540
|
|
@@ -541,38 +545,39 @@ end:
|
|
541
545
|
return result;
|
542
546
|
}
|
543
547
|
|
544
|
-
static EVP_PKEY
|
545
|
-
const grpc_json
|
546
|
-
const char
|
547
|
-
const char
|
548
|
-
const grpc_json
|
549
|
-
const grpc_json
|
548
|
+
static EVP_PKEY* find_verification_key(grpc_exec_ctx* exec_ctx,
|
549
|
+
const grpc_json* json,
|
550
|
+
const char* header_alg,
|
551
|
+
const char* header_kid) {
|
552
|
+
const grpc_json* jkey;
|
553
|
+
const grpc_json* jwk_keys;
|
550
554
|
/* Try to parse the json as a JWK set:
|
551
555
|
https://tools.ietf.org/html/rfc7517#section-5. */
|
552
556
|
jwk_keys = find_property_by_name(json, "keys");
|
553
|
-
if (jwk_keys ==
|
557
|
+
if (jwk_keys == nullptr) {
|
554
558
|
/* Use the google proprietary format which is:
|
555
559
|
{ <kid1>: <x5091>, <kid2>: <x5092>, ... } */
|
556
|
-
const grpc_json
|
557
|
-
if (cur ==
|
560
|
+
const grpc_json* cur = find_property_by_name(json, header_kid);
|
561
|
+
if (cur == nullptr) return nullptr;
|
558
562
|
return extract_pkey_from_x509(cur->value);
|
559
563
|
}
|
560
564
|
|
561
565
|
if (jwk_keys->type != GRPC_JSON_ARRAY) {
|
562
566
|
gpr_log(GPR_ERROR,
|
563
567
|
"Unexpected value type of keys property in jwks key set.");
|
564
|
-
return
|
568
|
+
return nullptr;
|
565
569
|
}
|
566
570
|
/* Key format is specified in:
|
567
571
|
https://tools.ietf.org/html/rfc7518#section-6. */
|
568
|
-
for (jkey = jwk_keys->child; jkey !=
|
569
|
-
grpc_json
|
570
|
-
const char
|
571
|
-
const char
|
572
|
-
const char
|
572
|
+
for (jkey = jwk_keys->child; jkey != nullptr; jkey = jkey->next) {
|
573
|
+
grpc_json* key_prop;
|
574
|
+
const char* alg = nullptr;
|
575
|
+
const char* kid = nullptr;
|
576
|
+
const char* kty = nullptr;
|
573
577
|
|
574
578
|
if (jkey->type != GRPC_JSON_OBJECT) continue;
|
575
|
-
for (key_prop = jkey->child; key_prop !=
|
579
|
+
for (key_prop = jkey->child; key_prop != nullptr;
|
580
|
+
key_prop = key_prop->next) {
|
576
581
|
if (strcmp(key_prop->key, "alg") == 0 &&
|
577
582
|
key_prop->type == GRPC_JSON_STRING) {
|
578
583
|
alg = key_prop->value;
|
@@ -584,7 +589,7 @@ static EVP_PKEY *find_verification_key(grpc_exec_ctx *exec_ctx,
|
|
584
589
|
kty = key_prop->value;
|
585
590
|
}
|
586
591
|
}
|
587
|
-
if (alg !=
|
592
|
+
if (alg != nullptr && kid != nullptr && kty != nullptr &&
|
588
593
|
strcmp(kid, header_kid) == 0 && strcmp(alg, header_alg) == 0) {
|
589
594
|
return pkey_from_jwk(exec_ctx, jkey, kty);
|
590
595
|
}
|
@@ -592,21 +597,21 @@ static EVP_PKEY *find_verification_key(grpc_exec_ctx *exec_ctx,
|
|
592
597
|
gpr_log(GPR_ERROR,
|
593
598
|
"Could not find matching key in key set for kid=%s and alg=%s",
|
594
599
|
header_kid, header_alg);
|
595
|
-
return
|
600
|
+
return nullptr;
|
596
601
|
}
|
597
602
|
|
598
|
-
static int verify_jwt_signature(EVP_PKEY
|
603
|
+
static int verify_jwt_signature(EVP_PKEY* key, const char* alg,
|
599
604
|
grpc_slice signature, grpc_slice signed_data) {
|
600
|
-
EVP_MD_CTX
|
601
|
-
const EVP_MD
|
605
|
+
EVP_MD_CTX* md_ctx = EVP_MD_CTX_create();
|
606
|
+
const EVP_MD* md = evp_md_from_alg(alg);
|
602
607
|
int result = 0;
|
603
608
|
|
604
|
-
GPR_ASSERT(md !=
|
605
|
-
if (md_ctx ==
|
609
|
+
GPR_ASSERT(md != nullptr); /* Checked before. */
|
610
|
+
if (md_ctx == nullptr) {
|
606
611
|
gpr_log(GPR_ERROR, "Could not create EVP_MD_CTX.");
|
607
612
|
goto end;
|
608
613
|
}
|
609
|
-
if (EVP_DigestVerifyInit(md_ctx,
|
614
|
+
if (EVP_DigestVerifyInit(md_ctx, nullptr, md, nullptr, key) != 1) {
|
610
615
|
gpr_log(GPR_ERROR, "EVP_DigestVerifyInit failed.");
|
611
616
|
goto end;
|
612
617
|
}
|
@@ -627,21 +632,21 @@ end:
|
|
627
632
|
return result;
|
628
633
|
}
|
629
634
|
|
630
|
-
static void on_keys_retrieved(grpc_exec_ctx
|
631
|
-
grpc_error
|
632
|
-
verifier_cb_ctx
|
633
|
-
grpc_json
|
634
|
-
EVP_PKEY
|
635
|
+
static void on_keys_retrieved(grpc_exec_ctx* exec_ctx, void* user_data,
|
636
|
+
grpc_error* error) {
|
637
|
+
verifier_cb_ctx* ctx = (verifier_cb_ctx*)user_data;
|
638
|
+
grpc_json* json = json_from_http(&ctx->responses[HTTP_RESPONSE_KEYS]);
|
639
|
+
EVP_PKEY* verification_key = nullptr;
|
635
640
|
grpc_jwt_verifier_status status = GRPC_JWT_VERIFIER_GENERIC_ERROR;
|
636
|
-
grpc_jwt_claims
|
641
|
+
grpc_jwt_claims* claims = nullptr;
|
637
642
|
|
638
|
-
if (json ==
|
643
|
+
if (json == nullptr) {
|
639
644
|
status = GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR;
|
640
645
|
goto end;
|
641
646
|
}
|
642
647
|
verification_key =
|
643
648
|
find_verification_key(exec_ctx, json, ctx->header->alg, ctx->header->kid);
|
644
|
-
if (verification_key ==
|
649
|
+
if (verification_key == nullptr) {
|
645
650
|
gpr_log(GPR_ERROR, "Could not find verification key with kid %s.",
|
646
651
|
ctx->header->kid);
|
647
652
|
status = GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR;
|
@@ -658,34 +663,35 @@ static void on_keys_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
658
663
|
if (status == GRPC_JWT_VERIFIER_OK) {
|
659
664
|
/* Pass ownership. */
|
660
665
|
claims = ctx->claims;
|
661
|
-
ctx->claims =
|
666
|
+
ctx->claims = nullptr;
|
662
667
|
}
|
663
668
|
|
664
669
|
end:
|
665
|
-
if (json !=
|
670
|
+
if (json != nullptr) grpc_json_destroy(json);
|
666
671
|
EVP_PKEY_free(verification_key);
|
667
672
|
ctx->user_cb(exec_ctx, ctx->user_data, status, claims);
|
668
673
|
verifier_cb_ctx_destroy(exec_ctx, ctx);
|
669
674
|
}
|
670
675
|
|
671
|
-
static void on_openid_config_retrieved(grpc_exec_ctx
|
672
|
-
grpc_error
|
673
|
-
const grpc_json
|
674
|
-
verifier_cb_ctx
|
675
|
-
const grpc_http_response
|
676
|
-
grpc_json
|
676
|
+
static void on_openid_config_retrieved(grpc_exec_ctx* exec_ctx, void* user_data,
|
677
|
+
grpc_error* error) {
|
678
|
+
const grpc_json* cur;
|
679
|
+
verifier_cb_ctx* ctx = (verifier_cb_ctx*)user_data;
|
680
|
+
const grpc_http_response* response = &ctx->responses[HTTP_RESPONSE_OPENID];
|
681
|
+
grpc_json* json = json_from_http(response);
|
677
682
|
grpc_httpcli_request req;
|
678
|
-
const char
|
683
|
+
const char* jwks_uri;
|
684
|
+
grpc_resource_quota* resource_quota = nullptr;
|
679
685
|
|
680
686
|
/* TODO(jboeuf): Cache the jwks_uri in order to avoid this hop next time. */
|
681
|
-
if (json ==
|
687
|
+
if (json == nullptr) goto error;
|
682
688
|
cur = find_property_by_name(json, "jwks_uri");
|
683
|
-
if (cur ==
|
689
|
+
if (cur == nullptr) {
|
684
690
|
gpr_log(GPR_ERROR, "Could not find jwks_uri in openid config.");
|
685
691
|
goto error;
|
686
692
|
}
|
687
693
|
jwks_uri = validate_string_field(cur, "jwks_uri");
|
688
|
-
if (jwks_uri ==
|
694
|
+
if (jwks_uri == nullptr) goto error;
|
689
695
|
if (strstr(jwks_uri, "https://") != jwks_uri) {
|
690
696
|
gpr_log(GPR_ERROR, "Invalid non https jwks_uri: %s.", jwks_uri);
|
691
697
|
goto error;
|
@@ -693,9 +699,9 @@ static void on_openid_config_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
693
699
|
jwks_uri += 8;
|
694
700
|
req.handshaker = &grpc_httpcli_ssl;
|
695
701
|
req.host = gpr_strdup(jwks_uri);
|
696
|
-
req.http.path = strchr(jwks_uri, '/');
|
697
|
-
if (req.http.path ==
|
698
|
-
req.http.path = "";
|
702
|
+
req.http.path = (char*)strchr(jwks_uri, '/');
|
703
|
+
if (req.http.path == nullptr) {
|
704
|
+
req.http.path = (char*)"";
|
699
705
|
} else {
|
700
706
|
*(req.host + (req.http.path - jwks_uri)) = '\0';
|
701
707
|
}
|
@@ -703,11 +709,10 @@ static void on_openid_config_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
703
709
|
/* TODO(ctiller): Carry the resource_quota in ctx and share it with the host
|
704
710
|
channel. This would allow us to cancel an authentication query when under
|
705
711
|
extreme memory pressure. */
|
706
|
-
|
707
|
-
grpc_resource_quota_create("jwt_verifier");
|
712
|
+
resource_quota = grpc_resource_quota_create("jwt_verifier");
|
708
713
|
grpc_httpcli_get(
|
709
714
|
exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent, resource_quota, &req,
|
710
|
-
|
715
|
+
grpc_exec_ctx_now(exec_ctx) + grpc_jwt_verifier_max_delay,
|
711
716
|
GRPC_CLOSURE_CREATE(on_keys_retrieved, ctx, grpc_schedule_on_exec_ctx),
|
712
717
|
&ctx->responses[HTTP_RESPONSE_KEYS]);
|
713
718
|
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
@@ -716,29 +721,29 @@ static void on_openid_config_retrieved(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
716
721
|
return;
|
717
722
|
|
718
723
|
error:
|
719
|
-
if (json !=
|
724
|
+
if (json != nullptr) grpc_json_destroy(json);
|
720
725
|
ctx->user_cb(exec_ctx, ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
|
721
|
-
|
726
|
+
nullptr);
|
722
727
|
verifier_cb_ctx_destroy(exec_ctx, ctx);
|
723
728
|
}
|
724
729
|
|
725
|
-
static email_key_mapping
|
726
|
-
const char
|
730
|
+
static email_key_mapping* verifier_get_mapping(grpc_jwt_verifier* v,
|
731
|
+
const char* email_domain) {
|
727
732
|
size_t i;
|
728
|
-
if (v->mappings ==
|
733
|
+
if (v->mappings == nullptr) return nullptr;
|
729
734
|
for (i = 0; i < v->num_mappings; i++) {
|
730
735
|
if (strcmp(email_domain, v->mappings[i].email_domain) == 0) {
|
731
736
|
return &v->mappings[i];
|
732
737
|
}
|
733
738
|
}
|
734
|
-
return
|
739
|
+
return nullptr;
|
735
740
|
}
|
736
741
|
|
737
|
-
static void verifier_put_mapping(grpc_jwt_verifier
|
738
|
-
const char
|
739
|
-
email_key_mapping
|
742
|
+
static void verifier_put_mapping(grpc_jwt_verifier* v, const char* email_domain,
|
743
|
+
const char* key_url_prefix) {
|
744
|
+
email_key_mapping* mapping = verifier_get_mapping(v, email_domain);
|
740
745
|
GPR_ASSERT(v->num_mappings < v->allocated_mappings);
|
741
|
-
if (mapping !=
|
746
|
+
if (mapping != nullptr) {
|
742
747
|
gpr_free(mapping->key_url_prefix);
|
743
748
|
mapping->key_url_prefix = gpr_strdup(key_url_prefix);
|
744
749
|
return;
|
@@ -751,39 +756,42 @@ static void verifier_put_mapping(grpc_jwt_verifier *v, const char *email_domain,
|
|
751
756
|
|
752
757
|
/* Very non-sophisticated way to detect an email address. Should be good
|
753
758
|
enough for now... */
|
754
|
-
const char
|
755
|
-
const char
|
756
|
-
if (at_sign ==
|
757
|
-
const char
|
758
|
-
if (*email_domain == '\0') return
|
759
|
-
const char
|
760
|
-
if (dot ==
|
759
|
+
const char* grpc_jwt_issuer_email_domain(const char* issuer) {
|
760
|
+
const char* at_sign = strchr(issuer, '@');
|
761
|
+
if (at_sign == nullptr) return nullptr;
|
762
|
+
const char* email_domain = at_sign + 1;
|
763
|
+
if (*email_domain == '\0') return nullptr;
|
764
|
+
const char* dot = strrchr(email_domain, '.');
|
765
|
+
if (dot == nullptr || dot == email_domain) return email_domain;
|
761
766
|
GPR_ASSERT(dot > email_domain);
|
762
767
|
/* There may be a subdomain, we just want the domain. */
|
763
|
-
dot = gpr_memrchr(email_domain, '.',
|
764
|
-
|
768
|
+
dot = (const char*)gpr_memrchr((void*)email_domain, '.',
|
769
|
+
(size_t)(dot - email_domain));
|
770
|
+
if (dot == nullptr) return email_domain;
|
765
771
|
return dot + 1;
|
766
772
|
}
|
767
773
|
|
768
774
|
/* Takes ownership of ctx. */
|
769
|
-
static void retrieve_key_and_verify(grpc_exec_ctx
|
770
|
-
verifier_cb_ctx
|
771
|
-
const char
|
772
|
-
grpc_closure
|
773
|
-
char
|
774
|
-
const char
|
775
|
+
static void retrieve_key_and_verify(grpc_exec_ctx* exec_ctx,
|
776
|
+
verifier_cb_ctx* ctx) {
|
777
|
+
const char* email_domain;
|
778
|
+
grpc_closure* http_cb;
|
779
|
+
char* path_prefix = nullptr;
|
780
|
+
const char* iss;
|
775
781
|
grpc_httpcli_request req;
|
782
|
+
grpc_resource_quota* resource_quota = nullptr;
|
776
783
|
memset(&req, 0, sizeof(grpc_httpcli_request));
|
777
784
|
req.handshaker = &grpc_httpcli_ssl;
|
778
785
|
http_response_index rsp_idx;
|
779
786
|
|
780
|
-
GPR_ASSERT(ctx !=
|
787
|
+
GPR_ASSERT(ctx != nullptr && ctx->header != nullptr &&
|
788
|
+
ctx->claims != nullptr);
|
781
789
|
iss = ctx->claims->iss;
|
782
|
-
if (ctx->header->kid ==
|
790
|
+
if (ctx->header->kid == nullptr) {
|
783
791
|
gpr_log(GPR_ERROR, "Missing kid in jose header.");
|
784
792
|
goto error;
|
785
793
|
}
|
786
|
-
if (iss ==
|
794
|
+
if (iss == nullptr) {
|
787
795
|
gpr_log(GPR_ERROR, "Missing iss in claims.");
|
788
796
|
goto error;
|
789
797
|
}
|
@@ -794,17 +802,17 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
|
|
794
802
|
so we will rely instead on email/url mappings if we detect such an issuer.
|
795
803
|
Part 4, on the other hand is implemented by both google and salesforce. */
|
796
804
|
email_domain = grpc_jwt_issuer_email_domain(iss);
|
797
|
-
if (email_domain !=
|
798
|
-
email_key_mapping
|
799
|
-
GPR_ASSERT(ctx->verifier !=
|
805
|
+
if (email_domain != nullptr) {
|
806
|
+
email_key_mapping* mapping;
|
807
|
+
GPR_ASSERT(ctx->verifier != nullptr);
|
800
808
|
mapping = verifier_get_mapping(ctx->verifier, email_domain);
|
801
|
-
if (mapping ==
|
809
|
+
if (mapping == nullptr) {
|
802
810
|
gpr_log(GPR_ERROR, "Missing mapping for issuer email.");
|
803
811
|
goto error;
|
804
812
|
}
|
805
813
|
req.host = gpr_strdup(mapping->key_url_prefix);
|
806
814
|
path_prefix = strchr(req.host, '/');
|
807
|
-
if (path_prefix ==
|
815
|
+
if (path_prefix == nullptr) {
|
808
816
|
gpr_asprintf(&req.http.path, "/%s", iss);
|
809
817
|
} else {
|
810
818
|
*(path_prefix++) = '\0';
|
@@ -816,7 +824,7 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
|
|
816
824
|
} else {
|
817
825
|
req.host = gpr_strdup(strstr(iss, "https://") == iss ? iss + 8 : iss);
|
818
826
|
path_prefix = strchr(req.host, '/');
|
819
|
-
if (path_prefix ==
|
827
|
+
if (path_prefix == nullptr) {
|
820
828
|
req.http.path = gpr_strdup(GRPC_OPENID_CONFIG_URL_SUFFIX);
|
821
829
|
} else {
|
822
830
|
*(path_prefix++) = 0;
|
@@ -831,12 +839,11 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
|
|
831
839
|
/* TODO(ctiller): Carry the resource_quota in ctx and share it with the host
|
832
840
|
channel. This would allow us to cancel an authentication query when under
|
833
841
|
extreme memory pressure. */
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
http_cb, &ctx->responses[rsp_idx]);
|
842
|
+
resource_quota = grpc_resource_quota_create("jwt_verifier");
|
843
|
+
grpc_httpcli_get(exec_ctx, &ctx->verifier->http_ctx, &ctx->pollent,
|
844
|
+
resource_quota, &req,
|
845
|
+
grpc_exec_ctx_now(exec_ctx) + grpc_jwt_verifier_max_delay,
|
846
|
+
http_cb, &ctx->responses[rsp_idx]);
|
840
847
|
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
841
848
|
gpr_free(req.host);
|
842
849
|
gpr_free(req.http.path);
|
@@ -844,43 +851,44 @@ static void retrieve_key_and_verify(grpc_exec_ctx *exec_ctx,
|
|
844
851
|
|
845
852
|
error:
|
846
853
|
ctx->user_cb(exec_ctx, ctx->user_data, GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR,
|
847
|
-
|
854
|
+
nullptr);
|
848
855
|
verifier_cb_ctx_destroy(exec_ctx, ctx);
|
849
856
|
}
|
850
857
|
|
851
|
-
void grpc_jwt_verifier_verify(grpc_exec_ctx
|
852
|
-
grpc_jwt_verifier
|
853
|
-
grpc_pollset
|
854
|
-
const char
|
858
|
+
void grpc_jwt_verifier_verify(grpc_exec_ctx* exec_ctx,
|
859
|
+
grpc_jwt_verifier* verifier,
|
860
|
+
grpc_pollset* pollset, const char* jwt,
|
861
|
+
const char* audience,
|
855
862
|
grpc_jwt_verification_done_cb cb,
|
856
|
-
void
|
857
|
-
const char
|
858
|
-
grpc_json
|
859
|
-
jose_header
|
860
|
-
grpc_jwt_claims
|
863
|
+
void* user_data) {
|
864
|
+
const char* dot = nullptr;
|
865
|
+
grpc_json* json;
|
866
|
+
jose_header* header = nullptr;
|
867
|
+
grpc_jwt_claims* claims = nullptr;
|
861
868
|
grpc_slice header_buffer;
|
862
869
|
grpc_slice claims_buffer;
|
863
870
|
grpc_slice signature;
|
864
871
|
size_t signed_jwt_len;
|
865
|
-
const char
|
872
|
+
const char* cur = jwt;
|
866
873
|
|
867
|
-
GPR_ASSERT(verifier !=
|
874
|
+
GPR_ASSERT(verifier != nullptr && jwt != nullptr && audience != nullptr &&
|
875
|
+
cb != nullptr);
|
868
876
|
dot = strchr(cur, '.');
|
869
|
-
if (dot ==
|
877
|
+
if (dot == nullptr) goto error;
|
870
878
|
json = parse_json_part_from_jwt(exec_ctx, cur, (size_t)(dot - cur),
|
871
879
|
&header_buffer);
|
872
|
-
if (json ==
|
880
|
+
if (json == nullptr) goto error;
|
873
881
|
header = jose_header_from_json(exec_ctx, json, header_buffer);
|
874
|
-
if (header ==
|
882
|
+
if (header == nullptr) goto error;
|
875
883
|
|
876
884
|
cur = dot + 1;
|
877
885
|
dot = strchr(cur, '.');
|
878
|
-
if (dot ==
|
886
|
+
if (dot == nullptr) goto error;
|
879
887
|
json = parse_json_part_from_jwt(exec_ctx, cur, (size_t)(dot - cur),
|
880
888
|
&claims_buffer);
|
881
|
-
if (json ==
|
889
|
+
if (json == nullptr) goto error;
|
882
890
|
claims = grpc_jwt_claims_from_json(exec_ctx, json, claims_buffer);
|
883
|
-
if (claims ==
|
891
|
+
if (claims == nullptr) goto error;
|
884
892
|
|
885
893
|
signed_jwt_len = (size_t)(dot - jwt);
|
886
894
|
cur = dot + 1;
|
@@ -893,24 +901,26 @@ void grpc_jwt_verifier_verify(grpc_exec_ctx *exec_ctx,
|
|
893
901
|
return;
|
894
902
|
|
895
903
|
error:
|
896
|
-
if (header !=
|
897
|
-
if (claims !=
|
898
|
-
cb(exec_ctx, user_data, GRPC_JWT_VERIFIER_BAD_FORMAT,
|
904
|
+
if (header != nullptr) jose_header_destroy(exec_ctx, header);
|
905
|
+
if (claims != nullptr) grpc_jwt_claims_destroy(exec_ctx, claims);
|
906
|
+
cb(exec_ctx, user_data, GRPC_JWT_VERIFIER_BAD_FORMAT, nullptr);
|
899
907
|
}
|
900
908
|
|
901
|
-
grpc_jwt_verifier
|
902
|
-
const grpc_jwt_verifier_email_domain_key_url_mapping
|
909
|
+
grpc_jwt_verifier* grpc_jwt_verifier_create(
|
910
|
+
const grpc_jwt_verifier_email_domain_key_url_mapping* mappings,
|
903
911
|
size_t num_mappings) {
|
904
|
-
grpc_jwt_verifier
|
912
|
+
grpc_jwt_verifier* v =
|
913
|
+
(grpc_jwt_verifier*)gpr_zalloc(sizeof(grpc_jwt_verifier));
|
905
914
|
grpc_httpcli_context_init(&v->http_ctx);
|
906
915
|
|
907
916
|
/* We know at least of one mapping. */
|
908
917
|
v->allocated_mappings = 1 + num_mappings;
|
909
|
-
v->mappings = gpr_malloc(v->allocated_mappings *
|
918
|
+
v->mappings = (email_key_mapping*)gpr_malloc(v->allocated_mappings *
|
919
|
+
sizeof(email_key_mapping));
|
910
920
|
verifier_put_mapping(v, GRPC_GOOGLE_SERVICE_ACCOUNTS_EMAIL_DOMAIN,
|
911
921
|
GRPC_GOOGLE_SERVICE_ACCOUNTS_KEY_URL_PREFIX);
|
912
922
|
/* User-Provided mappings. */
|
913
|
-
if (mappings !=
|
923
|
+
if (mappings != nullptr) {
|
914
924
|
size_t i;
|
915
925
|
for (i = 0; i < num_mappings; i++) {
|
916
926
|
verifier_put_mapping(v, mappings[i].email_domain,
|
@@ -920,11 +930,11 @@ grpc_jwt_verifier *grpc_jwt_verifier_create(
|
|
920
930
|
return v;
|
921
931
|
}
|
922
932
|
|
923
|
-
void grpc_jwt_verifier_destroy(grpc_exec_ctx
|
933
|
+
void grpc_jwt_verifier_destroy(grpc_exec_ctx* exec_ctx, grpc_jwt_verifier* v) {
|
924
934
|
size_t i;
|
925
|
-
if (v ==
|
935
|
+
if (v == nullptr) return;
|
926
936
|
grpc_httpcli_context_destroy(exec_ctx, &v->http_ctx);
|
927
|
-
if (v->mappings !=
|
937
|
+
if (v->mappings != nullptr) {
|
928
938
|
for (i = 0; i < v->num_mappings; i++) {
|
929
939
|
gpr_free(v->mappings[i].email_domain);
|
930
940
|
gpr_free(v->mappings[i].key_url_prefix);
|