diff --git a/app.go b/app.go index eb8b2a0..aa6df03 100644 --- a/app.go +++ b/app.go @@ -16,6 +16,7 @@ import ( "goexplore/internal/transfer" "os" "path/filepath" + "sync" "github.com/google/uuid" "github.com/wailsapp/wails/v2/pkg/runtime" @@ -25,6 +26,8 @@ type App struct { ctx context.Context cfg *config.Config transferManager *transfer.Manager + explorers map[string]explorer.Explorer + explorersMu sync.Mutex } func NewApp() *App { @@ -38,6 +41,7 @@ func NewApp() *App { return &App{ cfg: cfg, transferManager: transfer.NewManager(3), + explorers: make(map[string]explorer.Explorer), } } @@ -123,6 +127,41 @@ func (a *App) ReorderConnections(ids []string) error { return config.SaveConfig(a.cfg) } +func (a *App) getConnection(id string) (explorer.Explorer, error) { + if id == "local" { + return local.New(), nil + } + + a.explorersMu.Lock() + defer a.explorersMu.Unlock() + + if exp, ok := a.explorers[id]; ok { + return exp, nil + } + + exp, err := a.getExplorerForConnection(id) + if err != nil { + return nil, err + } + + if err := exp.Connect(); err != nil { + return nil, err + } + + a.explorers[id] = exp + return exp, nil +} + +func (a *App) DisconnectConnection(id string) { + a.explorersMu.Lock() + defer a.explorersMu.Unlock() + + if exp, ok := a.explorers[id]; ok { + exp.Disconnect() + delete(a.explorers, id) + } +} + func (a *App) getExplorerForConnection(id string) (explorer.Explorer, error) { if id == "local" { return local.New(), nil @@ -160,38 +199,26 @@ func (a *App) getExplorerForConnection(id string) (explorer.Explorer, error) { } func (a *App) ListDir(connId, path string) ([]explorer.FileEntry, error) { - exp, err := a.getExplorerForConnection(connId) + exp, err := a.getConnection(connId) if err != nil { return nil, err } - if err := exp.Connect(); err != nil { - return nil, err - } - defer exp.Disconnect() return exp.ListDir(path) } func (a *App) MkDir(connId, path string) error { - exp, err := a.getExplorerForConnection(connId) + exp, err := a.getConnection(connId) if err != nil { return err } - if err := exp.Connect(); err != nil { - return err - } - defer exp.Disconnect() return exp.MkDir(path) } func (a *App) Delete(connId, path string) error { - exp, err := a.getExplorerForConnection(connId) + exp, err := a.getConnection(connId) if err != nil { return err } - if err := exp.Connect(); err != nil { - return err - } - defer exp.Disconnect() return exp.Delete(path) } @@ -225,14 +252,10 @@ func (a *App) ClearTransfers() { } func (a *App) Rename(connId, src, dst string) error { - exp, err := a.getExplorerForConnection(connId) + exp, err := a.getConnection(connId) if err != nil { return err } - if err := exp.Connect(); err != nil { - return err - } - defer exp.Disconnect() return exp.Rename(src, dst) } diff --git a/frontend/wailsjs/go/main/App.d.ts b/frontend/wailsjs/go/main/App.d.ts index 8aca504..5f3c85a 100755 --- a/frontend/wailsjs/go/main/App.d.ts +++ b/frontend/wailsjs/go/main/App.d.ts @@ -11,6 +11,8 @@ export function Delete(arg1:string,arg2:string):Promise; export function DeleteConnection(arg1:string):Promise; +export function DisconnectConnection(arg1:string):Promise; + export function GetConnections():Promise>; export function GetTransfers():Promise>; diff --git a/frontend/wailsjs/go/main/App.js b/frontend/wailsjs/go/main/App.js index 9b0e0d1..b5c6640 100755 --- a/frontend/wailsjs/go/main/App.js +++ b/frontend/wailsjs/go/main/App.js @@ -14,6 +14,10 @@ export function DeleteConnection(arg1) { return window['go']['main']['App']['DeleteConnection'](arg1); } +export function DisconnectConnection(arg1) { + return window['go']['main']['App']['DisconnectConnection'](arg1); +} + export function GetConnections() { return window['go']['main']['App']['GetConnections'](); } diff --git a/internal/protocols/sftp/sftp.go b/internal/protocols/sftp/sftp.go index 4d04d71..c3b0cd1 100644 --- a/internal/protocols/sftp/sftp.go +++ b/internal/protocols/sftp/sftp.go @@ -9,10 +9,11 @@ import ( "strings" "time" - "github.com/pkg/sftp" - "golang.org/x/crypto/ssh" "goexplore/internal/config" "goexplore/internal/explorer" + + "github.com/pkg/sftp" + "golang.org/x/crypto/ssh" ) type SFTPExplorer struct { @@ -31,9 +32,9 @@ func (e *SFTPExplorer) Connect() error { if port == 0 { port = 22 } - + var authMethods []ssh.AuthMethod - + secretStr := strings.TrimSpace(e.secret) // Handle case where newlines might be escaped by mistake secretStr = strings.ReplaceAll(secretStr, "\\n", "\n") @@ -70,8 +71,8 @@ func (e *SFTPExplorer) Connect() error { })) config := &ssh.ClientConfig{ - User: e.cfg.Username, - Auth: authMethods, + User: e.cfg.Username, + Auth: authMethods, HostKeyCallback: ssh.InsecureIgnoreHostKey(), } @@ -102,9 +103,17 @@ func (e *SFTPExplorer) Disconnect() error { func (e *SFTPExplorer) ListDir(path string) ([]explorer.FileEntry, error) { if path == "" { - path = "." + if e.cfg.Bucket != "" { + path = e.cfg.Bucket + } else { + path = "/" + } + } else if path == "." { + path = "/" } + files, err := e.client.ReadDir(path) + if err != nil { return nil, err } diff --git a/main.go b/main.go index 7d90f1d..a7aee3e 100644 --- a/main.go +++ b/main.go @@ -27,6 +27,12 @@ func installLinux() { return } + for _, arg := range os.Args { + if arg == "--debug" { + return + } + } + exe, err := os.Executable() if err != nil { return