/
driver.go
107 lines (100 loc) · 2.49 KB
/
driver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright (c) 2017-2019 Snowflake Computing Inc. All right reserved.
package gosnowflake
import (
"database/sql"
"database/sql/driver"
"net/http"
)
// SnowflakeDriver is a context of Go Driver
type SnowflakeDriver struct{}
// Open creates a new connection.
func (d SnowflakeDriver) Open(dsn string) (driver.Conn, error) {
glog.V(2).Info("Open")
var err error
sc := &snowflakeConn{
SequenceCounter: 0,
}
sc.cfg, err = ParseDSN(dsn)
if err != nil {
sc.cleanup()
return nil, err
}
st := SnowflakeTransport
if sc.cfg.InsecureMode {
// no revocation check with OCSP. Think twice when you want to enable this option.
st = snowflakeInsecureTransport
} else {
// set OCSP fail open mode
ocspResponseCacheLock.Lock()
ocspFailOpen = sc.cfg.OCSPFailOpen
ocspResponseCacheLock.Unlock()
}
// authenticate
sc.rest = &snowflakeRestful{
Host: sc.cfg.Host,
Port: sc.cfg.Port,
Protocol: sc.cfg.Protocol,
Client: &http.Client{
// request timeout including reading response body
Timeout: defaultClientTimeout,
Transport: st,
},
LoginTimeout: sc.cfg.LoginTimeout,
RequestTimeout: sc.cfg.RequestTimeout,
FuncPost: postRestful,
FuncGet: getRestful,
FuncPostQuery: postRestfulQuery,
FuncPostQueryHelper: postRestfulQueryHelper,
FuncRenewSession: renewRestfulSession,
FuncPostAuth: postAuth,
FuncCloseSession: closeSession,
FuncCancelQuery: cancelQuery,
FuncPostAuthSAML: postAuthSAML,
FuncPostAuthOKTA: postAuthOKTA,
FuncGetSSO: getSSO,
}
var authData *authResponseMain
var samlResponse []byte
var proofKey []byte
glog.V(2).Infof("Authenticating via %v", sc.cfg.Authenticator.String())
switch sc.cfg.Authenticator {
case AuthTypeExternalBrowser:
samlResponse, proofKey, err = authenticateByExternalBrowser(
sc.rest,
sc.cfg.Authenticator.String(),
sc.cfg.Application,
sc.cfg.Account,
sc.cfg.User,
sc.cfg.Password)
if err != nil {
sc.cleanup()
return nil, err
}
case AuthTypeOkta:
samlResponse, err = authenticateBySAML(
sc.rest,
sc.cfg.OktaURL,
sc.cfg.Application,
sc.cfg.Account,
sc.cfg.User,
sc.cfg.Password)
if err != nil {
sc.cleanup()
return nil, err
}
}
authData, err = authenticate(
sc,
samlResponse,
proofKey)
if err != nil {
sc.cleanup()
return nil, err
}
sc.populateSessionParameters(authData.Parameters)
sc.startHeartBeat()
return sc, nil
}
func init() {
sql.Register("snowflake", &SnowflakeDriver{})
}