config_test.go 47 KB

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