Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Commit 22a9d51

Browse files
authored
add support for ssl options (#2)
* add support for ssl options * use strconv.ParseBool * set clusterConfig.SslOpts in each case instead * expand on tests * fix extraneous TrimSpace and missing QueryUnescape on value * reorg tests for TestConfigStringToClusterConfig * only QueryUnescape username, password, certPath, keyPath, and caPath * add SslOptions to ClusterConfigToConfigString * fix missing QueryEscape on username and password
1 parent 60b83bc commit 22a9d51

File tree

2 files changed

+160
-50
lines changed

2 files changed

+160
-50
lines changed

config.go

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cql
22

33
import (
44
"fmt"
5+
"net/url"
56
"strconv"
67
"strings"
78
"time"
@@ -57,14 +58,30 @@ func ClusterConfigToConfigString(clusterConfig *gocql.ClusterConfig) string {
5758
passwordAuthenticator, ok := clusterConfig.Authenticator.(gocql.PasswordAuthenticator)
5859
if ok {
5960
if passwordAuthenticator.Username != "" {
60-
stringConfig += "username=" + passwordAuthenticator.Username + "&"
61+
stringConfig += "username=" + url.QueryEscape(passwordAuthenticator.Username) + "&"
6162
}
6263
if passwordAuthenticator.Password != "" {
63-
stringConfig += "password=" + passwordAuthenticator.Password + "&"
64+
stringConfig += "password=" + url.QueryEscape(passwordAuthenticator.Password) + "&"
6465
}
6566
}
6667
}
6768

69+
if sslOpts := clusterConfig.SslOpts; sslOpts != nil {
70+
defaultSslOpts := gocql.SslOptions{}
71+
if s := strconv.FormatBool(sslOpts.EnableHostVerification); sslOpts.EnableHostVerification != defaultSslOpts.EnableHostVerification {
72+
stringConfig += "enableHostVerification=" + s + "&"
73+
}
74+
if s := sslOpts.KeyPath; sslOpts.KeyPath != defaultSslOpts.KeyPath {
75+
stringConfig += "keyPath=" + url.QueryEscape(s) + "&"
76+
}
77+
if s := sslOpts.CertPath; sslOpts.CertPath != defaultSslOpts.CertPath {
78+
stringConfig += "certPath=" + url.QueryEscape(s) + "&"
79+
}
80+
if s := sslOpts.CaPath; sslOpts.CaPath != defaultSslOpts.CaPath {
81+
stringConfig += "caPath=" + url.QueryEscape(s) + "&"
82+
}
83+
}
84+
6885
return stringConfig[:len(stringConfig)-1]
6986
}
7087

@@ -84,6 +101,7 @@ func ConfigStringToClusterConfig(configString string) (*gocql.ClusterConfig, err
84101
}
85102

86103
passwordAuthenticator := gocql.PasswordAuthenticator{}
104+
sslOpts := gocql.SslOptions{}
87105

88106
if len(configStringSplit) > 1 && len(configStringSplit[1]) > 1 {
89107
dataSplit := strings.Split(configStringSplit[1], "&")
@@ -93,7 +111,7 @@ func ConfigStringToClusterConfig(configString string) (*gocql.ClusterConfig, err
93111
if len(settingSplit) != 2 {
94112
return nil, fmt.Errorf("missing =")
95113
}
96-
key, value := strings.TrimSpace(settingSplit[0]), strings.TrimSpace(settingSplit[1])
114+
key, value := strings.TrimSpace(settingSplit[0]), settingSplit[1]
97115
switch key {
98116
case "consistency":
99117
consistency, ok := DbConsistencyLevels[value]
@@ -149,11 +167,47 @@ func ConfigStringToClusterConfig(configString string) (*gocql.ClusterConfig, err
149167
}
150168
clusterConfig.WriteCoalesceWaitTime = data
151169
case "username":
152-
passwordAuthenticator.Username = value
170+
data, err := url.QueryUnescape(value)
171+
if err != nil {
172+
return nil, fmt.Errorf("failed for: %v = %v", key, value)
173+
}
174+
passwordAuthenticator.Username = data
153175
clusterConfig.Authenticator = passwordAuthenticator
154176
case "password":
155-
passwordAuthenticator.Password = value
177+
data, err := url.QueryUnescape(value)
178+
if err != nil {
179+
return nil, fmt.Errorf("failed for: %v = %v", key, value)
180+
}
181+
passwordAuthenticator.Password = data
156182
clusterConfig.Authenticator = passwordAuthenticator
183+
case "enableHostVerification":
184+
data, err := strconv.ParseBool(value)
185+
if err != nil {
186+
return nil, fmt.Errorf("failed for: %v = %v", key, value)
187+
}
188+
sslOpts.EnableHostVerification = data
189+
clusterConfig.SslOpts = &sslOpts
190+
case "certPath":
191+
data, err := url.QueryUnescape(value)
192+
if err != nil {
193+
return nil, fmt.Errorf("failed for: %v = %v", key, value)
194+
}
195+
sslOpts.CertPath = data
196+
clusterConfig.SslOpts = &sslOpts
197+
case "keyPath":
198+
data, err := url.QueryUnescape(value)
199+
if err != nil {
200+
return nil, fmt.Errorf("failed for: %v = %v", key, value)
201+
}
202+
sslOpts.KeyPath = data
203+
clusterConfig.SslOpts = &sslOpts
204+
case "caPath":
205+
data, err := url.QueryUnescape(value)
206+
if err != nil {
207+
return nil, fmt.Errorf("failed for: %v = %v", key, value)
208+
}
209+
sslOpts.CaPath = data
210+
clusterConfig.SslOpts = &sslOpts
157211
default:
158212
return nil, fmt.Errorf("invalid key: %v", key)
159213
}

0 commit comments

Comments
 (0)