Skip to content

Commit f5e5b2a

Browse files
PolliOPavlo
authored and
Pavlo
committed
Add kerberos support to auth method forked from v.1.6.0
1 parent bcc459a commit f5e5b2a

10 files changed

+75
-39
lines changed

Diff for: AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ Olivier Mengué <dolmen at cpan.org>
7474
oscarzhao <oscarzhaosl at gmail.com>
7575
Paul Bonser <misterpib at gmail.com>
7676
Peter Schultz <peter.schultz at classmarkets.com>
77+
Polina Osadcha <posadcha-ua at singlestore.com>
7778
Rebecca Chin <rchin at pivotal.io>
7879
Reed Allman <rdallman10 at gmail.com>
7980
Richard Wilkes <wilkes at me.com>

Diff for: README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import (
6767

6868
// ...
6969

70-
db, err := sql.Open("mysql", "user:password@/dbname")
70+
db, err := sql.Open("singlestore", "user:password@/dbname")
7171
if err != nil {
7272
panic(err)
7373
}

Diff for: auth.go

+31
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import (
1717
"encoding/pem"
1818
"fmt"
1919
"sync"
20+
21+
"github.com/openshift/gssapi"
2022
)
2123

2224
// server pub keys registry
@@ -288,6 +290,35 @@ func (mc *mysqlConn) auth(authData []byte, plugin string) ([]byte, error) {
288290
// encrypted password
289291
enc, err := encryptPassword(mc.cfg.Passwd, authData, pubKey)
290292
return enc, err
293+
case "auth_gssapi_client":
294+
dl, err := gssapi.Load(nil)
295+
if err != nil {
296+
return nil, err
297+
}
298+
299+
buf_name, err := dl.MakeBufferBytes(authData)
300+
if err != nil {
301+
return nil, err
302+
}
303+
name, err := buf_name.Name(dl.GSS_C_NT_USER_NAME)
304+
input_buf, _ := dl.MakeBuffer(0)
305+
if err != nil {
306+
return nil, err
307+
}
308+
_, _, token, _, _, err := dl.InitSecContext(
309+
dl.GSS_C_NO_CREDENTIAL,
310+
nil,
311+
name,
312+
dl.GSS_C_NO_OID,
313+
0,
314+
0,
315+
dl.GSS_C_NO_CHANNEL_BINDINGS,
316+
input_buf)
317+
if token == nil {
318+
return nil, err
319+
}
320+
321+
return token.Bytes(), err
291322

292323
default:
293324
errLog.Print("unknown auth plugin:", plugin)

Diff for: benchmark_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func (tb *TB) checkStmt(stmt *sql.Stmt, err error) *sql.Stmt {
4848

4949
func initDB(b *testing.B, queries ...string) *sql.DB {
5050
tb := (*TB)(b)
51-
db := tb.checkDB(sql.Open("mysql", dsn))
51+
db := tb.checkDB(sql.Open("singlestore", dsn))
5252
for _, query := range queries {
5353
if _, err := db.Exec(query); err != nil {
5454
b.Fatalf("error on %q: %v", query, err)
@@ -105,7 +105,7 @@ func BenchmarkExec(b *testing.B) {
105105
tb := (*TB)(b)
106106
b.StopTimer()
107107
b.ReportAllocs()
108-
db := tb.checkDB(sql.Open("mysql", dsn))
108+
db := tb.checkDB(sql.Open("singlestore", dsn))
109109
db.SetMaxIdleConns(concurrencyLevel)
110110
defer db.Close()
111111

@@ -151,7 +151,7 @@ func BenchmarkRoundtripTxt(b *testing.B) {
151151
sampleString := string(sample)
152152
b.ReportAllocs()
153153
tb := (*TB)(b)
154-
db := tb.checkDB(sql.Open("mysql", dsn))
154+
db := tb.checkDB(sql.Open("singlestore", dsn))
155155
defer db.Close()
156156
b.StartTimer()
157157
var result string
@@ -184,7 +184,7 @@ func BenchmarkRoundtripBin(b *testing.B) {
184184
sample, min, max := initRoundtripBenchmarks()
185185
b.ReportAllocs()
186186
tb := (*TB)(b)
187-
db := tb.checkDB(sql.Open("mysql", dsn))
187+
db := tb.checkDB(sql.Open("singlestore", dsn))
188188
defer db.Close()
189189
stmt := tb.checkStmt(db.Prepare("SELECT ?"))
190190
defer stmt.Close()

Diff for: driver.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
//
99
// The driver should be used via the database/sql package:
1010
//
11-
// import "database/sql"
12-
// import _ "github.com/go-sql-driver/mysql"
11+
// import "database/sql"
12+
// import _ "github.com/go-sql-driver/mysql"
1313
//
14-
// db, err := sql.Open("mysql", "user:password@/dbname")
14+
// db, err := sql.Open("singlestore", "user:password@/dbname")
1515
//
1616
// See https://github.com/go-sql-driver/mysql#usage for details
1717
package mysql
@@ -81,7 +81,7 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {
8181
}
8282

8383
func init() {
84-
sql.Register("mysql", &MySQLDriver{})
84+
sql.Register("singlestore", &MySQLDriver{})
8585
}
8686

8787
// NewConnector returns new driver.Connector.

Diff for: driver_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func runTestsWithMultiStatement(t *testing.T, dsn string, tests ...func(dbt *DBT
112112
dsn += "&multiStatements=true"
113113
var db *sql.DB
114114
if _, err := ParseDSN(dsn); err != errInvalidDSNUnsafeCollation {
115-
db, err = sql.Open("mysql", dsn)
115+
db, err = sql.Open("singlestore", dsn)
116116
if err != nil {
117117
t.Fatalf("error connecting: %s", err.Error())
118118
}
@@ -131,7 +131,7 @@ func runTests(t *testing.T, dsn string, tests ...func(dbt *DBTest)) {
131131
t.Skipf("MySQL server not running on %s", netAddr)
132132
}
133133

134-
db, err := sql.Open("mysql", dsn)
134+
db, err := sql.Open("singlestore", dsn)
135135
if err != nil {
136136
t.Fatalf("error connecting: %s", err.Error())
137137
}
@@ -142,7 +142,7 @@ func runTests(t *testing.T, dsn string, tests ...func(dbt *DBTest)) {
142142
dsn2 := dsn + "&interpolateParams=true"
143143
var db2 *sql.DB
144144
if _, err := ParseDSN(dsn2); err != errInvalidDSNUnsafeCollation {
145-
db2, err = sql.Open("mysql", dsn2)
145+
db2, err = sql.Open("singlestore", dsn2)
146146
if err != nil {
147147
t.Fatalf("error connecting: %s", err.Error())
148148
}
@@ -152,7 +152,7 @@ func runTests(t *testing.T, dsn string, tests ...func(dbt *DBTest)) {
152152
dsn3 := dsn + "&multiStatements=true"
153153
var db3 *sql.DB
154154
if _, err := ParseDSN(dsn3); err != errInvalidDSNUnsafeCollation {
155-
db3, err = sql.Open("mysql", dsn3)
155+
db3, err = sql.Open("singlestore", dsn3)
156156
if err != nil {
157157
t.Fatalf("error connecting: %s", err.Error())
158158
}
@@ -1883,7 +1883,7 @@ func testDialError(t *testing.T, dialErr error, expectErr error) {
18831883
return nil, dialErr
18841884
})
18851885

1886-
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@mydial(%s)/%s?timeout=30s", user, pass, addr, dbname))
1886+
db, err := sql.Open("singlestore", fmt.Sprintf("%s:%s@mydial(%s)/%s?timeout=30s", user, pass, addr, dbname))
18871887
if err != nil {
18881888
t.Fatalf("error connecting: %s", err.Error())
18891889
}
@@ -1922,7 +1922,7 @@ func TestCustomDial(t *testing.T) {
19221922
return d.DialContext(ctx, prot, addr)
19231923
})
19241924

1925-
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@mydial(%s)/%s?timeout=30s", user, pass, addr, dbname))
1925+
db, err := sql.Open("singlestore", fmt.Sprintf("%s:%s@mydial(%s)/%s?timeout=30s", user, pass, addr, dbname))
19261926
if err != nil {
19271927
t.Fatalf("error connecting: %s", err.Error())
19281928
}
@@ -2020,7 +2020,7 @@ func TestUnixSocketAuthFail(t *testing.T) {
20202020
}
20212021
t.Logf("socket: %s", socket)
20222022
badDSN := fmt.Sprintf("%s:%s@unix(%s)/%s?timeout=30s", user, badPass, socket, dbname)
2023-
db, err := sql.Open("mysql", badDSN)
2023+
db, err := sql.Open("singlestore", badDSN)
20242024
if err != nil {
20252025
t.Fatalf("error connecting: %s", err.Error())
20262026
}
@@ -2169,7 +2169,7 @@ func TestEmptyPassword(t *testing.T) {
21692169
}
21702170

21712171
dsn := fmt.Sprintf("%s:%s@%s/%s?timeout=30s", user, "", netAddr, dbname)
2172-
db, err := sql.Open("mysql", dsn)
2172+
db, err := sql.Open("singlestore", dsn)
21732173
if err == nil {
21742174
defer db.Close()
21752175
err = db.Ping()
@@ -3058,7 +3058,7 @@ func TestConnectorObeysDialTimeouts(t *testing.T) {
30583058
return d.DialContext(ctx, prot, addr)
30593059
})
30603060

3061-
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@dialctxtest(%s)/%s?timeout=30s", user, pass, addr, dbname))
3061+
db, err := sql.Open("singlestore", fmt.Sprintf("%s:%s@dialctxtest(%s)/%s?timeout=30s", user, pass, addr, dbname))
30623062
if err != nil {
30633063
t.Fatalf("error connecting: %s", err.Error())
30643064
}

Diff for: fuzz.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
77
// You can obtain one at http://mozilla.org/MPL/2.0/.
88

9+
//go:build gofuzz
910
// +build gofuzz
1011

1112
package mysql
@@ -15,7 +16,7 @@ import (
1516
)
1617

1718
func Fuzz(data []byte) int {
18-
db, err := sql.Open("mysql", string(data))
19+
db, err := sql.Open("singlestore", string(data))
1920
if err != nil {
2021
return 0
2122
}

Diff for: go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
module github.com/go-sql-driver/mysql
22

33
go 1.10
4+
5+
require github.com/openshift/gssapi v0.0.0-20161010215902-5fb4217df13b

Diff for: go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
github.com/openshift/gssapi v0.0.0-20161010215902-5fb4217df13b h1:it0YPE/evO6/m8t8wxis9KFI2F/aleOKsI6d9uz0cEk=
2+
github.com/openshift/gssapi v0.0.0-20161010215902-5fb4217df13b/go.mod h1:tNrEB5k8SI+g5kOlsCmL2ELASfpqEofI0+FLBgBdN08=

Diff for: utils.go

+19-20
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,25 @@ var (
3535
// Note: The provided tls.Config is exclusively owned by the driver after
3636
// registering it.
3737
//
38-
// rootCertPool := x509.NewCertPool()
39-
// pem, err := ioutil.ReadFile("/path/ca-cert.pem")
40-
// if err != nil {
41-
// log.Fatal(err)
42-
// }
43-
// if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
44-
// log.Fatal("Failed to append PEM.")
45-
// }
46-
// clientCert := make([]tls.Certificate, 0, 1)
47-
// certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem")
48-
// if err != nil {
49-
// log.Fatal(err)
50-
// }
51-
// clientCert = append(clientCert, certs)
52-
// mysql.RegisterTLSConfig("custom", &tls.Config{
53-
// RootCAs: rootCertPool,
54-
// Certificates: clientCert,
55-
// })
56-
// db, err := sql.Open("mysql", "user@tcp(localhost:3306)/test?tls=custom")
57-
//
38+
// rootCertPool := x509.NewCertPool()
39+
// pem, err := ioutil.ReadFile("/path/ca-cert.pem")
40+
// if err != nil {
41+
// log.Fatal(err)
42+
// }
43+
// if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
44+
// log.Fatal("Failed to append PEM.")
45+
// }
46+
// clientCert := make([]tls.Certificate, 0, 1)
47+
// certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem")
48+
// if err != nil {
49+
// log.Fatal(err)
50+
// }
51+
// clientCert = append(clientCert, certs)
52+
// mysql.RegisterTLSConfig("custom", &tls.Config{
53+
// RootCAs: rootCertPool,
54+
// Certificates: clientCert,
55+
// })
56+
// db, err := sql.Open("singlestore", "user@tcp(localhost:3306)/test?tls=custom")
5857
func RegisterTLSConfig(key string, config *tls.Config) error {
5958
if _, isBool := readBool(key); isBool || strings.ToLower(key) == "skip-verify" || strings.ToLower(key) == "preferred" {
6059
return fmt.Errorf("key '%s' is reserved", key)

0 commit comments

Comments
 (0)