Files
MyGoNavi/internal/app/methods_saved_connections.go
AutumnNazi ee53a56183 feat(cloud-backup): 支持加密云端备份与选择性恢复
- 新增 WebDAV 与 S3 独立配置、凭据和远端状态管理
- 使用 Argon2id 与 AES-256-GCM 加密连接及配置备份
- 支持分类备份、自动同步、远端预览和一次性确认恢复
- 连接与已保存查询按 ID 合并恢复,并保留本地独有数据
- 补充前后端回归测试、六语言文案和恢复失败回滚
2026-07-27 20:20:00 +08:00

98 lines
3.2 KiB
Go

package app
import (
"strings"
"GoNavi-Wails/internal/connection"
)
func (a *App) savedConnectionRepository() *savedConnectionRepository {
return newSavedConnectionRepository(a.configDir, a.secretStore)
}
func (a *App) GetSavedConnections() ([]connection.SavedConnectionView, error) {
items, err := a.savedConnectionRepository().List()
if err != nil {
return nil, err
}
return sanitizeSavedConnectionViews(items), nil
}
func (a *App) GetEditableSavedConnection(id string) (connection.SavedConnectionView, error) {
view, err := a.savedConnectionRepository().Find(id)
if err != nil {
return connection.SavedConnectionView{}, err
}
resolvedConfig, err := a.resolveConnectionSecrets(view.Config)
if err != nil {
return connection.SavedConnectionView{}, err
}
view.Config = resolvedConfig
return view, nil
}
func (a *App) SaveConnection(input connection.SavedConnectionInput) (connection.SavedConnectionView, error) {
view, err := a.savedConnectionRepository().Save(input)
if err != nil {
return connection.SavedConnectionView{}, err
}
a.markCloudBackupDirty()
return sanitizeSavedConnectionView(view), nil
}
func (a *App) DeleteConnection(id string) error {
err := a.savedConnectionRepository().Delete(id)
if err == nil {
a.markCloudBackupDirty()
}
return err
}
func (a *App) DuplicateConnection(id string) (connection.SavedConnectionView, error) {
view, err := a.savedConnectionRepository().Duplicate(
id,
a.appText("connection.unnamed", nil),
a.appText("connection.copy_suffix", nil),
)
if err != nil {
return connection.SavedConnectionView{}, err
}
a.markCloudBackupDirty()
return sanitizeSavedConnectionView(view), nil
}
func (a *App) ImportLegacyConnections(items []connection.LegacySavedConnection) ([]connection.SavedConnectionView, error) {
inputs := make([]connection.SavedConnectionInput, 0, len(items))
for _, item := range items {
input := connection.SavedConnectionInput(item)
input.ClearPrimaryPassword = strings.TrimSpace(item.Config.Password) == ""
input.ClearSSHPassword = strings.TrimSpace(item.Config.SSH.Password) == ""
input.ClearProxyPassword = strings.TrimSpace(item.Config.Proxy.Password) == ""
input.ClearHTTPTunnelPassword = strings.TrimSpace(item.Config.HTTPTunnel.Password) == ""
input.ClearMySQLReplicaPassword = strings.TrimSpace(item.Config.MySQLReplicaPassword) == ""
input.ClearMongoReplicaPassword = strings.TrimSpace(item.Config.MongoReplicaPassword) == ""
input.ClearRedisSentinelPassword = strings.TrimSpace(item.Config.RedisSentinelPassword) == ""
input.ClearOpaqueURI = strings.TrimSpace(item.Config.URI) == ""
input.ClearOpaqueDSN = strings.TrimSpace(item.Config.DSN) == ""
inputs = append(inputs, input)
}
views, err := a.importSavedConnectionsAtomically(inputs)
if err != nil {
return nil, err
}
a.markCloudBackupDirty()
return sanitizeSavedConnectionViews(views), nil
}
func (a *App) SaveGlobalProxy(input connection.SaveGlobalProxyInput) (connection.GlobalProxyView, error) {
view, err := a.saveGlobalProxy(input)
if err == nil {
a.markCloudBackupDirty()
}
return view, err
}
func (a *App) ImportLegacyGlobalProxy(input connection.LegacyGlobalProxyInput) (connection.GlobalProxyView, error) {
return a.saveGlobalProxy(connection.SaveGlobalProxyInput(input))
}