mirror of
https://github.com/documize/community.git
synced 2025-07-27 09:09:44 +02:00
Bump Go deps
This commit is contained in:
parent
f2ba294be8
commit
acb59e1b43
91 changed files with 9004 additions and 513 deletions
234
vendor/github.com/microsoft/go-mssqldb/msdsn/conn_str.go
generated
vendored
234
vendor/github.com/microsoft/go-mssqldb/msdsn/conn_str.go
generated
vendored
|
@ -21,10 +21,17 @@ type (
|
|||
BrowserMsg byte
|
||||
)
|
||||
|
||||
const (
|
||||
DsnTypeURL = 1
|
||||
DsnTypeOdbc = 2
|
||||
DsnTypeAdo = 3
|
||||
)
|
||||
|
||||
const (
|
||||
EncryptionOff = 0
|
||||
EncryptionRequired = 1
|
||||
EncryptionDisabled = 3
|
||||
EncryptionStrict = 4
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -44,6 +51,34 @@ const (
|
|||
BrowserDAC BrowserMsg = 0x0f
|
||||
)
|
||||
|
||||
const (
|
||||
Database = "database"
|
||||
Encrypt = "encrypt"
|
||||
Password = "password"
|
||||
ChangePassword = "change password"
|
||||
UserID = "user id"
|
||||
Port = "port"
|
||||
TrustServerCertificate = "trustservercertificate"
|
||||
Certificate = "certificate"
|
||||
TLSMin = "tlsmin"
|
||||
PacketSize = "packet size"
|
||||
LogParam = "log"
|
||||
ConnectionTimeout = "connection timeout"
|
||||
HostNameInCertificate = "hostnameincertificate"
|
||||
KeepAlive = "keepalive"
|
||||
ServerSpn = "serverspn"
|
||||
WorkstationID = "workstation id"
|
||||
AppName = "app name"
|
||||
ApplicationIntent = "applicationintent"
|
||||
FailoverPartner = "failoverpartner"
|
||||
FailOverPort = "failoverport"
|
||||
DisableRetry = "disableretry"
|
||||
Server = "server"
|
||||
Protocol = "protocol"
|
||||
DialTimeout = "dial timeout"
|
||||
Pipe = "pipe"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
Port uint64
|
||||
Host string
|
||||
|
@ -88,6 +123,10 @@ type Config struct {
|
|||
ProtocolParameters map[string]interface{}
|
||||
// BrowserMsg is the message identifier to fetch instance data from SQL browser
|
||||
BrowserMessage BrowserMsg
|
||||
// ChangePassword is used to set the login's password during login. Ignored for non-SQL authentication.
|
||||
ChangePassword string
|
||||
//ColumnEncryption is true if the application needs to decrypt or encrypt Always Encrypted values
|
||||
ColumnEncryption bool
|
||||
}
|
||||
|
||||
// Build a tls.Config object from the supplied certificate.
|
||||
|
@ -128,24 +167,26 @@ func parseTLS(params map[string]string, host string) (Encryption, *tls.Config, e
|
|||
trustServerCert := false
|
||||
|
||||
var encryption Encryption = EncryptionOff
|
||||
encrypt, ok := params["encrypt"]
|
||||
encrypt, ok := params[Encrypt]
|
||||
if ok {
|
||||
if strings.EqualFold(encrypt, "DISABLE") {
|
||||
encrypt = strings.ToLower(encrypt)
|
||||
switch encrypt {
|
||||
case "mandatory", "yes", "1", "t", "true":
|
||||
encryption = EncryptionRequired
|
||||
case "disable":
|
||||
encryption = EncryptionDisabled
|
||||
} else {
|
||||
e, err := strconv.ParseBool(encrypt)
|
||||
if err != nil {
|
||||
f := "invalid encrypt '%s': %s"
|
||||
return encryption, nil, fmt.Errorf(f, encrypt, err.Error())
|
||||
}
|
||||
if e {
|
||||
encryption = EncryptionRequired
|
||||
}
|
||||
case "strict":
|
||||
encryption = EncryptionStrict
|
||||
case "optional", "no", "0", "f", "false":
|
||||
encryption = EncryptionOff
|
||||
default:
|
||||
f := "invalid encrypt '%s'"
|
||||
return encryption, nil, fmt.Errorf(f, encrypt)
|
||||
}
|
||||
} else {
|
||||
trustServerCert = true
|
||||
}
|
||||
trust, ok := params["trustservercertificate"]
|
||||
trust, ok := params[TrustServerCertificate]
|
||||
if ok {
|
||||
var err error
|
||||
trustServerCert, err = strconv.ParseBool(trust)
|
||||
|
@ -154,9 +195,12 @@ func parseTLS(params map[string]string, host string) (Encryption, *tls.Config, e
|
|||
return encryption, nil, fmt.Errorf(f, trust, err.Error())
|
||||
}
|
||||
}
|
||||
certificate := params["certificate"]
|
||||
certificate := params[Certificate]
|
||||
if encryption != EncryptionDisabled {
|
||||
tlsMin := params["tlsmin"]
|
||||
tlsMin := params[TLSMin]
|
||||
if encrypt == "strict" {
|
||||
trustServerCert = false
|
||||
}
|
||||
tlsConfig, err := SetupTLS(certificate, trustServerCert, host, tlsMin)
|
||||
if err != nil {
|
||||
return encryption, nil, fmt.Errorf("failed to setup TLS: %w", err)
|
||||
|
@ -168,6 +212,38 @@ func parseTLS(params map[string]string, host string) (Encryption, *tls.Config, e
|
|||
|
||||
var skipSetup = errors.New("skip setting up TLS")
|
||||
|
||||
func getDsnType(dsn string) int {
|
||||
if strings.HasPrefix(dsn, "sqlserver://") {
|
||||
return DsnTypeURL
|
||||
}
|
||||
if strings.HasPrefix(dsn, "odbc:") {
|
||||
return DsnTypeOdbc
|
||||
}
|
||||
return DsnTypeAdo
|
||||
}
|
||||
|
||||
func getDsnParams(dsn string) (map[string]string, error) {
|
||||
|
||||
var params map[string]string
|
||||
var err error
|
||||
|
||||
switch getDsnType(dsn) {
|
||||
case DsnTypeOdbc:
|
||||
params, err = splitConnectionStringOdbc(dsn[len("odbc:"):])
|
||||
if err != nil {
|
||||
return params, err
|
||||
}
|
||||
case DsnTypeURL:
|
||||
params, err = splitConnectionStringURL(dsn)
|
||||
if err != nil {
|
||||
return params, err
|
||||
}
|
||||
default:
|
||||
params = splitConnectionString(dsn)
|
||||
}
|
||||
return params, nil
|
||||
}
|
||||
|
||||
func Parse(dsn string) (Config, error) {
|
||||
p := Config{
|
||||
ProtocolParameters: map[string]interface{}{},
|
||||
|
@ -176,23 +252,14 @@ func Parse(dsn string) (Config, error) {
|
|||
|
||||
var params map[string]string
|
||||
var err error
|
||||
if strings.HasPrefix(dsn, "odbc:") {
|
||||
params, err = splitConnectionStringOdbc(dsn[len("odbc:"):])
|
||||
if err != nil {
|
||||
return p, err
|
||||
}
|
||||
} else if strings.HasPrefix(dsn, "sqlserver://") {
|
||||
params, err = splitConnectionStringURL(dsn)
|
||||
if err != nil {
|
||||
return p, err
|
||||
}
|
||||
} else {
|
||||
params = splitConnectionString(dsn)
|
||||
}
|
||||
|
||||
params, err = getDsnParams(dsn)
|
||||
if err != nil {
|
||||
return p, err
|
||||
}
|
||||
p.Parameters = params
|
||||
|
||||
strlog, ok := params["log"]
|
||||
strlog, ok := params[LogParam]
|
||||
if ok {
|
||||
flags, err := strconv.ParseUint(strlog, 10, 64)
|
||||
if err != nil {
|
||||
|
@ -201,12 +268,12 @@ func Parse(dsn string) (Config, error) {
|
|||
p.LogFlags = Log(flags)
|
||||
}
|
||||
|
||||
p.Database = params["database"]
|
||||
p.User = params["user id"]
|
||||
p.Password = params["password"]
|
||||
|
||||
p.Database = params[Database]
|
||||
p.User = params[UserID]
|
||||
p.Password = params[Password]
|
||||
p.ChangePassword = params[ChangePassword]
|
||||
p.Port = 0
|
||||
strport, ok := params["port"]
|
||||
strport, ok := params[Port]
|
||||
if ok {
|
||||
var err error
|
||||
p.Port, err = strconv.ParseUint(strport, 10, 16)
|
||||
|
@ -217,7 +284,7 @@ func Parse(dsn string) (Config, error) {
|
|||
}
|
||||
|
||||
// https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/configure-the-network-packet-size-server-configuration-option\
|
||||
strpsize, ok := params["packet size"]
|
||||
strpsize, ok := params[PacketSize]
|
||||
if ok {
|
||||
var err error
|
||||
psize, err := strconv.ParseUint(strpsize, 0, 16)
|
||||
|
@ -242,7 +309,7 @@ func Parse(dsn string) (Config, error) {
|
|||
//
|
||||
// Do not set a connection timeout. Use Context to manage such things.
|
||||
// Default to zero, but still allow it to be set.
|
||||
if strconntimeout, ok := params["connection timeout"]; ok {
|
||||
if strconntimeout, ok := params[ConnectionTimeout]; ok {
|
||||
timeout, err := strconv.ParseUint(strconntimeout, 10, 64)
|
||||
if err != nil {
|
||||
f := "invalid connection timeout '%v': %v"
|
||||
|
@ -254,7 +321,7 @@ func Parse(dsn string) (Config, error) {
|
|||
// default keep alive should be 30 seconds according to spec:
|
||||
// https://msdn.microsoft.com/en-us/library/dd341108.aspx
|
||||
p.KeepAlive = 30 * time.Second
|
||||
if keepAlive, ok := params["keepalive"]; ok {
|
||||
if keepAlive, ok := params[KeepAlive]; ok {
|
||||
timeout, err := strconv.ParseUint(keepAlive, 10, 64)
|
||||
if err != nil {
|
||||
f := "invalid keepAlive value '%s': %s"
|
||||
|
@ -263,12 +330,12 @@ func Parse(dsn string) (Config, error) {
|
|||
p.KeepAlive = time.Duration(timeout) * time.Second
|
||||
}
|
||||
|
||||
serverSPN, ok := params["serverspn"]
|
||||
serverSPN, ok := params[ServerSpn]
|
||||
if ok {
|
||||
p.ServerSPN = serverSPN
|
||||
} // If not set by the app, ServerSPN will be set by the successful dialer.
|
||||
|
||||
workstation, ok := params["workstation id"]
|
||||
workstation, ok := params[WorkstationID]
|
||||
if ok {
|
||||
p.Workstation = workstation
|
||||
} else {
|
||||
|
@ -278,13 +345,13 @@ func Parse(dsn string) (Config, error) {
|
|||
}
|
||||
}
|
||||
|
||||
appname, ok := params["app name"]
|
||||
appname, ok := params[AppName]
|
||||
if !ok {
|
||||
appname = "go-mssqldb"
|
||||
}
|
||||
p.AppName = appname
|
||||
|
||||
appintent, ok := params["applicationintent"]
|
||||
appintent, ok := params[ApplicationIntent]
|
||||
if ok {
|
||||
if appintent == "ReadOnly" {
|
||||
if p.Database == "" {
|
||||
|
@ -294,12 +361,12 @@ func Parse(dsn string) (Config, error) {
|
|||
}
|
||||
}
|
||||
|
||||
failOverPartner, ok := params["failoverpartner"]
|
||||
failOverPartner, ok := params[FailoverPartner]
|
||||
if ok {
|
||||
p.FailOverPartner = failOverPartner
|
||||
}
|
||||
|
||||
failOverPort, ok := params["failoverport"]
|
||||
failOverPort, ok := params[FailOverPort]
|
||||
if ok {
|
||||
var err error
|
||||
p.FailOverPort, err = strconv.ParseUint(failOverPort, 0, 16)
|
||||
|
@ -309,7 +376,7 @@ func Parse(dsn string) (Config, error) {
|
|||
}
|
||||
}
|
||||
|
||||
disableRetry, ok := params["disableretry"]
|
||||
disableRetry, ok := params[DisableRetry]
|
||||
if ok {
|
||||
var err error
|
||||
p.DisableRetry, err = strconv.ParseBool(disableRetry)
|
||||
|
@ -321,8 +388,8 @@ func Parse(dsn string) (Config, error) {
|
|||
p.DisableRetry = disableRetryDefault
|
||||
}
|
||||
|
||||
server := params["server"]
|
||||
protocol, ok := params["protocol"]
|
||||
server := params[Server]
|
||||
protocol, ok := params[Protocol]
|
||||
|
||||
for _, parser := range ProtocolParsers {
|
||||
if (!ok && !parser.Hidden()) || parser.Protocol() == protocol {
|
||||
|
@ -348,7 +415,7 @@ func Parse(dsn string) (Config, error) {
|
|||
f = 1
|
||||
}
|
||||
p.DialTimeout = time.Duration(15*f) * time.Second
|
||||
if strdialtimeout, ok := params["dial timeout"]; ok {
|
||||
if strdialtimeout, ok := params[DialTimeout]; ok {
|
||||
timeout, err := strconv.ParseUint(strdialtimeout, 10, 64)
|
||||
if err != nil {
|
||||
f := "invalid dial timeout '%v': %v"
|
||||
|
@ -358,7 +425,7 @@ func Parse(dsn string) (Config, error) {
|
|||
p.DialTimeout = time.Duration(timeout) * time.Second
|
||||
}
|
||||
|
||||
hostInCertificate, ok := params["hostnameincertificate"]
|
||||
hostInCertificate, ok := params[HostNameInCertificate]
|
||||
if ok {
|
||||
p.HostInCertificateProvided = true
|
||||
} else {
|
||||
|
@ -371,6 +438,19 @@ func Parse(dsn string) (Config, error) {
|
|||
return p, err
|
||||
}
|
||||
|
||||
if c, ok := params["columnencryption"]; ok {
|
||||
columnEncryption, err := strconv.ParseBool(c)
|
||||
if err != nil {
|
||||
if strings.EqualFold(c, "Enabled") {
|
||||
columnEncryption = true
|
||||
} else if strings.EqualFold(c, "Disabled") {
|
||||
columnEncryption = false
|
||||
} else {
|
||||
return p, fmt.Errorf("invalid columnencryption '%v' : %v", columnEncryption, err.Error())
|
||||
}
|
||||
}
|
||||
p.ColumnEncryption = columnEncryption
|
||||
}
|
||||
return p, nil
|
||||
}
|
||||
|
||||
|
@ -379,10 +459,10 @@ func Parse(dsn string) (Config, error) {
|
|||
func (p Config) URL() *url.URL {
|
||||
q := url.Values{}
|
||||
if p.Database != "" {
|
||||
q.Add("database", p.Database)
|
||||
q.Add(Database, p.Database)
|
||||
}
|
||||
if p.LogFlags != 0 {
|
||||
q.Add("log", strconv.FormatUint(uint64(p.LogFlags), 10))
|
||||
q.Add(LogParam, strconv.FormatUint(uint64(p.LogFlags), 10))
|
||||
}
|
||||
host := p.Host
|
||||
protocol := ""
|
||||
|
@ -397,8 +477,8 @@ func (p Config) URL() *url.URL {
|
|||
if p.Port > 0 {
|
||||
host = fmt.Sprintf("%s:%d", host, p.Port)
|
||||
}
|
||||
q.Add("disableRetry", fmt.Sprintf("%t", p.DisableRetry))
|
||||
protocolParam, ok := p.Parameters["protocol"]
|
||||
q.Add(DisableRetry, fmt.Sprintf("%t", p.DisableRetry))
|
||||
protocolParam, ok := p.Parameters[Protocol]
|
||||
if ok {
|
||||
if protocol != "" && protocolParam != protocol {
|
||||
panic("Mismatched protocol parameters!")
|
||||
|
@ -406,11 +486,11 @@ func (p Config) URL() *url.URL {
|
|||
protocol = protocolParam
|
||||
}
|
||||
if protocol != "" {
|
||||
q.Add("protocol", protocol)
|
||||
q.Add(Protocol, protocol)
|
||||
}
|
||||
pipe, ok := p.Parameters["pipe"]
|
||||
pipe, ok := p.Parameters[Pipe]
|
||||
if ok {
|
||||
q.Add("pipe", pipe)
|
||||
q.Add(Pipe, pipe)
|
||||
}
|
||||
res := url.URL{
|
||||
Scheme: "sqlserver",
|
||||
|
@ -420,7 +500,17 @@ func (p Config) URL() *url.URL {
|
|||
if p.Instance != "" {
|
||||
res.Path = p.Instance
|
||||
}
|
||||
q.Add("dial timeout", strconv.FormatFloat(float64(p.DialTimeout.Seconds()), 'f', 0, 64))
|
||||
q.Add(DialTimeout, strconv.FormatFloat(float64(p.DialTimeout.Seconds()), 'f', 0, 64))
|
||||
|
||||
switch p.Encryption {
|
||||
case EncryptionDisabled:
|
||||
q.Add(Encrypt, "DISABLE")
|
||||
case EncryptionRequired:
|
||||
q.Add(Encrypt, "true")
|
||||
}
|
||||
if p.ColumnEncryption {
|
||||
q.Add("columnencryption", "true")
|
||||
}
|
||||
if len(q) > 0 {
|
||||
res.RawQuery = q.Encode()
|
||||
}
|
||||
|
@ -428,15 +518,17 @@ func (p Config) URL() *url.URL {
|
|||
return &res
|
||||
}
|
||||
|
||||
// ADO connection string keywords at https://github.com/dotnet/SqlClient/blob/main/src/Microsoft.Data.SqlClient/src/Microsoft/Data/Common/DbConnectionStringCommon.cs
|
||||
var adoSynonyms = map[string]string{
|
||||
"application name": "app name",
|
||||
"data source": "server",
|
||||
"address": "server",
|
||||
"network address": "server",
|
||||
"addr": "server",
|
||||
"user": "user id",
|
||||
"uid": "user id",
|
||||
"initial catalog": "database",
|
||||
"application name": AppName,
|
||||
"data source": Server,
|
||||
"address": Server,
|
||||
"network address": Server,
|
||||
"addr": Server,
|
||||
"user": UserID,
|
||||
"uid": UserID,
|
||||
"initial catalog": Database,
|
||||
"column encryption setting": "columnencryption",
|
||||
}
|
||||
|
||||
func splitConnectionString(dsn string) (res map[string]string) {
|
||||
|
@ -460,18 +552,18 @@ func splitConnectionString(dsn string) (res map[string]string) {
|
|||
name = synonym
|
||||
}
|
||||
// "server" in ADO can include a protocol and a port.
|
||||
if name == "server" {
|
||||
if name == Server {
|
||||
for _, parser := range ProtocolParsers {
|
||||
prot := parser.Protocol() + ":"
|
||||
if strings.HasPrefix(value, prot) {
|
||||
res["protocol"] = parser.Protocol()
|
||||
res[Protocol] = parser.Protocol()
|
||||
}
|
||||
value = strings.TrimPrefix(value, prot)
|
||||
}
|
||||
serverParts := strings.Split(value, ",")
|
||||
if len(serverParts) == 2 && len(serverParts[1]) > 0 {
|
||||
value = serverParts[0]
|
||||
res["port"] = serverParts[1]
|
||||
res[Port] = serverParts[1]
|
||||
}
|
||||
}
|
||||
res[name] = value
|
||||
|
@ -493,10 +585,10 @@ func splitConnectionStringURL(dsn string) (map[string]string, error) {
|
|||
}
|
||||
|
||||
if u.User != nil {
|
||||
res["user id"] = u.User.Username()
|
||||
res[UserID] = u.User.Username()
|
||||
p, exists := u.User.Password()
|
||||
if exists {
|
||||
res["password"] = p
|
||||
res[Password] = p
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -506,13 +598,13 @@ func splitConnectionStringURL(dsn string) (map[string]string, error) {
|
|||
}
|
||||
|
||||
if len(u.Path) > 0 {
|
||||
res["server"] = host + "\\" + u.Path[1:]
|
||||
res[Server] = host + "\\" + u.Path[1:]
|
||||
} else {
|
||||
res["server"] = host
|
||||
res[Server] = host
|
||||
}
|
||||
|
||||
if len(port) > 0 {
|
||||
res["port"] = port
|
||||
res[Port] = port
|
||||
}
|
||||
|
||||
query := u.Query()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue