Use vault bindings for remote opens
This commit is contained in:
+140
@@ -83,6 +83,22 @@ func (s summarySession) HasVault() bool
|
||||
func (s summarySession) IsLocked() bool { return s.locked }
|
||||
func (s summarySession) IsRemote() bool { return s.remote }
|
||||
|
||||
type remoteOpenCaptureSession struct {
|
||||
model vault.Model
|
||||
remoteClient webdav.Client
|
||||
remotePath string
|
||||
}
|
||||
|
||||
func (s *remoteOpenCaptureSession) Current() (vault.Model, error) {
|
||||
return s.model, nil
|
||||
}
|
||||
|
||||
func (s *remoteOpenCaptureSession) OpenRemote(client webdav.Client, path string, _ vault.MasterKey) error {
|
||||
s.remoteClient = client
|
||||
s.remotePath = path
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestUIFiltersUsingVaultModelPathsAndSearch(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
@@ -1658,6 +1674,130 @@ func TestUIOpenRemoteReportsTransportFailure(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestUIOpenRemoteActionUsesSelectedVaultBinding(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
sess := &remoteOpenCaptureSession{
|
||||
model: vault.Model{
|
||||
Entries: []vault.Entry{{
|
||||
ID: "remote-creds-1",
|
||||
Title: "WebDAV Sign-In",
|
||||
Username: "tjulian",
|
||||
Password: "token-1",
|
||||
Path: []string{"Crew", "Internet"},
|
||||
}},
|
||||
RemoteProfiles: []vault.RemoteProfile{{
|
||||
ID: "family-webdav",
|
||||
Name: "Family Vault",
|
||||
Backend: vault.RemoteBackendWebDAV,
|
||||
BaseURL: "https://dav.example.invalid/remote.php/dav",
|
||||
Path: "files/family/keepass.kdbx",
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
||||
u := newUIWithSession("desktop", sess)
|
||||
u.masterPassword.SetText("correct horse battery staple")
|
||||
u.selectedVaultRemoteProfileID = "family-webdav"
|
||||
u.selectedVaultRemoteCredentialEntryID = "remote-creds-1"
|
||||
|
||||
if err := u.openRemoteAction(); err != nil {
|
||||
t.Fatalf("openRemoteAction() error = %v", err)
|
||||
}
|
||||
|
||||
if got := sess.remoteClient.BaseURL; got != "https://dav.example.invalid/remote.php/dav" {
|
||||
t.Fatalf("remoteClient.BaseURL = %q, want remote.php/dav URL", got)
|
||||
}
|
||||
if got := sess.remoteClient.Username; got != "tjulian" {
|
||||
t.Fatalf("remoteClient.Username = %q, want tjulian", got)
|
||||
}
|
||||
if got := sess.remoteClient.Password; got != "token-1" {
|
||||
t.Fatalf("remoteClient.Password = %q, want token-1", got)
|
||||
}
|
||||
if got := sess.remotePath; got != "files/family/keepass.kdbx" {
|
||||
t.Fatalf("remotePath = %q, want files/family/keepass.kdbx", got)
|
||||
}
|
||||
if got := u.remoteBaseURL.Text(); got != "https://dav.example.invalid/remote.php/dav" {
|
||||
t.Fatalf("remoteBaseURL = %q, want resolved profile base URL", got)
|
||||
}
|
||||
if got := u.remotePath.Text(); got != "files/family/keepass.kdbx" {
|
||||
t.Fatalf("remotePath editor = %q, want resolved profile path", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUIStartOpenRemoteActionUsesSelectedVaultBinding(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
localKey := vault.MasterKey{Password: "correct horse battery staple"}
|
||||
localModel := vault.Model{
|
||||
Entries: []vault.Entry{{
|
||||
ID: "remote-creds-1",
|
||||
Title: "WebDAV Sign-In",
|
||||
Username: "tjulian",
|
||||
Password: "token-1",
|
||||
Path: []string{"Crew", "Internet"},
|
||||
}},
|
||||
RemoteProfiles: []vault.RemoteProfile{{
|
||||
ID: "family-webdav",
|
||||
Name: "Family Vault",
|
||||
Backend: vault.RemoteBackendWebDAV,
|
||||
BaseURL: "",
|
||||
Path: "files/family/keepass.kdbx",
|
||||
}},
|
||||
}
|
||||
|
||||
remoteModel := vault.Model{
|
||||
Entries: []vault.Entry{{
|
||||
ID: "vault-console",
|
||||
Title: "Vault Console",
|
||||
Username: "dannyocean",
|
||||
Password: "token-1",
|
||||
URL: "https://vault.crew.example.invalid",
|
||||
Path: []string{"Root", "Internet"},
|
||||
}},
|
||||
}
|
||||
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodGet {
|
||||
t.Fatalf("unexpected method %s", r.Method)
|
||||
}
|
||||
var encoded bytes.Buffer
|
||||
if err := vault.SaveKDBXWithKey(&encoded, remoteModel, localKey); err != nil {
|
||||
t.Fatalf("SaveKDBXWithKey() error = %v", err)
|
||||
}
|
||||
w.Header().Set("ETag", "\"v1\"")
|
||||
_, _ = w.Write(encoded.Bytes())
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
localModel.RemoteProfiles[0].BaseURL = server.URL
|
||||
|
||||
manager := &session.Manager{}
|
||||
if err := manager.Create(localModel, localKey); err != nil {
|
||||
t.Fatalf("manager.Create() error = %v", err)
|
||||
}
|
||||
|
||||
u := newUIWithSession("desktop", manager)
|
||||
u.masterPassword.SetText(localKey.Password)
|
||||
u.selectedVaultRemoteProfileID = "family-webdav"
|
||||
u.selectedVaultRemoteCredentialEntryID = "remote-creds-1"
|
||||
|
||||
u.startOpenRemoteAction()
|
||||
|
||||
result := waitForBackgroundResult(t, u)
|
||||
u.applyBackgroundResult(result)
|
||||
|
||||
if got := u.state.ErrorMessage; got != "" {
|
||||
t.Fatalf("ErrorMessage after apply = %q, want empty", got)
|
||||
}
|
||||
if got := u.remoteBaseURL.Text(); got != server.URL {
|
||||
t.Fatalf("remoteBaseURL = %q, want server URL from selected profile", got)
|
||||
}
|
||||
if got := u.remotePath.Text(); got != "files/family/keepass.kdbx" {
|
||||
t.Fatalf("remotePath = %q, want selected profile path", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUIRemoteSaveConflictShowsVisibleErrorAndKeepsDirtyState(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user