mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-31 18:48:08 +00:00 
			
		
		
		
	Database gRPC plugins (#3666)
* Start work on context aware backends * Start work on moving the database plugins to gRPC in order to pass context * Add context to builtin database plugins * use byte slice instead of string * Context all the things * Move proto messages to the dbplugin package * Add a grpc mechanism for running backend plugins * Serve the GRPC plugin * Add backwards compatibility to the database plugins * Remove backend plugin changes * Remove backend plugin changes * Cleanup the transport implementations * If grpc connection is in an unexpected state restart the plugin * Fix tests * Fix tests * Remove context from the request object, replace it with context.TODO * Add a test to verify netRPC plugins still work * Remove unused mapstructure call * Code review fixes * Code review fixes * Code review fixes
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| package mysql | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"database/sql" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| @@ -30,6 +31,8 @@ var ( | ||||
| 	LegacyUsernameLen int = 16 | ||||
| ) | ||||
|  | ||||
| var _ dbplugin.Database = &MySQL{} | ||||
|  | ||||
| type MySQL struct { | ||||
| 	connutil.ConnectionProducer | ||||
| 	credsutil.CredentialsProducer | ||||
| @@ -88,8 +91,8 @@ func (m *MySQL) Type() (string, error) { | ||||
| 	return mySQLTypeName, nil | ||||
| } | ||||
|  | ||||
| func (m *MySQL) getConnection() (*sql.DB, error) { | ||||
| 	db, err := m.Connection() | ||||
| func (m *MySQL) getConnection(ctx context.Context) (*sql.DB, error) { | ||||
| 	db, err := m.Connection(ctx) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -97,13 +100,13 @@ func (m *MySQL) getConnection() (*sql.DB, error) { | ||||
| 	return db.(*sql.DB), nil | ||||
| } | ||||
|  | ||||
| func (m *MySQL) CreateUser(statements dbplugin.Statements, usernameConfig dbplugin.UsernameConfig, expiration time.Time) (username string, password string, err error) { | ||||
| func (m *MySQL) CreateUser(ctx context.Context, statements dbplugin.Statements, usernameConfig dbplugin.UsernameConfig, expiration time.Time) (username string, password string, err error) { | ||||
| 	// Grab the lock | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	// Get the connection | ||||
| 	db, err := m.getConnection() | ||||
| 	db, err := m.getConnection(ctx) | ||||
| 	if err != nil { | ||||
| 		return "", "", err | ||||
| 	} | ||||
| @@ -128,7 +131,7 @@ func (m *MySQL) CreateUser(statements dbplugin.Statements, usernameConfig dbplug | ||||
| 	} | ||||
|  | ||||
| 	// Start a transaction | ||||
| 	tx, err := db.Begin() | ||||
| 	tx, err := db.BeginTx(ctx, nil) | ||||
| 	if err != nil { | ||||
| 		return "", "", err | ||||
| 	} | ||||
| @@ -146,7 +149,7 @@ func (m *MySQL) CreateUser(statements dbplugin.Statements, usernameConfig dbplug | ||||
| 			"expiration": expirationStr, | ||||
| 		}) | ||||
|  | ||||
| 		stmt, err := tx.Prepare(query) | ||||
| 		stmt, err := tx.PrepareContext(ctx, query) | ||||
| 		if err != nil { | ||||
| 			// If the error code we get back is Error 1295: This command is not | ||||
| 			// supported in the prepared statement protocol yet, we will execute | ||||
| @@ -155,7 +158,7 @@ func (m *MySQL) CreateUser(statements dbplugin.Statements, usernameConfig dbplug | ||||
| 			// prepare supported commands. If there is no error when running we | ||||
| 			// will continue to the next statement. | ||||
| 			if e, ok := err.(*stdmysql.MySQLError); ok && e.Number == 1295 { | ||||
| 				_, err = tx.Exec(query) | ||||
| 				_, err = tx.ExecContext(ctx, query) | ||||
| 				if err != nil { | ||||
| 					return "", "", err | ||||
| 				} | ||||
| @@ -165,7 +168,7 @@ func (m *MySQL) CreateUser(statements dbplugin.Statements, usernameConfig dbplug | ||||
| 			return "", "", err | ||||
| 		} | ||||
| 		defer stmt.Close() | ||||
| 		if _, err := stmt.Exec(); err != nil { | ||||
| 		if _, err := stmt.ExecContext(ctx); err != nil { | ||||
| 			return "", "", err | ||||
| 		} | ||||
| 	} | ||||
| @@ -179,17 +182,17 @@ func (m *MySQL) CreateUser(statements dbplugin.Statements, usernameConfig dbplug | ||||
| } | ||||
|  | ||||
| // NOOP | ||||
| func (m *MySQL) RenewUser(statements dbplugin.Statements, username string, expiration time.Time) error { | ||||
| func (m *MySQL) RenewUser(ctx context.Context, statements dbplugin.Statements, username string, expiration time.Time) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *MySQL) RevokeUser(statements dbplugin.Statements, username string) error { | ||||
| func (m *MySQL) RevokeUser(ctx context.Context, statements dbplugin.Statements, username string) error { | ||||
| 	// Grab the read lock | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	// Get the connection | ||||
| 	db, err := m.getConnection() | ||||
| 	db, err := m.getConnection(ctx) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -201,7 +204,7 @@ func (m *MySQL) RevokeUser(statements dbplugin.Statements, username string) erro | ||||
| 	} | ||||
|  | ||||
| 	// Start a transaction | ||||
| 	tx, err := db.Begin() | ||||
| 	tx, err := db.BeginTx(ctx, nil) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -217,7 +220,7 @@ func (m *MySQL) RevokeUser(statements dbplugin.Statements, username string) erro | ||||
| 		// 1295: This command is not supported in the prepared statement protocol yet | ||||
| 		// Reference https://mariadb.com/kb/en/mariadb/prepare-statement/ | ||||
| 		query = strings.Replace(query, "{{name}}", username, -1) | ||||
| 		_, err = tx.Exec(query) | ||||
| 		_, err = tx.ExecContext(ctx, query) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Brian Kassouf
					Brian Kassouf