Share local vaults from Android

This commit is contained in:
Joe Julian
2026-04-06 17:02:30 -07:00
parent 4f5465dfff
commit d037393a16
8 changed files with 528 additions and 1 deletions
+84 -1
View File
@@ -99,6 +99,33 @@ func (s *remoteOpenCaptureSession) OpenRemote(client webdav.Client, path string,
return nil
}
type saveCaptureSession struct {
model vault.Model
saveCount int
saveErr error
}
func (s *saveCaptureSession) Current() (vault.Model, error) {
return s.model, nil
}
func (s *saveCaptureSession) Save() error {
s.saveCount++
return s.saveErr
}
type captureVaultSharer struct {
path string
title string
err error
}
func (s *captureVaultSharer) ShareVault(path, title string) error {
s.path = path
s.title = title
return s.err
}
func TestUIFiltersUsingVaultModelPathsAndSearch(t *testing.T) {
t.Parallel()
@@ -367,7 +394,12 @@ func TestUIChildGroupsComeFromVaultModel(t *testing.T) {
func TestUIAPITokenLifecycleManagement(t *testing.T) {
t.Parallel()
u := newUIWithSession("desktop", &session.Manager{})
u := newUIWithSession("desktop", &session.Manager{}, statePaths{
DefaultSaveAsPath: filepath.Join(t.TempDir(), "vault.kdbx"),
RecentVaultsPath: filepath.Join(t.TempDir(), "recent-vaults.json"),
RecentRemotesPath: filepath.Join(t.TempDir(), "recent-remotes.json"),
UIPreferencesPath: filepath.Join(t.TempDir(), "ui-prefs.json"),
})
u.masterPassword.SetText("correct horse battery staple")
if err := u.createVaultAction(); err != nil {
t.Fatalf("createVaultAction() error = %v", err)
@@ -5787,6 +5819,57 @@ func TestUIConsumesPendingSharedVaultImportOnStartup(t *testing.T) {
}
}
func TestUICurrentShareableVaultPathUsesSelectedVaultPath(t *testing.T) {
t.Parallel()
u := newUIWithSession("phone", &session.Manager{})
u.vaultPath.SetText("/vaults/crew-shared.kdbx")
if got := u.currentShareableVaultPath(); got != "/vaults/crew-shared.kdbx" {
t.Fatalf("currentShareableVaultPath() = %q, want %q", got, "/vaults/crew-shared.kdbx")
}
}
func TestUIShareCurrentVaultActionSavesAndSharesCurrentVault(t *testing.T) {
t.Parallel()
session := &saveCaptureSession{}
sharer := &captureVaultSharer{}
u := newUIWithSession("phone", session)
u.vaultSharer = sharer
u.vaultPath.SetText("/vaults/crew-shared.kdbx")
if err := u.shareCurrentVaultAction(); err != nil {
t.Fatalf("shareCurrentVaultAction() error = %v", err)
}
if session.saveCount != 1 {
t.Fatalf("shareCurrentVaultAction() saveCount = %d, want 1", session.saveCount)
}
if got := sharer.path; got != "/vaults/crew-shared.kdbx" {
t.Fatalf("ShareVault path = %q, want %q", got, "/vaults/crew-shared.kdbx")
}
if got := sharer.title; got != "crew-shared.kdbx" {
t.Fatalf("ShareVault title = %q, want %q", got, "crew-shared.kdbx")
}
}
func TestUIShareCurrentVaultActionRequiresVaultPath(t *testing.T) {
t.Parallel()
u := newUIWithSession("phone", &saveCaptureSession{}, statePaths{
DefaultSaveAsPath: filepath.Join(t.TempDir(), "vault.kdbx"),
RecentVaultsPath: filepath.Join(t.TempDir(), "recent-vaults.json"),
RecentRemotesPath: filepath.Join(t.TempDir(), "recent-remotes.json"),
UIPreferencesPath: filepath.Join(t.TempDir(), "ui-prefs.json"),
})
u.vaultSharer = &captureVaultSharer{}
err := u.shareCurrentVaultAction()
if err == nil || err.Error() != errVaultPathRequired {
t.Fatalf("shareCurrentVaultAction() error = %v, want %q", err, errVaultPathRequired)
}
}
func TestDefaultStatePathsUsesEnvironmentStateDirWhenFlagUnset(t *testing.T) {
base := filepath.Join(t.TempDir(), "keepassgo-state-env")
t.Setenv("KEEPASSGO_STATE_DIR", base)