Skip to content

Commit 075c287

Browse files
committed
feat: add support for database cert, key, ca-cert
1 parent 4778827 commit 075c287

File tree

12 files changed

+163
-35
lines changed

12 files changed

+163
-35
lines changed

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ build
99
data.db
1010
app/node_modules
1111
app/build
12+
certs/

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ data.db
1313
*.tar.gz
1414
.vscode/
1515
.yalc
16-
yalc.lock
16+
yalc.lock
17+
certs/

server/constants/env.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ const (
3838
EnvKeyDatabasePort = "DATABASE_PORT"
3939
// EnvKeyDatabaseHost key for env variable DATABASE_HOST
4040
EnvKeyDatabaseHost = "DATABASE_HOST"
41+
// EnvKeyDatabaseCert key for env variable DATABASE_CERT
42+
EnvKeyDatabaseCert = "DATABASE_CERT"
43+
// EnvKeyDatabaseCertKey key for env variable DATABASE_KEY
44+
EnvKeyDatabaseCertKey = "DATABASE_CERT_KEY"
45+
// EnvKeyDatabaseCACert key for env variable DATABASE_CA_CERT
46+
EnvKeyDatabaseCACert = "DATABASE_CA_CERT"
4147
// EnvKeySmtpHost key for env variable SMTP_HOST
4248
EnvKeySmtpHost = "SMTP_HOST"
4349
// EnvKeySmtpPort key for env variable SMTP_PORT

server/db/providers/cassandradb/provider.go

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package cassandradb
22

33
import (
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
2226
func 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

server/env/env.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ func InitRequiredEnv() error {
4242
dbHost := os.Getenv(constants.EnvKeyDatabaseHost)
4343
dbUsername := os.Getenv(constants.EnvKeyDatabaseUsername)
4444
dbPassword := os.Getenv(constants.EnvKeyDatabasePassword)
45+
dbCert := os.Getenv(constants.EnvKeyDatabaseCert)
46+
dbCertKey := os.Getenv(constants.EnvKeyDatabaseCertKey)
47+
dbCACert := os.Getenv(constants.EnvKeyDatabaseCACert)
4548

4649
if strings.TrimSpace(dbType) == "" {
4750
if envstore.ARG_DB_TYPE != nil && *envstore.ARG_DB_TYPE != "" {
@@ -77,6 +80,10 @@ func InitRequiredEnv() error {
7780
envstore.EnvStoreObj.UpdateEnvVariable(constants.StringStoreIdentifier, constants.EnvKeyDatabasePort, dbPort)
7881
envstore.EnvStoreObj.UpdateEnvVariable(constants.StringStoreIdentifier, constants.EnvKeyDatabaseUsername, dbUsername)
7982
envstore.EnvStoreObj.UpdateEnvVariable(constants.StringStoreIdentifier, constants.EnvKeyDatabasePassword, dbPassword)
83+
envstore.EnvStoreObj.UpdateEnvVariable(constants.StringStoreIdentifier, constants.EnvKeyDatabaseCert, dbCert)
84+
envstore.EnvStoreObj.UpdateEnvVariable(constants.StringStoreIdentifier, constants.EnvKeyDatabaseCertKey, dbCertKey)
85+
envstore.EnvStoreObj.UpdateEnvVariable(constants.StringStoreIdentifier, constants.EnvKeyDatabaseCACert, dbCACert)
86+
8087
return nil
8188
}
8289

server/handlers/oauth_callback.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,11 @@ func OAuthCallbackHandler() gin.HandlerFunc {
174174
sessionstore.SetState(authToken.RefreshToken.Token, authToken.FingerPrint+"@"+user.ID)
175175
}
176176

177-
go utils.SaveSessionInDB(c, user.ID)
177+
go db.Provider.AddSession(models.Session{
178+
UserID: user.ID,
179+
UserAgent: utils.GetUserAgent(c.Request),
180+
IP: utils.GetIP(c.Request),
181+
})
178182
if strings.Contains(redirectURL, "?") {
179183
redirectURL = redirectURL + "&" + params
180184
} else {

server/handlers/verify_email.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/authorizerdev/authorizer/server/cookie"
1010
"github.com/authorizerdev/authorizer/server/db"
11+
"github.com/authorizerdev/authorizer/server/db/models"
1112
"github.com/authorizerdev/authorizer/server/sessionstore"
1213
"github.com/authorizerdev/authorizer/server/token"
1314
"github.com/authorizerdev/authorizer/server/utils"
@@ -109,7 +110,11 @@ func VerifyEmailHandler() gin.HandlerFunc {
109110
redirectURL = redirectURL + "?" + params
110111
}
111112

112-
go utils.SaveSessionInDB(c, user.ID)
113+
go db.Provider.AddSession(models.Session{
114+
UserID: user.ID,
115+
UserAgent: utils.GetUserAgent(c.Request),
116+
IP: utils.GetIP(c.Request),
117+
})
113118

114119
c.Redirect(http.StatusTemporaryRedirect, redirectURL)
115120
}

server/resolvers/login.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/authorizerdev/authorizer/server/constants"
1111
"github.com/authorizerdev/authorizer/server/cookie"
1212
"github.com/authorizerdev/authorizer/server/db"
13+
"github.com/authorizerdev/authorizer/server/db/models"
1314
"github.com/authorizerdev/authorizer/server/envstore"
1415
"github.com/authorizerdev/authorizer/server/graph/model"
1516
"github.com/authorizerdev/authorizer/server/sessionstore"
@@ -96,7 +97,11 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes
9697
sessionstore.SetState(authToken.RefreshToken.Token, authToken.FingerPrint+"@"+user.ID)
9798
}
9899

99-
go utils.SaveSessionInDB(gc, user.ID)
100+
go db.Provider.AddSession(models.Session{
101+
UserID: user.ID,
102+
UserAgent: utils.GetUserAgent(gc.Request),
103+
IP: utils.GetIP(gc.Request),
104+
})
100105

101106
return res, nil
102107
}

server/resolvers/signup.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,11 @@ func SignupResolver(ctx context.Context, params model.SignUpInput) (*model.AuthR
174174

175175
sessionstore.SetState(authToken.FingerPrintHash, authToken.FingerPrint+"@"+user.ID)
176176
cookie.SetSession(gc, authToken.FingerPrintHash)
177-
go utils.SaveSessionInDB(gc, user.ID)
177+
go db.Provider.AddSession(models.Session{
178+
UserID: user.ID,
179+
UserAgent: utils.GetUserAgent(gc.Request),
180+
IP: utils.GetIP(gc.Request),
181+
})
178182

179183
expiresIn := authToken.AccessToken.ExpiresAt - time.Now().Unix()
180184
if expiresIn <= 0 {

server/resolvers/verify_email.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/authorizerdev/authorizer/server/cookie"
1010
"github.com/authorizerdev/authorizer/server/db"
11+
"github.com/authorizerdev/authorizer/server/db/models"
1112
"github.com/authorizerdev/authorizer/server/graph/model"
1213
"github.com/authorizerdev/authorizer/server/sessionstore"
1314
"github.com/authorizerdev/authorizer/server/token"
@@ -62,7 +63,11 @@ func VerifyEmailResolver(ctx context.Context, params model.VerifyEmailInput) (*m
6263
sessionstore.SetState(authToken.FingerPrintHash, authToken.FingerPrint+"@"+user.ID)
6364
sessionstore.SetState(authToken.AccessToken.Token, authToken.FingerPrint+"@"+user.ID)
6465
cookie.SetSession(gc, authToken.FingerPrintHash)
65-
go utils.SaveSessionInDB(gc, user.ID)
66+
go db.Provider.AddSession(models.Session{
67+
UserID: user.ID,
68+
UserAgent: utils.GetUserAgent(gc.Request),
69+
IP: utils.GetIP(gc.Request),
70+
})
6671

6772
expiresIn := authToken.AccessToken.ExpiresAt - time.Now().Unix()
6873
if expiresIn <= 0 {

0 commit comments

Comments
 (0)