56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package kwallet
|
|
|
|
import (
|
|
"context"
|
|
|
|
"email-mcp/internal/secretstore"
|
|
)
|
|
|
|
type Client interface {
|
|
IsAvailable(ctx context.Context) error
|
|
Open(ctx context.Context) error
|
|
WriteEntry(ctx context.Context, key string, value []byte) error
|
|
ReadEntry(ctx context.Context, key string) ([]byte, error)
|
|
}
|
|
|
|
type Store struct {
|
|
client Client
|
|
}
|
|
|
|
var _ secretstore.Store = (*Store)(nil)
|
|
|
|
func NewStore(client Client) *Store {
|
|
return &Store{client: client}
|
|
}
|
|
|
|
func (s *Store) Save(ctx context.Context, key string, cred secretstore.Credential) error {
|
|
if err := s.client.IsAvailable(ctx); err != nil {
|
|
return err
|
|
}
|
|
if err := s.client.Open(ctx); err != nil {
|
|
return err
|
|
}
|
|
|
|
data, err := secretstore.MarshalCredential(cred)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return s.client.WriteEntry(ctx, key, data)
|
|
}
|
|
|
|
func (s *Store) Load(ctx context.Context, key string) (secretstore.Credential, error) {
|
|
if err := s.client.IsAvailable(ctx); err != nil {
|
|
return secretstore.Credential{}, err
|
|
}
|
|
if err := s.client.Open(ctx); err != nil {
|
|
return secretstore.Credential{}, err
|
|
}
|
|
|
|
data, err := s.client.ReadEntry(ctx, key)
|
|
if err != nil {
|
|
return secretstore.Credential{}, err
|
|
}
|
|
|
|
return secretstore.UnmarshalCredential(data)
|
|
}
|