Receive shared Android vault imports

This commit is contained in:
Joe Julian
2026-04-06 16:54:14 -07:00
parent 05345559ee
commit 4f5465dfff
5 changed files with 257 additions and 12 deletions
+66
View File
@@ -5651,6 +5651,12 @@ func TestDefaultStatePathsUsesProvidedStateDir(t *testing.T) {
if got := paths.AutofillCachePath; got != filepath.Join(base, "autofill-cache.json") {
t.Fatalf("AutofillCachePath = %q, want %q", got, filepath.Join(base, "autofill-cache.json"))
}
if got := paths.PendingSharedVaultPath; got != filepath.Join(base, "pending-shared-vault.kdbx") {
t.Fatalf("PendingSharedVaultPath = %q, want %q", got, filepath.Join(base, "pending-shared-vault.kdbx"))
}
if got := paths.PendingSharedVaultNamePath; got != filepath.Join(base, "pending-shared-vault-name.txt") {
t.Fatalf("PendingSharedVaultNamePath = %q, want %q", got, filepath.Join(base, "pending-shared-vault-name.txt"))
}
}
func TestImportedVaultDestinationUsesIncomingFilenameInsideDefaultDirectory(t *testing.T) {
@@ -5721,6 +5727,66 @@ func TestUIImportSharedVaultBytesActionCopiesVaultAndSelectsIt(t *testing.T) {
}
}
func TestUIConsumesPendingSharedVaultImportOnStartup(t *testing.T) {
t.Parallel()
dir := t.TempDir()
paths := statePaths{
DefaultSaveAsPath: filepath.Join(dir, "vault.kdbx"),
RecentVaultsPath: filepath.Join(dir, "recent-vaults.json"),
RecentRemotesPath: filepath.Join(dir, "recent-remotes.json"),
UIPreferencesPath: filepath.Join(dir, "ui-prefs.json"),
PendingSharedVaultPath: filepath.Join(dir, "pending-shared-vault.kdbx"),
PendingSharedVaultNamePath: filepath.Join(dir, "pending-shared-vault-name.txt"),
}
key := vault.MasterKey{Password: "correct horse battery staple"}
var encoded bytes.Buffer
if err := vault.SaveKDBXWithKey(&encoded, vault.Model{
Entries: []vault.Entry{
{ID: "entry-1", Title: "Bellagio", Path: []string{"Crew", "Internet"}},
},
}, key); err != nil {
t.Fatalf("SaveKDBXWithKey() error = %v", err)
}
if err := os.WriteFile(paths.PendingSharedVaultPath, encoded.Bytes(), 0o600); err != nil {
t.Fatalf("WriteFile(PendingSharedVaultPath) error = %v", err)
}
if err := os.WriteFile(paths.PendingSharedVaultNamePath, []byte("crew-shared.kdbx\n"), 0o600); err != nil {
t.Fatalf("WriteFile(PendingSharedVaultNamePath) error = %v", err)
}
u := newUIWithState("phone", &session.Manager{}, paths)
wantPath := filepath.Join(dir, "crew-shared.kdbx")
if got := u.vaultPath.Text(); got != wantPath {
t.Fatalf("vaultPath = %q, want %q", got, wantPath)
}
if got := u.lifecycleMode; got != "local" {
t.Fatalf("lifecycleMode = %q, want local", got)
}
if !u.hasSelectedLifecycleTarget() {
t.Fatal("hasSelectedLifecycleTarget() = false, want true after pending import")
}
if _, err := os.Stat(paths.PendingSharedVaultPath); !errors.Is(err, os.ErrNotExist) {
t.Fatalf("Stat(PendingSharedVaultPath) error = %v, want not exist", err)
}
if _, err := os.Stat(paths.PendingSharedVaultNamePath); !errors.Is(err, os.ErrNotExist) {
t.Fatalf("Stat(PendingSharedVaultNamePath) error = %v, want not exist", err)
}
reopened := newUIWithState("phone", &session.Manager{}, paths)
reopened.vaultPath.SetText(wantPath)
reopened.masterPassword.SetText(key.Password)
if err := reopened.openVaultAction(); err != nil {
t.Fatalf("openVaultAction(imported) error = %v", err)
}
reopened.state.NavigateToPath([]string{"Crew", "Internet"})
reopened.filter()
if got := reopened.filteredTitles(); !slices.Equal(got, []string{"Bellagio"}) {
t.Fatalf("filteredTitles() = %v, want [Bellagio]", got)
}
}
func TestDefaultStatePathsUsesEnvironmentStateDirWhenFlagUnset(t *testing.T) {
base := filepath.Join(t.TempDir(), "keepassgo-state-env")
t.Setenv("KEEPASSGO_STATE_DIR", base)