Support Android share-driven credential lookup
This commit is contained in:
@@ -4,8 +4,10 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
@@ -17,6 +19,8 @@ import (
|
||||
"git.julianfamily.org/keepassgo/internal/webdav"
|
||||
)
|
||||
|
||||
var pendingSharedLookupURLPattern = regexp.MustCompile(`https?://[^\s<>"']+`)
|
||||
|
||||
func (u *ui) createVaultAction() error {
|
||||
key, err := u.currentMasterKey()
|
||||
defer u.clearMasterPassword()
|
||||
@@ -78,6 +82,7 @@ func (u *ui) openVaultAction() error {
|
||||
u.loadSecuritySettingsFromSession()
|
||||
u.editingEntry = false
|
||||
u.filter()
|
||||
u.applyPendingSharedLookup()
|
||||
u.applyPendingLifecycleOpenIntent()
|
||||
return nil
|
||||
}
|
||||
@@ -120,6 +125,7 @@ func (u *ui) startOpenVaultAction() {
|
||||
u.loadSecuritySettingsFromSession()
|
||||
u.editingEntry = false
|
||||
u.filter()
|
||||
u.applyPendingSharedLookup()
|
||||
u.applyPendingLifecycleOpenIntent()
|
||||
return nil
|
||||
}, nil
|
||||
@@ -741,6 +747,49 @@ func (u *ui) consumePendingSharedVaultImport() {
|
||||
}
|
||||
}
|
||||
|
||||
func normalizePendingSharedLookupQuery(raw string) string {
|
||||
value := strings.TrimSpace(raw)
|
||||
if value == "" {
|
||||
return ""
|
||||
}
|
||||
if match := pendingSharedLookupURLPattern.FindString(value); match != "" {
|
||||
value = match
|
||||
}
|
||||
if parsed, err := url.Parse(value); err == nil && strings.TrimSpace(parsed.Hostname()) != "" {
|
||||
return strings.ToLower(strings.TrimSpace(parsed.Hostname()))
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func (u *ui) consumePendingSharedLookup() {
|
||||
path := strings.TrimSpace(u.pendingSharedLookupPath)
|
||||
if path == "" {
|
||||
return
|
||||
}
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
if !errors.Is(err, os.ErrNotExist) {
|
||||
u.state.ErrorMessage = fmt.Sprintf("shared lookup: %v", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
_ = os.Remove(path)
|
||||
u.pendingSharedLookupQuery = normalizePendingSharedLookupQuery(string(data))
|
||||
u.applyPendingSharedLookup()
|
||||
}
|
||||
|
||||
func (u *ui) applyPendingSharedLookup() {
|
||||
query := strings.TrimSpace(u.pendingSharedLookupQuery)
|
||||
status, ok := u.state.Session.(sessionStatus)
|
||||
if query == "" || !ok || !status.HasVault() || status.IsLocked() {
|
||||
return
|
||||
}
|
||||
u.pendingSharedLookupQuery = ""
|
||||
u.state.Section = appstate.SectionEntries
|
||||
u.search.SetText(query)
|
||||
u.filter()
|
||||
}
|
||||
|
||||
func (u *ui) importSharedVaultBytesAction(name string, content []byte) error {
|
||||
target := u.importedVaultDestination(name)
|
||||
if err := os.MkdirAll(filepath.Dir(target), 0o700); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user