Skip to content

Commit eb695ac

Browse files
authored
Merge pull request #137 from hsanson/2-add-ssh-tunnel-support-to-mssql-driver
Add ssh tunnel support to mssql driver
2 parents e89c70f + 1ad3481 commit eb695ac

File tree

4 files changed

+46
-11
lines changed

4 files changed

+46
-11
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# sqls
1+
# sqls: SQL Language Server
22

33
![test](https://github.com/sqls-server/sqls/workflows/test/badge.svg)
44

@@ -222,7 +222,7 @@ require'lspconfig'.sqls.setup{
222222

223223
**I'm sorry. Please wait a little longer for other editor settings.**
224224

225-
### Configuration Params
225+
### Configuration Parameters
226226

227227
The first setting in `connections` is the default connection.
228228

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/godror/godror v0.41.0
1010
github.com/google/go-cmp v0.5.9
1111
github.com/jackc/pgx/v4 v4.18.1
12+
github.com/jfcote87/sshdb v0.5.3
1213
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect
1314
github.com/sourcegraph/jsonrpc2 v0.2.0
1415
github.com/urfave/cli/v2 v2.27.0

go.sum

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9
8888
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
8989
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
9090
github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
91+
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
9192
github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
9293
github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
9394
github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
@@ -135,6 +136,8 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f
135136
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
136137
github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
137138
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
139+
github.com/jfcote87/sshdb v0.5.3 h1:c0I3+ScEbT0mjvpoY8qbVNfR4Y9Q5JWh52WnmjfsuV0=
140+
github.com/jfcote87/sshdb v0.5.3/go.mod h1:YIGPRF3vtRG1Cvpwa1LaQvmrsIEPKC9WqF+ZU5rInUw=
138141
github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4=
139142
github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak=
140143
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM=
@@ -370,7 +373,6 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
370373
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
371374
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
372375
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
373-
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
374376
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
375377
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
376378
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=

internal/database/mssql.go

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package database
22

33
import (
4+
"os"
45
"context"
56
"database/sql"
67
"fmt"
@@ -10,6 +11,8 @@ import (
1011

1112
_ "github.com/denisenkom/go-mssqldb"
1213
"github.com/sqls-server/sqls/dialect"
14+
"github.com/jfcote87/sshdb"
15+
"github.com/jfcote87/sshdb/mssql"
1316
"golang.org/x/crypto/ssh"
1417
)
1518

@@ -21,21 +24,51 @@ func init() {
2124
func mssqlOpen(dbConnCfg *DBConfig) (*DBConnection, error) {
2225
var (
2326
conn *sql.DB
24-
sshConn *ssh.Client
2527
)
2628
dsn, err := genMssqlConfig(dbConnCfg)
2729
if err != nil {
2830
return nil, err
2931
}
3032

3133
if dbConnCfg.SSHCfg != nil {
32-
return nil, fmt.Errorf("connect via SSH is not supported")
33-
}
34-
dbConn, err := sql.Open("sqlserver", dsn)
35-
if err != nil {
36-
return nil, err
34+
key, err := os.ReadFile(dbConnCfg.SSHCfg.PrivateKey)
35+
if err != nil {
36+
return nil, fmt.Errorf("unable to open private key")
37+
}
38+
39+
signer, err := ssh.ParsePrivateKeyWithPassphrase(key, []byte(dbConnCfg.SSHCfg.PassPhrase))
40+
if err != nil {
41+
return nil, fmt.Errorf("unable to decrypt private key")
42+
}
43+
44+
cfg := &ssh.ClientConfig {
45+
User: dbConnCfg.SSHCfg.User,
46+
Auth: []ssh.AuthMethod {
47+
ssh.PublicKeys(signer),
48+
},
49+
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
50+
}
51+
52+
remoteAddr := fmt.Sprintf("%s:%d", dbConnCfg.SSHCfg.Host, dbConnCfg.SSHCfg.Port)
53+
54+
tunnel, err := sshdb.New(cfg, remoteAddr)
55+
if err != nil {
56+
return nil, fmt.Errorf("%w", err)
57+
}
58+
59+
connector, err := tunnel.OpenConnector(mssql.TunnelDriver, dsn)
60+
if err != nil {
61+
return nil, err
62+
}
63+
64+
conn = sql.OpenDB(connector)
65+
} else {
66+
conn, err = sql.Open("mssql", dsn)
67+
if err != nil {
68+
return nil, err
69+
}
3770
}
38-
conn = dbConn
71+
3972
if err = conn.Ping(); err != nil {
4073
return nil, err
4174
}
@@ -45,7 +78,6 @@ func mssqlOpen(dbConnCfg *DBConfig) (*DBConnection, error) {
4578

4679
return &DBConnection{
4780
Conn: conn,
48-
SSHConn: sshConn,
4981
}, nil
5082
}
5183

0 commit comments

Comments
 (0)