config_test.go 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. package config_test
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "testing"
  8. "github.com/spf13/viper"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. "github.com/drakkan/sftpgo/v2/common"
  12. "github.com/drakkan/sftpgo/v2/config"
  13. "github.com/drakkan/sftpgo/v2/dataprovider"
  14. "github.com/drakkan/sftpgo/v2/ftpd"
  15. "github.com/drakkan/sftpgo/v2/httpclient"
  16. "github.com/drakkan/sftpgo/v2/httpd"
  17. "github.com/drakkan/sftpgo/v2/kms"
  18. "github.com/drakkan/sftpgo/v2/mfa"
  19. "github.com/drakkan/sftpgo/v2/sftpd"
  20. "github.com/drakkan/sftpgo/v2/smtp"
  21. "github.com/drakkan/sftpgo/v2/util"
  22. )
  23. const (
  24. tempConfigName = "temp"
  25. )
  26. func reset() {
  27. viper.Reset()
  28. config.Init()
  29. }
  30. func TestLoadConfigTest(t *testing.T) {
  31. reset()
  32. configDir := ".."
  33. err := config.LoadConfig(configDir, "")
  34. assert.NoError(t, err)
  35. assert.NotEqual(t, httpd.Conf{}, config.GetHTTPConfig())
  36. assert.NotEqual(t, dataprovider.Config{}, config.GetProviderConf())
  37. assert.NotEqual(t, sftpd.Configuration{}, config.GetSFTPDConfig())
  38. assert.NotEqual(t, httpclient.Config{}, config.GetHTTPConfig())
  39. assert.NotEqual(t, smtp.Config{}, config.GetSMTPConfig())
  40. confName := tempConfigName + ".json"
  41. configFilePath := filepath.Join(configDir, confName)
  42. err = config.LoadConfig(configDir, confName)
  43. assert.NoError(t, err)
  44. err = os.WriteFile(configFilePath, []byte("{invalid json}"), os.ModePerm)
  45. assert.NoError(t, err)
  46. err = config.LoadConfig(configDir, confName)
  47. assert.NoError(t, err)
  48. err = os.WriteFile(configFilePath, []byte(`{"sftpd": {"max_auth_tries": "a"}}`), os.ModePerm)
  49. assert.NoError(t, err)
  50. err = config.LoadConfig(configDir, confName)
  51. assert.Error(t, err)
  52. err = os.Remove(configFilePath)
  53. assert.NoError(t, err)
  54. }
  55. func TestLoadConfigFileNotFound(t *testing.T) {
  56. reset()
  57. viper.SetConfigName("configfile")
  58. err := config.LoadConfig(os.TempDir(), "")
  59. assert.NoError(t, err)
  60. }
  61. func TestEmptyBanner(t *testing.T) {
  62. reset()
  63. configDir := ".."
  64. confName := tempConfigName + ".json"
  65. configFilePath := filepath.Join(configDir, confName)
  66. err := config.LoadConfig(configDir, "")
  67. assert.NoError(t, err)
  68. sftpdConf := config.GetSFTPDConfig()
  69. sftpdConf.Banner = " "
  70. c := make(map[string]sftpd.Configuration)
  71. c["sftpd"] = sftpdConf
  72. jsonConf, _ := json.Marshal(c)
  73. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  74. assert.NoError(t, err)
  75. err = config.LoadConfig(configDir, confName)
  76. assert.NoError(t, err)
  77. sftpdConf = config.GetSFTPDConfig()
  78. assert.NotEmpty(t, strings.TrimSpace(sftpdConf.Banner))
  79. err = os.Remove(configFilePath)
  80. assert.NoError(t, err)
  81. ftpdConf := config.GetFTPDConfig()
  82. ftpdConf.Banner = " "
  83. c1 := make(map[string]ftpd.Configuration)
  84. c1["ftpd"] = ftpdConf
  85. jsonConf, _ = json.Marshal(c1)
  86. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  87. assert.NoError(t, err)
  88. err = config.LoadConfig(configDir, confName)
  89. assert.NoError(t, err)
  90. ftpdConf = config.GetFTPDConfig()
  91. assert.NotEmpty(t, strings.TrimSpace(ftpdConf.Banner))
  92. err = os.Remove(configFilePath)
  93. assert.NoError(t, err)
  94. }
  95. func TestEnabledSSHCommands(t *testing.T) {
  96. reset()
  97. configDir := ".."
  98. confName := tempConfigName + ".json"
  99. configFilePath := filepath.Join(configDir, confName)
  100. err := config.LoadConfig(configDir, "")
  101. assert.NoError(t, err)
  102. reset()
  103. sftpdConf := config.GetSFTPDConfig()
  104. sftpdConf.EnabledSSHCommands = []string{"scp"}
  105. c := make(map[string]sftpd.Configuration)
  106. c["sftpd"] = sftpdConf
  107. jsonConf, err := json.Marshal(c)
  108. assert.NoError(t, err)
  109. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  110. assert.NoError(t, err)
  111. err = config.LoadConfig(configDir, confName)
  112. assert.NoError(t, err)
  113. sftpdConf = config.GetSFTPDConfig()
  114. if assert.Len(t, sftpdConf.EnabledSSHCommands, 1) {
  115. assert.Equal(t, "scp", sftpdConf.EnabledSSHCommands[0])
  116. }
  117. err = os.Remove(configFilePath)
  118. assert.NoError(t, err)
  119. }
  120. func TestInvalidUploadMode(t *testing.T) {
  121. reset()
  122. configDir := ".."
  123. confName := tempConfigName + ".json"
  124. configFilePath := filepath.Join(configDir, confName)
  125. err := config.LoadConfig(configDir, "")
  126. assert.NoError(t, err)
  127. commonConf := config.GetCommonConfig()
  128. commonConf.UploadMode = 10
  129. c := make(map[string]common.Configuration)
  130. c["common"] = commonConf
  131. jsonConf, err := json.Marshal(c)
  132. assert.NoError(t, err)
  133. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  134. assert.NoError(t, err)
  135. err = config.LoadConfig(configDir, confName)
  136. assert.NoError(t, err)
  137. assert.Equal(t, 0, config.GetCommonConfig().UploadMode)
  138. err = os.Remove(configFilePath)
  139. assert.NoError(t, err)
  140. }
  141. func TestInvalidExternalAuthScope(t *testing.T) {
  142. reset()
  143. configDir := ".."
  144. confName := tempConfigName + ".json"
  145. configFilePath := filepath.Join(configDir, confName)
  146. err := config.LoadConfig(configDir, "")
  147. assert.NoError(t, err)
  148. providerConf := config.GetProviderConf()
  149. providerConf.ExternalAuthScope = 100
  150. c := make(map[string]dataprovider.Config)
  151. c["data_provider"] = providerConf
  152. jsonConf, err := json.Marshal(c)
  153. assert.NoError(t, err)
  154. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  155. assert.NoError(t, err)
  156. err = config.LoadConfig(configDir, confName)
  157. assert.NoError(t, err)
  158. assert.Equal(t, 0, config.GetProviderConf().ExternalAuthScope)
  159. err = os.Remove(configFilePath)
  160. assert.NoError(t, err)
  161. }
  162. func TestInvalidCredentialsPath(t *testing.T) {
  163. reset()
  164. configDir := ".."
  165. confName := tempConfigName + ".json"
  166. configFilePath := filepath.Join(configDir, confName)
  167. err := config.LoadConfig(configDir, "")
  168. assert.NoError(t, err)
  169. providerConf := config.GetProviderConf()
  170. providerConf.CredentialsPath = ""
  171. c := make(map[string]dataprovider.Config)
  172. c["data_provider"] = providerConf
  173. jsonConf, err := json.Marshal(c)
  174. assert.NoError(t, err)
  175. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  176. assert.NoError(t, err)
  177. err = config.LoadConfig(configDir, confName)
  178. assert.NoError(t, err)
  179. assert.Equal(t, "credentials", config.GetProviderConf().CredentialsPath)
  180. err = os.Remove(configFilePath)
  181. assert.NoError(t, err)
  182. }
  183. func TestInvalidProxyProtocol(t *testing.T) {
  184. reset()
  185. configDir := ".."
  186. confName := tempConfigName + ".json"
  187. configFilePath := filepath.Join(configDir, confName)
  188. err := config.LoadConfig(configDir, "")
  189. assert.NoError(t, err)
  190. commonConf := config.GetCommonConfig()
  191. commonConf.ProxyProtocol = 10
  192. c := make(map[string]common.Configuration)
  193. c["common"] = commonConf
  194. jsonConf, err := json.Marshal(c)
  195. assert.NoError(t, err)
  196. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  197. assert.NoError(t, err)
  198. err = config.LoadConfig(configDir, confName)
  199. assert.NoError(t, err)
  200. assert.Equal(t, 0, config.GetCommonConfig().ProxyProtocol)
  201. err = os.Remove(configFilePath)
  202. assert.NoError(t, err)
  203. }
  204. func TestInvalidUsersBaseDir(t *testing.T) {
  205. reset()
  206. configDir := ".."
  207. confName := tempConfigName + ".json"
  208. configFilePath := filepath.Join(configDir, confName)
  209. err := config.LoadConfig(configDir, "")
  210. assert.NoError(t, err)
  211. providerConf := config.GetProviderConf()
  212. providerConf.UsersBaseDir = "."
  213. c := make(map[string]dataprovider.Config)
  214. c["data_provider"] = providerConf
  215. jsonConf, err := json.Marshal(c)
  216. assert.NoError(t, err)
  217. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  218. assert.NoError(t, err)
  219. err = config.LoadConfig(configDir, confName)
  220. assert.NoError(t, err)
  221. assert.Empty(t, config.GetProviderConf().UsersBaseDir)
  222. err = os.Remove(configFilePath)
  223. assert.NoError(t, err)
  224. }
  225. func TestSetGetConfig(t *testing.T) {
  226. reset()
  227. sftpdConf := config.GetSFTPDConfig()
  228. sftpdConf.MaxAuthTries = 10
  229. config.SetSFTPDConfig(sftpdConf)
  230. assert.Equal(t, sftpdConf.MaxAuthTries, config.GetSFTPDConfig().MaxAuthTries)
  231. dataProviderConf := config.GetProviderConf()
  232. dataProviderConf.Host = "test host"
  233. config.SetProviderConf(dataProviderConf)
  234. assert.Equal(t, dataProviderConf.Host, config.GetProviderConf().Host)
  235. httpdConf := config.GetHTTPDConfig()
  236. httpdConf.Bindings = append(httpdConf.Bindings, httpd.Binding{Address: "0.0.0.0"})
  237. config.SetHTTPDConfig(httpdConf)
  238. assert.Equal(t, httpdConf.Bindings[0].Address, config.GetHTTPDConfig().Bindings[0].Address)
  239. commonConf := config.GetCommonConfig()
  240. commonConf.IdleTimeout = 10
  241. config.SetCommonConfig(commonConf)
  242. assert.Equal(t, commonConf.IdleTimeout, config.GetCommonConfig().IdleTimeout)
  243. ftpdConf := config.GetFTPDConfig()
  244. ftpdConf.CertificateFile = "cert"
  245. ftpdConf.CertificateKeyFile = "key"
  246. config.SetFTPDConfig(ftpdConf)
  247. assert.Equal(t, ftpdConf.CertificateFile, config.GetFTPDConfig().CertificateFile)
  248. assert.Equal(t, ftpdConf.CertificateKeyFile, config.GetFTPDConfig().CertificateKeyFile)
  249. webDavConf := config.GetWebDAVDConfig()
  250. webDavConf.CertificateFile = "dav_cert"
  251. webDavConf.CertificateKeyFile = "dav_key"
  252. config.SetWebDAVDConfig(webDavConf)
  253. assert.Equal(t, webDavConf.CertificateFile, config.GetWebDAVDConfig().CertificateFile)
  254. assert.Equal(t, webDavConf.CertificateKeyFile, config.GetWebDAVDConfig().CertificateKeyFile)
  255. kmsConf := config.GetKMSConfig()
  256. kmsConf.Secrets.MasterKeyPath = "apath"
  257. kmsConf.Secrets.URL = "aurl"
  258. config.SetKMSConfig(kmsConf)
  259. assert.Equal(t, kmsConf.Secrets.MasterKeyPath, config.GetKMSConfig().Secrets.MasterKeyPath)
  260. assert.Equal(t, kmsConf.Secrets.URL, config.GetKMSConfig().Secrets.URL)
  261. telemetryConf := config.GetTelemetryConfig()
  262. telemetryConf.BindPort = 10001
  263. telemetryConf.BindAddress = "0.0.0.0"
  264. config.SetTelemetryConfig(telemetryConf)
  265. assert.Equal(t, telemetryConf.BindPort, config.GetTelemetryConfig().BindPort)
  266. assert.Equal(t, telemetryConf.BindAddress, config.GetTelemetryConfig().BindAddress)
  267. }
  268. func TestServiceToStart(t *testing.T) {
  269. reset()
  270. configDir := ".."
  271. err := config.LoadConfig(configDir, "")
  272. assert.NoError(t, err)
  273. assert.True(t, config.HasServicesToStart())
  274. sftpdConf := config.GetSFTPDConfig()
  275. sftpdConf.Bindings[0].Port = 0
  276. config.SetSFTPDConfig(sftpdConf)
  277. assert.False(t, config.HasServicesToStart())
  278. ftpdConf := config.GetFTPDConfig()
  279. ftpdConf.Bindings[0].Port = 2121
  280. config.SetFTPDConfig(ftpdConf)
  281. assert.True(t, config.HasServicesToStart())
  282. ftpdConf.Bindings[0].Port = 0
  283. config.SetFTPDConfig(ftpdConf)
  284. webdavdConf := config.GetWebDAVDConfig()
  285. webdavdConf.Bindings[0].Port = 9000
  286. config.SetWebDAVDConfig(webdavdConf)
  287. assert.True(t, config.HasServicesToStart())
  288. webdavdConf.Bindings[0].Port = 0
  289. config.SetWebDAVDConfig(webdavdConf)
  290. assert.False(t, config.HasServicesToStart())
  291. sftpdConf.Bindings[0].Port = 2022
  292. config.SetSFTPDConfig(sftpdConf)
  293. assert.True(t, config.HasServicesToStart())
  294. }
  295. func TestSSHCommandsFromEnv(t *testing.T) {
  296. reset()
  297. os.Setenv("SFTPGO_SFTPD__ENABLED_SSH_COMMANDS", "cd,scp")
  298. t.Cleanup(func() {
  299. os.Unsetenv("SFTPGO_SFTPD__ENABLED_SSH_COMMANDS")
  300. })
  301. configDir := ".."
  302. err := config.LoadConfig(configDir, "")
  303. assert.NoError(t, err)
  304. sftpdConf := config.GetSFTPDConfig()
  305. if assert.Len(t, sftpdConf.EnabledSSHCommands, 2) {
  306. assert.Equal(t, "cd", sftpdConf.EnabledSSHCommands[0])
  307. assert.Equal(t, "scp", sftpdConf.EnabledSSHCommands[1])
  308. }
  309. }
  310. func TestSMTPFromEnv(t *testing.T) {
  311. reset()
  312. os.Setenv("SFTPGO_SMTP__HOST", "smtp.example.com")
  313. os.Setenv("SFTPGO_SMTP__PORT", "587")
  314. t.Cleanup(func() {
  315. os.Unsetenv("SFTPGO_SMTP__HOST")
  316. os.Unsetenv("SFTPGO_SMTP__PORT")
  317. })
  318. configDir := ".."
  319. err := config.LoadConfig(configDir, "")
  320. assert.NoError(t, err)
  321. smtpConfig := config.GetSMTPConfig()
  322. assert.Equal(t, "smtp.example.com", smtpConfig.Host)
  323. assert.Equal(t, 587, smtpConfig.Port)
  324. }
  325. func TestMFAFromEnv(t *testing.T) {
  326. reset()
  327. os.Setenv("SFTPGO_MFA__TOTP__0__NAME", "main")
  328. os.Setenv("SFTPGO_MFA__TOTP__1__NAME", "additional_name")
  329. os.Setenv("SFTPGO_MFA__TOTP__1__ISSUER", "additional_issuer")
  330. os.Setenv("SFTPGO_MFA__TOTP__1__ALGO", "sha256")
  331. t.Cleanup(func() {
  332. os.Unsetenv("SFTPGO_MFA__TOTP__0__NAME")
  333. os.Unsetenv("SFTPGO_MFA__TOTP__1__NAME")
  334. os.Unsetenv("SFTPGO_MFA__TOTP__1__ISSUER")
  335. os.Unsetenv("SFTPGO_MFA__TOTP__1__ALGO")
  336. })
  337. configDir := ".."
  338. err := config.LoadConfig(configDir, "")
  339. assert.NoError(t, err)
  340. mfaConf := config.GetMFAConfig()
  341. require.Len(t, mfaConf.TOTP, 2)
  342. require.Equal(t, "main", mfaConf.TOTP[0].Name)
  343. require.Equal(t, "SFTPGo", mfaConf.TOTP[0].Issuer)
  344. require.Equal(t, "sha1", mfaConf.TOTP[0].Algo)
  345. require.Equal(t, "additional_name", mfaConf.TOTP[1].Name)
  346. require.Equal(t, "additional_issuer", mfaConf.TOTP[1].Issuer)
  347. require.Equal(t, "sha256", mfaConf.TOTP[1].Algo)
  348. }
  349. func TestDisabledMFAConfig(t *testing.T) {
  350. reset()
  351. configDir := ".."
  352. confName := tempConfigName + ".json"
  353. configFilePath := filepath.Join(configDir, confName)
  354. err := config.LoadConfig(configDir, "")
  355. assert.NoError(t, err)
  356. mfaConf := config.GetMFAConfig()
  357. assert.Len(t, mfaConf.TOTP, 1)
  358. reset()
  359. c := make(map[string]mfa.Config)
  360. c["mfa"] = mfa.Config{}
  361. jsonConf, err := json.Marshal(c)
  362. assert.NoError(t, err)
  363. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  364. assert.NoError(t, err)
  365. err = config.LoadConfig(configDir, confName)
  366. assert.NoError(t, err)
  367. mfaConf = config.GetMFAConfig()
  368. assert.Len(t, mfaConf.TOTP, 0)
  369. err = os.Remove(configFilePath)
  370. assert.NoError(t, err)
  371. }
  372. func TestPluginsFromEnv(t *testing.T) {
  373. reset()
  374. os.Setenv("SFTPGO_PLUGINS__0__TYPE", "notifier")
  375. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__FS_EVENTS", "upload,download")
  376. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__PROVIDER_EVENTS", "add,update")
  377. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__PROVIDER_OBJECTS", "user,admin")
  378. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__RETRY_MAX_TIME", "2")
  379. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__RETRY_QUEUE_MAX_SIZE", "1000")
  380. os.Setenv("SFTPGO_PLUGINS__0__CMD", "plugin_start_cmd")
  381. os.Setenv("SFTPGO_PLUGINS__0__ARGS", "arg1,arg2")
  382. os.Setenv("SFTPGO_PLUGINS__0__SHA256SUM", "0a71ded61fccd59c4f3695b51c1b3d180da8d2d77ea09ccee20dac242675c193")
  383. os.Setenv("SFTPGO_PLUGINS__0__AUTO_MTLS", "1")
  384. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__SCHEME", kms.SchemeAWS)
  385. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__ENCRYPTED_STATUS", kms.SecretStatusAWS)
  386. t.Cleanup(func() {
  387. os.Unsetenv("SFTPGO_PLUGINS__0__TYPE")
  388. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__FS_EVENTS")
  389. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__PROVIDER_EVENTS")
  390. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__PROVIDER_OBJECTS")
  391. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__RETRY_MAX_TIME")
  392. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__RETRY_QUEUE_MAX_SIZE")
  393. os.Unsetenv("SFTPGO_PLUGINS__0__CMD")
  394. os.Unsetenv("SFTPGO_PLUGINS__0__ARGS")
  395. os.Unsetenv("SFTPGO_PLUGINS__0__SHA256SUM")
  396. os.Unsetenv("SFTPGO_PLUGINS__0__AUTO_MTLS")
  397. os.Unsetenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__SCHEME")
  398. os.Unsetenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__ENCRYPTED_STATUS")
  399. })
  400. configDir := ".."
  401. err := config.LoadConfig(configDir, "")
  402. assert.NoError(t, err)
  403. pluginsConf := config.GetPluginsConfig()
  404. require.Len(t, pluginsConf, 1)
  405. pluginConf := pluginsConf[0]
  406. require.Equal(t, "notifier", pluginConf.Type)
  407. require.Len(t, pluginConf.NotifierOptions.FsEvents, 2)
  408. require.True(t, util.IsStringInSlice("upload", pluginConf.NotifierOptions.FsEvents))
  409. require.True(t, util.IsStringInSlice("download", pluginConf.NotifierOptions.FsEvents))
  410. require.Len(t, pluginConf.NotifierOptions.ProviderEvents, 2)
  411. require.Equal(t, "add", pluginConf.NotifierOptions.ProviderEvents[0])
  412. require.Equal(t, "update", pluginConf.NotifierOptions.ProviderEvents[1])
  413. require.Len(t, pluginConf.NotifierOptions.ProviderObjects, 2)
  414. require.Equal(t, "user", pluginConf.NotifierOptions.ProviderObjects[0])
  415. require.Equal(t, "admin", pluginConf.NotifierOptions.ProviderObjects[1])
  416. require.Equal(t, 2, pluginConf.NotifierOptions.RetryMaxTime)
  417. require.Equal(t, 1000, pluginConf.NotifierOptions.RetryQueueMaxSize)
  418. require.Equal(t, "plugin_start_cmd", pluginConf.Cmd)
  419. require.Len(t, pluginConf.Args, 2)
  420. require.Equal(t, "arg1", pluginConf.Args[0])
  421. require.Equal(t, "arg2", pluginConf.Args[1])
  422. require.Equal(t, "0a71ded61fccd59c4f3695b51c1b3d180da8d2d77ea09ccee20dac242675c193", pluginConf.SHA256Sum)
  423. require.True(t, pluginConf.AutoMTLS)
  424. require.Equal(t, kms.SchemeAWS, pluginConf.KMSOptions.Scheme)
  425. require.Equal(t, kms.SecretStatusAWS, pluginConf.KMSOptions.EncryptedStatus)
  426. configAsJSON, err := json.Marshal(pluginsConf)
  427. require.NoError(t, err)
  428. confName := tempConfigName + ".json"
  429. configFilePath := filepath.Join(configDir, confName)
  430. err = os.WriteFile(configFilePath, configAsJSON, os.ModePerm)
  431. assert.NoError(t, err)
  432. os.Setenv("SFTPGO_PLUGINS__0__CMD", "plugin_start_cmd1")
  433. os.Setenv("SFTPGO_PLUGINS__0__ARGS", "")
  434. os.Setenv("SFTPGO_PLUGINS__0__AUTO_MTLS", "0")
  435. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__SCHEME", kms.SchemeVaultTransit)
  436. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__ENCRYPTED_STATUS", kms.SecretStatusVaultTransit)
  437. err = config.LoadConfig(configDir, confName)
  438. assert.NoError(t, err)
  439. pluginsConf = config.GetPluginsConfig()
  440. require.Len(t, pluginsConf, 1)
  441. pluginConf = pluginsConf[0]
  442. require.Equal(t, "notifier", pluginConf.Type)
  443. require.Len(t, pluginConf.NotifierOptions.FsEvents, 2)
  444. require.True(t, util.IsStringInSlice("upload", pluginConf.NotifierOptions.FsEvents))
  445. require.True(t, util.IsStringInSlice("download", pluginConf.NotifierOptions.FsEvents))
  446. require.Len(t, pluginConf.NotifierOptions.ProviderEvents, 2)
  447. require.Equal(t, "add", pluginConf.NotifierOptions.ProviderEvents[0])
  448. require.Equal(t, "update", pluginConf.NotifierOptions.ProviderEvents[1])
  449. require.Len(t, pluginConf.NotifierOptions.ProviderObjects, 2)
  450. require.Equal(t, "user", pluginConf.NotifierOptions.ProviderObjects[0])
  451. require.Equal(t, "admin", pluginConf.NotifierOptions.ProviderObjects[1])
  452. require.Equal(t, 2, pluginConf.NotifierOptions.RetryMaxTime)
  453. require.Equal(t, 1000, pluginConf.NotifierOptions.RetryQueueMaxSize)
  454. require.Equal(t, "plugin_start_cmd1", pluginConf.Cmd)
  455. require.Len(t, pluginConf.Args, 0)
  456. require.Equal(t, "0a71ded61fccd59c4f3695b51c1b3d180da8d2d77ea09ccee20dac242675c193", pluginConf.SHA256Sum)
  457. require.False(t, pluginConf.AutoMTLS)
  458. require.Equal(t, kms.SchemeVaultTransit, pluginConf.KMSOptions.Scheme)
  459. require.Equal(t, kms.SecretStatusVaultTransit, pluginConf.KMSOptions.EncryptedStatus)
  460. err = os.Remove(configFilePath)
  461. assert.NoError(t, err)
  462. }
  463. func TestRateLimitersFromEnv(t *testing.T) {
  464. reset()
  465. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__AVERAGE", "100")
  466. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__PERIOD", "2000")
  467. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__BURST", "10")
  468. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__TYPE", "2")
  469. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__PROTOCOLS", "SSH, FTP")
  470. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__GENERATE_DEFENDER_EVENTS", "1")
  471. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__ENTRIES_SOFT_LIMIT", "50")
  472. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__ENTRIES_HARD_LIMIT", "100")
  473. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__ALLOW_LIST", ", 172.16.2.4, ")
  474. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__8__AVERAGE", "50")
  475. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__8__ALLOW_LIST", "192.168.1.1, 192.168.2.0/24")
  476. t.Cleanup(func() {
  477. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__AVERAGE")
  478. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__PERIOD")
  479. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__BURST")
  480. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__TYPE")
  481. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__PROTOCOLS")
  482. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__GENERATE_DEFENDER_EVENTS")
  483. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__ENTRIES_SOFT_LIMIT")
  484. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__ENTRIES_HARD_LIMIT")
  485. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__ALLOW_LIST")
  486. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__8__AVERAGE")
  487. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__8__ALLOW_LIST")
  488. })
  489. configDir := ".."
  490. err := config.LoadConfig(configDir, "")
  491. assert.NoError(t, err)
  492. limiters := config.GetCommonConfig().RateLimitersConfig
  493. require.Len(t, limiters, 2)
  494. require.Equal(t, int64(100), limiters[0].Average)
  495. require.Equal(t, int64(2000), limiters[0].Period)
  496. require.Equal(t, 10, limiters[0].Burst)
  497. require.Equal(t, 2, limiters[0].Type)
  498. protocols := limiters[0].Protocols
  499. require.Len(t, protocols, 2)
  500. require.True(t, util.IsStringInSlice(common.ProtocolFTP, protocols))
  501. require.True(t, util.IsStringInSlice(common.ProtocolSSH, protocols))
  502. require.True(t, limiters[0].GenerateDefenderEvents)
  503. require.Equal(t, 50, limiters[0].EntriesSoftLimit)
  504. require.Equal(t, 100, limiters[0].EntriesHardLimit)
  505. require.Len(t, limiters[0].AllowList, 1)
  506. require.Equal(t, "172.16.2.4", limiters[0].AllowList[0])
  507. require.Equal(t, int64(50), limiters[1].Average)
  508. require.Len(t, limiters[1].AllowList, 2)
  509. require.Equal(t, "192.168.1.1", limiters[1].AllowList[0])
  510. require.Equal(t, "192.168.2.0/24", limiters[1].AllowList[1])
  511. // we check the default values here
  512. require.Equal(t, int64(1000), limiters[1].Period)
  513. require.Equal(t, 1, limiters[1].Burst)
  514. require.Equal(t, 2, limiters[1].Type)
  515. protocols = limiters[1].Protocols
  516. require.Len(t, protocols, 4)
  517. require.True(t, util.IsStringInSlice(common.ProtocolFTP, protocols))
  518. require.True(t, util.IsStringInSlice(common.ProtocolSSH, protocols))
  519. require.True(t, util.IsStringInSlice(common.ProtocolWebDAV, protocols))
  520. require.True(t, util.IsStringInSlice(common.ProtocolHTTP, protocols))
  521. require.False(t, limiters[1].GenerateDefenderEvents)
  522. require.Equal(t, 100, limiters[1].EntriesSoftLimit)
  523. require.Equal(t, 150, limiters[1].EntriesHardLimit)
  524. }
  525. func TestSFTPDBindingsFromEnv(t *testing.T) {
  526. reset()
  527. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  528. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__PORT", "2200")
  529. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__APPLY_PROXY_CONFIG", "false")
  530. os.Setenv("SFTPGO_SFTPD__BINDINGS__3__ADDRESS", "127.0.1.1")
  531. os.Setenv("SFTPGO_SFTPD__BINDINGS__3__PORT", "2203")
  532. t.Cleanup(func() {
  533. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS")
  534. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__PORT")
  535. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__APPLY_PROXY_CONFIG")
  536. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__3__ADDRESS")
  537. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__3__PORT")
  538. })
  539. configDir := ".."
  540. err := config.LoadConfig(configDir, "")
  541. assert.NoError(t, err)
  542. bindings := config.GetSFTPDConfig().Bindings
  543. require.Len(t, bindings, 2)
  544. require.Equal(t, 2200, bindings[0].Port)
  545. require.Equal(t, "127.0.0.1", bindings[0].Address)
  546. require.False(t, bindings[0].ApplyProxyConfig)
  547. require.Equal(t, 2203, bindings[1].Port)
  548. require.Equal(t, "127.0.1.1", bindings[1].Address)
  549. require.True(t, bindings[1].ApplyProxyConfig) // default value
  550. }
  551. func TestFTPDBindingsFromEnv(t *testing.T) {
  552. reset()
  553. os.Setenv("SFTPGO_FTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  554. os.Setenv("SFTPGO_FTPD__BINDINGS__0__PORT", "2200")
  555. os.Setenv("SFTPGO_FTPD__BINDINGS__0__APPLY_PROXY_CONFIG", "f")
  556. os.Setenv("SFTPGO_FTPD__BINDINGS__0__TLS_MODE", "2")
  557. os.Setenv("SFTPGO_FTPD__BINDINGS__0__FORCE_PASSIVE_IP", "127.0.1.2")
  558. os.Setenv("SFTPGO_FTPD__BINDINGS__0__TLS_CIPHER_SUITES", "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256")
  559. os.Setenv("SFTPGO_FTPD__BINDINGS__0__PASSIVE_CONNECTIONS_SECURITY", "1")
  560. os.Setenv("SFTPGO_FTPD__BINDINGS__9__ADDRESS", "127.0.1.1")
  561. os.Setenv("SFTPGO_FTPD__BINDINGS__9__PORT", "2203")
  562. os.Setenv("SFTPGO_FTPD__BINDINGS__9__TLS_MODE", "1")
  563. os.Setenv("SFTPGO_FTPD__BINDINGS__9__FORCE_PASSIVE_IP", "127.0.1.1")
  564. os.Setenv("SFTPGO_FTPD__BINDINGS__9__CLIENT_AUTH_TYPE", "2")
  565. os.Setenv("SFTPGO_FTPD__BINDINGS__9__DEBUG", "1")
  566. os.Setenv("SFTPGO_FTPD__BINDINGS__9__ACTIVE_CONNECTIONS_SECURITY", "1")
  567. t.Cleanup(func() {
  568. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__ADDRESS")
  569. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__PORT")
  570. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__APPLY_PROXY_CONFIG")
  571. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__TLS_MODE")
  572. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__FORCE_PASSIVE_IP")
  573. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__TLS_CIPHER_SUITES")
  574. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__ACTIVE_CONNECTIONS_SECURITY")
  575. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__ADDRESS")
  576. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__PORT")
  577. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__TLS_MODE")
  578. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__FORCE_PASSIVE_IP")
  579. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__CLIENT_AUTH_TYPE")
  580. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__DEBUG")
  581. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__ACTIVE_CONNECTIONS_SECURITY")
  582. })
  583. configDir := ".."
  584. err := config.LoadConfig(configDir, "")
  585. assert.NoError(t, err)
  586. bindings := config.GetFTPDConfig().Bindings
  587. require.Len(t, bindings, 2)
  588. require.Equal(t, 2200, bindings[0].Port)
  589. require.Equal(t, "127.0.0.1", bindings[0].Address)
  590. require.False(t, bindings[0].ApplyProxyConfig)
  591. require.Equal(t, 2, bindings[0].TLSMode)
  592. require.Equal(t, "127.0.1.2", bindings[0].ForcePassiveIP)
  593. require.Equal(t, 0, bindings[0].ClientAuthType)
  594. require.Len(t, bindings[0].TLSCipherSuites, 2)
  595. require.Equal(t, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", bindings[0].TLSCipherSuites[0])
  596. require.Equal(t, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", bindings[0].TLSCipherSuites[1])
  597. require.False(t, bindings[0].Debug)
  598. require.Equal(t, 1, bindings[0].PassiveConnectionsSecurity)
  599. require.Equal(t, 0, bindings[0].ActiveConnectionsSecurity)
  600. require.Equal(t, 2203, bindings[1].Port)
  601. require.Equal(t, "127.0.1.1", bindings[1].Address)
  602. require.True(t, bindings[1].ApplyProxyConfig) // default value
  603. require.Equal(t, 1, bindings[1].TLSMode)
  604. require.Equal(t, "127.0.1.1", bindings[1].ForcePassiveIP)
  605. require.Equal(t, 2, bindings[1].ClientAuthType)
  606. require.Nil(t, bindings[1].TLSCipherSuites)
  607. require.Equal(t, 0, bindings[1].PassiveConnectionsSecurity)
  608. require.Equal(t, 1, bindings[1].ActiveConnectionsSecurity)
  609. require.True(t, bindings[1].Debug)
  610. }
  611. func TestWebDAVBindingsFromEnv(t *testing.T) {
  612. reset()
  613. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__ADDRESS", "127.0.0.1")
  614. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__PORT", "8000")
  615. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS", "0")
  616. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_CIPHER_SUITES", "TLS_RSA_WITH_AES_128_CBC_SHA ")
  617. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_ALLOWED", "192.168.10.1")
  618. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__ADDRESS", "127.0.1.1")
  619. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__PORT", "9000")
  620. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__ENABLE_HTTPS", "1")
  621. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__CLIENT_AUTH_TYPE", "1")
  622. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__PREFIX", "/dav2")
  623. t.Cleanup(func() {
  624. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__ADDRESS")
  625. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__PORT")
  626. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS")
  627. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_CIPHER_SUITES")
  628. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_ALLOWED")
  629. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__ADDRESS")
  630. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__PORT")
  631. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__ENABLE_HTTPS")
  632. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__CLIENT_AUTH_TYPE")
  633. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__PREFIX")
  634. })
  635. configDir := ".."
  636. err := config.LoadConfig(configDir, "")
  637. assert.NoError(t, err)
  638. bindings := config.GetWebDAVDConfig().Bindings
  639. require.Len(t, bindings, 3)
  640. require.Equal(t, 0, bindings[0].Port)
  641. require.Empty(t, bindings[0].Address)
  642. require.False(t, bindings[0].EnableHTTPS)
  643. require.Len(t, bindings[0].TLSCipherSuites, 0)
  644. require.Empty(t, bindings[0].Prefix)
  645. require.Equal(t, 8000, bindings[1].Port)
  646. require.Equal(t, "127.0.0.1", bindings[1].Address)
  647. require.False(t, bindings[1].EnableHTTPS)
  648. require.Equal(t, 0, bindings[1].ClientAuthType)
  649. require.Len(t, bindings[1].TLSCipherSuites, 1)
  650. require.Equal(t, "TLS_RSA_WITH_AES_128_CBC_SHA", bindings[1].TLSCipherSuites[0])
  651. require.Equal(t, "192.168.10.1", bindings[1].ProxyAllowed[0])
  652. require.Empty(t, bindings[1].Prefix)
  653. require.Equal(t, 9000, bindings[2].Port)
  654. require.Equal(t, "127.0.1.1", bindings[2].Address)
  655. require.True(t, bindings[2].EnableHTTPS)
  656. require.Equal(t, 1, bindings[2].ClientAuthType)
  657. require.Nil(t, bindings[2].TLSCipherSuites)
  658. require.Equal(t, "/dav2", bindings[2].Prefix)
  659. }
  660. func TestHTTPDBindingsFromEnv(t *testing.T) {
  661. reset()
  662. sockPath := filepath.Clean(os.TempDir())
  663. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__ADDRESS", sockPath)
  664. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__PORT", "0")
  665. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__TLS_CIPHER_SUITES", " TLS_AES_128_GCM_SHA256")
  666. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__ADDRESS", "127.0.0.1")
  667. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__PORT", "8000")
  668. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_HTTPS", "0")
  669. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__HIDE_LOGIN_URL", " 1")
  670. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ADDRESS", "127.0.1.1")
  671. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__PORT", "9000")
  672. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_ADMIN", "0")
  673. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_CLIENT", "0")
  674. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_HTTPS", "1 ")
  675. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE", "1")
  676. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__TLS_CIPHER_SUITES", " TLS_AES_256_GCM_SHA384 , TLS_CHACHA20_POLY1305_SHA256")
  677. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_ALLOWED", " 192.168.9.1 , 172.16.25.0/24")
  678. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__HIDE_LOGIN_URL", "3")
  679. t.Cleanup(func() {
  680. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__ADDRESS")
  681. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__PORT")
  682. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__TLS_CIPHER_SUITES")
  683. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__ADDRESS")
  684. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__PORT")
  685. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_HTTPS")
  686. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__HIDE_LOGIN_URL")
  687. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ADDRESS")
  688. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__PORT")
  689. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_HTTPS")
  690. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_ADMIN")
  691. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_CLIENT")
  692. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE")
  693. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__TLS_CIPHER_SUITES")
  694. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_ALLOWED")
  695. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__HIDE_LOGIN_URL")
  696. })
  697. configDir := ".."
  698. err := config.LoadConfig(configDir, "")
  699. assert.NoError(t, err)
  700. bindings := config.GetHTTPDConfig().Bindings
  701. require.Len(t, bindings, 3)
  702. require.Equal(t, 0, bindings[0].Port)
  703. require.Equal(t, sockPath, bindings[0].Address)
  704. require.False(t, bindings[0].EnableHTTPS)
  705. require.True(t, bindings[0].EnableWebAdmin)
  706. require.True(t, bindings[0].EnableWebClient)
  707. require.Len(t, bindings[0].TLSCipherSuites, 1)
  708. require.Equal(t, "TLS_AES_128_GCM_SHA256", bindings[0].TLSCipherSuites[0])
  709. require.Equal(t, 0, bindings[0].HideLoginURL)
  710. require.Equal(t, 8000, bindings[1].Port)
  711. require.Equal(t, "127.0.0.1", bindings[1].Address)
  712. require.False(t, bindings[1].EnableHTTPS)
  713. require.True(t, bindings[1].EnableWebAdmin)
  714. require.True(t, bindings[1].EnableWebClient)
  715. require.Nil(t, bindings[1].TLSCipherSuites)
  716. require.Equal(t, 1, bindings[1].HideLoginURL)
  717. require.Equal(t, 9000, bindings[2].Port)
  718. require.Equal(t, "127.0.1.1", bindings[2].Address)
  719. require.True(t, bindings[2].EnableHTTPS)
  720. require.False(t, bindings[2].EnableWebAdmin)
  721. require.False(t, bindings[2].EnableWebClient)
  722. require.Equal(t, 1, bindings[2].ClientAuthType)
  723. require.Len(t, bindings[2].TLSCipherSuites, 2)
  724. require.Equal(t, "TLS_AES_256_GCM_SHA384", bindings[2].TLSCipherSuites[0])
  725. require.Equal(t, "TLS_CHACHA20_POLY1305_SHA256", bindings[2].TLSCipherSuites[1])
  726. require.Len(t, bindings[2].ProxyAllowed, 2)
  727. require.Equal(t, "192.168.9.1", bindings[2].ProxyAllowed[0])
  728. require.Equal(t, "172.16.25.0/24", bindings[2].ProxyAllowed[1])
  729. require.Equal(t, 3, bindings[2].HideLoginURL)
  730. }
  731. func TestHTTPClientCertificatesFromEnv(t *testing.T) {
  732. reset()
  733. configDir := ".."
  734. confName := tempConfigName + ".json"
  735. configFilePath := filepath.Join(configDir, confName)
  736. err := config.LoadConfig(configDir, "")
  737. assert.NoError(t, err)
  738. httpConf := config.GetHTTPConfig()
  739. httpConf.Certificates = append(httpConf.Certificates, httpclient.TLSKeyPair{
  740. Cert: "cert",
  741. Key: "key",
  742. })
  743. c := make(map[string]httpclient.Config)
  744. c["http"] = httpConf
  745. jsonConf, err := json.Marshal(c)
  746. require.NoError(t, err)
  747. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  748. require.NoError(t, err)
  749. err = config.LoadConfig(configDir, confName)
  750. require.NoError(t, err)
  751. require.Len(t, config.GetHTTPConfig().Certificates, 1)
  752. require.Equal(t, "cert", config.GetHTTPConfig().Certificates[0].Cert)
  753. require.Equal(t, "key", config.GetHTTPConfig().Certificates[0].Key)
  754. os.Setenv("SFTPGO_HTTP__CERTIFICATES__0__CERT", "cert0")
  755. os.Setenv("SFTPGO_HTTP__CERTIFICATES__0__KEY", "key0")
  756. os.Setenv("SFTPGO_HTTP__CERTIFICATES__8__CERT", "cert8")
  757. os.Setenv("SFTPGO_HTTP__CERTIFICATES__9__CERT", "cert9")
  758. os.Setenv("SFTPGO_HTTP__CERTIFICATES__9__KEY", "key9")
  759. t.Cleanup(func() {
  760. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__0__CERT")
  761. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__0__KEY")
  762. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__8__CERT")
  763. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__9__CERT")
  764. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__9__KEY")
  765. })
  766. err = config.LoadConfig(configDir, confName)
  767. require.NoError(t, err)
  768. require.Len(t, config.GetHTTPConfig().Certificates, 2)
  769. require.Equal(t, "cert0", config.GetHTTPConfig().Certificates[0].Cert)
  770. require.Equal(t, "key0", config.GetHTTPConfig().Certificates[0].Key)
  771. require.Equal(t, "cert9", config.GetHTTPConfig().Certificates[1].Cert)
  772. require.Equal(t, "key9", config.GetHTTPConfig().Certificates[1].Key)
  773. err = os.Remove(configFilePath)
  774. assert.NoError(t, err)
  775. config.Init()
  776. err = config.LoadConfig(configDir, "")
  777. require.NoError(t, err)
  778. require.Len(t, config.GetHTTPConfig().Certificates, 2)
  779. require.Equal(t, "cert0", config.GetHTTPConfig().Certificates[0].Cert)
  780. require.Equal(t, "key0", config.GetHTTPConfig().Certificates[0].Key)
  781. require.Equal(t, "cert9", config.GetHTTPConfig().Certificates[1].Cert)
  782. require.Equal(t, "key9", config.GetHTTPConfig().Certificates[1].Key)
  783. }
  784. func TestHTTPClientHeadersFromEnv(t *testing.T) {
  785. reset()
  786. configDir := ".."
  787. confName := tempConfigName + ".json"
  788. configFilePath := filepath.Join(configDir, confName)
  789. err := config.LoadConfig(configDir, "")
  790. assert.NoError(t, err)
  791. httpConf := config.GetHTTPConfig()
  792. httpConf.Headers = append(httpConf.Headers, httpclient.Header{
  793. Key: "key",
  794. Value: "value",
  795. URL: "url",
  796. })
  797. c := make(map[string]httpclient.Config)
  798. c["http"] = httpConf
  799. jsonConf, err := json.Marshal(c)
  800. require.NoError(t, err)
  801. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  802. require.NoError(t, err)
  803. err = config.LoadConfig(configDir, confName)
  804. require.NoError(t, err)
  805. require.Len(t, config.GetHTTPConfig().Headers, 1)
  806. require.Equal(t, "key", config.GetHTTPConfig().Headers[0].Key)
  807. require.Equal(t, "value", config.GetHTTPConfig().Headers[0].Value)
  808. require.Equal(t, "url", config.GetHTTPConfig().Headers[0].URL)
  809. os.Setenv("SFTPGO_HTTP__HEADERS__0__KEY", "key0")
  810. os.Setenv("SFTPGO_HTTP__HEADERS__0__VALUE", "value0")
  811. os.Setenv("SFTPGO_HTTP__HEADERS__0__URL", "url0")
  812. os.Setenv("SFTPGO_HTTP__HEADERS__8__KEY", "key8")
  813. os.Setenv("SFTPGO_HTTP__HEADERS__9__KEY", "key9")
  814. os.Setenv("SFTPGO_HTTP__HEADERS__9__VALUE", "value9")
  815. os.Setenv("SFTPGO_HTTP__HEADERS__9__URL", "url9")
  816. t.Cleanup(func() {
  817. os.Unsetenv("SFTPGO_HTTP__HEADERS__0__KEY")
  818. os.Unsetenv("SFTPGO_HTTP__HEADERS__0__VALUE")
  819. os.Unsetenv("SFTPGO_HTTP__HEADERS__0__URL")
  820. os.Unsetenv("SFTPGO_HTTP__HEADERS__8__KEY")
  821. os.Unsetenv("SFTPGO_HTTP__HEADERS__9__KEY")
  822. os.Unsetenv("SFTPGO_HTTP__HEADERS__9__VALUE")
  823. os.Unsetenv("SFTPGO_HTTP__HEADERS__9__URL")
  824. })
  825. err = config.LoadConfig(configDir, confName)
  826. require.NoError(t, err)
  827. require.Len(t, config.GetHTTPConfig().Headers, 2)
  828. require.Equal(t, "key0", config.GetHTTPConfig().Headers[0].Key)
  829. require.Equal(t, "value0", config.GetHTTPConfig().Headers[0].Value)
  830. require.Equal(t, "url0", config.GetHTTPConfig().Headers[0].URL)
  831. require.Equal(t, "key9", config.GetHTTPConfig().Headers[1].Key)
  832. require.Equal(t, "value9", config.GetHTTPConfig().Headers[1].Value)
  833. require.Equal(t, "url9", config.GetHTTPConfig().Headers[1].URL)
  834. err = os.Remove(configFilePath)
  835. assert.NoError(t, err)
  836. config.Init()
  837. err = config.LoadConfig(configDir, "")
  838. require.NoError(t, err)
  839. require.Len(t, config.GetHTTPConfig().Headers, 2)
  840. require.Equal(t, "key0", config.GetHTTPConfig().Headers[0].Key)
  841. require.Equal(t, "value0", config.GetHTTPConfig().Headers[0].Value)
  842. require.Equal(t, "url0", config.GetHTTPConfig().Headers[0].URL)
  843. require.Equal(t, "key9", config.GetHTTPConfig().Headers[1].Key)
  844. require.Equal(t, "value9", config.GetHTTPConfig().Headers[1].Value)
  845. require.Equal(t, "url9", config.GetHTTPConfig().Headers[1].URL)
  846. }
  847. func TestConfigFromEnv(t *testing.T) {
  848. reset()
  849. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  850. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__0__PORT", "12000")
  851. os.Setenv("SFTPGO_DATA_PROVIDER__PASSWORD_HASHING__ARGON2_OPTIONS__ITERATIONS", "41")
  852. os.Setenv("SFTPGO_DATA_PROVIDER__POOL_SIZE", "10")
  853. os.Setenv("SFTPGO_DATA_PROVIDER__IS_SHARED", "1")
  854. os.Setenv("SFTPGO_DATA_PROVIDER__ACTIONS__EXECUTE_ON", "add")
  855. os.Setenv("SFTPGO_KMS__SECRETS__URL", "local")
  856. os.Setenv("SFTPGO_KMS__SECRETS__MASTER_KEY_PATH", "path")
  857. os.Setenv("SFTPGO_TELEMETRY__TLS_CIPHER_SUITES", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA")
  858. t.Cleanup(func() {
  859. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS")
  860. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__0__PORT")
  861. os.Unsetenv("SFTPGO_DATA_PROVIDER__PASSWORD_HASHING__ARGON2_OPTIONS__ITERATIONS")
  862. os.Unsetenv("SFTPGO_DATA_PROVIDER__POOL_SIZE")
  863. os.Unsetenv("SFTPGO_DATA_PROVIDER__IS_SHARED")
  864. os.Unsetenv("SFTPGO_DATA_PROVIDER__ACTIONS__EXECUTE_ON")
  865. os.Unsetenv("SFTPGO_KMS__SECRETS__URL")
  866. os.Unsetenv("SFTPGO_KMS__SECRETS__MASTER_KEY_PATH")
  867. os.Unsetenv("SFTPGO_TELEMETRY__TLS_CIPHER_SUITES")
  868. })
  869. err := config.LoadConfig(".", "invalid config")
  870. assert.NoError(t, err)
  871. sftpdConfig := config.GetSFTPDConfig()
  872. assert.Equal(t, "127.0.0.1", sftpdConfig.Bindings[0].Address)
  873. assert.Equal(t, 12000, config.GetWebDAVDConfig().Bindings[0].Port)
  874. dataProviderConf := config.GetProviderConf()
  875. assert.Equal(t, uint32(41), dataProviderConf.PasswordHashing.Argon2Options.Iterations)
  876. assert.Equal(t, 10, dataProviderConf.PoolSize)
  877. assert.Equal(t, 1, dataProviderConf.IsShared)
  878. assert.Len(t, dataProviderConf.Actions.ExecuteOn, 1)
  879. assert.Contains(t, dataProviderConf.Actions.ExecuteOn, "add")
  880. kmsConfig := config.GetKMSConfig()
  881. assert.Equal(t, "local", kmsConfig.Secrets.URL)
  882. assert.Equal(t, "path", kmsConfig.Secrets.MasterKeyPath)
  883. telemetryConfig := config.GetTelemetryConfig()
  884. assert.Len(t, telemetryConfig.TLSCipherSuites, 2)
  885. assert.Equal(t, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", telemetryConfig.TLSCipherSuites[0])
  886. assert.Equal(t, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", telemetryConfig.TLSCipherSuites[1])
  887. }