github.com/decred/dcrlnd@v0.7.6/macaroons/context.go (about)

     1  package macaroons
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  )
     7  
     8  var (
     9  	// RootKeyIDContextKey is the key to get rootKeyID from context.
    10  	RootKeyIDContextKey = contextKey{"rootkeyid"}
    11  
    12  	// ErrContextRootKeyID is used when the supplied context doesn't have
    13  	// a root key ID.
    14  	ErrContextRootKeyID = fmt.Errorf("failed to read root key ID " +
    15  		"from context")
    16  )
    17  
    18  // contextKey is the type we use to identify values in the context.
    19  type contextKey struct {
    20  	Name string
    21  }
    22  
    23  // ContextWithRootKeyID passes the root key ID value to context.
    24  func ContextWithRootKeyID(ctx context.Context,
    25  	value interface{}) context.Context {
    26  
    27  	return context.WithValue(ctx, RootKeyIDContextKey, value)
    28  }
    29  
    30  // RootKeyIDFromContext retrieves the root key ID from context using the key
    31  // RootKeyIDContextKey.
    32  func RootKeyIDFromContext(ctx context.Context) ([]byte, error) {
    33  	id, ok := ctx.Value(RootKeyIDContextKey).([]byte)
    34  	if !ok {
    35  		return nil, ErrContextRootKeyID
    36  	}
    37  
    38  	// Check that the id is not empty.
    39  	if len(id) == 0 {
    40  		return nil, ErrMissingRootKeyID
    41  	}
    42  
    43  	return id, nil
    44  }