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
+51 -12
View File
@@ -137,12 +137,14 @@ type attachmentItem struct {
}
type statePaths struct {
DefaultSaveAsPath string
RecentVaultsPath string
RecentRemotesPath string
SettingsPath string
UIPreferencesPath string
AutofillCachePath string
DefaultSaveAsPath string
RecentVaultsPath string
RecentRemotesPath string
SettingsPath string
UIPreferencesPath string
AutofillCachePath string
PendingSharedVaultPath string
PendingSharedVaultNamePath string
}
type recentVaultRecord struct {
@@ -452,6 +454,8 @@ type ui struct {
uiPreferencesPath string
recentRemotesPath string
autofillCachePath string
pendingSharedVaultPath string
pendingSharedVaultNamePath string
editingEntry bool
syncDefaultSourceMode syncSourceMode
syncDefaultDirection syncDirection
@@ -615,6 +619,8 @@ func newUIWithState(mode string, sess appstate.CurrentSession, paths statePaths)
uiPreferencesPath: paths.UIPreferencesPath,
recentRemotesPath: paths.RecentRemotesPath,
autofillCachePath: paths.AutofillCachePath,
pendingSharedVaultPath: paths.PendingSharedVaultPath,
pendingSharedVaultNamePath: paths.PendingSharedVaultNamePath,
recentVaultGroups: map[string][]string{},
recentVaultUsedAt: map[string]time.Time{},
lifecycleAdvancedHidden: true,
@@ -655,6 +661,7 @@ func newUIWithState(mode string, sess appstate.CurrentSession, paths statePaths)
u.setCustomFieldRows(nil)
u.loadRecentVaults()
u.loadRecentRemotes()
u.consumePendingSharedVaultImport()
u.restoreStartupLifecycleTarget()
u.requestMasterPassFocus = u.hasSelectedLifecycleTarget()
u.loadUIPreferences()
@@ -725,12 +732,14 @@ func defaultStatePaths(stateDir string) statePaths {
baseDir = filepath.Join(configDir, "keepassgo")
}
return statePaths{
DefaultSaveAsPath: filepath.Join(baseDir, "vault.kdbx"),
RecentVaultsPath: filepath.Join(baseDir, "recent-vaults.json"),
RecentRemotesPath: filepath.Join(baseDir, "recent-remotes.json"),
SettingsPath: filepath.Join(baseDir, "settings.json"),
UIPreferencesPath: filepath.Join(baseDir, "ui-prefs.json"),
AutofillCachePath: filepath.Join(baseDir, "autofill-cache.json"),
DefaultSaveAsPath: filepath.Join(baseDir, "vault.kdbx"),
RecentVaultsPath: filepath.Join(baseDir, "recent-vaults.json"),
RecentRemotesPath: filepath.Join(baseDir, "recent-remotes.json"),
SettingsPath: filepath.Join(baseDir, "settings.json"),
UIPreferencesPath: filepath.Join(baseDir, "ui-prefs.json"),
AutofillCachePath: filepath.Join(baseDir, "autofill-cache.json"),
PendingSharedVaultPath: filepath.Join(baseDir, "pending-shared-vault.kdbx"),
PendingSharedVaultNamePath: filepath.Join(baseDir, "pending-shared-vault-name.txt"),
}
}
@@ -1494,6 +1503,36 @@ func (u *ui) importedVaultDestination(name string) string {
}
}
func (u *ui) consumePendingSharedVaultImport() {
path := strings.TrimSpace(u.pendingSharedVaultPath)
if path == "" {
return
}
content, err := os.ReadFile(path)
if err != nil {
if !errors.Is(err, os.ErrNotExist) {
u.state.ErrorMessage = fmt.Sprintf("import shared vault: %v", err)
}
return
}
name := "shared-vault.kdbx"
if namePath := strings.TrimSpace(u.pendingSharedVaultNamePath); namePath != "" {
if rawName, err := os.ReadFile(namePath); err == nil {
if trimmed := strings.TrimSpace(string(rawName)); trimmed != "" {
name = trimmed
}
}
}
if err := u.importSharedVaultBytesAction(name, content); err != nil {
u.state.ErrorMessage = fmt.Sprintf("import shared vault: %v", err)
return
}
_ = os.Remove(path)
if namePath := strings.TrimSpace(u.pendingSharedVaultNamePath); namePath != "" {
_ = os.Remove(namePath)
}
}
func (u *ui) importSharedVaultBytesAction(name string, content []byte) error {
target := u.importedVaultDestination(name)
if err := os.MkdirAll(filepath.Dir(target), 0o700); err != nil {