grpc 1.59.2 → 1.59.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +9 -1
- data/include/grpc/grpc_crl_provider.h +94 -0
- data/include/grpc/grpc_security.h +18 -0
- data/include/grpc/module.modulemap +1 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +36 -27
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -0
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +2 -1
- data/src/core/lib/gprpp/directory_reader.h +48 -0
- data/src/core/lib/gprpp/posix/directory_reader.cc +82 -0
- data/src/core/lib/gprpp/windows/directory_reader.cc +80 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +22 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +5 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +238 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +132 -0
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +23 -0
- data/src/core/lib/security/security_connector/ssl_utils.cc +7 -0
- data/src/core/lib/security/security_connector/ssl_utils.h +4 -0
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +3 -2
- data/src/core/tsi/ssl_transport_security.cc +109 -15
- data/src/core/tsi/ssl_transport_security.h +19 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2f9c97b2899a98b0aa10617cf7d44f43c790a94ae5254ed9f5aeb00d981fc5f
|
4
|
+
data.tar.gz: 8de2a6a60e16d1f737e2feac45432deca18279de9ec5d53b91a6fad053a40cba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ec764417ad5ce529fae525c381d4d8cc0a201ef3ca7637702a1f2562606bf43ac4e9896a3649b88087c01dea10248f0d6d339a01559248c62ebf75b28fbb83d
|
7
|
+
data.tar.gz: 514767e299520918851cb034c80a9765ade6f230488a9c278ffff02cca9e9c9610a459e1d6ce8dafd4f87fbac9696c2efb816defb5c9b31ca784436bef481b16
|
data/Makefile
CHANGED
@@ -411,7 +411,7 @@ Q = @
|
|
411
411
|
endif
|
412
412
|
|
413
413
|
CORE_VERSION = 36.0.0
|
414
|
-
CPP_VERSION = 1.59.
|
414
|
+
CPP_VERSION = 1.59.5
|
415
415
|
|
416
416
|
CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
|
417
417
|
CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
|
@@ -1482,11 +1482,13 @@ LIBGRPC_SRC = \
|
|
1482
1482
|
src/core/lib/experiments/experiments.cc \
|
1483
1483
|
src/core/lib/gprpp/load_file.cc \
|
1484
1484
|
src/core/lib/gprpp/per_cpu.cc \
|
1485
|
+
src/core/lib/gprpp/posix/directory_reader.cc \
|
1485
1486
|
src/core/lib/gprpp/ref_counted_string.cc \
|
1486
1487
|
src/core/lib/gprpp/status_helper.cc \
|
1487
1488
|
src/core/lib/gprpp/time.cc \
|
1488
1489
|
src/core/lib/gprpp/time_averaged_stats.cc \
|
1489
1490
|
src/core/lib/gprpp/validation_errors.cc \
|
1491
|
+
src/core/lib/gprpp/windows/directory_reader.cc \
|
1490
1492
|
src/core/lib/gprpp/work_serializer.cc \
|
1491
1493
|
src/core/lib/handshaker/proxy_mapper_registry.cc \
|
1492
1494
|
src/core/lib/http/format_request.cc \
|
@@ -1636,6 +1638,7 @@ LIBGRPC_SRC = \
|
|
1636
1638
|
src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc \
|
1637
1639
|
src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc \
|
1638
1640
|
src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc \
|
1641
|
+
src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc \
|
1639
1642
|
src/core/lib/security/credentials/tls/tls_credentials.cc \
|
1640
1643
|
src/core/lib/security/credentials/tls/tls_utils.cc \
|
1641
1644
|
src/core/lib/security/credentials/xds/xds_credentials.cc \
|
@@ -1750,6 +1753,7 @@ PUBLIC_HEADERS_C += \
|
|
1750
1753
|
include/grpc/fork.h \
|
1751
1754
|
include/grpc/grpc.h \
|
1752
1755
|
include/grpc/grpc_audit_logging.h \
|
1756
|
+
include/grpc/grpc_crl_provider.h \
|
1753
1757
|
include/grpc/grpc_posix.h \
|
1754
1758
|
include/grpc/grpc_security.h \
|
1755
1759
|
include/grpc/grpc_security_constants.h \
|
@@ -2266,6 +2270,7 @@ PUBLIC_HEADERS_C += \
|
|
2266
2270
|
include/grpc/fork.h \
|
2267
2271
|
include/grpc/grpc.h \
|
2268
2272
|
include/grpc/grpc_audit_logging.h \
|
2273
|
+
include/grpc/grpc_crl_provider.h \
|
2269
2274
|
include/grpc/grpc_posix.h \
|
2270
2275
|
include/grpc/grpc_security.h \
|
2271
2276
|
include/grpc/grpc_security_constants.h \
|
@@ -3656,6 +3661,8 @@ src/core/ext/xds/xds_route_config.cc: $(OPENSSL_DEP)
|
|
3656
3661
|
src/core/ext/xds/xds_routing.cc: $(OPENSSL_DEP)
|
3657
3662
|
src/core/ext/xds/xds_server_config_fetcher.cc: $(OPENSSL_DEP)
|
3658
3663
|
src/core/ext/xds/xds_transport_grpc.cc: $(OPENSSL_DEP)
|
3664
|
+
src/core/lib/gprpp/posix/directory_reader.cc: $(OPENSSL_DEP)
|
3665
|
+
src/core/lib/gprpp/windows/directory_reader.cc: $(OPENSSL_DEP)
|
3659
3666
|
src/core/lib/http/httpcli_security_connector.cc: $(OPENSSL_DEP)
|
3660
3667
|
src/core/lib/json/json_util.cc: $(OPENSSL_DEP)
|
3661
3668
|
src/core/lib/matchers/matchers.cc: $(OPENSSL_DEP)
|
@@ -3685,6 +3692,7 @@ src/core/lib/security/credentials/tls/grpc_tls_certificate_match.cc: $(OPENSSL_D
|
|
3685
3692
|
src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc: $(OPENSSL_DEP)
|
3686
3693
|
src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc: $(OPENSSL_DEP)
|
3687
3694
|
src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc: $(OPENSSL_DEP)
|
3695
|
+
src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc: $(OPENSSL_DEP)
|
3688
3696
|
src/core/lib/security/credentials/tls/tls_credentials.cc: $(OPENSSL_DEP)
|
3689
3697
|
src/core/lib/security/credentials/xds/xds_credentials.cc: $(OPENSSL_DEP)
|
3690
3698
|
src/core/lib/security/security_connector/alts/alts_security_connector.cc: $(OPENSSL_DEP)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2023 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#ifndef GRPC_GRPC_CRL_PROVIDER_H
|
20
|
+
#define GRPC_GRPC_CRL_PROVIDER_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include <memory>
|
25
|
+
#include <string>
|
26
|
+
|
27
|
+
#include "absl/status/statusor.h"
|
28
|
+
#include "absl/strings/string_view.h"
|
29
|
+
|
30
|
+
#include <grpc/grpc_security.h>
|
31
|
+
|
32
|
+
namespace grpc_core {
|
33
|
+
namespace experimental {
|
34
|
+
|
35
|
+
// Opaque representation of a CRL. Must be thread safe.
|
36
|
+
class Crl {
|
37
|
+
public:
|
38
|
+
static absl::StatusOr<std::unique_ptr<Crl>> Parse(
|
39
|
+
absl::string_view crl_string);
|
40
|
+
virtual ~Crl() = default;
|
41
|
+
virtual absl::string_view Issuer() = 0;
|
42
|
+
};
|
43
|
+
|
44
|
+
// Information about a certificate to be used to fetch its associated CRL. Must
|
45
|
+
// be thread safe.
|
46
|
+
class CertificateInfo {
|
47
|
+
public:
|
48
|
+
virtual ~CertificateInfo() = default;
|
49
|
+
virtual absl::string_view Issuer() const = 0;
|
50
|
+
};
|
51
|
+
|
52
|
+
// The base class for CRL Provider implementations.
|
53
|
+
// CrlProviders can be passed in as a way to supply CRLs during handshakes.
|
54
|
+
// CrlProviders must be thread safe. They are on the critical path of gRPC
|
55
|
+
// creating a connection and doing a handshake, so the implementation of
|
56
|
+
// `GetCrl` should be very fast. It is suggested to have an in-memory map of
|
57
|
+
// CRLs for quick lookup and return, and doing expensive updates to this map
|
58
|
+
// asynchronously.
|
59
|
+
class CrlProvider {
|
60
|
+
public:
|
61
|
+
virtual ~CrlProvider() = default;
|
62
|
+
// Get the CRL associated with a certificate. Read-only.
|
63
|
+
virtual std::shared_ptr<Crl> GetCrl(
|
64
|
+
const CertificateInfo& certificate_info) = 0;
|
65
|
+
};
|
66
|
+
|
67
|
+
absl::StatusOr<std::shared_ptr<CrlProvider>> CreateStaticCrlProvider(
|
68
|
+
absl::Span<const std::string> crls);
|
69
|
+
|
70
|
+
// Creates a CRL Provider that periodically and asynchronously reloads a
|
71
|
+
// directory. The refresh_duration minimum is 60 seconds. The
|
72
|
+
// reload_error_callback provides a way for the user to specifically log or
|
73
|
+
// otherwise notify of errors during reloading. Since reloading is asynchronous
|
74
|
+
// and not on the main codepath, the grpc process will continue to run through
|
75
|
+
// reloading errors, so this mechanism is an important way to provide signals to
|
76
|
+
// your monitoring and alerting setup.
|
77
|
+
absl::StatusOr<std::shared_ptr<CrlProvider>> CreateDirectoryReloaderCrlProvider(
|
78
|
+
absl::string_view directory, std::chrono::seconds refresh_duration,
|
79
|
+
std::function<void(absl::Status)> reload_error_callback);
|
80
|
+
|
81
|
+
} // namespace experimental
|
82
|
+
} // namespace grpc_core
|
83
|
+
|
84
|
+
// TODO(gtcooke94) - Mark with api macro when all wrapped langauges support C++
|
85
|
+
// in core APIs
|
86
|
+
/**
|
87
|
+
* EXPERIMENTAL API - Subject to change
|
88
|
+
*
|
89
|
+
* Sets the crl provider in the options.
|
90
|
+
*/
|
91
|
+
void grpc_tls_credentials_options_set_crl_provider(
|
92
|
+
grpc_tls_credentials_options* options,
|
93
|
+
std::shared_ptr<grpc_core::experimental::CrlProvider> provider);
|
94
|
+
#endif /* GRPC_GRPC_CRL_PROVIDER_H */
|
@@ -815,6 +815,24 @@ GRPCAPI void grpc_tls_certificate_provider_release(
|
|
815
815
|
*/
|
816
816
|
GRPCAPI grpc_tls_credentials_options* grpc_tls_credentials_options_create(void);
|
817
817
|
|
818
|
+
/**
|
819
|
+
* EXPERIMENTAL API - Subject to change
|
820
|
+
*
|
821
|
+
* Sets the minimum TLS version that will be negotiated during the TLS
|
822
|
+
* handshake. If not set, the underlying SSL library will set it to TLS v1.2.
|
823
|
+
*/
|
824
|
+
GRPCAPI void grpc_tls_credentials_options_set_min_tls_version(
|
825
|
+
grpc_tls_credentials_options* options, grpc_tls_version min_tls_version);
|
826
|
+
|
827
|
+
/**
|
828
|
+
* EXPERIMENTAL API - Subject to change
|
829
|
+
*
|
830
|
+
* Sets the maximum TLS version that will be negotiated during the TLS
|
831
|
+
* handshake. If not set, the underlying SSL library will set it to TLS v1.3.
|
832
|
+
*/
|
833
|
+
GRPCAPI void grpc_tls_credentials_options_set_max_tls_version(
|
834
|
+
grpc_tls_credentials_options* options, grpc_tls_version max_tls_version);
|
835
|
+
|
818
836
|
/**
|
819
837
|
* EXPERIMENTAL API - Subject to change
|
820
838
|
*
|
@@ -91,12 +91,14 @@ constexpr Base64InverseTable kBase64InverseTable;
|
|
91
91
|
class HPackParser::Input {
|
92
92
|
public:
|
93
93
|
Input(grpc_slice_refcount* current_slice_refcount, const uint8_t* begin,
|
94
|
-
const uint8_t* end, absl::BitGenRef bitsrc,
|
94
|
+
const uint8_t* end, absl::BitGenRef bitsrc,
|
95
|
+
HpackParseResult& frame_error, HpackParseResult& field_error)
|
95
96
|
: current_slice_refcount_(current_slice_refcount),
|
96
97
|
begin_(begin),
|
97
98
|
end_(end),
|
98
99
|
frontier_(begin),
|
99
|
-
|
100
|
+
frame_error_(frame_error),
|
101
|
+
field_error_(field_error),
|
100
102
|
bitsrc_(bitsrc) {}
|
101
103
|
|
102
104
|
// If input is backed by a slice, retrieve its refcount. If not, return
|
@@ -215,14 +217,18 @@ class HPackParser::Input {
|
|
215
217
|
|
216
218
|
// Check if we saw an EOF
|
217
219
|
bool eof_error() const {
|
218
|
-
return min_progress_size_ != 0 ||
|
220
|
+
return min_progress_size_ != 0 || frame_error_.connection_error();
|
221
|
+
}
|
222
|
+
|
223
|
+
// Reset the field error to be ok
|
224
|
+
void ClearFieldError() {
|
225
|
+
if (field_error_.ok()) return;
|
226
|
+
field_error_ = HpackParseResult();
|
219
227
|
}
|
220
228
|
|
221
229
|
// Minimum number of bytes to unstuck the current parse
|
222
230
|
size_t min_progress_size() const { return min_progress_size_; }
|
223
231
|
|
224
|
-
bool has_error() const { return !error_.ok(); }
|
225
|
-
|
226
232
|
// Set the current error - tweaks the error to include a stream id so that
|
227
233
|
// chttp2 does not close the connection.
|
228
234
|
// Intended for errors that are specific to a stream and recoverable.
|
@@ -246,10 +252,7 @@ class HPackParser::Input {
|
|
246
252
|
// read prior to being able to get further in this parse.
|
247
253
|
void UnexpectedEOF(size_t min_progress_size) {
|
248
254
|
GPR_ASSERT(min_progress_size > 0);
|
249
|
-
if (
|
250
|
-
GPR_DEBUG_ASSERT(eof_error());
|
251
|
-
return;
|
252
|
-
}
|
255
|
+
if (eof_error()) return;
|
253
256
|
// Set min progress size, taking into account bytes parsed already but not
|
254
257
|
// consumed.
|
255
258
|
min_progress_size_ = min_progress_size + (begin_ - frontier_);
|
@@ -302,13 +305,18 @@ class HPackParser::Input {
|
|
302
305
|
// Do not use this directly, instead use SetErrorAndContinueParsing or
|
303
306
|
// SetErrorAndStopParsing.
|
304
307
|
void SetError(HpackParseResult error) {
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
+
SetErrorFor(frame_error_, error);
|
309
|
+
SetErrorFor(field_error_, std::move(error));
|
310
|
+
}
|
311
|
+
|
312
|
+
void SetErrorFor(HpackParseResult& error, HpackParseResult new_error) {
|
313
|
+
if (!error.ok() || min_progress_size_ > 0) {
|
314
|
+
if (new_error.connection_error() && !error.connection_error()) {
|
315
|
+
error = std::move(new_error); // connection errors dominate
|
308
316
|
}
|
309
317
|
return;
|
310
318
|
}
|
311
|
-
|
319
|
+
error = std::move(new_error);
|
312
320
|
}
|
313
321
|
|
314
322
|
// Refcount if we are backed by a slice
|
@@ -320,7 +328,8 @@ class HPackParser::Input {
|
|
320
328
|
// Frontier denotes the first byte past successfully processed input
|
321
329
|
const uint8_t* frontier_;
|
322
330
|
// Current error
|
323
|
-
HpackParseResult&
|
331
|
+
HpackParseResult& frame_error_;
|
332
|
+
HpackParseResult& field_error_;
|
324
333
|
// If the error was EOF, we flag it here by noting how many more bytes would
|
325
334
|
// be needed to make progress
|
326
335
|
size_t min_progress_size_ = 0;
|
@@ -597,6 +606,7 @@ class HPackParser::Parser {
|
|
597
606
|
bool ParseTop() {
|
598
607
|
GPR_DEBUG_ASSERT(state_.parse_state == ParseState::kTop);
|
599
608
|
auto cur = *input_->Next();
|
609
|
+
input_->ClearFieldError();
|
600
610
|
switch (cur >> 4) {
|
601
611
|
// Literal header not indexed - First byte format: 0000xxxx
|
602
612
|
// Literal header never indexed - First byte format: 0001xxxx
|
@@ -702,7 +712,7 @@ class HPackParser::Parser {
|
|
702
712
|
break;
|
703
713
|
}
|
704
714
|
gpr_log(
|
705
|
-
|
715
|
+
GPR_INFO, "HTTP:%d:%s:%s: %s%s", log_info_.stream_id, type,
|
706
716
|
log_info_.is_client ? "CLI" : "SVR", memento.md.DebugString().c_str(),
|
707
717
|
memento.parse_status == nullptr
|
708
718
|
? ""
|
@@ -951,11 +961,10 @@ class HPackParser::Parser {
|
|
951
961
|
state_.string_length)
|
952
962
|
: String::Parse(input_, state_.is_string_huff_compressed,
|
953
963
|
state_.string_length);
|
954
|
-
HpackParseResult& status = state_.frame_error;
|
955
964
|
absl::string_view key_string;
|
956
965
|
if (auto* s = absl::get_if<Slice>(&state_.key)) {
|
957
966
|
key_string = s->as_string_view();
|
958
|
-
if (
|
967
|
+
if (state_.field_error.ok()) {
|
959
968
|
auto r = ValidateKey(key_string);
|
960
969
|
if (r != ValidateMetadataResult::kOk) {
|
961
970
|
input_->SetErrorAndContinueParsing(
|
@@ -965,7 +974,7 @@ class HPackParser::Parser {
|
|
965
974
|
} else {
|
966
975
|
const auto* memento = absl::get<const HPackTable::Memento*>(state_.key);
|
967
976
|
key_string = memento->md.key();
|
968
|
-
if (
|
977
|
+
if (state_.field_error.ok() && memento->parse_status != nullptr) {
|
969
978
|
input_->SetErrorAndContinueParsing(*memento->parse_status);
|
970
979
|
}
|
971
980
|
}
|
@@ -992,16 +1001,16 @@ class HPackParser::Parser {
|
|
992
1001
|
key_string.size() + value.wire_size + hpack_constants::kEntryOverhead;
|
993
1002
|
auto md = grpc_metadata_batch::Parse(
|
994
1003
|
key_string, std::move(value_slice), state_.add_to_table, transport_size,
|
995
|
-
[key_string,
|
996
|
-
if (!
|
1004
|
+
[key_string, this](absl::string_view message, const Slice&) {
|
1005
|
+
if (!state_.field_error.ok()) return;
|
997
1006
|
input_->SetErrorAndContinueParsing(
|
998
1007
|
HpackParseResult::MetadataParseError(key_string));
|
999
1008
|
gpr_log(GPR_ERROR, "Error parsing '%s' metadata: %s",
|
1000
1009
|
std::string(key_string).c_str(),
|
1001
1010
|
std::string(message).c_str());
|
1002
1011
|
});
|
1003
|
-
HPackTable::Memento memento{
|
1004
|
-
|
1012
|
+
HPackTable::Memento memento{
|
1013
|
+
std::move(md), state_.field_error.PersistentStreamErrorOrNullptr()};
|
1005
1014
|
input_->UpdateFrontier();
|
1006
1015
|
state_.parse_state = ParseState::kTop;
|
1007
1016
|
if (state_.add_to_table) {
|
@@ -1163,13 +1172,13 @@ grpc_error_handle HPackParser::Parse(
|
|
1163
1172
|
std::vector<uint8_t> buffer = std::move(unparsed_bytes_);
|
1164
1173
|
return ParseInput(
|
1165
1174
|
Input(nullptr, buffer.data(), buffer.data() + buffer.size(), bitsrc,
|
1166
|
-
state_.frame_error),
|
1175
|
+
state_.frame_error, state_.field_error),
|
1167
1176
|
is_last, call_tracer);
|
1168
1177
|
}
|
1169
|
-
return ParseInput(
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1178
|
+
return ParseInput(Input(slice.refcount, GRPC_SLICE_START_PTR(slice),
|
1179
|
+
GRPC_SLICE_END_PTR(slice), bitsrc, state_.frame_error,
|
1180
|
+
state_.field_error),
|
1181
|
+
is_last, call_tracer);
|
1173
1182
|
}
|
1174
1183
|
|
1175
1184
|
grpc_error_handle HPackParser::ParseInput(
|
@@ -236,6 +236,8 @@ class HPackParser {
|
|
236
236
|
HPackTable hpack_table;
|
237
237
|
// Error so far for this frame (set by class Input)
|
238
238
|
HpackParseResult frame_error;
|
239
|
+
// Error so far for this field (set by class Input)
|
240
|
+
HpackParseResult field_error;
|
239
241
|
// Length of frame so far.
|
240
242
|
uint32_t frame_length = 0;
|
241
243
|
// Length of the string being parsed
|
@@ -68,7 +68,8 @@ Chttp2PingRatePolicy::RequestSendPing(Duration next_allowed_ping_interval,
|
|
68
68
|
if (max_pings_without_data_ != 0 && pings_before_data_required_ == 0) {
|
69
69
|
return TooManyRecentPings{};
|
70
70
|
}
|
71
|
-
if (max_inflight_pings_ != 0 &&
|
71
|
+
if (max_inflight_pings_ != 0 &&
|
72
|
+
inflight_pings > static_cast<size_t>(max_inflight_pings_)) {
|
72
73
|
return TooManyRecentPings{};
|
73
74
|
}
|
74
75
|
const Timestamp next_allowed_ping =
|
@@ -0,0 +1,48 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2023 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#ifndef GRPC_SRC_CORE_LIB_GPRPP_DIRECTORY_READER_H
|
20
|
+
#define GRPC_SRC_CORE_LIB_GPRPP_DIRECTORY_READER_H
|
21
|
+
|
22
|
+
#include <grpc/support/port_platform.h>
|
23
|
+
|
24
|
+
#include <memory>
|
25
|
+
|
26
|
+
#include "absl/functional/function_ref.h"
|
27
|
+
#include "absl/status/status.h"
|
28
|
+
#include "absl/strings/string_view.h"
|
29
|
+
|
30
|
+
namespace grpc_core {
|
31
|
+
|
32
|
+
class DirectoryReader {
|
33
|
+
public:
|
34
|
+
virtual ~DirectoryReader() = default;
|
35
|
+
// Returns the name of the directory being read.
|
36
|
+
virtual absl::string_view Name() const = 0;
|
37
|
+
// Calls callback for each name in the directory except for "." and "..".
|
38
|
+
// Returns non-OK if there was an error reading the directory.
|
39
|
+
virtual absl::Status ForEach(
|
40
|
+
absl::FunctionRef<void(absl::string_view)> callback) = 0;
|
41
|
+
};
|
42
|
+
|
43
|
+
std::unique_ptr<DirectoryReader> MakeDirectoryReader(
|
44
|
+
absl::string_view filename);
|
45
|
+
|
46
|
+
} // namespace grpc_core
|
47
|
+
|
48
|
+
#endif // GRPC_SRC_CORE_LIB_GPRPP_DIRECTORY_READER_H
|
@@ -0,0 +1,82 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2023 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#include <memory>
|
22
|
+
|
23
|
+
#include "absl/functional/function_ref.h"
|
24
|
+
#include "absl/status/status.h"
|
25
|
+
#include "absl/strings/string_view.h"
|
26
|
+
|
27
|
+
#if defined(GPR_LINUX) || defined(GPR_ANDROID) || defined(GPR_FREEBSD) || \
|
28
|
+
defined(GPR_APPLE)
|
29
|
+
|
30
|
+
#include <dirent.h>
|
31
|
+
|
32
|
+
#include <string>
|
33
|
+
|
34
|
+
#include "src/core/lib/gprpp/directory_reader.h"
|
35
|
+
|
36
|
+
namespace grpc_core {
|
37
|
+
|
38
|
+
namespace {
|
39
|
+
const char kSkipEntriesSelf[] = ".";
|
40
|
+
const char kSkipEntriesParent[] = "..";
|
41
|
+
} // namespace
|
42
|
+
|
43
|
+
class DirectoryReaderImpl : public DirectoryReader {
|
44
|
+
public:
|
45
|
+
explicit DirectoryReaderImpl(absl::string_view directory_path)
|
46
|
+
: directory_path_(directory_path) {}
|
47
|
+
absl::string_view Name() const override { return directory_path_; }
|
48
|
+
absl::Status ForEach(absl::FunctionRef<void(absl::string_view)>) override;
|
49
|
+
|
50
|
+
private:
|
51
|
+
const std::string directory_path_;
|
52
|
+
};
|
53
|
+
|
54
|
+
std::unique_ptr<DirectoryReader> MakeDirectoryReader(
|
55
|
+
absl::string_view filename) {
|
56
|
+
return std::make_unique<DirectoryReaderImpl>(filename);
|
57
|
+
}
|
58
|
+
|
59
|
+
absl::Status DirectoryReaderImpl::ForEach(
|
60
|
+
absl::FunctionRef<void(absl::string_view)> callback) {
|
61
|
+
// Open the dir for reading
|
62
|
+
DIR* directory = opendir(directory_path_.c_str());
|
63
|
+
if (directory == nullptr) {
|
64
|
+
return absl::InternalError("Could not read crl directory.");
|
65
|
+
}
|
66
|
+
struct dirent* directory_entry;
|
67
|
+
// Iterate over everything in the directory
|
68
|
+
while ((directory_entry = readdir(directory)) != nullptr) {
|
69
|
+
const absl::string_view file_name = directory_entry->d_name;
|
70
|
+
// Skip "." and ".."
|
71
|
+
if (file_name == kSkipEntriesParent || file_name == kSkipEntriesSelf) {
|
72
|
+
continue;
|
73
|
+
}
|
74
|
+
// Call the callback with this filename
|
75
|
+
callback(file_name);
|
76
|
+
}
|
77
|
+
closedir(directory);
|
78
|
+
return absl::OkStatus();
|
79
|
+
}
|
80
|
+
} // namespace grpc_core
|
81
|
+
|
82
|
+
#endif // GPR_LINUX || GPR_ANDROID || GPR_FREEBSD || GPR_APPLE
|
@@ -0,0 +1,80 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
// Copyright 2023 gRPC authors.
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
//
|
17
|
+
//
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#if defined(GPR_WINDOWS)
|
22
|
+
|
23
|
+
#include <sys/stat.h>
|
24
|
+
#include <windows.h>
|
25
|
+
|
26
|
+
#include <string>
|
27
|
+
#include <vector>
|
28
|
+
|
29
|
+
#include "absl/status/statusor.h"
|
30
|
+
#include "absl/strings/string_view.h"
|
31
|
+
|
32
|
+
#include <grpc/support/log.h>
|
33
|
+
|
34
|
+
#include "src/core/lib/gprpp/directory_reader.h"
|
35
|
+
namespace grpc_core {
|
36
|
+
|
37
|
+
namespace {
|
38
|
+
const char kSkipEntriesSelf[] = ".";
|
39
|
+
const char kSkipEntriesParent[] = "..";
|
40
|
+
} // namespace
|
41
|
+
|
42
|
+
class DirectoryReaderImpl : public DirectoryReader {
|
43
|
+
public:
|
44
|
+
explicit DirectoryReaderImpl(absl::string_view directory_path)
|
45
|
+
: directory_path_(directory_path) {}
|
46
|
+
absl::string_view Name() const override { return directory_path_; }
|
47
|
+
absl::Status ForEach(absl::FunctionRef<void(absl::string_view)>) override;
|
48
|
+
|
49
|
+
private:
|
50
|
+
const std::string directory_path_;
|
51
|
+
};
|
52
|
+
|
53
|
+
std::unique_ptr<DirectoryReader> MakeDirectoryReader(
|
54
|
+
absl::string_view filename) {
|
55
|
+
return std::make_unique<DirectoryReaderImpl>(filename);
|
56
|
+
}
|
57
|
+
|
58
|
+
// Reference for reading directory in Windows:
|
59
|
+
// https://stackoverflow.com/questions/612097/how-can-i-get-the-list-of-files-in-a-directory-using-c-or-c
|
60
|
+
// https://learn.microsoft.com/en-us/windows/win32/fileio/listing-the-files-in-a-directory
|
61
|
+
absl::Status DirectoryReaderImpl::ForEach(
|
62
|
+
absl::FunctionRef<void(absl::string_view)> callback) {
|
63
|
+
std::string search_path = absl::StrCat(directory_path_, "/*");
|
64
|
+
WIN32_FIND_DATAA find_data;
|
65
|
+
HANDLE hFind = ::FindFirstFileA(search_path.c_str(), &find_data);
|
66
|
+
if (hFind == INVALID_HANDLE_VALUE) {
|
67
|
+
return absl::InternalError("Could not read crl directory.");
|
68
|
+
}
|
69
|
+
do {
|
70
|
+
if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
|
71
|
+
callback(find_data.cFileName);
|
72
|
+
}
|
73
|
+
} while (::FindNextFileA(hFind, &find_data));
|
74
|
+
::FindClose(hFind);
|
75
|
+
return absl::OkStatus();
|
76
|
+
}
|
77
|
+
|
78
|
+
} // namespace grpc_core
|
79
|
+
|
80
|
+
#endif // GPR_WINDOWS
|
@@ -20,6 +20,9 @@
|
|
20
20
|
|
21
21
|
#include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h"
|
22
22
|
|
23
|
+
#include <memory>
|
24
|
+
|
25
|
+
#include <grpc/grpc_crl_provider.h>
|
23
26
|
#include <grpc/support/log.h>
|
24
27
|
|
25
28
|
#include "src/core/lib/debug/trace.h"
|
@@ -128,3 +131,22 @@ void grpc_tls_credentials_options_set_send_client_ca_list(
|
|
128
131
|
}
|
129
132
|
options->set_send_client_ca_list(send_client_ca_list);
|
130
133
|
}
|
134
|
+
|
135
|
+
void grpc_tls_credentials_options_set_crl_provider(
|
136
|
+
grpc_tls_credentials_options* options,
|
137
|
+
std::shared_ptr<grpc_core::experimental::CrlProvider> provider) {
|
138
|
+
GPR_ASSERT(options != nullptr);
|
139
|
+
options->set_crl_provider(std::move(provider));
|
140
|
+
}
|
141
|
+
|
142
|
+
void grpc_tls_credentials_options_set_min_tls_version(
|
143
|
+
grpc_tls_credentials_options* options, grpc_tls_version min_tls_version) {
|
144
|
+
GPR_ASSERT(options != nullptr);
|
145
|
+
options->set_min_tls_version(min_tls_version);
|
146
|
+
}
|
147
|
+
|
148
|
+
void grpc_tls_credentials_options_set_max_tls_version(
|
149
|
+
grpc_tls_credentials_options* options, grpc_tls_version max_tls_version) {
|
150
|
+
GPR_ASSERT(options != nullptr);
|
151
|
+
options->set_max_tls_version(max_tls_version);
|
152
|
+
}
|
@@ -61,6 +61,8 @@ struct grpc_tls_credentials_options
|
|
61
61
|
const std::string& identity_cert_name() const { return identity_cert_name_; }
|
62
62
|
const std::string& tls_session_key_log_file_path() const { return tls_session_key_log_file_path_; }
|
63
63
|
const std::string& crl_directory() const { return crl_directory_; }
|
64
|
+
// Returns the CRL Provider
|
65
|
+
std::shared_ptr<grpc_core::experimental::CrlProvider> crl_provider() const { return crl_provider_; }
|
64
66
|
bool send_client_ca_list() const { return send_client_ca_list_; }
|
65
67
|
|
66
68
|
// Setters for member fields.
|
@@ -82,6 +84,7 @@ struct grpc_tls_credentials_options
|
|
82
84
|
void set_tls_session_key_log_file_path(std::string tls_session_key_log_file_path) { tls_session_key_log_file_path_ = std::move(tls_session_key_log_file_path); }
|
83
85
|
// gRPC will enforce CRLs on all handshakes from all hashed CRL files inside of the crl_directory. If not set, an empty string will be used, which will not enable CRL checking. Only supported for OpenSSL version > 1.1.
|
84
86
|
void set_crl_directory(std::string crl_directory) { crl_directory_ = std::move(crl_directory); }
|
87
|
+
void set_crl_provider(std::shared_ptr<grpc_core::experimental::CrlProvider> crl_provider) { crl_provider_ = std::move(crl_provider); }
|
85
88
|
void set_send_client_ca_list(bool send_client_ca_list) { send_client_ca_list_ = send_client_ca_list; }
|
86
89
|
|
87
90
|
bool operator==(const grpc_tls_credentials_options& other) const {
|
@@ -98,6 +101,7 @@ struct grpc_tls_credentials_options
|
|
98
101
|
identity_cert_name_ == other.identity_cert_name_ &&
|
99
102
|
tls_session_key_log_file_path_ == other.tls_session_key_log_file_path_ &&
|
100
103
|
crl_directory_ == other.crl_directory_ &&
|
104
|
+
(crl_provider_ == other.crl_provider_) &&
|
101
105
|
send_client_ca_list_ == other.send_client_ca_list_;
|
102
106
|
}
|
103
107
|
|
@@ -115,6 +119,7 @@ struct grpc_tls_credentials_options
|
|
115
119
|
std::string identity_cert_name_;
|
116
120
|
std::string tls_session_key_log_file_path_;
|
117
121
|
std::string crl_directory_;
|
122
|
+
std::shared_ptr<grpc_core::experimental::CrlProvider> crl_provider_;
|
118
123
|
bool send_client_ca_list_ = false;
|
119
124
|
};
|
120
125
|
|