grpc 1.18.0 → 1.19.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 +301 -33
- data/include/grpc/grpc_security.h +195 -0
- data/include/grpc/impl/codegen/grpc_types.h +17 -1
- data/include/grpc/impl/codegen/port_platform.h +40 -0
- data/include/grpc/impl/codegen/slice.h +1 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -0
- data/src/core/ext/filters/client_channel/client_channel.cc +74 -69
- data/src/core/ext/filters/client_channel/client_channel.h +2 -2
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +5 -6
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +5 -4
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel_factory.h +4 -4
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -3
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +176 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -8
- data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -156
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +28 -30
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -8
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -8
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +23 -24
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +80 -15
- data/src/core/ext/filters/client_channel/lb_policy.cc +30 -1
- data/src/core/ext/filters/client_channel/lb_policy.h +29 -1
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +6 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
- data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
- data/src/core/ext/filters/client_channel/request_routing.cc +13 -3
- data/src/core/ext/filters/client_channel/request_routing.h +5 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +9 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -35
- data/src/core/ext/filters/client_channel/subchannel.cc +698 -791
- data/src/core/ext/filters/client_channel/subchannel.h +213 -123
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
- data/src/core/ext/filters/http/client_authority_filter.cc +5 -2
- data/src/core/ext/filters/max_age/max_age_filter.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +5 -7
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +19 -27
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +18 -19
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +27 -6
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/writing.cc +8 -5
- data/src/core/lib/channel/handshaker.cc +141 -214
- data/src/core/lib/channel/handshaker.h +110 -101
- data/src/core/lib/channel/handshaker_factory.h +11 -19
- data/src/core/lib/channel/handshaker_registry.cc +64 -52
- data/src/core/lib/channel/handshaker_registry.h +21 -16
- data/src/core/lib/gpr/log_posix.cc +2 -1
- data/src/core/lib/gpr/time.cc +8 -0
- data/src/core/lib/gpr/time_posix.cc +8 -2
- data/src/core/lib/gprpp/optional.h +47 -0
- data/src/core/lib/http/httpcli_security_connector.cc +13 -14
- data/src/core/lib/iomgr/buffer_list.cc +182 -24
- data/src/core/lib/iomgr/buffer_list.h +70 -8
- data/src/core/lib/iomgr/combiner.cc +11 -3
- data/src/core/lib/iomgr/error.cc +9 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -0
- data/src/core/lib/iomgr/ev_epollex_linux.cc +136 -162
- data/src/core/lib/iomgr/ev_poll_posix.cc +3 -0
- data/src/core/lib/iomgr/ev_posix.cc +4 -0
- data/src/core/lib/iomgr/ev_posix.h +4 -0
- data/src/core/lib/iomgr/exec_ctx.cc +1 -0
- data/src/core/lib/iomgr/exec_ctx.h +137 -8
- data/src/core/lib/iomgr/executor.cc +122 -87
- data/src/core/lib/iomgr/executor.h +53 -48
- data/src/core/lib/iomgr/fork_posix.cc +6 -4
- data/src/core/lib/iomgr/{network_status_tracker.cc → grpc_if_nametoindex.h} +8 -14
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
- data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
- data/src/core/lib/iomgr/internal_errqueue.h +105 -3
- data/src/core/lib/iomgr/iomgr.cc +6 -5
- data/src/core/lib/iomgr/iomgr.h +8 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +6 -2
- data/src/core/lib/iomgr/iomgr_internal.cc +4 -0
- data/src/core/lib/iomgr/iomgr_internal.h +4 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +10 -1
- data/src/core/lib/iomgr/iomgr_windows.cc +8 -1
- data/src/core/lib/iomgr/port.h +1 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
- data/src/core/lib/iomgr/tcp_custom.cc +0 -4
- data/src/core/lib/iomgr/tcp_posix.cc +58 -44
- data/src/core/lib/iomgr/tcp_uv.cc +0 -1
- data/src/core/lib/iomgr/tcp_windows.cc +0 -4
- data/src/core/lib/iomgr/timer_manager.cc +8 -0
- data/src/core/lib/iomgr/udp_server.cc +6 -4
- data/src/core/lib/json/json.cc +1 -4
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
- data/src/core/lib/security/credentials/credentials.h +9 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -2
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -2
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +2 -2
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +213 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +6 -10
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/security_connector.h +2 -2
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -6
- data/src/core/lib/security/security_connector/ssl_utils.h +33 -0
- data/src/core/lib/security/transport/security_handshaker.cc +267 -300
- data/src/core/lib/security/transport/security_handshaker.h +11 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +1 -0
- data/src/core/lib/surface/call.cc +5 -1
- data/src/core/lib/surface/channel_init.h +5 -0
- data/src/core/lib/surface/completion_queue.cc +4 -7
- data/src/core/lib/surface/init.cc +5 -3
- data/src/core/lib/surface/init_secure.cc +1 -1
- data/src/core/lib/surface/server.cc +19 -17
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/service_config.h +1 -0
- data/src/core/lib/transport/static_metadata.cc +279 -279
- data/src/core/lib/transport/transport.cc +5 -3
- data/src/core/tsi/ssl_transport_security.cc +10 -4
- data/src/ruby/ext/grpc/extconf.rb +12 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
- data/src/ruby/ext/grpc/rb_channel.c +14 -10
- data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
- data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
- data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc.c +22 -23
- data/src/ruby/ext/grpc/rb_grpc.h +4 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +18 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +27 -0
- data/src/ruby/ext/grpc/rb_server.c +8 -4
- data/src/ruby/lib/grpc/version.rb +1 -1
- metadata +45 -38
- data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
- data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
- data/src/core/lib/channel/handshaker_factory.cc +0 -42
@@ -39,74 +39,113 @@
|
|
39
39
|
|
40
40
|
#define GRPC_INITIAL_HANDSHAKE_BUFFER_SIZE 256
|
41
41
|
|
42
|
-
namespace {
|
43
|
-
struct security_handshaker {
|
44
|
-
security_handshaker(tsi_handshaker* handshaker,
|
45
|
-
grpc_security_connector* connector);
|
46
|
-
~security_handshaker() {
|
47
|
-
gpr_mu_destroy(&mu);
|
48
|
-
tsi_handshaker_destroy(handshaker);
|
49
|
-
tsi_handshaker_result_destroy(handshaker_result);
|
50
|
-
if (endpoint_to_destroy != nullptr) {
|
51
|
-
grpc_endpoint_destroy(endpoint_to_destroy);
|
52
|
-
}
|
53
|
-
if (read_buffer_to_destroy != nullptr) {
|
54
|
-
grpc_slice_buffer_destroy_internal(read_buffer_to_destroy);
|
55
|
-
gpr_free(read_buffer_to_destroy);
|
56
|
-
}
|
57
|
-
gpr_free(handshake_buffer);
|
58
|
-
grpc_slice_buffer_destroy_internal(&outgoing);
|
59
|
-
auth_context.reset(DEBUG_LOCATION, "handshake");
|
60
|
-
connector.reset(DEBUG_LOCATION, "handshake");
|
61
|
-
}
|
42
|
+
namespace grpc_core {
|
62
43
|
|
63
|
-
|
64
|
-
void Unref() {
|
65
|
-
if (refs.Unref()) {
|
66
|
-
grpc_core::Delete(this);
|
67
|
-
}
|
68
|
-
}
|
44
|
+
namespace {
|
69
45
|
|
70
|
-
|
46
|
+
class SecurityHandshaker : public Handshaker {
|
47
|
+
public:
|
48
|
+
SecurityHandshaker(tsi_handshaker* handshaker,
|
49
|
+
grpc_security_connector* connector);
|
50
|
+
~SecurityHandshaker() override;
|
51
|
+
void Shutdown(grpc_error* why) override;
|
52
|
+
void DoHandshake(grpc_tcp_server_acceptor* acceptor,
|
53
|
+
grpc_closure* on_handshake_done,
|
54
|
+
HandshakerArgs* args) override;
|
55
|
+
const char* name() const override { return "security"; }
|
56
|
+
|
57
|
+
private:
|
58
|
+
grpc_error* DoHandshakerNextLocked(const unsigned char* bytes_received,
|
59
|
+
size_t bytes_received_size);
|
60
|
+
|
61
|
+
grpc_error* OnHandshakeNextDoneLocked(
|
62
|
+
tsi_result result, const unsigned char* bytes_to_send,
|
63
|
+
size_t bytes_to_send_size, tsi_handshaker_result* handshaker_result);
|
64
|
+
void HandshakeFailedLocked(grpc_error* error);
|
65
|
+
void CleanupArgsForFailureLocked();
|
66
|
+
|
67
|
+
static void OnHandshakeDataReceivedFromPeerFn(void* arg, grpc_error* error);
|
68
|
+
static void OnHandshakeDataSentToPeerFn(void* arg, grpc_error* error);
|
69
|
+
static void OnHandshakeNextDoneGrpcWrapper(
|
70
|
+
tsi_result result, void* user_data, const unsigned char* bytes_to_send,
|
71
|
+
size_t bytes_to_send_size, tsi_handshaker_result* handshaker_result);
|
72
|
+
static void OnPeerCheckedFn(void* arg, grpc_error* error);
|
73
|
+
void OnPeerCheckedInner(grpc_error* error);
|
74
|
+
size_t MoveReadBufferIntoHandshakeBuffer();
|
75
|
+
grpc_error* CheckPeerLocked();
|
71
76
|
|
72
77
|
// State set at creation time.
|
73
|
-
tsi_handshaker*
|
74
|
-
|
78
|
+
tsi_handshaker* handshaker_;
|
79
|
+
RefCountedPtr<grpc_security_connector> connector_;
|
75
80
|
|
76
|
-
gpr_mu
|
77
|
-
grpc_core::RefCount refs;
|
81
|
+
gpr_mu mu_;
|
78
82
|
|
79
|
-
bool
|
83
|
+
bool is_shutdown_ = false;
|
80
84
|
// Endpoint and read buffer to destroy after a shutdown.
|
81
|
-
grpc_endpoint*
|
82
|
-
grpc_slice_buffer*
|
85
|
+
grpc_endpoint* endpoint_to_destroy_ = nullptr;
|
86
|
+
grpc_slice_buffer* read_buffer_to_destroy_ = nullptr;
|
83
87
|
|
84
88
|
// State saved while performing the handshake.
|
85
|
-
|
86
|
-
grpc_closure*
|
87
|
-
|
88
|
-
size_t
|
89
|
-
unsigned char*
|
90
|
-
grpc_slice_buffer
|
91
|
-
grpc_closure
|
92
|
-
grpc_closure
|
93
|
-
grpc_closure
|
94
|
-
|
95
|
-
tsi_handshaker_result*
|
89
|
+
HandshakerArgs* args_ = nullptr;
|
90
|
+
grpc_closure* on_handshake_done_ = nullptr;
|
91
|
+
|
92
|
+
size_t handshake_buffer_size_;
|
93
|
+
unsigned char* handshake_buffer_;
|
94
|
+
grpc_slice_buffer outgoing_;
|
95
|
+
grpc_closure on_handshake_data_sent_to_peer_;
|
96
|
+
grpc_closure on_handshake_data_received_from_peer_;
|
97
|
+
grpc_closure on_peer_checked_;
|
98
|
+
RefCountedPtr<grpc_auth_context> auth_context_;
|
99
|
+
tsi_handshaker_result* handshaker_result_ = nullptr;
|
96
100
|
};
|
97
|
-
} // namespace
|
98
101
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
102
|
+
SecurityHandshaker::SecurityHandshaker(tsi_handshaker* handshaker,
|
103
|
+
grpc_security_connector* connector)
|
104
|
+
: handshaker_(handshaker),
|
105
|
+
connector_(connector->Ref(DEBUG_LOCATION, "handshake")),
|
106
|
+
handshake_buffer_size_(GRPC_INITIAL_HANDSHAKE_BUFFER_SIZE),
|
107
|
+
handshake_buffer_(
|
108
|
+
static_cast<uint8_t*>(gpr_malloc(handshake_buffer_size_))) {
|
109
|
+
gpr_mu_init(&mu_);
|
110
|
+
grpc_slice_buffer_init(&outgoing_);
|
111
|
+
GRPC_CLOSURE_INIT(&on_handshake_data_sent_to_peer_,
|
112
|
+
&SecurityHandshaker::OnHandshakeDataSentToPeerFn, this,
|
113
|
+
grpc_schedule_on_exec_ctx);
|
114
|
+
GRPC_CLOSURE_INIT(&on_handshake_data_received_from_peer_,
|
115
|
+
&SecurityHandshaker::OnHandshakeDataReceivedFromPeerFn,
|
116
|
+
this, grpc_schedule_on_exec_ctx);
|
117
|
+
GRPC_CLOSURE_INIT(&on_peer_checked_, &SecurityHandshaker::OnPeerCheckedFn,
|
118
|
+
this, grpc_schedule_on_exec_ctx);
|
119
|
+
}
|
120
|
+
|
121
|
+
SecurityHandshaker::~SecurityHandshaker() {
|
122
|
+
gpr_mu_destroy(&mu_);
|
123
|
+
tsi_handshaker_destroy(handshaker_);
|
124
|
+
tsi_handshaker_result_destroy(handshaker_result_);
|
125
|
+
if (endpoint_to_destroy_ != nullptr) {
|
126
|
+
grpc_endpoint_destroy(endpoint_to_destroy_);
|
127
|
+
}
|
128
|
+
if (read_buffer_to_destroy_ != nullptr) {
|
129
|
+
grpc_slice_buffer_destroy_internal(read_buffer_to_destroy_);
|
130
|
+
gpr_free(read_buffer_to_destroy_);
|
131
|
+
}
|
132
|
+
gpr_free(handshake_buffer_);
|
133
|
+
grpc_slice_buffer_destroy_internal(&outgoing_);
|
134
|
+
auth_context_.reset(DEBUG_LOCATION, "handshake");
|
135
|
+
connector_.reset(DEBUG_LOCATION, "handshake");
|
136
|
+
}
|
137
|
+
|
138
|
+
size_t SecurityHandshaker::MoveReadBufferIntoHandshakeBuffer() {
|
139
|
+
size_t bytes_in_read_buffer = args_->read_buffer->length;
|
140
|
+
if (handshake_buffer_size_ < bytes_in_read_buffer) {
|
141
|
+
handshake_buffer_ = static_cast<uint8_t*>(
|
142
|
+
gpr_realloc(handshake_buffer_, bytes_in_read_buffer));
|
143
|
+
handshake_buffer_size_ = bytes_in_read_buffer;
|
105
144
|
}
|
106
145
|
size_t offset = 0;
|
107
|
-
while (
|
108
|
-
grpc_slice next_slice = grpc_slice_buffer_take_first(
|
109
|
-
memcpy(
|
146
|
+
while (args_->read_buffer->count > 0) {
|
147
|
+
grpc_slice next_slice = grpc_slice_buffer_take_first(args_->read_buffer);
|
148
|
+
memcpy(handshake_buffer_ + offset, GRPC_SLICE_START_PTR(next_slice),
|
110
149
|
GRPC_SLICE_LENGTH(next_slice));
|
111
150
|
offset += GRPC_SLICE_LENGTH(next_slice);
|
112
151
|
grpc_slice_unref_internal(next_slice);
|
@@ -114,21 +153,20 @@ static size_t move_read_buffer_into_handshake_buffer(security_handshaker* h) {
|
|
114
153
|
return bytes_in_read_buffer;
|
115
154
|
}
|
116
155
|
|
117
|
-
// Set
|
156
|
+
// Set args_ fields to NULL, saving the endpoint and read buffer for
|
118
157
|
// later destruction.
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
grpc_channel_args_destroy(
|
125
|
-
|
158
|
+
void SecurityHandshaker::CleanupArgsForFailureLocked() {
|
159
|
+
endpoint_to_destroy_ = args_->endpoint;
|
160
|
+
args_->endpoint = nullptr;
|
161
|
+
read_buffer_to_destroy_ = args_->read_buffer;
|
162
|
+
args_->read_buffer = nullptr;
|
163
|
+
grpc_channel_args_destroy(args_->args);
|
164
|
+
args_->args = nullptr;
|
126
165
|
}
|
127
166
|
|
128
167
|
// If the handshake failed or we're shutting down, clean up and invoke the
|
129
168
|
// callback with the error.
|
130
|
-
|
131
|
-
grpc_error* error) {
|
169
|
+
void SecurityHandshaker::HandshakeFailedLocked(grpc_error* error) {
|
132
170
|
if (error == GRPC_ERROR_NONE) {
|
133
171
|
// If we were shut down after the handshake succeeded but before an
|
134
172
|
// endpoint callback was invoked, we need to generate our own error.
|
@@ -137,50 +175,51 @@ static void security_handshake_failed_locked(security_handshaker* h,
|
|
137
175
|
const char* msg = grpc_error_string(error);
|
138
176
|
gpr_log(GPR_DEBUG, "Security handshake failed: %s", msg);
|
139
177
|
|
140
|
-
if (!
|
178
|
+
if (!is_shutdown_) {
|
141
179
|
// TODO(ctiller): It is currently necessary to shutdown endpoints
|
142
180
|
// before destroying them, even if we know that there are no
|
143
181
|
// pending read/write callbacks. This should be fixed, at which
|
144
182
|
// point this can be removed.
|
145
|
-
grpc_endpoint_shutdown(
|
183
|
+
grpc_endpoint_shutdown(args_->endpoint, GRPC_ERROR_REF(error));
|
146
184
|
// Not shutting down, so the write failed. Clean up before
|
147
185
|
// invoking the callback.
|
148
|
-
|
186
|
+
CleanupArgsForFailureLocked();
|
149
187
|
// Set shutdown to true so that subsequent calls to
|
150
188
|
// security_handshaker_shutdown() do nothing.
|
151
|
-
|
189
|
+
is_shutdown_ = true;
|
152
190
|
}
|
153
191
|
// Invoke callback.
|
154
|
-
GRPC_CLOSURE_SCHED(
|
192
|
+
GRPC_CLOSURE_SCHED(on_handshake_done_, error);
|
155
193
|
}
|
156
194
|
|
157
|
-
|
158
|
-
|
159
|
-
|
195
|
+
void SecurityHandshaker::OnPeerCheckedInner(grpc_error* error) {
|
196
|
+
MutexLock lock(&mu_);
|
197
|
+
if (error != GRPC_ERROR_NONE || is_shutdown_) {
|
198
|
+
HandshakeFailedLocked(GRPC_ERROR_REF(error));
|
160
199
|
return;
|
161
200
|
}
|
162
201
|
// Create zero-copy frame protector, if implemented.
|
163
202
|
tsi_zero_copy_grpc_protector* zero_copy_protector = nullptr;
|
164
203
|
tsi_result result = tsi_handshaker_result_create_zero_copy_grpc_protector(
|
165
|
-
|
204
|
+
handshaker_result_, nullptr, &zero_copy_protector);
|
166
205
|
if (result != TSI_OK && result != TSI_UNIMPLEMENTED) {
|
167
206
|
error = grpc_set_tsi_error_result(
|
168
207
|
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
169
208
|
"Zero-copy frame protector creation failed"),
|
170
209
|
result);
|
171
|
-
|
210
|
+
HandshakeFailedLocked(error);
|
172
211
|
return;
|
173
212
|
}
|
174
213
|
// Create frame protector if zero-copy frame protector is NULL.
|
175
214
|
tsi_frame_protector* protector = nullptr;
|
176
215
|
if (zero_copy_protector == nullptr) {
|
177
|
-
result = tsi_handshaker_result_create_frame_protector(
|
216
|
+
result = tsi_handshaker_result_create_frame_protector(handshaker_result_,
|
178
217
|
nullptr, &protector);
|
179
218
|
if (result != TSI_OK) {
|
180
219
|
error = grpc_set_tsi_error_result(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
181
220
|
"Frame protector creation failed"),
|
182
221
|
result);
|
183
|
-
|
222
|
+
HandshakeFailedLocked(error);
|
184
223
|
return;
|
185
224
|
}
|
186
225
|
}
|
@@ -188,68 +227,63 @@ static void on_peer_checked_inner(security_handshaker* h, grpc_error* error) {
|
|
188
227
|
const unsigned char* unused_bytes = nullptr;
|
189
228
|
size_t unused_bytes_size = 0;
|
190
229
|
result = tsi_handshaker_result_get_unused_bytes(
|
191
|
-
|
230
|
+
handshaker_result_, &unused_bytes, &unused_bytes_size);
|
192
231
|
// Create secure endpoint.
|
193
232
|
if (unused_bytes_size > 0) {
|
194
233
|
grpc_slice slice =
|
195
234
|
grpc_slice_from_copied_buffer((char*)unused_bytes, unused_bytes_size);
|
196
|
-
|
197
|
-
protector, zero_copy_protector,
|
235
|
+
args_->endpoint = grpc_secure_endpoint_create(
|
236
|
+
protector, zero_copy_protector, args_->endpoint, &slice, 1);
|
198
237
|
grpc_slice_unref_internal(slice);
|
199
238
|
} else {
|
200
|
-
|
201
|
-
protector, zero_copy_protector,
|
239
|
+
args_->endpoint = grpc_secure_endpoint_create(
|
240
|
+
protector, zero_copy_protector, args_->endpoint, nullptr, 0);
|
202
241
|
}
|
203
|
-
tsi_handshaker_result_destroy(
|
204
|
-
|
242
|
+
tsi_handshaker_result_destroy(handshaker_result_);
|
243
|
+
handshaker_result_ = nullptr;
|
205
244
|
// Add auth context to channel args.
|
206
|
-
grpc_arg auth_context_arg = grpc_auth_context_to_arg(
|
207
|
-
grpc_channel_args* tmp_args =
|
208
|
-
|
209
|
-
grpc_channel_args_copy_and_add(tmp_args, &auth_context_arg, 1);
|
245
|
+
grpc_arg auth_context_arg = grpc_auth_context_to_arg(auth_context_.get());
|
246
|
+
grpc_channel_args* tmp_args = args_->args;
|
247
|
+
args_->args = grpc_channel_args_copy_and_add(tmp_args, &auth_context_arg, 1);
|
210
248
|
grpc_channel_args_destroy(tmp_args);
|
211
249
|
// Invoke callback.
|
212
|
-
GRPC_CLOSURE_SCHED(
|
250
|
+
GRPC_CLOSURE_SCHED(on_handshake_done_, GRPC_ERROR_NONE);
|
213
251
|
// Set shutdown to true so that subsequent calls to
|
214
252
|
// security_handshaker_shutdown() do nothing.
|
215
|
-
|
253
|
+
is_shutdown_ = true;
|
216
254
|
}
|
217
255
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
on_peer_checked_inner(h, error);
|
222
|
-
gpr_mu_unlock(&h->mu);
|
223
|
-
h->Unref();
|
256
|
+
void SecurityHandshaker::OnPeerCheckedFn(void* arg, grpc_error* error) {
|
257
|
+
RefCountedPtr<SecurityHandshaker>(static_cast<SecurityHandshaker*>(arg))
|
258
|
+
->OnPeerCheckedInner(error);
|
224
259
|
}
|
225
260
|
|
226
|
-
|
261
|
+
grpc_error* SecurityHandshaker::CheckPeerLocked() {
|
227
262
|
tsi_peer peer;
|
228
263
|
tsi_result result =
|
229
|
-
tsi_handshaker_result_extract_peer(
|
264
|
+
tsi_handshaker_result_extract_peer(handshaker_result_, &peer);
|
230
265
|
if (result != TSI_OK) {
|
231
266
|
return grpc_set_tsi_error_result(
|
232
267
|
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Peer extraction failed"), result);
|
233
268
|
}
|
234
|
-
|
235
|
-
|
269
|
+
connector_->check_peer(peer, args_->endpoint, &auth_context_,
|
270
|
+
&on_peer_checked_);
|
236
271
|
return GRPC_ERROR_NONE;
|
237
272
|
}
|
238
273
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
tsi_handshaker_result* handshaker_result) {
|
274
|
+
grpc_error* SecurityHandshaker::OnHandshakeNextDoneLocked(
|
275
|
+
tsi_result result, const unsigned char* bytes_to_send,
|
276
|
+
size_t bytes_to_send_size, tsi_handshaker_result* handshaker_result) {
|
243
277
|
grpc_error* error = GRPC_ERROR_NONE;
|
244
278
|
// Handshaker was shutdown.
|
245
|
-
if (
|
279
|
+
if (is_shutdown_) {
|
246
280
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Handshaker shutdown");
|
247
281
|
}
|
248
282
|
// Read more if we need to.
|
249
283
|
if (result == TSI_INCOMPLETE_DATA) {
|
250
284
|
GPR_ASSERT(bytes_to_send_size == 0);
|
251
|
-
grpc_endpoint_read(
|
252
|
-
&
|
285
|
+
grpc_endpoint_read(args_->endpoint, args_->read_buffer,
|
286
|
+
&on_handshake_data_received_from_peer_);
|
253
287
|
return error;
|
254
288
|
}
|
255
289
|
if (result != TSI_OK) {
|
@@ -258,55 +292,52 @@ static grpc_error* on_handshake_next_done_locked(
|
|
258
292
|
}
|
259
293
|
// Update handshaker result.
|
260
294
|
if (handshaker_result != nullptr) {
|
261
|
-
GPR_ASSERT(
|
262
|
-
|
295
|
+
GPR_ASSERT(handshaker_result_ == nullptr);
|
296
|
+
handshaker_result_ = handshaker_result;
|
263
297
|
}
|
264
298
|
if (bytes_to_send_size > 0) {
|
265
299
|
// Send data to peer, if needed.
|
266
300
|
grpc_slice to_send = grpc_slice_from_copied_buffer(
|
267
301
|
reinterpret_cast<const char*>(bytes_to_send), bytes_to_send_size);
|
268
|
-
grpc_slice_buffer_reset_and_unref_internal(&
|
269
|
-
grpc_slice_buffer_add(&
|
270
|
-
grpc_endpoint_write(
|
271
|
-
&
|
302
|
+
grpc_slice_buffer_reset_and_unref_internal(&outgoing_);
|
303
|
+
grpc_slice_buffer_add(&outgoing_, to_send);
|
304
|
+
grpc_endpoint_write(args_->endpoint, &outgoing_,
|
305
|
+
&on_handshake_data_sent_to_peer_, nullptr);
|
272
306
|
} else if (handshaker_result == nullptr) {
|
273
307
|
// There is nothing to send, but need to read from peer.
|
274
|
-
grpc_endpoint_read(
|
275
|
-
&
|
308
|
+
grpc_endpoint_read(args_->endpoint, args_->read_buffer,
|
309
|
+
&on_handshake_data_received_from_peer_);
|
276
310
|
} else {
|
277
311
|
// Handshake has finished, check peer and so on.
|
278
|
-
error =
|
312
|
+
error = CheckPeerLocked();
|
279
313
|
}
|
280
314
|
return error;
|
281
315
|
}
|
282
316
|
|
283
|
-
|
317
|
+
void SecurityHandshaker::OnHandshakeNextDoneGrpcWrapper(
|
284
318
|
tsi_result result, void* user_data, const unsigned char* bytes_to_send,
|
285
319
|
size_t bytes_to_send_size, tsi_handshaker_result* handshaker_result) {
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
320
|
+
RefCountedPtr<SecurityHandshaker> h(
|
321
|
+
static_cast<SecurityHandshaker*>(user_data));
|
322
|
+
MutexLock lock(&h->mu_);
|
323
|
+
grpc_error* error = h->OnHandshakeNextDoneLocked(
|
324
|
+
result, bytes_to_send, bytes_to_send_size, handshaker_result);
|
290
325
|
if (error != GRPC_ERROR_NONE) {
|
291
|
-
|
292
|
-
gpr_mu_unlock(&h->mu);
|
293
|
-
h->Unref();
|
326
|
+
h->HandshakeFailedLocked(error);
|
294
327
|
} else {
|
295
|
-
|
328
|
+
h.release(); // Avoid unref
|
296
329
|
}
|
297
330
|
}
|
298
331
|
|
299
|
-
|
300
|
-
|
301
|
-
size_t bytes_received_size) {
|
332
|
+
grpc_error* SecurityHandshaker::DoHandshakerNextLocked(
|
333
|
+
const unsigned char* bytes_received, size_t bytes_received_size) {
|
302
334
|
// Invoke TSI handshaker.
|
303
335
|
const unsigned char* bytes_to_send = nullptr;
|
304
336
|
size_t bytes_to_send_size = 0;
|
305
|
-
tsi_handshaker_result*
|
337
|
+
tsi_handshaker_result* hs_result = nullptr;
|
306
338
|
tsi_result result = tsi_handshaker_next(
|
307
|
-
|
308
|
-
&bytes_to_send_size, &
|
309
|
-
&on_handshake_next_done_grpc_wrapper, h);
|
339
|
+
handshaker_, bytes_received, bytes_received_size, &bytes_to_send,
|
340
|
+
&bytes_to_send_size, &hs_result, &OnHandshakeNextDoneGrpcWrapper, this);
|
310
341
|
if (result == TSI_ASYNC) {
|
311
342
|
// Handshaker operating asynchronously. Nothing else to do here;
|
312
343
|
// callback will be invoked in a TSI thread.
|
@@ -314,233 +345,169 @@ static grpc_error* do_handshaker_next_locked(
|
|
314
345
|
}
|
315
346
|
// Handshaker returned synchronously. Invoke callback directly in
|
316
347
|
// this thread with our existing exec_ctx.
|
317
|
-
return
|
318
|
-
|
348
|
+
return OnHandshakeNextDoneLocked(result, bytes_to_send, bytes_to_send_size,
|
349
|
+
hs_result);
|
319
350
|
}
|
320
351
|
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
gpr_mu_unlock(&h->mu);
|
329
|
-
h->Unref();
|
352
|
+
void SecurityHandshaker::OnHandshakeDataReceivedFromPeerFn(void* arg,
|
353
|
+
grpc_error* error) {
|
354
|
+
RefCountedPtr<SecurityHandshaker> h(static_cast<SecurityHandshaker*>(arg));
|
355
|
+
MutexLock lock(&h->mu_);
|
356
|
+
if (error != GRPC_ERROR_NONE || h->is_shutdown_) {
|
357
|
+
h->HandshakeFailedLocked(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
|
358
|
+
"Handshake read failed", &error, 1));
|
330
359
|
return;
|
331
360
|
}
|
332
361
|
// Copy all slices received.
|
333
|
-
size_t bytes_received_size =
|
362
|
+
size_t bytes_received_size = h->MoveReadBufferIntoHandshakeBuffer();
|
334
363
|
// Call TSI handshaker.
|
335
|
-
error =
|
336
|
-
do_handshaker_next_locked(h, h->handshake_buffer, bytes_received_size);
|
364
|
+
error = h->DoHandshakerNextLocked(h->handshake_buffer_, bytes_received_size);
|
337
365
|
|
338
366
|
if (error != GRPC_ERROR_NONE) {
|
339
|
-
|
340
|
-
gpr_mu_unlock(&h->mu);
|
341
|
-
h->Unref();
|
367
|
+
h->HandshakeFailedLocked(error);
|
342
368
|
} else {
|
343
|
-
|
369
|
+
h.release(); // Avoid unref
|
344
370
|
}
|
345
371
|
}
|
346
372
|
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
gpr_mu_unlock(&h->mu);
|
355
|
-
h->Unref();
|
373
|
+
void SecurityHandshaker::OnHandshakeDataSentToPeerFn(void* arg,
|
374
|
+
grpc_error* error) {
|
375
|
+
RefCountedPtr<SecurityHandshaker> h(static_cast<SecurityHandshaker*>(arg));
|
376
|
+
MutexLock lock(&h->mu_);
|
377
|
+
if (error != GRPC_ERROR_NONE || h->is_shutdown_) {
|
378
|
+
h->HandshakeFailedLocked(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
|
379
|
+
"Handshake write failed", &error, 1));
|
356
380
|
return;
|
357
381
|
}
|
358
382
|
// We may be done.
|
359
|
-
if (h->
|
360
|
-
grpc_endpoint_read(h->
|
361
|
-
&h->
|
383
|
+
if (h->handshaker_result_ == nullptr) {
|
384
|
+
grpc_endpoint_read(h->args_->endpoint, h->args_->read_buffer,
|
385
|
+
&h->on_handshake_data_received_from_peer_);
|
362
386
|
} else {
|
363
|
-
error =
|
387
|
+
error = h->CheckPeerLocked();
|
364
388
|
if (error != GRPC_ERROR_NONE) {
|
365
|
-
|
366
|
-
gpr_mu_unlock(&h->mu);
|
367
|
-
h->Unref();
|
389
|
+
h->HandshakeFailedLocked(error);
|
368
390
|
return;
|
369
391
|
}
|
370
392
|
}
|
371
|
-
|
393
|
+
h.release(); // Avoid unref
|
372
394
|
}
|
373
395
|
|
374
396
|
//
|
375
397
|
// public handshaker API
|
376
398
|
//
|
377
399
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
security_handshaker* h = reinterpret_cast<security_handshaker*>(handshaker);
|
386
|
-
gpr_mu_lock(&h->mu);
|
387
|
-
if (!h->shutdown) {
|
388
|
-
h->shutdown = true;
|
389
|
-
tsi_handshaker_shutdown(h->handshaker);
|
390
|
-
grpc_endpoint_shutdown(h->args->endpoint, GRPC_ERROR_REF(why));
|
391
|
-
cleanup_args_for_failure_locked(h);
|
400
|
+
void SecurityHandshaker::Shutdown(grpc_error* why) {
|
401
|
+
MutexLock lock(&mu_);
|
402
|
+
if (!is_shutdown_) {
|
403
|
+
is_shutdown_ = true;
|
404
|
+
tsi_handshaker_shutdown(handshaker_);
|
405
|
+
grpc_endpoint_shutdown(args_->endpoint, GRPC_ERROR_REF(why));
|
406
|
+
CleanupArgsForFailureLocked();
|
392
407
|
}
|
393
|
-
gpr_mu_unlock(&h->mu);
|
394
408
|
GRPC_ERROR_UNREF(why);
|
395
409
|
}
|
396
410
|
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
h->Ref();
|
406
|
-
size_t bytes_received_size = move_read_buffer_into_handshake_buffer(h);
|
411
|
+
void SecurityHandshaker::DoHandshake(grpc_tcp_server_acceptor* acceptor,
|
412
|
+
grpc_closure* on_handshake_done,
|
413
|
+
HandshakerArgs* args) {
|
414
|
+
auto ref = Ref();
|
415
|
+
MutexLock lock(&mu_);
|
416
|
+
args_ = args;
|
417
|
+
on_handshake_done_ = on_handshake_done;
|
418
|
+
size_t bytes_received_size = MoveReadBufferIntoHandshakeBuffer();
|
407
419
|
grpc_error* error =
|
408
|
-
|
420
|
+
DoHandshakerNextLocked(handshake_buffer_, bytes_received_size);
|
409
421
|
if (error != GRPC_ERROR_NONE) {
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
return;
|
422
|
+
HandshakeFailedLocked(error);
|
423
|
+
} else {
|
424
|
+
ref.release(); // Avoid unref
|
414
425
|
}
|
415
|
-
gpr_mu_unlock(&h->mu);
|
416
|
-
}
|
417
|
-
|
418
|
-
static const grpc_handshaker_vtable security_handshaker_vtable = {
|
419
|
-
security_handshaker_destroy, security_handshaker_shutdown,
|
420
|
-
security_handshaker_do_handshake, "security"};
|
421
|
-
|
422
|
-
namespace {
|
423
|
-
security_handshaker::security_handshaker(tsi_handshaker* handshaker,
|
424
|
-
grpc_security_connector* connector)
|
425
|
-
: handshaker(handshaker),
|
426
|
-
connector(connector->Ref(DEBUG_LOCATION, "handshake")),
|
427
|
-
handshake_buffer_size(GRPC_INITIAL_HANDSHAKE_BUFFER_SIZE),
|
428
|
-
handshake_buffer(
|
429
|
-
static_cast<uint8_t*>(gpr_malloc(handshake_buffer_size))) {
|
430
|
-
grpc_handshaker_init(&security_handshaker_vtable, &base);
|
431
|
-
gpr_mu_init(&mu);
|
432
|
-
grpc_slice_buffer_init(&outgoing);
|
433
|
-
GRPC_CLOSURE_INIT(&on_handshake_data_sent_to_peer,
|
434
|
-
::on_handshake_data_sent_to_peer, this,
|
435
|
-
grpc_schedule_on_exec_ctx);
|
436
|
-
GRPC_CLOSURE_INIT(&on_handshake_data_received_from_peer,
|
437
|
-
::on_handshake_data_received_from_peer, this,
|
438
|
-
grpc_schedule_on_exec_ctx);
|
439
|
-
GRPC_CLOSURE_INIT(&on_peer_checked, ::on_peer_checked, this,
|
440
|
-
grpc_schedule_on_exec_ctx);
|
441
|
-
}
|
442
|
-
} // namespace
|
443
|
-
|
444
|
-
static grpc_handshaker* security_handshaker_create(
|
445
|
-
tsi_handshaker* handshaker, grpc_security_connector* connector) {
|
446
|
-
security_handshaker* h =
|
447
|
-
grpc_core::New<security_handshaker>(handshaker, connector);
|
448
|
-
return &h->base;
|
449
426
|
}
|
450
427
|
|
451
428
|
//
|
452
|
-
//
|
429
|
+
// FailHandshaker
|
453
430
|
//
|
454
431
|
|
455
|
-
|
456
|
-
|
457
|
-
}
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
grpc_closure* on_handshake_done,
|
467
|
-
grpc_handshaker_args* args) {
|
468
|
-
GRPC_CLOSURE_SCHED(on_handshake_done,
|
469
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
470
|
-
"Failed to create security handshaker"));
|
471
|
-
}
|
472
|
-
|
473
|
-
static const grpc_handshaker_vtable fail_handshaker_vtable = {
|
474
|
-
fail_handshaker_destroy, fail_handshaker_shutdown,
|
475
|
-
fail_handshaker_do_handshake, "security_fail"};
|
432
|
+
class FailHandshaker : public Handshaker {
|
433
|
+
public:
|
434
|
+
const char* name() const override { return "security_fail"; }
|
435
|
+
void Shutdown(grpc_error* why) override { GRPC_ERROR_UNREF(why); }
|
436
|
+
void DoHandshake(grpc_tcp_server_acceptor* acceptor,
|
437
|
+
grpc_closure* on_handshake_done,
|
438
|
+
HandshakerArgs* args) override {
|
439
|
+
GRPC_CLOSURE_SCHED(on_handshake_done,
|
440
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
441
|
+
"Failed to create security handshaker"));
|
442
|
+
}
|
476
443
|
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
return h;
|
481
|
-
}
|
444
|
+
private:
|
445
|
+
virtual ~FailHandshaker() = default;
|
446
|
+
};
|
482
447
|
|
483
448
|
//
|
484
449
|
// handshaker factories
|
485
450
|
//
|
486
451
|
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
security_connector
|
452
|
+
class ClientSecurityHandshakerFactory : public HandshakerFactory {
|
453
|
+
public:
|
454
|
+
void AddHandshakers(const grpc_channel_args* args,
|
455
|
+
grpc_pollset_set* interested_parties,
|
456
|
+
HandshakeManager* handshake_mgr) override {
|
457
|
+
auto* security_connector =
|
458
|
+
reinterpret_cast<grpc_channel_security_connector*>(
|
459
|
+
grpc_security_connector_find_in_args(args));
|
460
|
+
if (security_connector) {
|
461
|
+
security_connector->add_handshakers(interested_parties, handshake_mgr);
|
462
|
+
}
|
496
463
|
}
|
497
|
-
|
464
|
+
~ClientSecurityHandshakerFactory() override = default;
|
465
|
+
};
|
498
466
|
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
security_connector
|
467
|
+
class ServerSecurityHandshakerFactory : public HandshakerFactory {
|
468
|
+
public:
|
469
|
+
void AddHandshakers(const grpc_channel_args* args,
|
470
|
+
grpc_pollset_set* interested_parties,
|
471
|
+
HandshakeManager* handshake_mgr) override {
|
472
|
+
auto* security_connector =
|
473
|
+
reinterpret_cast<grpc_server_security_connector*>(
|
474
|
+
grpc_security_connector_find_in_args(args));
|
475
|
+
if (security_connector) {
|
476
|
+
security_connector->add_handshakers(interested_parties, handshake_mgr);
|
477
|
+
}
|
508
478
|
}
|
509
|
-
|
510
|
-
|
511
|
-
static void handshaker_factory_destroy(
|
512
|
-
grpc_handshaker_factory* handshaker_factory) {}
|
513
|
-
|
514
|
-
static const grpc_handshaker_factory_vtable client_handshaker_factory_vtable = {
|
515
|
-
client_handshaker_factory_add_handshakers, handshaker_factory_destroy};
|
516
|
-
|
517
|
-
static grpc_handshaker_factory client_handshaker_factory = {
|
518
|
-
&client_handshaker_factory_vtable};
|
519
|
-
|
520
|
-
static const grpc_handshaker_factory_vtable server_handshaker_factory_vtable = {
|
521
|
-
server_handshaker_factory_add_handshakers, handshaker_factory_destroy};
|
479
|
+
~ServerSecurityHandshakerFactory() override = default;
|
480
|
+
};
|
522
481
|
|
523
|
-
|
524
|
-
&server_handshaker_factory_vtable};
|
482
|
+
} // namespace
|
525
483
|
|
526
484
|
//
|
527
485
|
// exported functions
|
528
486
|
//
|
529
487
|
|
530
|
-
|
488
|
+
RefCountedPtr<Handshaker> SecurityHandshakerCreate(
|
531
489
|
tsi_handshaker* handshaker, grpc_security_connector* connector) {
|
532
490
|
// If no TSI handshaker was created, return a handshaker that always fails.
|
533
491
|
// Otherwise, return a real security handshaker.
|
534
492
|
if (handshaker == nullptr) {
|
535
|
-
return
|
493
|
+
return MakeRefCounted<FailHandshaker>();
|
536
494
|
} else {
|
537
|
-
return
|
495
|
+
return MakeRefCounted<SecurityHandshaker>(handshaker, connector);
|
538
496
|
}
|
539
497
|
}
|
540
498
|
|
541
|
-
void
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
499
|
+
void SecurityRegisterHandshakerFactories() {
|
500
|
+
HandshakerRegistry::RegisterHandshakerFactory(
|
501
|
+
false /* at_start */, HANDSHAKER_CLIENT,
|
502
|
+
UniquePtr<HandshakerFactory>(New<ClientSecurityHandshakerFactory>()));
|
503
|
+
HandshakerRegistry::RegisterHandshakerFactory(
|
504
|
+
false /* at_start */, HANDSHAKER_SERVER,
|
505
|
+
UniquePtr<HandshakerFactory>(New<ServerSecurityHandshakerFactory>()));
|
506
|
+
}
|
507
|
+
|
508
|
+
} // namespace grpc_core
|
509
|
+
|
510
|
+
grpc_handshaker* grpc_security_handshaker_create(
|
511
|
+
tsi_handshaker* handshaker, grpc_security_connector* connector) {
|
512
|
+
return SecurityHandshakerCreate(handshaker, connector).release();
|
546
513
|
}
|