generated from TrueCloudLab/basic
WIP: Split read and write MFA managers #7
2 changed files with 58 additions and 14 deletions
60
mfa/mfa.go
60
mfa/mfa.go
|
@ -22,8 +22,14 @@ type (
|
||||||
// and KeyStore interface to encode and decode OTP keys inside FrostFS
|
// and KeyStore interface to encode and decode OTP keys inside FrostFS
|
||||||
// objects.
|
// objects.
|
||||||
Manager struct {
|
Manager struct {
|
||||||
storage Storage
|
ReadManager
|
||||||
unlocker KeyStore
|
storage Storage
|
||||||
|
unlocker KeyStore
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadManager struct {
|
||||||
|
storage StorageReader
|
||||||
|
unlocker KeyStoreReader
|
||||||
container cid.ID
|
container cid.ID
|
||||||
logger *zap.Logger
|
logger *zap.Logger
|
||||||
}
|
}
|
||||||
|
@ -31,13 +37,17 @@ type (
|
||||||
// KeyStore is an interface for Manager to provide keys to encode and decode
|
// KeyStore is an interface for Manager to provide keys to encode and decode
|
||||||
// OTP keys of MFA devices.
|
// OTP keys of MFA devices.
|
||||||
KeyStore interface {
|
KeyStore interface {
|
||||||
// PrivateKey returns private key of this Manager.
|
KeyStoreReader
|
||||||
PrivateKey() *keys.PrivateKey
|
|
||||||
// PublicKeys returns list of public keys for all managers, including
|
// PublicKeys returns list of public keys for all managers, including
|
||||||
// this Manager.
|
// this Manager.
|
||||||
PublicKeys() []*keys.PublicKey
|
PublicKeys() []*keys.PublicKey
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KeyStoreReader interface {
|
||||||
|
// PrivateKey returns private key of this Manager.
|
||||||
|
PrivateKey() *keys.PrivateKey
|
||||||
|
}
|
||||||
|
|
||||||
// Config contains parameters for Manager constructor.
|
// Config contains parameters for Manager constructor.
|
||||||
Config struct {
|
Config struct {
|
||||||
Storage Storage
|
Storage Storage
|
||||||
|
@ -45,6 +55,13 @@ type (
|
||||||
Container cid.ID
|
Container cid.ID
|
||||||
Logger *zap.Logger
|
Logger *zap.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReadConfig struct {
|
||||||
|
Storage StorageReader
|
||||||
|
Unlocker KeyStoreReader
|
||||||
|
Container cid.ID
|
||||||
|
Logger *zap.Logger
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewManager creates new instance of Manager.
|
// NewManager creates new instance of Manager.
|
||||||
|
@ -60,9 +77,32 @@ func NewManager(cfg Config) (*Manager, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Manager{
|
return &Manager{
|
||||||
|
ReadManager: ReadManager{
|
||||||
|
storage: cfg.Storage,
|
||||||
|
unlocker: cfg.Unlocker,
|
||||||
|
container: cfg.Container,
|
||||||
|
logger: cfg.Logger,
|
||||||
|
},
|
||||||
|
storage: cfg.Storage,
|
||||||
|
unlocker: cfg.Unlocker,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewReadManager(cfg ReadConfig) (*ReadManager, error) {
|
||||||
|
if cfg.Storage == nil {
|
||||||
|
return nil, errors.New("mfa storage is nil")
|
||||||
|
}
|
||||||
|
if cfg.Logger == nil {
|
||||||
|
return nil, errors.New("mfa logger is nil")
|
||||||
|
}
|
||||||
|
if cfg.Unlocker == nil {
|
||||||
|
return nil, errors.New("mfa key store is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
return &ReadManager{
|
||||||
storage: cfg.Storage,
|
storage: cfg.Storage,
|
||||||
container: cfg.Container,
|
|
||||||
unlocker: cfg.Unlocker,
|
unlocker: cfg.Unlocker,
|
||||||
|
container: cfg.Container,
|
||||||
logger: cfg.Logger,
|
logger: cfg.Logger,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@ -83,7 +123,7 @@ func (m *Manager) CreateMFADevice(ctx context.Context, device SecretDevice) erro
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMFADevice returns decoded MFA device from MFA container.
|
// GetMFADevice returns decoded MFA device from MFA container.
|
||||||
func (m *Manager) GetMFADevice(ctx context.Context, ns, mfaName string) (*SecretDevice, error) {
|
func (m *ReadManager) GetMFADevice(ctx context.Context, ns, mfaName string) (*SecretDevice, error) {
|
||||||
ctx, span := tracing.StartSpanFromContext(ctx, "mfa.GetMFADevice")
|
ctx, span := tracing.StartSpanFromContext(ctx, "mfa.GetMFADevice")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
|
@ -133,7 +173,7 @@ func (m *Manager) GetMFADevice(ctx context.Context, ns, mfaName string) (*Secret
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTinyMFADevice returns MFA device metadata without OTP key from the tree of MFA container.
|
// GetTinyMFADevice returns MFA device metadata without OTP key from the tree of MFA container.
|
||||||
func (m *Manager) GetTinyMFADevice(ctx context.Context, ns, mfaName string) (*Device, error) {
|
func (m *ReadManager) GetTinyMFADevice(ctx context.Context, ns, mfaName string) (*Device, error) {
|
||||||
ctx, span := tracing.StartSpanFromContext(ctx, "mfa.GetTinyMFADevice")
|
ctx, span := tracing.StartSpanFromContext(ctx, "mfa.GetTinyMFADevice")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
|
@ -151,7 +191,7 @@ func (m *Manager) GetTinyMFADevice(ctx context.Context, ns, mfaName string) (*De
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListMFADevices lists all available MFA device metadata with specified device namespace from the tree of MFA container.
|
// ListMFADevices lists all available MFA device metadata with specified device namespace from the tree of MFA container.
|
||||||
func (m *Manager) ListMFADevices(ctx context.Context, ns string) ([]*Device, error) {
|
func (m *ReadManager) ListMFADevices(ctx context.Context, ns string) ([]*Device, error) {
|
||||||
ctx, span := tracing.StartSpanFromContext(ctx, "mfa.ListMFADevices")
|
ctx, span := tracing.StartSpanFromContext(ctx, "mfa.ListMFADevices")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
|
@ -164,7 +204,7 @@ func (m *Manager) ListMFADevices(ctx context.Context, ns string) ([]*Device, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListAllMFADevices lists all available MFA device metadata from the tree of MFA container.
|
// ListAllMFADevices lists all available MFA device metadata from the tree of MFA container.
|
||||||
func (m *Manager) ListAllMFADevices(ctx context.Context) ([]*Device, error) {
|
func (m *ReadManager) ListAllMFADevices(ctx context.Context) ([]*Device, error) {
|
||||||
ctx, span := tracing.StartSpanFromContext(ctx, "mfa.ListAllMFADevices")
|
ctx, span := tracing.StartSpanFromContext(ctx, "mfa.ListAllMFADevices")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
|
@ -327,7 +367,7 @@ func (m *Manager) putMFADevice(ctx context.Context, device SecretDevice) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) formDevices(list []*TreeNode) ([]*Device, error) {
|
func (m *ReadManager) formDevices(list []*TreeNode) ([]*Device, error) {
|
||||||
res := make([]*Device, 0, len(list))
|
res := make([]*Device, 0, len(list))
|
||||||
for _, item := range list {
|
for _, item := range list {
|
||||||
dev, err := newDevice(item)
|
dev, err := newDevice(item)
|
||||||
|
|
|
@ -13,19 +13,23 @@ type (
|
||||||
// Storage is an interface for Manager to manage FrostFS objects
|
// Storage is an interface for Manager to manage FrostFS objects
|
||||||
// and metadata in tree service.
|
// and metadata in tree service.
|
||||||
Storage interface {
|
Storage interface {
|
||||||
|
StorageReader
|
||||||
// CreateObject creates new FrostFS object.
|
// CreateObject creates new FrostFS object.
|
||||||
CreateObject(context.Context, PrmObjectCreate) (oid.ID, error)
|
CreateObject(context.Context, PrmObjectCreate) (oid.ID, error)
|
||||||
// GetObject returns payload of FrostFS object.
|
|
||||||
GetObject(context.Context, oid.Address) ([]byte, error)
|
|
||||||
// DeleteObject deletes FrostFS object.
|
// DeleteObject deletes FrostFS object.
|
||||||
DeleteObject(context.Context, oid.Address) error
|
DeleteObject(context.Context, oid.Address) error
|
||||||
// SetTreeNode creates or updates specified tree node the tree service and returns updated data.
|
// SetTreeNode creates or updates specified tree node the tree service and returns updated data.
|
||||||
SetTreeNode(ctx context.Context, cnrID cid.ID, name string, meta map[string]string) (*TreeMultiNode, error)
|
SetTreeNode(ctx context.Context, cnrID cid.ID, name string, meta map[string]string) (*TreeMultiNode, error)
|
||||||
|
// DeleteTreeNode removes all specified tree nodes from the tree and returns copy of it.
|
||||||
|
DeleteTreeNode(ctx context.Context, cnrID cid.ID, name string) ([]*TreeNode, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageReader interface {
|
||||||
|
// GetObject returns payload of FrostFS object.
|
||||||
|
GetObject(context.Context, oid.Address) ([]byte, error)
|
||||||
// GetTreeNode returns data about latest and remaining versions of specified tree node.
|
// GetTreeNode returns data about latest and remaining versions of specified tree node.
|
||||||
// Must return 'ErrTreeNodeNotFound' if tree does not exist.
|
// Must return 'ErrTreeNodeNotFound' if tree does not exist.
|
||||||
GetTreeNode(ctx context.Context, cnrID cid.ID, name string) (*TreeMultiNode, error)
|
GetTreeNode(ctx context.Context, cnrID cid.ID, name string) (*TreeMultiNode, error)
|
||||||
// DeleteTreeNode removes all specified tree nodes from the tree and returns copy of it.
|
|
||||||
DeleteTreeNode(ctx context.Context, cnrID cid.ID, name string) ([]*TreeNode, error)
|
|
||||||
// GetTreeNodes returns all available tree nodes with specified prefix.
|
// GetTreeNodes returns all available tree nodes with specified prefix.
|
||||||
GetTreeNodes(ctx context.Context, cnrID cid.ID, prefix string) ([]*TreeNode, error)
|
GetTreeNodes(ctx context.Context, cnrID cid.ID, prefix string) ([]*TreeNode, error)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue