feat: add ftp root path setting

This commit is contained in:
2026-07-13 13:20:31 +08:00
parent 50551de105
commit b69ef00013
7 changed files with 104 additions and 29 deletions
+13
View File
@@ -83,6 +83,10 @@ type SSHConfig struct {
// reuses the local ssh-agent and ~/.ssh/id_* discovery used by SSH/SCP.
// - PathPrefix is relative to the account's login root. The application
// rejects absolute paths and traversal segments before uploading.
// - RootDirectory is only used to build the path copied to the clipboard.
// Keeping it separate from PathPrefix lets the server expose a login root
// such as "~/ftp/" while uploads still target a relative directory such
// as "snapgo/".
// - StrictHostKey and KnownHostsPath apply only to SFTP. Plain FTP has no
// host-key mechanism and sends credentials and data without encryption.
type FTPConfig struct {
@@ -92,6 +96,7 @@ type FTPConfig struct {
User string `json:"user"`
AuthMethod string `json:"authMethod"`
Password string `json:"password"`
RootDirectory string `json:"rootDirectory"`
PathPrefix string `json:"pathPrefix"`
StrictHostKey bool `json:"strictHostKey"`
KnownHostsPath string `json:"knownHostsPath"`
@@ -260,6 +265,7 @@ func DefaultAppConfig() AppConfig {
Protocol: FTPProtocolFTP,
Port: 21,
AuthMethod: SSHAuthPassword,
RootDirectory: "/",
PathPrefix: "snapgo/",
ConnectTimeoutSecs: 10,
StrictHostKey: false,
@@ -371,6 +377,13 @@ func (c *AppConfig) Normalize() {
if c.FTP.AuthMethod != SSHAuthPassword && c.FTP.AuthMethod != SSHAuthKey {
c.FTP.AuthMethod = SSHAuthPassword
}
if c.FTP.RootDirectory == "" {
if c.FTP.Protocol == FTPProtocolSFTP {
c.FTP.RootDirectory = "~/"
} else {
c.FTP.RootDirectory = "/"
}
}
if c.FTP.PathPrefix == "" {
c.FTP.PathPrefix = "snapgo/"
}
+6
View File
@@ -13,6 +13,9 @@ func TestDefaultAppConfigIncludesFTPDefaults(t *testing.T) {
if cfg.FTP.PathPrefix != "snapgo/" {
t.Fatalf("expected default path prefix, got %q", cfg.FTP.PathPrefix)
}
if cfg.FTP.RootDirectory != "/" {
t.Fatalf("expected default root directory, got %q", cfg.FTP.RootDirectory)
}
if cfg.FTP.ConnectTimeoutSecs != 10 {
t.Fatalf("expected 10 second timeout, got %d", cfg.FTP.ConnectTimeoutSecs)
}
@@ -31,6 +34,9 @@ func TestNormalizeUsesSFTPDefaultPort(t *testing.T) {
if cfg.FTP.AuthMethod != SSHAuthPassword {
t.Fatalf("expected password auth default, got %q", cfg.FTP.AuthMethod)
}
if cfg.FTP.RootDirectory != "~/" {
t.Fatalf("expected SFTP home root directory, got %q", cfg.FTP.RootDirectory)
}
}
func TestIsFTPConfiguredRequiresProtocolHostAndUser(t *testing.T) {