Reconstruct KeePassGO repository
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
package clipboard
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
systemclipboard "github.com/atotto/clipboard"
|
||||
|
||||
"git.julianfamily.org/keepassgo/vault"
|
||||
)
|
||||
|
||||
var ErrUnsupportedTarget = errors.New("unsupported clipboard target")
|
||||
|
||||
type Target string
|
||||
|
||||
const (
|
||||
TargetUsername Target = "username"
|
||||
TargetPassword Target = "password"
|
||||
TargetURL Target = "url"
|
||||
)
|
||||
|
||||
type Writer interface {
|
||||
WriteText(text string) error
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
Writer Writer
|
||||
}
|
||||
|
||||
func (s Service) Copy(model vault.Model, entryID string, target Target) error {
|
||||
entry, err := findEntry(model, entryID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
content, err := contentForTarget(entry, target)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := s.writer().WriteText(content); err != nil {
|
||||
return fmt.Errorf("write clipboard text: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s Service) writer() Writer {
|
||||
if s.Writer != nil {
|
||||
return s.Writer
|
||||
}
|
||||
return systemWriter{}
|
||||
}
|
||||
|
||||
func findEntry(model vault.Model, entryID string) (vault.Entry, error) {
|
||||
for _, entry := range model.Entries {
|
||||
if entry.ID == entryID {
|
||||
return entry, nil
|
||||
}
|
||||
}
|
||||
return vault.Entry{}, vault.ErrEntryNotFound
|
||||
}
|
||||
|
||||
func contentForTarget(entry vault.Entry, target Target) (string, error) {
|
||||
switch target {
|
||||
case TargetUsername:
|
||||
return entry.Username, nil
|
||||
case TargetPassword:
|
||||
return entry.Password, nil
|
||||
case TargetURL:
|
||||
return entry.URL, nil
|
||||
default:
|
||||
return "", ErrUnsupportedTarget
|
||||
}
|
||||
}
|
||||
|
||||
type systemWriter struct{}
|
||||
|
||||
func (systemWriter) WriteText(text string) error {
|
||||
return systemclipboard.WriteAll(text)
|
||||
}
|
||||
Reference in New Issue
Block a user