Reconstruct KeePassGO repository

This commit is contained in:
Joe Julian
2026-03-29 11:04:38 -07:00
commit ce01c47256
34 changed files with 14041 additions and 0 deletions
+81
View File
@@ -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)
}
+78
View File
@@ -0,0 +1,78 @@
package clipboard
import (
"errors"
"testing"
"git.julianfamily.org/keepassgo/vault"
)
func TestServiceCopiesUsernamePasswordAndURL(t *testing.T) {
t.Parallel()
model := vault.Model{
Entries: []vault.Entry{
{
ID: "git-server",
Title: "Git Server",
Username: "joejulian",
Password: "token-1",
URL: "https://git.julianfamily.org",
},
},
}
tests := []struct {
name string
target Target
want string
}{
{name: "username", target: TargetUsername, want: "joejulian"},
{name: "password", target: TargetPassword, want: "token-1"},
{name: "url", target: TargetURL, want: "https://git.julianfamily.org"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var writer memoryWriter
service := Service{Writer: &writer}
if err := service.Copy(model, "git-server", tt.target); err != nil {
t.Fatalf("Copy() error = %v", err)
}
if writer.content != tt.want {
t.Fatalf("clipboard content = %q, want %q", writer.content, tt.want)
}
})
}
}
func TestServiceRejectsUnknownEntryAndUnsupportedTarget(t *testing.T) {
t.Parallel()
var writer memoryWriter
service := Service{Writer: &writer}
err := service.Copy(vault.Model{}, "missing", TargetPassword)
if !errors.Is(err, vault.ErrEntryNotFound) {
t.Fatalf("Copy() missing entry error = %v, want ErrEntryNotFound", err)
}
model := vault.Model{
Entries: []vault.Entry{{ID: "git-server", Username: "joejulian"}},
}
err = service.Copy(model, "git-server", Target("unsupported"))
if !errors.Is(err, ErrUnsupportedTarget) {
t.Fatalf("Copy() unsupported target error = %v, want ErrUnsupportedTarget", err)
}
}
type memoryWriter struct {
content string
}
func (w *memoryWriter) WriteText(text string) error {
w.content = text
return nil
}