| // Go MySQL Driver - A MySQL-Driver for Go's database/sql package |
| // |
| // Copyright 2026 The Go-MySQL-Driver Authors. All rights reserved. |
| // |
| // This Source Code Form is subject to the terms of the Mozilla Public |
| // License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| // You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| package mysql |
| |
| import ( |
| "crypto/rsa" |
| "math/big" |
| ) |
| |
| // AuthContext contains the credentials and transport information for the current |
| // authentication exchange. The driver creates a new snapshot whenever it starts |
| // a plugin and does not change it during that exchange. Plugins must not modify it. |
| type AuthContext struct { |
| user string |
| password string |
| tls bool |
| unixSocket bool |
| serverPublicKey *rsa.PublicKey |
| } |
| |
| // newAuthContext snapshots the selected password and established transport. |
| // tlsEstablished describes the completed MySQL TLS handshake, not cfg.TLS. |
| func newAuthContext(cfg *Config, password string, tlsEstablished bool) *AuthContext { |
| auth := &AuthContext{ |
| user: cfg.User, |
| password: password, |
| tls: tlsEstablished, |
| unixSocket: cfg.Net == "unix", |
| serverPublicKey: cfg.pubKey, |
| } |
| auth.serverPublicKey = auth.ServerPublicKey() |
| return auth |
| } |
| |
| // User returns the username supplied for the connection. |
| func (a *AuthContext) User() string { return a.user } |
| |
| // Password returns the password selected for this authentication exchange. |
| func (a *AuthContext) Password() string { return a.password } |
| |
| // TLS reports whether the driver has completed the MySQL TLS handshake. |
| // It does not indicate whether the server's certificate was verified, nor does |
| // it describe encryption provided by a custom dialer or an external tunnel. |
| func (a *AuthContext) TLS() bool { return a.tls } |
| |
| // UnixSocket reports whether the connection uses the configured unix network. |
| func (a *AuthContext) UnixSocket() bool { return a.unixSocket } |
| |
| // ServerPublicKey returns a copy of the configured server RSA public key, |
| // or nil if none was configured. Modifying the copy does not affect the driver |
| // or subsequent calls to ServerPublicKey. |
| func (a *AuthContext) ServerPublicKey() *rsa.PublicKey { |
| if a.serverPublicKey == nil { |
| return nil |
| } |
| key := *a.serverPublicKey |
| if key.N != nil { |
| key.N = new(big.Int).Set(key.N) |
| } |
| return &key |
| } |