// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package database import ( "context" "fmt" "time" log "github.com/hashicorp/go-hclog" "github.com/hashicorp/vault/api" v4 "github.com/hashicorp/vault/sdk/database/dbplugin" ) const mockV4Type = "mockv4" // MockDatabaseV4 is an implementation of Database interface type MockDatabaseV4 struct { config map[string]interface{} } var _ v4.Database = &MockDatabaseV4{} // New returns a new in-memory instance func NewV4() (interface{}, error) { return MockDatabaseV4{}, nil } // RunV4 instantiates a MongoDB object, and runs the RPC server for the plugin func RunV4(apiTLSConfig *api.TLSConfig) error { dbType, err := NewV4() if err != nil { return err } v4.Serve(dbType.(v4.Database), api.VaultPluginTLSProvider(apiTLSConfig)) return nil } func (m MockDatabaseV4) Init(ctx context.Context, config map[string]interface{}, verifyConnection bool) (saveConfig map[string]interface{}, err error) { log.Default().Info("Init called", "config", config, "verifyConnection", verifyConnection) return config, nil } func (m MockDatabaseV4) Initialize(ctx context.Context, config map[string]interface{}, verifyConnection bool) (err error) { _, err = m.Init(ctx, config, verifyConnection) return err } func (m MockDatabaseV4) CreateUser(ctx context.Context, statements v4.Statements, usernameConfig v4.UsernameConfig, expiration time.Time) (username string, password string, err error) { log.Default().Info("CreateUser called", "statements", statements, "usernameConfig", usernameConfig, "expiration", expiration) now := time.Now() user := fmt.Sprintf("mockv4_user_%s", now.Format(time.RFC3339)) pass, err := m.GenerateCredentials(ctx) if err != nil { return "", "", fmt.Errorf("failed to generate credentials: %w", err) } return user, pass, nil } func (m MockDatabaseV4) RenewUser(ctx context.Context, statements v4.Statements, username string, expiration time.Time) error { log.Default().Info("RenewUser called", "statements", statements, "username", username, "expiration", expiration) return nil } func (m MockDatabaseV4) RevokeUser(ctx context.Context, statements v4.Statements, username string) error { log.Default().Info("RevokeUser called", "statements", statements, "username", username) return nil } func (m MockDatabaseV4) RotateRootCredentials(ctx context.Context, statements []string) (config map[string]interface{}, err error) { log.Default().Info("RotateRootCredentials called", "statements", statements) newPassword, err := m.GenerateCredentials(ctx) if err != nil { return config, fmt.Errorf("failed to generate credentials: %w", err) } config["password"] = newPassword return m.config, nil } func (m MockDatabaseV4) SetCredentials(ctx context.Context, statements v4.Statements, staticConfig v4.StaticUserConfig) (username string, password string, err error) { log.Default().Info("SetCredentials called", "statements", statements, "staticConfig", staticConfig) return "", "", nil } func (m MockDatabaseV4) GenerateCredentials(ctx context.Context) (password string, err error) { now := time.Now() pass := fmt.Sprintf("mockv4_password_%s", now.Format(time.RFC3339)) return pass, nil } func (m MockDatabaseV4) Type() (string, error) { log.Default().Info("Type called") return mockV4Type, nil } func (m MockDatabaseV4) Close() error { log.Default().Info("Close called") return nil }