Skip to content

Commit 272cfa7

Browse files
committed
implement server bindings
1 parent 68b6de6 commit 272cfa7

File tree

10 files changed

+127
-4
lines changed

10 files changed

+127
-4
lines changed

.github/workflows/server.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ jobs:
2828
run_tests: false
2929
- name: 'Launch test service as background task'
3030
run: $TEST_SERVICE_BINARY $TEST_SERVICE_PORT 2>&1 &
31-
- uses: launchdarkly/gh-actions/actions/[email protected].0
31+
- uses: launchdarkly/gh-actions/actions/[email protected].2
3232
with:
3333
# Inform the test harness of test service's port.
3434
test_service_port: ${{ env.TEST_SERVICE_PORT }}

contract-tests/server-contract-tests/src/entity_manager.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,14 @@ std::optional<std::string> EntityManager::create(ConfigParams const& in) {
120120
}
121121
}
122122

123+
if (in.tls) {
124+
auto builder = config::builders::TlsBuilder();
125+
if (in.tls->skipVerifyPeer) {
126+
builder.SkipVerifyPeer(*in.tls->skipVerifyPeer);
127+
}
128+
config_builder.HttpProperties().Tls(std::move(builder));
129+
}
130+
123131
auto config = config_builder.Build();
124132
if (!config) {
125133
LD_LOG(logger_, LogLevel::kWarn)

contract-tests/server-contract-tests/src/main.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ int main(int argc, char* argv[]) {
2121
launchdarkly::Logger logger{
2222
std::make_unique<ConsoleBackend>("server-contract-tests")};
2323

24-
const std::string default_port = "8123";
24+
std::string const default_port = "8123";
2525
std::string port = default_port;
2626
if (argc == 2) {
2727
port =
@@ -42,6 +42,8 @@ int main(int argc, char* argv[]) {
4242
srv.add_capability("server-side-polling");
4343
srv.add_capability("inline-context");
4444
srv.add_capability("anonymous-redaction");
45+
srv.add_capability("tls:verify-peer");
46+
srv.add_capability("tls:skip-verify-peer");
4547

4648
net::signal_set signals{ioc, SIGINT, SIGTERM};
4749

libs/common/src/config/http_properties_builder.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ built::HttpProperties HttpPropertiesBuilder<SDK>::Build() const {
124124
}
125125

126126
template class TlsBuilder<config::shared::ClientSDK>;
127+
template class TlsBuilder<config::shared::ServerSDK>;
128+
127129
template class HttpPropertiesBuilder<config::shared::ClientSDK>;
128130
template class HttpPropertiesBuilder<config::shared::ServerSDK>;
129131
} // namespace launchdarkly::config::shared::builders

libs/server-sdk/include/launchdarkly/server_side/bindings/c/config/builder.h

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ typedef struct _LDServerConfigBuilder* LDServerConfigBuilder;
2222
typedef struct _LDServerDataSourceStreamBuilder*
2323
LDServerDataSourceStreamBuilder;
2424
typedef struct _LDServerDataSourcePollBuilder* LDServerDataSourcePollBuilder;
25+
typedef struct _LDServerHttpPropertiesTlsBuilder*
26+
LDServerHttpPropertiesTlsBuilder;
2527

2628
/**
2729
* Constructs a client-side config builder.
@@ -117,8 +119,8 @@ LDServerConfigBuilder_Events_Enabled(LDServerConfigBuilder b, bool enabled);
117119
* that a previously-indexed context may cause generation of a redundant
118120
* index event.
119121
* @param b Server config builder. Must not be NULL.
120-
* @param context_keys_capacity Maximum unique context keys to remember. The default
121-
* is 1000.
122+
* @param context_keys_capacity Maximum unique context keys to remember. The
123+
* default is 1000.
122124
*/
123125
LD_EXPORT(void)
124126
LDServerConfigBuilder_Events_ContextKeysCapacity(LDServerConfigBuilder b,
@@ -349,6 +351,51 @@ LDServerConfigBuilder_HttpProperties_Header(LDServerConfigBuilder b,
349351
char const* key,
350352
char const* value);
351353

354+
/**
355+
* Sets the TLS options builder. The builder is consumed; do not free it.
356+
* @param b Server config builder. Must not be NULL.
357+
* @param tls_builder The TLS options builder. Must not be NULL.
358+
*/
359+
LD_EXPORT(void)
360+
LDServerConfigBuilder_HttpProperties_Tls(
361+
LDServerConfigBuilder b,
362+
LDServerHttpPropertiesTlsBuilder tls_builder);
363+
364+
/**
365+
* Creates a new TLS options builder for the HttpProperties builder.
366+
*
367+
* If not passed into the HttpProperties
368+
* builder, must be manually freed with LDServerHttpPropertiesTlsBuilder_Free.
369+
*
370+
* @return New builder for TLS options.
371+
*/
372+
LD_EXPORT(LDServerHttpPropertiesTlsBuilder)
373+
LDServerHttpPropertiesTlsBuilder_New(void);
374+
375+
/**
376+
* Frees a TLS options builder. Do not call if the builder was consumed by
377+
* the HttpProperties builder.
378+
*
379+
* @param b Builder to free.
380+
*/
381+
LD_EXPORT(void)
382+
LDServerHttpPropertiesTlsBuilder_Free(LDServerHttpPropertiesTlsBuilder b);
383+
384+
/**
385+
* Configures TLS peer certificate verification. Peer verification
386+
* is enabled by default.
387+
*
388+
* Disabling peer verification is not recommended unless a specific
389+
* use-case calls for it.
390+
*
391+
* @param b Server config builder. Must not be NULL.
392+
* @param skip_verify_peer False to skip verification.
393+
*/
394+
LD_EXPORT(void)
395+
LDServerHttpPropertiesTlsBuilder_SkipVerifyPeer(
396+
LDServerHttpPropertiesTlsBuilder b,
397+
bool skip_verify_peer);
398+
352399
/**
353400
* Disables the default SDK logging.
354401
* @param b Server config builder. Must not be NULL.

libs/server-sdk/include/launchdarkly/server_side/config/builders/all_builders.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ using AppInfoBuilder = launchdarkly::config::shared::builders::AppInfoBuilder;
2323
using EventsBuilder =
2424
launchdarkly::config::shared::builders::EventsBuilder<SDK>;
2525
using LoggingBuilder = launchdarkly::config::shared::builders::LoggingBuilder;
26+
using TlsBuilder = launchdarkly::config::shared::builders::TlsBuilder<SDK>;
2627

2728
} // namespace launchdarkly::server_side::config::builders

libs/server-sdk/src/bindings/c/builder.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ using namespace launchdarkly::server_side::config::builders;
4848
#define FROM_CUSTOM_PERSISTENCE_BUILDER(ptr) \
4949
(reinterpret_cast<LDPersistenceCustomBuilder>(ptr))
5050

51+
#define TO_TLS_BUILDER(ptr) (reinterpret_cast<TlsBuilder*>(ptr))
52+
53+
#define FROM_TLS_BUILDER(ptr) \
54+
(reinterpret_cast<LDServerHttpPropertiesTlsBuilder>(ptr))
55+
5156
LD_EXPORT(LDServerConfigBuilder)
5257
LDServerConfigBuilder_New(char const* sdk_key) {
5358
LD_ASSERT_NOT_NULL(sdk_key);
@@ -332,6 +337,37 @@ LDServerConfigBuilder_HttpProperties_Header(LDServerConfigBuilder b,
332337
TO_BUILDER(b)->HttpProperties().Header(key, value);
333338
}
334339

340+
LD_EXPORT(void)
341+
LDServerConfigBuilder_HttpProperties_Tls(
342+
LDServerConfigBuilder b,
343+
LDServerHttpPropertiesTlsBuilder tls_builder) {
344+
LD_ASSERT_NOT_NULL(b);
345+
LD_ASSERT_NOT_NULL(tls_builder);
346+
347+
TO_BUILDER(b)->HttpProperties().Tls(*TO_TLS_BUILDER(tls_builder));
348+
349+
LDServerHttpPropertiesTlsBuilder_Free(tls_builder);
350+
}
351+
352+
LD_EXPORT(void)
353+
LDServerHttpPropertiesTlsBuilder_SkipVerifyPeer(
354+
LDServerHttpPropertiesTlsBuilder b,
355+
bool skip_verify_peer) {
356+
LD_ASSERT_NOT_NULL(b);
357+
358+
TO_TLS_BUILDER(b)->SkipVerifyPeer(skip_verify_peer);
359+
}
360+
361+
LD_EXPORT(LDServerHttpPropertiesTlsBuilder)
362+
LDServerHttpPropertiesTlsBuilder_New(void) {
363+
return FROM_TLS_BUILDER(new TlsBuilder());
364+
}
365+
366+
LD_EXPORT(void)
367+
LDServerHttpPropertiesTlsBuilder_Free(LDServerHttpPropertiesTlsBuilder b) {
368+
delete TO_TLS_BUILDER(b);
369+
}
370+
335371
LD_EXPORT(void)
336372
LDServerConfigBuilder_Logging_Disable(LDServerConfigBuilder b) {
337373
LD_ASSERT_NOT_NULL(b);

libs/server-sdk/src/data_systems/background_sync/sources/polling/polling_data_source.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ PollingDataSource::PollingDataSource(
5757
request_(MakeRequest(data_source_config, endpoints, http_properties)),
5858
timer_(ioc),
5959
sink_(nullptr) {
60+
if (http_properties.Tls().VerifyMode() ==
61+
launchdarkly::config::shared::built::TlsOptions::VerifyMode::
62+
kVerifyNone) {
63+
LD_LOG(logger_, LogLevel::kDebug) << "TLS peer verification disabled";
64+
}
6065
if (polling_interval_ < data_source_config.min_polling_interval) {
6166
LD_LOG(logger_, LogLevel::kWarn)
6267
<< "Polling interval too frequent, defaulting to "

libs/server-sdk/src/data_systems/background_sync/sources/streaming/streaming_data_source.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ void StreamingDataSource::StartAsync(
104104
client_builder.header(key, value);
105105
}
106106

107+
if (http_config_.Tls().VerifyMode() ==
108+
launchdarkly::config::shared::built::TlsOptions::VerifyMode::
109+
kVerifyNone) {
110+
client_builder.skip_verify_peer(true);
111+
}
112+
107113
auto weak_self = weak_from_this();
108114

109115
client_builder.receiver([weak_self](launchdarkly::sse::Event const& event) {

libs/server-sdk/tests/server_c_bindings_test.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,19 @@ TEST(ClientBindings, LazyLoadDataSource) {
250250

251251
LDStatus_Free(status);
252252
}
253+
254+
TEST(ClientBindings, TlsConfiguration) {
255+
LDServerConfigBuilder cfg_builder = LDServerConfigBuilder_New("sdk-123");
256+
257+
LDServerHttpPropertiesTlsBuilder tls =
258+
LDServerHttpPropertiesTlsBuilder_New();
259+
LDServerHttpPropertiesTlsBuilder_SkipVerifyPeer(tls, true);
260+
261+
LDServerConfigBuilder_HttpProperties_Tls(cfg_builder, tls);
262+
263+
LDServerConfig config;
264+
LDStatus status = LDServerConfigBuilder_Build(cfg_builder, &config);
265+
266+
ASSERT_FALSE(LDStatus_Ok(status));
267+
LDStatus_Free(status);
268+
}

0 commit comments

Comments
 (0)