Skip to content

Commit

Permalink
Update frontend with sslflag for monogodb.
Browse files Browse the repository at this point in the history
  • Loading branch information
prashantkhandelwal committed Jan 18, 2023
1 parent 05421db commit 92b9987
Show file tree
Hide file tree
Showing 8 changed files with 29 additions and 10 deletions.
1 change: 1 addition & 0 deletions frontend/src/network/payloads.ts
Expand Up @@ -15,4 +15,5 @@ export interface AddDBConnPayload {
sshUser: string
sshPassword: string
sshKeyFile: string
useSSL: boolean
}
13 changes: 13 additions & 0 deletions frontend/src/pages/project/newdb.tsx
Expand Up @@ -32,6 +32,7 @@ const NewDBPage: FunctionComponent<{}> = () => {
const [dbSSHKeyFile, setSSHKeyFile] = useState('')
const [addingError, setAddingError] = useState(false)
const [adding, setAdding] = useState(false)
const [dbUseSSL, setDBUseSSL] = useState(false)

if (!project) {
return <h1>Project not found</h1>
Expand All @@ -58,6 +59,7 @@ const NewDBPage: FunctionComponent<{}> = () => {
sshUser: dbSSHUser,
sshPassword: dbSSHPassword,
sshKeyFile: dbSSHKeyFile,
useSSL: dbUseSSL,
}
try {
await dispatch(addNewDBConn(payload)).unwrap()
Expand Down Expand Up @@ -190,6 +192,17 @@ const NewDBPage: FunctionComponent<{}> = () => {
</select>
</div>
</div>
{dbType === DBConnType.MONGO && <div className="field">
<label className="checkbox">
<input
type="checkbox"
defaultChecked={false}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => { setDBUseSSL(e.target.checked) }} />
&nbsp;Enable SSL
<span className="help">If you are connecting to database which enforce/require SSL connection. (Example: Azure CosmosDB)</span>
</label>
</div>}

{dbUseSSH !== DBConnectionUseSSHType.NONE &&
<React.Fragment>
<div className="field">
Expand Down
5 changes: 3 additions & 2 deletions internal/controllers/dbconnection.go
Expand Up @@ -25,10 +25,11 @@ func (DBConnectionController) CreateDBConnection(
sshHost string,
sshUser string,
sshPassword string,
sshKeyFile string) (*models.DBConnection, error) {
sshKeyFile string,
useSSL bool) (*models.DBConnection, error) {

dbConn, err := models.NewDBConnection(projectID, name, dbtype, scheme, host, port,
user, password, dbName, useSSH, sshHost, sshUser, sshPassword, sshKeyFile)
user, password, dbName, useSSH, sshHost, sshUser, sshPassword, sshKeyFile, useSSL)
if err != nil {
return nil, err
}
Expand Down
3 changes: 2 additions & 1 deletion internal/handlers/dbconnection.go
Expand Up @@ -28,11 +28,12 @@ func (DBConnectionHandlers) CreateDBConnection(c *gin.Context) {
SSHUser string `json:"sshUser"`
SSHPassword string `json:"sshPassword"`
SSHKeyFile string `json:"sshKeyFile"`
UseSSL bool `json:"useSSL"`
}
c.BindJSON(&createBody)

dbConn, err := dbConnController.CreateDBConnection(createBody.ProjectID, createBody.Name, createBody.Type, createBody.Scheme, createBody.Host, createBody.Port,
createBody.User, createBody.Password, createBody.DBName, createBody.UseSSH, createBody.SSHHost, createBody.SSHUser, createBody.SSHPassword, createBody.SSHKeyFile)
createBody.User, createBody.Password, createBody.DBName, createBody.UseSSH, createBody.SSHHost, createBody.SSHUser, createBody.SSHPassword, createBody.SSHKeyFile, createBody.UseSSL)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"success": false,
Expand Down
5 changes: 4 additions & 1 deletion internal/models/dbconnection.go
Expand Up @@ -29,13 +29,14 @@ type DBConnection struct {
SSHUser sbsql.CryptedData `gorm:"type:text"`
SSHPassword sbsql.CryptedData `gorm:"type:text"`
SSHKeyFile sbsql.CryptedData `gorm:"type:text"`
UseSSL bool `gorm:"type:bool"`
CreatedAt time.Time `gorm:"autoCreateTime"`
UpdatedAt time.Time `gorm:"autoUpdateTime"`

Project Project `gorm:"foreignkey:ProjectID"`
}

func NewDBConnection(projectID string, name string, dbtype string, dbscheme, dbhost, dbport, dbuser, dbpassword, databaseName, useSSH, sshHost, sshUser, sshPassword, sshKeyFile string) (*DBConnection, error) {
func NewDBConnection(projectID string, name string, dbtype string, dbscheme, dbhost, dbport, dbuser, dbpassword, databaseName, useSSH, sshHost, sshUser, sshPassword, sshKeyFile string, useSSL bool) (*DBConnection, error) {

if !utils.ContainsString([]string{qemodels.DBUSESSH_NONE, qemodels.DBUSESSH_PASSWORD, qemodels.DBUSESSH_KEYFILE, qemodels.DBUSESSH_PASSKEYFILE}, useSSH) {
return nil, errors.New("useSSH is not correct")
Expand Down Expand Up @@ -76,6 +77,7 @@ func NewDBConnection(projectID string, name string, dbtype string, dbscheme, dbh
SSHUser: sbsql.CryptedData(sshUser),
SSHPassword: sbsql.CryptedData(sshPassword),
SSHKeyFile: sbsql.CryptedData(sshKeyFile),
UseSSL: useSSL,
}, nil
}

Expand All @@ -100,5 +102,6 @@ func (dbConn *DBConnection) ToQEConnection() *qemodels.DBConnection {
SSHUser: string(dbConn.SSHUser),
SSHPassword: string(dbConn.SSHPassword),
SSHKeyFile: string(dbConn.SSHKeyFile),
UseSSL: dbConn.UseSSL,
}
}
1 change: 1 addition & 0 deletions pkg/queryengines/models/dbconnections.go
Expand Up @@ -16,6 +16,7 @@ type DBConnection struct {
SSHUser string
SSHPassword string
SSHKeyFile string
UseSSL bool
}

const (
Expand Down
9 changes: 4 additions & 5 deletions pkg/queryengines/mongoqueryengine/connection.go
Expand Up @@ -4,7 +4,6 @@ import (
"context"
"fmt"
"strconv"
"strings"
"time"

"go.mongodb.org/mongo-driver/mongo"
Expand All @@ -16,7 +15,7 @@ type mongoClientInstance struct {
LastUsed time.Time
}

func createMongoConnectionURI(scheme string, host string, port uint16, user, password string) string {
func createMongoConnectionURI(scheme string, host string, port uint16, user, password string, useSSL bool) string {
usernamePassword := ""
if user != "" && password != "" {
usernamePassword = user + ":" + password + "@"
Expand All @@ -25,7 +24,7 @@ func createMongoConnectionURI(scheme string, host string, port uint16, user, pas
// Adding support to connect to Azure CosmosDB using MongoDB API.
// According to official docs, the connection string should pass
// ssl=true param to connect.
if strings.Contains(host, ".mongo.cosmos.azure.com") {
if useSSL == true {
return "mongodb://" + usernamePassword + host + ":" + strconv.Itoa(int(port)) + "/?ssl=true"
} else {
return "mongodb://" + usernamePassword + host + ":" + strconv.Itoa(int(port))
Expand All @@ -36,15 +35,15 @@ func createMongoConnectionURI(scheme string, host string, port uint16, user, pas
return ""
}

func (mEngine *MongoQueryEngine) getConnection(dbConnectionId, scheme, host string, port uint16, user, password string) (c *mongo.Client, err error) {
func (mEngine *MongoQueryEngine) getConnection(dbConnectionId, scheme, host string, port uint16, user, password string, useSSL bool) (c *mongo.Client, err error) {
if mClientInstance, exists := mEngine.openClients[dbConnectionId]; exists {
mEngine.openClients[dbConnectionId] = mongoClientInstance{
mongoClientInstance: mClientInstance.mongoClientInstance,
LastUsed: time.Now(),
}
return mClientInstance.mongoClientInstance, nil
}
connectionURI := createMongoConnectionURI(scheme, host, port, user, password)
connectionURI := createMongoConnectionURI(scheme, host, port, user, password, useSSL)
client, err := mongo.Connect(context.Background(), options.Client().ApplyURI(connectionURI))
if err != nil {
err = fmt.Errorf("unable to connect to database: %v", err)
Expand Down
2 changes: 1 addition & 1 deletion pkg/queryengines/mongoqueryengine/queryengine.go
Expand Up @@ -41,7 +41,7 @@ func (mqe *MongoQueryEngine) RunQuery(dbConn *models.DBConnection, query string,
dbConn.DBPort = fmt.Sprintf("%d", sshTun.GetLocalEndpoint().Port)
}
port, _ = strconv.Atoi(string(dbConn.DBPort))
conn, err := mqe.getConnection(dbConn.ID, string(dbConn.DBScheme), string(dbConn.DBHost), uint16(port), string(dbConn.DBUser), string(dbConn.DBPassword))
conn, err := mqe.getConnection(dbConn.ID, string(dbConn.DBScheme), string(dbConn.DBHost), uint16(port), string(dbConn.DBUser), string(dbConn.DBPassword), dbConn.UseSSL)
if err != nil {
return nil, err
}
Expand Down

0 comments on commit 92b9987

Please sign in to comment.