mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-30 18:17:55 +00:00 
			
		
		
		
	 7ca2caf3d0
			
		
	
	7ca2caf3d0
	
	
	
		
			
			* audit: deprecate errwrap.Wrapf() * builtin/audit/file: deprecate errwrap.Wrapf() * builtin/crediential/app-id: deprecate errwrap.Wrapf() * builtin/credential/approle: deprecate errwrap.Wrapf() * builtin/credential/aws: deprecate errwrap.Wrapf() * builtin/credentials/token: deprecate errwrap.Wrapf() * builtin/credential/github: deprecate errwrap.Wrapf() * builtin/credential/cert: deprecate errwrap.Wrapf() * builtin/logical/transit: deprecate errwrap.Wrapf() * builtin/logical/totp: deprecate errwrap.Wrapf() * builtin/logical/ssh: deprecate errwrap.Wrapf() * builtin/logical/rabbitmq: deprecate errwrap.Wrapf() * builtin/logical/postgresql: deprecate errwrap.Wrapf() * builtin/logical/pki: deprecate errwrap.Wrapf() * builtin/logical/nomad: deprecate errwrap.Wrapf() * builtin/logical/mssql: deprecate errwrap.Wrapf() * builtin/logical/database: deprecate errwrap.Wrapf() * builtin/logical/consul: deprecate errwrap.Wrapf() * builtin/logical/cassandra: deprecate errwrap.Wrapf() * builtin/logical/aws: deprecate errwrap.Wrapf()
		
			
				
	
	
		
			159 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package rabbitmq
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 
 | |
| 	"github.com/hashicorp/vault/sdk/framework"
 | |
| 	"github.com/hashicorp/vault/sdk/logical"
 | |
| 	rabbithole "github.com/michaelklishin/rabbit-hole"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	storageKey = "config/connection"
 | |
| )
 | |
| 
 | |
| func pathConfigConnection(b *backend) *framework.Path {
 | |
| 	return &framework.Path{
 | |
| 		Pattern: "config/connection",
 | |
| 		Fields: map[string]*framework.FieldSchema{
 | |
| 			"connection_uri": {
 | |
| 				Type:        framework.TypeString,
 | |
| 				Description: "RabbitMQ Management URI",
 | |
| 			},
 | |
| 			"username": {
 | |
| 				Type:        framework.TypeString,
 | |
| 				Description: "Username of a RabbitMQ management administrator",
 | |
| 			},
 | |
| 			"password": {
 | |
| 				Type:        framework.TypeString,
 | |
| 				Description: "Password of the provided RabbitMQ management user",
 | |
| 			},
 | |
| 			"verify_connection": {
 | |
| 				Type:        framework.TypeBool,
 | |
| 				Default:     true,
 | |
| 				Description: `If set, connection_uri is verified by actually connecting to the RabbitMQ management API`,
 | |
| 			},
 | |
| 			"password_policy": {
 | |
| 				Type:        framework.TypeString,
 | |
| 				Description: "Name of the password policy to use to generate passwords for dynamic credentials.",
 | |
| 			},
 | |
| 		},
 | |
| 
 | |
| 		Callbacks: map[logical.Operation]framework.OperationFunc{
 | |
| 			logical.UpdateOperation: b.pathConnectionUpdate,
 | |
| 		},
 | |
| 
 | |
| 		HelpSynopsis:    pathConfigConnectionHelpSyn,
 | |
| 		HelpDescription: pathConfigConnectionHelpDesc,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (b *backend) pathConnectionUpdate(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) {
 | |
| 	uri := data.Get("connection_uri").(string)
 | |
| 	if uri == "" {
 | |
| 		return logical.ErrorResponse("missing connection_uri"), nil
 | |
| 	}
 | |
| 
 | |
| 	username := data.Get("username").(string)
 | |
| 	if username == "" {
 | |
| 		return logical.ErrorResponse("missing username"), nil
 | |
| 	}
 | |
| 
 | |
| 	password := data.Get("password").(string)
 | |
| 	if password == "" {
 | |
| 		return logical.ErrorResponse("missing password"), nil
 | |
| 	}
 | |
| 
 | |
| 	passwordPolicy := data.Get("password_policy").(string)
 | |
| 
 | |
| 	// Don't check the connection_url if verification is disabled
 | |
| 	verifyConnection := data.Get("verify_connection").(bool)
 | |
| 	if verifyConnection {
 | |
| 		// Create RabbitMQ management client
 | |
| 		client, err := rabbithole.NewClient(uri, username, password)
 | |
| 		if err != nil {
 | |
| 			return nil, fmt.Errorf("failed to create client: %w", err)
 | |
| 		}
 | |
| 
 | |
| 		// Verify that configured credentials is capable of listing
 | |
| 		if _, err = client.ListUsers(); err != nil {
 | |
| 			return nil, fmt.Errorf("failed to validate the connection: %w", err)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Store it
 | |
| 	config := connectionConfig{
 | |
| 		URI:            uri,
 | |
| 		Username:       username,
 | |
| 		Password:       password,
 | |
| 		PasswordPolicy: passwordPolicy,
 | |
| 	}
 | |
| 	err := writeConfig(ctx, req.Storage, config)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	// Reset the client connection
 | |
| 	b.resetClient(ctx)
 | |
| 
 | |
| 	return nil, nil
 | |
| }
 | |
| 
 | |
| func readConfig(ctx context.Context, storage logical.Storage) (connectionConfig, error) {
 | |
| 	entry, err := storage.Get(ctx, storageKey)
 | |
| 	if err != nil {
 | |
| 		return connectionConfig{}, err
 | |
| 	}
 | |
| 	if entry == nil {
 | |
| 		return connectionConfig{}, nil
 | |
| 	}
 | |
| 
 | |
| 	var connConfig connectionConfig
 | |
| 	if err := entry.DecodeJSON(&connConfig); err != nil {
 | |
| 		return connectionConfig{}, err
 | |
| 	}
 | |
| 	return connConfig, nil
 | |
| }
 | |
| 
 | |
| func writeConfig(ctx context.Context, storage logical.Storage, config connectionConfig) error {
 | |
| 	entry, err := logical.StorageEntryJSON(storageKey, config)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	if err := storage.Put(ctx, entry); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // connectionConfig contains the information required to make a connection to a RabbitMQ node
 | |
| type connectionConfig struct {
 | |
| 	// URI of the RabbitMQ server
 | |
| 	URI string `json:"connection_uri"`
 | |
| 
 | |
| 	// Username which has 'administrator' tag attached to it
 | |
| 	Username string `json:"username"`
 | |
| 
 | |
| 	// Password for the Username
 | |
| 	Password string `json:"password"`
 | |
| 
 | |
| 	// PasswordPolicy for generating passwords for dynamic credentials
 | |
| 	PasswordPolicy string `json:"password_policy"`
 | |
| }
 | |
| 
 | |
| const pathConfigConnectionHelpSyn = `
 | |
| Configure the connection URI, username, and password to talk to RabbitMQ management HTTP API.
 | |
| `
 | |
| 
 | |
| const pathConfigConnectionHelpDesc = `
 | |
| This path configures the connection properties used to connect to RabbitMQ management HTTP API.
 | |
| The "connection_uri" parameter is a string that is used to connect to the API. The "username"
 | |
| and "password" parameters are strings that are used as credentials to the API. The "verify_connection"
 | |
| parameter is a boolean that is used to verify whether the provided connection URI, username, and password
 | |
| are valid.
 | |
| 
 | |
| The URI looks like:
 | |
| "http://localhost:15672"
 | |
| `
 |