This is an automated email from the ASF dual-hosted git repository.

abeizn pushed a commit to branch fix#5659
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/fix#5659 by this push:
     new f7337bbdc fix: add tls connection
f7337bbdc is described below

commit f7337bbdc211fd700eb1ad409166d27a5ce6946e
Author: abeizn <[email protected]>
AuthorDate: Tue Sep 26 15:37:33 2023 +0800

    fix: add tls connection
---
 backend/core/runner/db.go | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/backend/core/runner/db.go b/backend/core/runner/db.go
index 0a98704a4..73a4e7875 100644
--- a/backend/core/runner/db.go
+++ b/backend/core/runner/db.go
@@ -19,8 +19,12 @@ package runner
 
 import (
        "context"
+       "crypto/tls"
+       "crypto/x509"
+       "database/sql"
        "fmt"
        "net/url"
+       "os"
        "strings"
        "time"
 
@@ -28,6 +32,7 @@ import (
        "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/log"
+       tlsMysql "github.com/go-sql-driver/mysql"
        "gorm.io/driver/mysql"
        "gorm.io/driver/postgres"
        "gorm.io/gorm"
@@ -109,6 +114,9 @@ func addLocal(query url.Values) string {
        if query.Get("loc") == "" {
                query.Set("loc", "Local")
        }
+       if query.Get("ca-cert") != "" {
+               query.Del("ca-cert")
+       }
        return query.Encode()
 }
 
@@ -120,6 +128,28 @@ func getDbConnection(dbUrl string, conf *gorm.Config) 
(*gorm.DB, error) {
        switch strings.ToLower(u.Scheme) {
        case "mysql":
                dbUrl = fmt.Sprintf("%s@tcp(%s)%s?%s", getUserString(u), 
u.Host, u.Path, addLocal(u.Query()))
+               if u.Query().Get("ca-cert") != "" {
+                       rootCertPool := x509.NewCertPool()
+                       pem, err := os.ReadFile(u.Query().Get("ca-cert"))
+                       if err != nil {
+                               return nil, err
+                       }
+                       if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
+                               return nil, err
+                       }
+                       tlsMysql.RegisterTLSConfig("custom", 
&tls.Config{RootCAs: rootCertPool})
+
+                       dbUrl = fmt.Sprintf("%s&tls=custom", dbUrl)
+                       db, err := sql.Open("mysql", dbUrl)
+                       if err != nil {
+                               return nil, err
+                       }
+                       gormDB, err := gorm.Open(mysql.New(mysql.Config{
+                               Conn: db,
+                       }), &gorm.Config{})
+
+                       return gormDB, err
+               }
                return gorm.Open(mysql.Open(dbUrl), conf)
        case "postgresql", "postgres", "pg":
                return gorm.Open(postgres.Open(dbUrl), conf)

Reply via email to