config_test.go 33 KB

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