config_test.go 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  1. package config_test
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "testing"
  8. sdkkms "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", sdkkms.SchemeAWS)
  422. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__ENCRYPTED_STATUS", sdkkms.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, sdkkms.SchemeAWS, pluginConf.KMSOptions.Scheme)
  464. require.Equal(t, sdkkms.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", sdkkms.SchemeVaultTransit)
  476. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__ENCRYPTED_STATUS", sdkkms.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, sdkkms.SchemeVaultTransit, pluginConf.KMSOptions.Scheme)
  499. require.Equal(t, sdkkms.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__FORCE_PASSIVE_IP", "127.0.1.1")
  606. os.Setenv("SFTPGO_FTPD__BINDINGS__9__PASSIVE_IP_OVERRIDES__3__IP", "192.168.1.1")
  607. os.Setenv("SFTPGO_FTPD__BINDINGS__9__PASSIVE_IP_OVERRIDES__3__NETWORKS", "192.168.1.0/24, 192.168.3.0/25")
  608. os.Setenv("SFTPGO_FTPD__BINDINGS__9__CLIENT_AUTH_TYPE", "2")
  609. os.Setenv("SFTPGO_FTPD__BINDINGS__9__DEBUG", "1")
  610. os.Setenv("SFTPGO_FTPD__BINDINGS__9__ACTIVE_CONNECTIONS_SECURITY", "1")
  611. t.Cleanup(func() {
  612. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__ADDRESS")
  613. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__PORT")
  614. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__APPLY_PROXY_CONFIG")
  615. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__TLS_MODE")
  616. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__FORCE_PASSIVE_IP")
  617. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__PASSIVE_IP_OVERRIDES__0__IP")
  618. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__TLS_CIPHER_SUITES")
  619. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__ACTIVE_CONNECTIONS_SECURITY")
  620. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__ADDRESS")
  621. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__PORT")
  622. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__TLS_MODE")
  623. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__FORCE_PASSIVE_IP")
  624. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__PASSIVE_IP_OVERRIDES__3__IP")
  625. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__PASSIVE_IP_OVERRIDES__3__NETWORKS")
  626. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__CLIENT_AUTH_TYPE")
  627. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__DEBUG")
  628. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__ACTIVE_CONNECTIONS_SECURITY")
  629. })
  630. configDir := ".."
  631. err := config.LoadConfig(configDir, "")
  632. assert.NoError(t, err)
  633. bindings := config.GetFTPDConfig().Bindings
  634. require.Len(t, bindings, 2)
  635. require.Equal(t, 2200, bindings[0].Port)
  636. require.Equal(t, "127.0.0.1", bindings[0].Address)
  637. require.False(t, bindings[0].ApplyProxyConfig)
  638. require.Equal(t, 2, bindings[0].TLSMode)
  639. require.Equal(t, "127.0.1.2", bindings[0].ForcePassiveIP)
  640. require.Len(t, bindings[0].PassiveIPOverrides, 0)
  641. require.Equal(t, 0, bindings[0].ClientAuthType)
  642. require.Len(t, bindings[0].TLSCipherSuites, 2)
  643. require.Equal(t, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", bindings[0].TLSCipherSuites[0])
  644. require.Equal(t, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", bindings[0].TLSCipherSuites[1])
  645. require.False(t, bindings[0].Debug)
  646. require.Equal(t, 1, bindings[0].PassiveConnectionsSecurity)
  647. require.Equal(t, 0, bindings[0].ActiveConnectionsSecurity)
  648. require.Equal(t, 2203, bindings[1].Port)
  649. require.Equal(t, "127.0.1.1", bindings[1].Address)
  650. require.True(t, bindings[1].ApplyProxyConfig) // default value
  651. require.Equal(t, 1, bindings[1].TLSMode)
  652. require.Equal(t, "127.0.1.1", bindings[1].ForcePassiveIP)
  653. require.Len(t, bindings[1].PassiveIPOverrides, 1)
  654. require.Equal(t, "192.168.1.1", bindings[1].PassiveIPOverrides[0].IP)
  655. require.Len(t, bindings[1].PassiveIPOverrides[0].Networks, 2)
  656. require.Equal(t, "192.168.1.0/24", bindings[1].PassiveIPOverrides[0].Networks[0])
  657. require.Equal(t, "192.168.3.0/25", bindings[1].PassiveIPOverrides[0].Networks[1])
  658. require.Equal(t, 2, bindings[1].ClientAuthType)
  659. require.Nil(t, bindings[1].TLSCipherSuites)
  660. require.Equal(t, 0, bindings[1].PassiveConnectionsSecurity)
  661. require.Equal(t, 1, bindings[1].ActiveConnectionsSecurity)
  662. require.True(t, bindings[1].Debug)
  663. }
  664. func TestWebDAVBindingsFromEnv(t *testing.T) {
  665. reset()
  666. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__ADDRESS", "127.0.0.1")
  667. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__PORT", "8000")
  668. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS", "0")
  669. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_CIPHER_SUITES", "TLS_RSA_WITH_AES_128_CBC_SHA ")
  670. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_ALLOWED", "192.168.10.1")
  671. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__ADDRESS", "127.0.1.1")
  672. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__PORT", "9000")
  673. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__ENABLE_HTTPS", "1")
  674. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__CLIENT_AUTH_TYPE", "1")
  675. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__PREFIX", "/dav2")
  676. t.Cleanup(func() {
  677. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__ADDRESS")
  678. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__PORT")
  679. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS")
  680. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_CIPHER_SUITES")
  681. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_ALLOWED")
  682. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__ADDRESS")
  683. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__PORT")
  684. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__ENABLE_HTTPS")
  685. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__CLIENT_AUTH_TYPE")
  686. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__PREFIX")
  687. })
  688. configDir := ".."
  689. err := config.LoadConfig(configDir, "")
  690. assert.NoError(t, err)
  691. bindings := config.GetWebDAVDConfig().Bindings
  692. require.Len(t, bindings, 3)
  693. require.Equal(t, 0, bindings[0].Port)
  694. require.Empty(t, bindings[0].Address)
  695. require.False(t, bindings[0].EnableHTTPS)
  696. require.Len(t, bindings[0].TLSCipherSuites, 0)
  697. require.Empty(t, bindings[0].Prefix)
  698. require.Equal(t, 8000, bindings[1].Port)
  699. require.Equal(t, "127.0.0.1", bindings[1].Address)
  700. require.False(t, bindings[1].EnableHTTPS)
  701. require.Equal(t, 0, bindings[1].ClientAuthType)
  702. require.Len(t, bindings[1].TLSCipherSuites, 1)
  703. require.Equal(t, "TLS_RSA_WITH_AES_128_CBC_SHA", bindings[1].TLSCipherSuites[0])
  704. require.Equal(t, "192.168.10.1", bindings[1].ProxyAllowed[0])
  705. require.Empty(t, bindings[1].Prefix)
  706. require.Equal(t, 9000, bindings[2].Port)
  707. require.Equal(t, "127.0.1.1", bindings[2].Address)
  708. require.True(t, bindings[2].EnableHTTPS)
  709. require.Equal(t, 1, bindings[2].ClientAuthType)
  710. require.Nil(t, bindings[2].TLSCipherSuites)
  711. require.Equal(t, "/dav2", bindings[2].Prefix)
  712. }
  713. func TestHTTPDBindingsFromEnv(t *testing.T) {
  714. reset()
  715. sockPath := filepath.Clean(os.TempDir())
  716. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__ADDRESS", sockPath)
  717. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__PORT", "0")
  718. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__TLS_CIPHER_SUITES", " TLS_AES_128_GCM_SHA256")
  719. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__ADDRESS", "127.0.0.1")
  720. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__PORT", "8000")
  721. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_HTTPS", "0")
  722. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__HIDE_LOGIN_URL", " 1")
  723. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ADDRESS", "127.0.1.1")
  724. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__PORT", "9000")
  725. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_ADMIN", "0")
  726. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_CLIENT", "0")
  727. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__RENDER_OPENAPI", "0")
  728. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_HTTPS", "1 ")
  729. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE", "1")
  730. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__TLS_CIPHER_SUITES", " TLS_AES_256_GCM_SHA384 , TLS_CHACHA20_POLY1305_SHA256")
  731. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_ALLOWED", " 192.168.9.1 , 172.16.25.0/24")
  732. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__HIDE_LOGIN_URL", "3")
  733. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__1__URL", "http://127.0.0.1/")
  734. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__1__FILE_EXTENSIONS", ".pdf, .txt")
  735. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__2__URL", "http://127.0.1.1/")
  736. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__3__FILE_EXTENSIONS", ".jpg, .txt")
  737. t.Cleanup(func() {
  738. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__ADDRESS")
  739. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__PORT")
  740. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__TLS_CIPHER_SUITES")
  741. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__ADDRESS")
  742. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__PORT")
  743. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_HTTPS")
  744. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__HIDE_LOGIN_URL")
  745. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ADDRESS")
  746. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__PORT")
  747. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_HTTPS")
  748. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_ADMIN")
  749. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_CLIENT")
  750. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__RENDER_OPENAPI")
  751. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE")
  752. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__TLS_CIPHER_SUITES")
  753. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_ALLOWED")
  754. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__HIDE_LOGIN_URL")
  755. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__1__URL")
  756. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__1__FILE_EXTENSIONS")
  757. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__2__URL")
  758. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__3__FILE_EXTENSIONS")
  759. })
  760. configDir := ".."
  761. err := config.LoadConfig(configDir, "")
  762. assert.NoError(t, err)
  763. bindings := config.GetHTTPDConfig().Bindings
  764. require.Len(t, bindings, 3)
  765. require.Equal(t, 0, bindings[0].Port)
  766. require.Equal(t, sockPath, bindings[0].Address)
  767. require.False(t, bindings[0].EnableHTTPS)
  768. require.True(t, bindings[0].EnableWebAdmin)
  769. require.True(t, bindings[0].EnableWebClient)
  770. require.True(t, bindings[0].RenderOpenAPI)
  771. require.Len(t, bindings[0].TLSCipherSuites, 1)
  772. require.Equal(t, "TLS_AES_128_GCM_SHA256", bindings[0].TLSCipherSuites[0])
  773. require.Equal(t, 0, bindings[0].HideLoginURL)
  774. require.Equal(t, 8000, bindings[1].Port)
  775. require.Equal(t, "127.0.0.1", bindings[1].Address)
  776. require.False(t, bindings[1].EnableHTTPS)
  777. require.True(t, bindings[1].EnableWebAdmin)
  778. require.True(t, bindings[1].EnableWebClient)
  779. require.True(t, bindings[1].RenderOpenAPI)
  780. require.Nil(t, bindings[1].TLSCipherSuites)
  781. require.Equal(t, 1, bindings[1].HideLoginURL)
  782. require.Equal(t, 9000, bindings[2].Port)
  783. require.Equal(t, "127.0.1.1", bindings[2].Address)
  784. require.True(t, bindings[2].EnableHTTPS)
  785. require.False(t, bindings[2].EnableWebAdmin)
  786. require.False(t, bindings[2].EnableWebClient)
  787. require.False(t, bindings[2].RenderOpenAPI)
  788. require.Equal(t, 1, bindings[2].ClientAuthType)
  789. require.Len(t, bindings[2].TLSCipherSuites, 2)
  790. require.Equal(t, "TLS_AES_256_GCM_SHA384", bindings[2].TLSCipherSuites[0])
  791. require.Equal(t, "TLS_CHACHA20_POLY1305_SHA256", bindings[2].TLSCipherSuites[1])
  792. require.Len(t, bindings[2].ProxyAllowed, 2)
  793. require.Equal(t, "192.168.9.1", bindings[2].ProxyAllowed[0])
  794. require.Equal(t, "172.16.25.0/24", bindings[2].ProxyAllowed[1])
  795. require.Equal(t, 3, bindings[2].HideLoginURL)
  796. require.Len(t, bindings[2].WebClientIntegrations, 1)
  797. require.Equal(t, "http://127.0.0.1/", bindings[2].WebClientIntegrations[0].URL)
  798. require.Equal(t, []string{".pdf", ".txt"}, bindings[2].WebClientIntegrations[0].FileExtensions)
  799. }
  800. func TestHTTPClientCertificatesFromEnv(t *testing.T) {
  801. reset()
  802. configDir := ".."
  803. confName := tempConfigName + ".json"
  804. configFilePath := filepath.Join(configDir, confName)
  805. err := config.LoadConfig(configDir, "")
  806. assert.NoError(t, err)
  807. httpConf := config.GetHTTPConfig()
  808. httpConf.Certificates = append(httpConf.Certificates, httpclient.TLSKeyPair{
  809. Cert: "cert",
  810. Key: "key",
  811. })
  812. c := make(map[string]httpclient.Config)
  813. c["http"] = httpConf
  814. jsonConf, err := json.Marshal(c)
  815. require.NoError(t, err)
  816. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  817. require.NoError(t, err)
  818. err = config.LoadConfig(configDir, confName)
  819. require.NoError(t, err)
  820. require.Len(t, config.GetHTTPConfig().Certificates, 1)
  821. require.Equal(t, "cert", config.GetHTTPConfig().Certificates[0].Cert)
  822. require.Equal(t, "key", config.GetHTTPConfig().Certificates[0].Key)
  823. os.Setenv("SFTPGO_HTTP__CERTIFICATES__0__CERT", "cert0")
  824. os.Setenv("SFTPGO_HTTP__CERTIFICATES__0__KEY", "key0")
  825. os.Setenv("SFTPGO_HTTP__CERTIFICATES__8__CERT", "cert8")
  826. os.Setenv("SFTPGO_HTTP__CERTIFICATES__9__CERT", "cert9")
  827. os.Setenv("SFTPGO_HTTP__CERTIFICATES__9__KEY", "key9")
  828. t.Cleanup(func() {
  829. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__0__CERT")
  830. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__0__KEY")
  831. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__8__CERT")
  832. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__9__CERT")
  833. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__9__KEY")
  834. })
  835. err = config.LoadConfig(configDir, confName)
  836. require.NoError(t, err)
  837. require.Len(t, config.GetHTTPConfig().Certificates, 2)
  838. require.Equal(t, "cert0", config.GetHTTPConfig().Certificates[0].Cert)
  839. require.Equal(t, "key0", config.GetHTTPConfig().Certificates[0].Key)
  840. require.Equal(t, "cert9", config.GetHTTPConfig().Certificates[1].Cert)
  841. require.Equal(t, "key9", config.GetHTTPConfig().Certificates[1].Key)
  842. err = os.Remove(configFilePath)
  843. assert.NoError(t, err)
  844. config.Init()
  845. err = config.LoadConfig(configDir, "")
  846. require.NoError(t, err)
  847. require.Len(t, config.GetHTTPConfig().Certificates, 2)
  848. require.Equal(t, "cert0", config.GetHTTPConfig().Certificates[0].Cert)
  849. require.Equal(t, "key0", config.GetHTTPConfig().Certificates[0].Key)
  850. require.Equal(t, "cert9", config.GetHTTPConfig().Certificates[1].Cert)
  851. require.Equal(t, "key9", config.GetHTTPConfig().Certificates[1].Key)
  852. }
  853. func TestHTTPClientHeadersFromEnv(t *testing.T) {
  854. reset()
  855. configDir := ".."
  856. confName := tempConfigName + ".json"
  857. configFilePath := filepath.Join(configDir, confName)
  858. err := config.LoadConfig(configDir, "")
  859. assert.NoError(t, err)
  860. httpConf := config.GetHTTPConfig()
  861. httpConf.Headers = append(httpConf.Headers, httpclient.Header{
  862. Key: "key",
  863. Value: "value",
  864. URL: "url",
  865. })
  866. c := make(map[string]httpclient.Config)
  867. c["http"] = httpConf
  868. jsonConf, err := json.Marshal(c)
  869. require.NoError(t, err)
  870. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  871. require.NoError(t, err)
  872. err = config.LoadConfig(configDir, confName)
  873. require.NoError(t, err)
  874. require.Len(t, config.GetHTTPConfig().Headers, 1)
  875. require.Equal(t, "key", config.GetHTTPConfig().Headers[0].Key)
  876. require.Equal(t, "value", config.GetHTTPConfig().Headers[0].Value)
  877. require.Equal(t, "url", config.GetHTTPConfig().Headers[0].URL)
  878. os.Setenv("SFTPGO_HTTP__HEADERS__0__KEY", "key0")
  879. os.Setenv("SFTPGO_HTTP__HEADERS__0__VALUE", "value0")
  880. os.Setenv("SFTPGO_HTTP__HEADERS__0__URL", "url0")
  881. os.Setenv("SFTPGO_HTTP__HEADERS__8__KEY", "key8")
  882. os.Setenv("SFTPGO_HTTP__HEADERS__9__KEY", "key9")
  883. os.Setenv("SFTPGO_HTTP__HEADERS__9__VALUE", "value9")
  884. os.Setenv("SFTPGO_HTTP__HEADERS__9__URL", "url9")
  885. t.Cleanup(func() {
  886. os.Unsetenv("SFTPGO_HTTP__HEADERS__0__KEY")
  887. os.Unsetenv("SFTPGO_HTTP__HEADERS__0__VALUE")
  888. os.Unsetenv("SFTPGO_HTTP__HEADERS__0__URL")
  889. os.Unsetenv("SFTPGO_HTTP__HEADERS__8__KEY")
  890. os.Unsetenv("SFTPGO_HTTP__HEADERS__9__KEY")
  891. os.Unsetenv("SFTPGO_HTTP__HEADERS__9__VALUE")
  892. os.Unsetenv("SFTPGO_HTTP__HEADERS__9__URL")
  893. })
  894. err = config.LoadConfig(configDir, confName)
  895. require.NoError(t, err)
  896. require.Len(t, config.GetHTTPConfig().Headers, 2)
  897. require.Equal(t, "key0", config.GetHTTPConfig().Headers[0].Key)
  898. require.Equal(t, "value0", config.GetHTTPConfig().Headers[0].Value)
  899. require.Equal(t, "url0", config.GetHTTPConfig().Headers[0].URL)
  900. require.Equal(t, "key9", config.GetHTTPConfig().Headers[1].Key)
  901. require.Equal(t, "value9", config.GetHTTPConfig().Headers[1].Value)
  902. require.Equal(t, "url9", config.GetHTTPConfig().Headers[1].URL)
  903. err = os.Remove(configFilePath)
  904. assert.NoError(t, err)
  905. config.Init()
  906. err = config.LoadConfig(configDir, "")
  907. require.NoError(t, err)
  908. require.Len(t, config.GetHTTPConfig().Headers, 2)
  909. require.Equal(t, "key0", config.GetHTTPConfig().Headers[0].Key)
  910. require.Equal(t, "value0", config.GetHTTPConfig().Headers[0].Value)
  911. require.Equal(t, "url0", config.GetHTTPConfig().Headers[0].URL)
  912. require.Equal(t, "key9", config.GetHTTPConfig().Headers[1].Key)
  913. require.Equal(t, "value9", config.GetHTTPConfig().Headers[1].Value)
  914. require.Equal(t, "url9", config.GetHTTPConfig().Headers[1].URL)
  915. }
  916. func TestConfigFromEnv(t *testing.T) {
  917. reset()
  918. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  919. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__0__PORT", "12000")
  920. os.Setenv("SFTPGO_DATA_PROVIDER__PASSWORD_HASHING__ARGON2_OPTIONS__ITERATIONS", "41")
  921. os.Setenv("SFTPGO_DATA_PROVIDER__POOL_SIZE", "10")
  922. os.Setenv("SFTPGO_DATA_PROVIDER__IS_SHARED", "1")
  923. os.Setenv("SFTPGO_DATA_PROVIDER__ACTIONS__EXECUTE_ON", "add")
  924. os.Setenv("SFTPGO_KMS__SECRETS__URL", "local")
  925. os.Setenv("SFTPGO_KMS__SECRETS__MASTER_KEY_PATH", "path")
  926. os.Setenv("SFTPGO_TELEMETRY__TLS_CIPHER_SUITES", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA")
  927. t.Cleanup(func() {
  928. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS")
  929. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__0__PORT")
  930. os.Unsetenv("SFTPGO_DATA_PROVIDER__PASSWORD_HASHING__ARGON2_OPTIONS__ITERATIONS")
  931. os.Unsetenv("SFTPGO_DATA_PROVIDER__POOL_SIZE")
  932. os.Unsetenv("SFTPGO_DATA_PROVIDER__IS_SHARED")
  933. os.Unsetenv("SFTPGO_DATA_PROVIDER__ACTIONS__EXECUTE_ON")
  934. os.Unsetenv("SFTPGO_KMS__SECRETS__URL")
  935. os.Unsetenv("SFTPGO_KMS__SECRETS__MASTER_KEY_PATH")
  936. os.Unsetenv("SFTPGO_TELEMETRY__TLS_CIPHER_SUITES")
  937. })
  938. err := config.LoadConfig(".", "invalid config")
  939. assert.NoError(t, err)
  940. sftpdConfig := config.GetSFTPDConfig()
  941. assert.Equal(t, "127.0.0.1", sftpdConfig.Bindings[0].Address)
  942. assert.Equal(t, 12000, config.GetWebDAVDConfig().Bindings[0].Port)
  943. dataProviderConf := config.GetProviderConf()
  944. assert.Equal(t, uint32(41), dataProviderConf.PasswordHashing.Argon2Options.Iterations)
  945. assert.Equal(t, 10, dataProviderConf.PoolSize)
  946. assert.Equal(t, 1, dataProviderConf.IsShared)
  947. assert.Len(t, dataProviderConf.Actions.ExecuteOn, 1)
  948. assert.Contains(t, dataProviderConf.Actions.ExecuteOn, "add")
  949. kmsConfig := config.GetKMSConfig()
  950. assert.Equal(t, "local", kmsConfig.Secrets.URL)
  951. assert.Equal(t, "path", kmsConfig.Secrets.MasterKeyPath)
  952. telemetryConfig := config.GetTelemetryConfig()
  953. assert.Len(t, telemetryConfig.TLSCipherSuites, 2)
  954. assert.Equal(t, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", telemetryConfig.TLSCipherSuites[0])
  955. assert.Equal(t, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", telemetryConfig.TLSCipherSuites[1])
  956. }