mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-20 07:40:35 +08:00
- 密文存储:新增 dailysecret 本地存储引擎,连接/代理/AI 密钥不再依赖系统钥匙串 - 启动迁移:自动将已有钥匙串密文迁移到本地 JSON,用户无感知 - WebKit 迁移:从旧版 Wails WebKit LocalStorage 中恢复连接与代理数据 - DMG 修复:移除 --sandbox-safe 避免扩展属性污染签名,新增 xattr 清理与签名校验 - 安全适配:钥匙串不可用时标记完成而非回滚,消除无钥匙串环境下的阻塞 - 出口脱敏:所有连接/代理 API 返回前统一 sanitize 防止密文泄漏
69 lines
2.4 KiB
Go
69 lines
2.4 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) SaveConnection(input connection.SavedConnectionInput) (connection.SavedConnectionView, error) {
|
|
view, err := a.savedConnectionRepository().Save(input)
|
|
if err != nil {
|
|
return connection.SavedConnectionView{}, err
|
|
}
|
|
return sanitizeSavedConnectionView(view), nil
|
|
}
|
|
|
|
func (a *App) DeleteConnection(id string) error {
|
|
return a.savedConnectionRepository().Delete(id)
|
|
}
|
|
|
|
func (a *App) DuplicateConnection(id string) (connection.SavedConnectionView, error) {
|
|
view, err := a.savedConnectionRepository().Duplicate(id)
|
|
if err != nil {
|
|
return connection.SavedConnectionView{}, err
|
|
}
|
|
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.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
|
|
}
|
|
return sanitizeSavedConnectionViews(views), nil
|
|
}
|
|
|
|
func (a *App) SaveGlobalProxy(input connection.SaveGlobalProxyInput) (connection.GlobalProxyView, error) {
|
|
return a.saveGlobalProxy(input)
|
|
}
|
|
|
|
func (a *App) ImportLegacyGlobalProxy(input connection.LegacyGlobalProxyInput) (connection.GlobalProxyView, error) {
|
|
return a.saveGlobalProxy(connection.SaveGlobalProxyInput(input))
|
|
}
|