config_test.go 50 KB

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