11package cassandradb
22
33import (
4+ "crypto/tls"
5+ "crypto/x509"
46 "fmt"
57 "log"
68 "strings"
79
810 "github.com/authorizerdev/authorizer/server/constants"
11+ "github.com/authorizerdev/authorizer/server/crypto"
912 "github.com/authorizerdev/authorizer/server/db/models"
1013 "github.com/authorizerdev/authorizer/server/envstore"
14+ "github.com/gocql/gocql"
1115 cansandraDriver "github.com/gocql/gocql"
1216)
1317
@@ -21,6 +25,13 @@ var KeySpace string
2125// NewProvider to initialize arangodb connection
2226func NewProvider () (* provider , error ) {
2327 dbURL := envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabaseURL )
28+ if dbURL == "" {
29+ dbURL = envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabaseHost )
30+ if envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabasePort ) != "" {
31+ dbURL = fmt .Sprintf ("%s:%s" , dbURL , envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabasePort ))
32+ }
33+ }
34+
2435 KeySpace = envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabaseName )
2536 clusterURL := []string {}
2637 if strings .Contains (dbURL , "," ) {
@@ -36,23 +47,76 @@ func NewProvider() (*provider, error) {
3647 }
3748 }
3849
50+ if envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabaseCert ) != "" && envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabaseCACert ) != "" && envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabaseCertKey ) != "" {
51+ certString , err := crypto .DecryptB64 (envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabaseCert ))
52+ if err != nil {
53+ return nil , err
54+ }
55+
56+ keyString , err := crypto .DecryptB64 (envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabaseCertKey ))
57+ if err != nil {
58+ return nil , err
59+ }
60+
61+ caString , err := crypto .DecryptB64 (envstore .EnvStoreObj .GetStringStoreEnvVariable (constants .EnvKeyDatabaseCACert ))
62+ if err != nil {
63+ return nil , err
64+ }
65+
66+ cert , err := tls .X509KeyPair ([]byte (certString ), []byte (keyString ))
67+ if err != nil {
68+ return nil , err
69+ }
70+
71+ caCertPool := x509 .NewCertPool ()
72+ caCertPool .AppendCertsFromPEM ([]byte (caString ))
73+
74+ cassandraClient .SslOpts = & cansandraDriver.SslOptions {
75+ Config : & tls.Config {
76+ Certificates : []tls.Certificate {cert },
77+ RootCAs : caCertPool ,
78+ InsecureSkipVerify : true ,
79+ },
80+ EnableHostVerification : false ,
81+ }
82+ }
83+
3984 cassandraClient .RetryPolicy = & cansandraDriver.SimpleRetryPolicy {
4085 NumRetries : 3 ,
4186 }
42- cassandraClient .Consistency = cansandraDriver . Quorum
87+ cassandraClient .Consistency = gocql . LocalQuorum
4388
4489 session , err := cassandraClient .CreateSession ()
4590 if err != nil {
4691 log .Println ("Error while creating connection to cassandra db" , err )
4792 return nil , err
4893 }
4994
50- keyspaceQuery := fmt .Sprintf ("CREATE KEYSPACE IF NOT EXISTS %s WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor':1}" ,
51- KeySpace )
52- err = session .Query (keyspaceQuery ).Exec ()
53- if err != nil {
54- log .Println ("Unable to create keyspace:" , err )
55- return nil , err
95+ // Note for astra keyspaces can only be created from there console
96+ // https://docs.datastax.com/en/astra/docs/datastax-astra-faq.html#_i_am_trying_to_create_a_keyspace_in_the_cql_shell_and_i_am_running_into_an_error_how_do_i_fix_this
97+ getKeyspaceQuery := fmt .Sprintf ("SELECT keyspace_name FROM system_schema.keyspaces;" )
98+ scanner := session .Query (getKeyspaceQuery ).Iter ().Scanner ()
99+ hasAuthorizerKeySpace := false
100+ for scanner .Next () {
101+ var keySpace string
102+ err := scanner .Scan (& keySpace )
103+ if err != nil {
104+ log .Println ("Error while getting keyspace information" , err )
105+ return nil , err
106+ }
107+ if keySpace == KeySpace {
108+ hasAuthorizerKeySpace = true
109+ break
110+ }
111+ }
112+
113+ if ! hasAuthorizerKeySpace {
114+ createKeySpaceQuery := fmt .Sprintf ("CREATE KEYSPACE %s WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};" , KeySpace )
115+ err = session .Query (createKeySpaceQuery ).Exec ()
116+ if err != nil {
117+ log .Println ("Error while creating keyspace" , err )
118+ return nil , err
119+ }
56120 }
57121
58122 // make sure collections are present
0 commit comments