Receive shared Android vault imports
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user