Skip to content

Commit 8aeea5e

Browse files
authored
CPP-817 - Provide error if override attempt of cloud bundle or contct points/ssl context (#294)
* CPP-817 - Provide error if override attempt of cloud bundle or contact points/ssl context
1 parent b6a7b0a commit 8aeea5e

3 files changed

Lines changed: 152 additions & 30 deletions

File tree

cpp-driver/gtests/src/integration/tests/test_dbaas.cpp

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ class DbaasTests : public Integration {
134134
Cluster cluster = default_cluster(false)
135135
.with_randomized_contact_points(false)
136136
.with_load_balance_round_robin();
137-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
138-
creds_v1().c_str());
137+
EXPECT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
138+
cluster.get(), creds_v1().c_str()));
139139
Session session = cluster.connect();
140140
for (int i = 0; i < 3; ++i) {
141141
Row row = session.execute(SELECT_ALL_SYSTEM_LOCAL_CQL).first_row();
@@ -260,8 +260,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, ResolveAndConnect) {
260260
CHECK_FAILURE;
261261

262262
Cluster cluster = default_cluster(false);
263-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
264-
creds_v1().c_str());
263+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
264+
cluster.get(), creds_v1().c_str()));
265265
connect(cluster);
266266
}
267267

@@ -282,8 +282,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, QueryEachNode) {
282282
CHECK_FAILURE;
283283

284284
Cluster cluster = default_cluster(false).with_load_balance_round_robin();
285-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
286-
creds_v1().c_str());
285+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
286+
cluster.get(), creds_v1().c_str()));
287287
connect(cluster);
288288

289289
ServerNames server_names;
@@ -319,8 +319,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, SchemaMetadata) {
319319
CHECK_FAILURE;
320320

321321
Cluster cluster = default_cluster(false);
322-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
323-
creds_v1().c_str());
322+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
323+
cluster.get(), creds_v1().c_str()));
324324
connect(cluster);
325325

326326
// clang-format off
@@ -434,6 +434,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, SchemaMetadata) {
434434
EXPECT_EQ(Text("(0, 0)"), Text(initcond));
435435
ASSERT_TRUE(true);
436436
}
437+
438+
cass_schema_meta_free(schema_meta);
437439
}
438440

439441
/**
@@ -454,8 +456,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, ConsistencyGuardrails) {
454456
CHECK_FAILURE;
455457

456458
Cluster cluster = default_cluster(false);
457-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
458-
creds_v1().c_str());
459+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
460+
cluster.get(), creds_v1().c_str()));
459461
connect(cluster);
460462

461463
session_.execute(
@@ -489,8 +491,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, ConsistencyGuardrailsInvalid) {
489491
CHECK_FAILURE;
490492

491493
Cluster cluster = default_cluster(false);
492-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
493-
creds_v1().c_str());
494+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
495+
cluster.get(), creds_v1().c_str()));
494496
connect(cluster);
495497

496498
session_.execute(
@@ -535,8 +537,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, DcAwareTokenAwareRoutingDefault) {
535537
replicas.push_back(std::pair<int, int>(5, 2));
536538

537539
Cluster cluster = default_cluster(false);
538-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
539-
creds_v1().c_str());
540+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
541+
cluster.get(), creds_v1().c_str()));
540542
connect(cluster);
541543

542544
for (std::vector<std::pair<int, int> >::iterator it = replicas.begin(), end = replicas.end();
@@ -568,8 +570,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, ResolveAndConnectWithoutCredsInBundle)
568570
CHECK_FAILURE;
569571

570572
Cluster cluster = default_cluster(false);
571-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
572-
creds_v1_no_creds().c_str());
573+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
574+
cluster.get(), creds_v1_no_creds().c_str()));
573575
cluster.with_credentials("cassandra", "cassandra");
574576
connect(cluster);
575577
}
@@ -589,8 +591,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, InvalidWithoutCreds) {
589591
CHECK_FAILURE;
590592

591593
Cluster cluster = default_cluster(false);
592-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
593-
creds_v1_no_creds().c_str());
594+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
595+
cluster.get(), creds_v1_no_creds().c_str()));
594596
try {
595597
connect(cluster);
596598
EXPECT_TRUE(false) << "Connection established";
@@ -614,8 +616,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, InvalidMetadataServer) {
614616
CHECK_FAILURE;
615617

616618
Cluster cluster = default_cluster(false);
617-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
618-
creds_v1_unreachable().c_str());
619+
EXPECT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
620+
cluster.get(), creds_v1_unreachable().c_str()));
619621
try {
620622
connect(cluster);
621623
EXPECT_TRUE(false) << "Connection established";
@@ -639,8 +641,9 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, InvalidCertificate) {
639641
CHECK_FAILURE;
640642

641643
Cluster cluster = default_cluster(false);
642-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
643-
creds_v1_no_cert().c_str());
644+
EXPECT_EQ(CASS_ERROR_LIB_BAD_PARAMS,
645+
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
646+
cluster.get(), creds_v1_no_cert().c_str()));
644647
try {
645648
connect(cluster);
646649
EXPECT_TRUE(false) << "Connection established";
@@ -664,8 +667,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, InvalidCertificateAuthority) {
664667
CHECK_FAILURE;
665668

666669
Cluster cluster = default_cluster(false);
667-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
668-
creds_v1_invalid_ca().c_str());
670+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
671+
cluster.get(), creds_v1_invalid_ca().c_str()));
669672
try {
670673
connect(cluster);
671674
EXPECT_TRUE(false) << "Connection established";
@@ -693,8 +696,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, QueryWithNodesDown) {
693696
ServerNames server_names = get_server_names();
694697

695698
Cluster cluster = default_cluster(false);
696-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
697-
creds_v1().c_str());
699+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
700+
cluster.get(), creds_v1().c_str()));
698701
connect(cluster);
699702

700703
EXPECT_TRUE(stop_node(1));
@@ -729,8 +732,8 @@ CASSANDRA_INTEGRATION_TEST_F(DbaasTests, FullOutage) {
729732
ServerNames server_names = get_server_names();
730733

731734
Cluster cluster = default_cluster(false).with_constant_reconnect(10); // Quick reconnect
732-
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(cluster.get(),
733-
creds_v1().c_str());
735+
ASSERT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
736+
cluster.get(), creds_v1().c_str()));
734737
connect(cluster);
735738

736739
EXPECT_TRUE(stop_cluster());

cpp-driver/gtests/src/unit/tests/test_cloud_secure_connect_config.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "http_test.hpp"
2121

2222
#include "cloud_secure_connection_config.hpp"
23+
#include "cluster_config.hpp"
2324
#include "cluster_connector.hpp"
2425
#include "cluster_metadata_resolver.hpp"
2526
#include "config.hpp"
@@ -57,10 +58,13 @@
5758
using datastax::String;
5859
using datastax::internal::core::AddressVec;
5960
using datastax::internal::core::CloudSecureConnectionConfig;
61+
using datastax::internal::core::ClusterConfig;
6062
using datastax::internal::core::ClusterMetadataResolver;
6163
using datastax::internal::core::ClusterSettings;
6264
using datastax::internal::core::Config;
6365
using datastax::internal::core::HttpClient;
66+
using datastax::internal::core::SslContext;
67+
using datastax::internal::core::SslContextFactory;
6468
using datastax::internal::enterprise::DsePlainTextAuthProvider;
6569
using datastax::internal::json::StringBuffer;
6670
using datastax::internal::json::Writer;
@@ -595,4 +599,89 @@ TEST_F(CloudMetadataServerTest, ResolveInvalidJsonErrorResponse) {
595599

596600
stop_http_server();
597601
}
602+
603+
TEST_F(CloudMetadataServerTest, CloudConfiguredInvalidContactPointsOverride) {
604+
StringBuffer buffer;
605+
full_config_credsv1(buffer);
606+
create_zip_file(buffer.GetString());
607+
608+
ClusterConfig cluster_config;
609+
CassCluster* cluster = CassCluster::to(&cluster_config);
610+
EXPECT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
611+
cluster, creds_zip_file().c_str()));
612+
add_logging_critera("Contact points cannot be overridden with cloud secure connection bundle");
613+
EXPECT_EQ(CASS_ERROR_LIB_BAD_PARAMS,
614+
cass_cluster_set_contact_points(cluster, "some.contact.point"));
615+
EXPECT_EQ(logging_criteria_count(), 1);
616+
}
617+
618+
TEST_F(CloudMetadataServerTest, CloudConfiguredInvalidSslContextOverride) {
619+
StringBuffer buffer;
620+
full_config_credsv1(buffer);
621+
create_zip_file(buffer.GetString());
622+
623+
ClusterConfig cluster_config;
624+
CassCluster* cluster = CassCluster::to(&cluster_config);
625+
SslContext::Ptr ssl_context(SslContextFactory::create());
626+
CassSsl* ssl = CassSsl::to(ssl_context.get());
627+
628+
EXPECT_EQ(CASS_OK, cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
629+
cluster, creds_zip_file().c_str()));
630+
add_logging_critera("SSL context cannot be overridden with cloud secure connection bundle");
631+
cass_cluster_set_ssl(cluster, ssl);
632+
EXPECT_EQ(logging_criteria_count(), 1);
633+
}
634+
635+
TEST_F(CloudMetadataServerTest, CloudConfiguredFailureContactPointsExist) {
636+
StringBuffer buffer;
637+
full_config_credsv1(buffer);
638+
create_zip_file(buffer.GetString());
639+
640+
ClusterConfig cluster_config;
641+
CassCluster* cluster = CassCluster::to(&cluster_config);
642+
EXPECT_EQ(CASS_OK, cass_cluster_set_contact_points(cluster, "some.contact.point"));
643+
add_logging_critera("Contact points must not be specified with cloud secure connection bundle");
644+
EXPECT_EQ(CASS_ERROR_LIB_BAD_PARAMS,
645+
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
646+
cluster, creds_zip_file().c_str()));
647+
EXPECT_EQ(logging_criteria_count(), 1);
648+
}
649+
650+
TEST_F(CloudMetadataServerTest, CloudConfiguredFailureSslContextExist) {
651+
StringBuffer buffer;
652+
full_config_credsv1(buffer);
653+
create_zip_file(buffer.GetString());
654+
655+
ClusterConfig cluster_config;
656+
CassCluster* cluster = CassCluster::to(&cluster_config);
657+
SslContext::Ptr ssl_context(SslContextFactory::create());
658+
CassSsl* ssl = CassSsl::to(ssl_context.get());
659+
660+
cass_cluster_set_ssl(cluster, ssl);
661+
add_logging_critera("SSL context must not be specified with cloud secure connection bundle");
662+
EXPECT_EQ(CASS_ERROR_LIB_BAD_PARAMS,
663+
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
664+
cluster, creds_zip_file().c_str()));
665+
EXPECT_EQ(logging_criteria_count(), 1);
666+
}
667+
668+
TEST_F(CloudMetadataServerTest, CloudConfiguredFailureContactPointsAndSslContextExist) {
669+
StringBuffer buffer;
670+
full_config_credsv1(buffer);
671+
create_zip_file(buffer.GetString());
672+
673+
ClusterConfig cluster_config;
674+
CassCluster* cluster = CassCluster::to(&cluster_config);
675+
SslContext::Ptr ssl_context(SslContextFactory::create());
676+
CassSsl* ssl = CassSsl::to(ssl_context.get());
677+
678+
EXPECT_EQ(CASS_OK, cass_cluster_set_contact_points(cluster, "some.contact.point"));
679+
cass_cluster_set_ssl(cluster, ssl);
680+
add_logging_critera(
681+
"Contact points and SSL context must not be specified with cloud secure connection bundle");
682+
EXPECT_EQ(CASS_ERROR_LIB_BAD_PARAMS,
683+
cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(
684+
cluster, creds_zip_file().c_str()));
685+
EXPECT_EQ(logging_criteria_count(), 1);
686+
}
598687
#endif

cpp-driver/src/cluster_config.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ CassError cass_cluster_set_port(CassCluster* cluster, int port) {
3333
}
3434

3535
void cass_cluster_set_ssl(CassCluster* cluster, CassSsl* ssl) {
36-
cluster->config().set_ssl_context(ssl->from());
36+
if (cluster->config().cloud_secure_connection_config().is_loaded()) {
37+
LOG_ERROR("SSL context cannot be overridden with cloud secure connection bundle");
38+
} else {
39+
cluster->config().set_ssl_context(ssl->from());
40+
}
3741
}
3842

3943
CassError cass_cluster_set_protocol_version(CassCluster* cluster, int protocol_version) {
@@ -101,6 +105,11 @@ CassError cass_cluster_set_contact_points(CassCluster* cluster, const char* cont
101105

102106
CassError cass_cluster_set_contact_points_n(CassCluster* cluster, const char* contact_points,
103107
size_t contact_points_length) {
108+
if (cluster->config().cloud_secure_connection_config().is_loaded()) {
109+
LOG_ERROR("Contact points cannot be overridden with cloud secure connection bundle");
110+
return CASS_ERROR_LIB_BAD_PARAMS;
111+
}
112+
104113
if (contact_points_length == 0) {
105114
cluster->config().contact_points().clear();
106115
} else {
@@ -485,7 +494,9 @@ CassError cass_cluster_set_cloud_secure_connection_bundle(CassCluster* cluster,
485494

486495
CassError cass_cluster_set_cloud_secure_connection_bundle_n(CassCluster* cluster, const char* path,
487496
size_t path_length) {
488-
SslContextFactory::init_once();
497+
if (cluster->config().contact_points().empty() && !cluster->config().ssl_context()) {
498+
SslContextFactory::init_once();
499+
}
489500
return cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init_n(cluster, path,
490501
path_length);
491502
}
@@ -499,6 +510,25 @@ CassError cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init(CassCl
499510
CassError cass_cluster_set_cloud_secure_connection_bundle_no_ssl_lib_init_n(CassCluster* cluster,
500511
const char* path,
501512
size_t path_length) {
513+
const AddressVec& contact_points = cluster->config().contact_points();
514+
const SslContext::Ptr& ssl_context = cluster->config().ssl_context();
515+
if (!contact_points.empty() || ssl_context) {
516+
String message;
517+
if (!cluster->config().contact_points().empty()) {
518+
message.append("Contact points");
519+
}
520+
if (cluster->config().ssl_context()) {
521+
if (!message.empty()) {
522+
message.append(" and ");
523+
}
524+
message.append("SSL context");
525+
}
526+
message.append(" must not be specified with cloud secure connection bundle");
527+
LOG_ERROR("%s", message.c_str());
528+
529+
return CASS_ERROR_LIB_BAD_PARAMS;
530+
}
531+
502532
if (!cluster->config().set_cloud_secure_connection_bundle(String(path, path_length))) {
503533
return CASS_ERROR_LIB_BAD_PARAMS;
504534
}

0 commit comments

Comments
 (0)