Shift remote open copy to local-first flow

This commit is contained in:
Joe Julian
2026-04-06 16:40:43 -07:00
parent fc921ca30f
commit 48a21c2c59
3 changed files with 65 additions and 1 deletions
+23
View File
@@ -2602,13 +2602,36 @@ func (u *ui) remoteOpenRetryAvailable() bool {
return u.lifecycleMode == "remote" && strings.HasPrefix(strings.TrimSpace(u.state.ErrorMessage), "open remote vault failed:") return u.lifecycleMode == "remote" && strings.HasPrefix(strings.TrimSpace(u.state.ErrorMessage), "open remote vault failed:")
} }
func (u *ui) selectedRemoteUsesLocalCache() bool {
return u.hasSelectedRemoteTarget() &&
strings.TrimSpace(u.vaultPath.Text()) != "" &&
strings.TrimSpace(u.selectedVaultRemoteProfileID) != "" &&
strings.TrimSpace(u.selectedVaultRemoteCredentialEntryID) != ""
}
func (u *ui) remoteLifecycleMessage() string {
if u.selectedRemoteUsesLocalCache() {
return "Open the local cache for this remote vault, then unlock and sync it with the vault-stored remote settings."
}
return "Connect to a remote vault, then unlock it with the KeePass master key."
}
func (u *ui) remoteOpenButtonLabel() string { func (u *ui) remoteOpenButtonLabel() string {
switch { switch {
case u.lifecycleBusy(): case u.lifecycleBusy():
if u.selectedRemoteUsesLocalCache() {
return "Opening Cached Vault..."
}
return "Opening Remote Vault..." return "Opening Remote Vault..."
case u.remoteOpenRetryAvailable(): case u.remoteOpenRetryAvailable():
if u.selectedRemoteUsesLocalCache() {
return "Retry Cached Vault"
}
return "Retry Remote Vault" return "Retry Remote Vault"
default: default:
if u.selectedRemoteUsesLocalCache() {
return "Open Cached Vault"
}
return "Open Remote Vault" return "Open Remote Vault"
} }
} }
+41
View File
@@ -5301,6 +5301,47 @@ func TestUIRemoteOpenButtonLabelOffersRetryAfterFailure(t *testing.T) {
} }
} }
func TestUIRemoteLifecycleMessageUsesLocalCacheLanguageForBoundRemote(t *testing.T) {
t.Parallel()
u := newUIWithSession("desktop", &session.Manager{})
u.lifecycleMode = "remote"
u.applyRecentRemoteRecord(recentRemoteRecord{
BaseURL: "https://dav.example.invalid",
Path: "vaults/home.kdbx",
LocalVaultPath: "/vaults/cache/home.kdbx",
RemoteProfileID: "remote-profile-1",
CredentialEntryID: "remote-creds-1",
})
if got := u.remoteLifecycleMessage(); got != "Open the local cache for this remote vault, then unlock and sync it with the vault-stored remote settings." {
t.Fatalf("remoteLifecycleMessage() = %q, want local-cache guidance", got)
}
}
func TestUIRemoteOpenButtonLabelUsesLocalCacheLanguageForBoundRemote(t *testing.T) {
t.Parallel()
u := newUIWithSession("desktop", &session.Manager{})
u.lifecycleMode = "remote"
u.applyRecentRemoteRecord(recentRemoteRecord{
BaseURL: "https://dav.example.invalid",
Path: "vaults/home.kdbx",
LocalVaultPath: "/vaults/cache/home.kdbx",
RemoteProfileID: "remote-profile-1",
CredentialEntryID: "remote-creds-1",
})
if got := u.remoteOpenButtonLabel(); got != "Open Cached Vault" {
t.Fatalf("remoteOpenButtonLabel() = %q, want %q", got, "Open Cached Vault")
}
u.state.ErrorMessage = "open remote vault failed: dial tcp timeout"
if got := u.remoteOpenButtonLabel(); got != "Retry Cached Vault" {
t.Fatalf("remoteOpenButtonLabel() after error = %q, want %q", got, "Retry Cached Vault")
}
}
func TestUIOpenRemoteVaultRestoresLastOpenedGroupForThatConnection(t *testing.T) { func TestUIOpenRemoteVaultRestoresLastOpenedGroupForThatConnection(t *testing.T) {
t.Parallel() t.Parallel()
+1 -1
View File
@@ -33,7 +33,7 @@ func (u *ui) lifecycleControls(gtx layout.Context) layout.Dimensions {
layout.Rigid(func(gtx layout.Context) layout.Dimensions { layout.Rigid(func(gtx layout.Context) layout.Dimensions {
message := "Choose a recent vault or enter a .kdbx path, then unlock it." message := "Choose a recent vault or enter a .kdbx path, then unlock it."
if u.lifecycleMode == "remote" { if u.lifecycleMode == "remote" {
message = "Connect to a remote vault, then unlock it with the KeePass master key." message = u.remoteLifecycleMessage()
} }
lbl := material.Label(u.theme, unit.Sp(14), message) lbl := material.Label(u.theme, unit.Sp(14), message)
lbl.Color = accentColor lbl.Color = accentColor