config_test.go 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. package config_test
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "testing"
  8. "github.com/spf13/viper"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. "github.com/drakkan/sftpgo/v2/common"
  12. "github.com/drakkan/sftpgo/v2/config"
  13. "github.com/drakkan/sftpgo/v2/dataprovider"
  14. "github.com/drakkan/sftpgo/v2/ftpd"
  15. "github.com/drakkan/sftpgo/v2/httpclient"
  16. "github.com/drakkan/sftpgo/v2/httpd"
  17. "github.com/drakkan/sftpgo/v2/kms"
  18. "github.com/drakkan/sftpgo/v2/mfa"
  19. "github.com/drakkan/sftpgo/v2/sdk/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 TestSetGetConfig(t *testing.T) {
  227. reset()
  228. sftpdConf := config.GetSFTPDConfig()
  229. sftpdConf.MaxAuthTries = 10
  230. config.SetSFTPDConfig(sftpdConf)
  231. assert.Equal(t, sftpdConf.MaxAuthTries, config.GetSFTPDConfig().MaxAuthTries)
  232. dataProviderConf := config.GetProviderConf()
  233. dataProviderConf.Host = "test host"
  234. config.SetProviderConf(dataProviderConf)
  235. assert.Equal(t, dataProviderConf.Host, config.GetProviderConf().Host)
  236. httpdConf := config.GetHTTPDConfig()
  237. httpdConf.Bindings = append(httpdConf.Bindings, httpd.Binding{Address: "0.0.0.0"})
  238. config.SetHTTPDConfig(httpdConf)
  239. assert.Equal(t, httpdConf.Bindings[0].Address, config.GetHTTPDConfig().Bindings[0].Address)
  240. commonConf := config.GetCommonConfig()
  241. commonConf.IdleTimeout = 10
  242. config.SetCommonConfig(commonConf)
  243. assert.Equal(t, commonConf.IdleTimeout, config.GetCommonConfig().IdleTimeout)
  244. ftpdConf := config.GetFTPDConfig()
  245. ftpdConf.CertificateFile = "cert"
  246. ftpdConf.CertificateKeyFile = "key"
  247. config.SetFTPDConfig(ftpdConf)
  248. assert.Equal(t, ftpdConf.CertificateFile, config.GetFTPDConfig().CertificateFile)
  249. assert.Equal(t, ftpdConf.CertificateKeyFile, config.GetFTPDConfig().CertificateKeyFile)
  250. webDavConf := config.GetWebDAVDConfig()
  251. webDavConf.CertificateFile = "dav_cert"
  252. webDavConf.CertificateKeyFile = "dav_key"
  253. config.SetWebDAVDConfig(webDavConf)
  254. assert.Equal(t, webDavConf.CertificateFile, config.GetWebDAVDConfig().CertificateFile)
  255. assert.Equal(t, webDavConf.CertificateKeyFile, config.GetWebDAVDConfig().CertificateKeyFile)
  256. kmsConf := config.GetKMSConfig()
  257. kmsConf.Secrets.MasterKeyPath = "apath"
  258. kmsConf.Secrets.URL = "aurl"
  259. config.SetKMSConfig(kmsConf)
  260. assert.Equal(t, kmsConf.Secrets.MasterKeyPath, config.GetKMSConfig().Secrets.MasterKeyPath)
  261. assert.Equal(t, kmsConf.Secrets.URL, config.GetKMSConfig().Secrets.URL)
  262. telemetryConf := config.GetTelemetryConfig()
  263. telemetryConf.BindPort = 10001
  264. telemetryConf.BindAddress = "0.0.0.0"
  265. config.SetTelemetryConfig(telemetryConf)
  266. assert.Equal(t, telemetryConf.BindPort, config.GetTelemetryConfig().BindPort)
  267. assert.Equal(t, telemetryConf.BindAddress, config.GetTelemetryConfig().BindAddress)
  268. pluginConf := []plugin.Config{
  269. {
  270. Type: "eventsearcher",
  271. },
  272. }
  273. config.SetPluginsConfig(pluginConf)
  274. if assert.Len(t, config.GetPluginsConfig(), 1) {
  275. assert.Equal(t, pluginConf[0].Type, config.GetPluginsConfig()[0].Type)
  276. }
  277. }
  278. func TestServiceToStart(t *testing.T) {
  279. reset()
  280. configDir := ".."
  281. err := config.LoadConfig(configDir, "")
  282. assert.NoError(t, err)
  283. assert.True(t, config.HasServicesToStart())
  284. sftpdConf := config.GetSFTPDConfig()
  285. sftpdConf.Bindings[0].Port = 0
  286. config.SetSFTPDConfig(sftpdConf)
  287. assert.False(t, config.HasServicesToStart())
  288. ftpdConf := config.GetFTPDConfig()
  289. ftpdConf.Bindings[0].Port = 2121
  290. config.SetFTPDConfig(ftpdConf)
  291. assert.True(t, config.HasServicesToStart())
  292. ftpdConf.Bindings[0].Port = 0
  293. config.SetFTPDConfig(ftpdConf)
  294. webdavdConf := config.GetWebDAVDConfig()
  295. webdavdConf.Bindings[0].Port = 9000
  296. config.SetWebDAVDConfig(webdavdConf)
  297. assert.True(t, config.HasServicesToStart())
  298. webdavdConf.Bindings[0].Port = 0
  299. config.SetWebDAVDConfig(webdavdConf)
  300. assert.False(t, config.HasServicesToStart())
  301. sftpdConf.Bindings[0].Port = 2022
  302. config.SetSFTPDConfig(sftpdConf)
  303. assert.True(t, config.HasServicesToStart())
  304. }
  305. func TestSSHCommandsFromEnv(t *testing.T) {
  306. reset()
  307. os.Setenv("SFTPGO_SFTPD__ENABLED_SSH_COMMANDS", "cd,scp")
  308. t.Cleanup(func() {
  309. os.Unsetenv("SFTPGO_SFTPD__ENABLED_SSH_COMMANDS")
  310. })
  311. configDir := ".."
  312. err := config.LoadConfig(configDir, "")
  313. assert.NoError(t, err)
  314. sftpdConf := config.GetSFTPDConfig()
  315. if assert.Len(t, sftpdConf.EnabledSSHCommands, 2) {
  316. assert.Equal(t, "cd", sftpdConf.EnabledSSHCommands[0])
  317. assert.Equal(t, "scp", sftpdConf.EnabledSSHCommands[1])
  318. }
  319. }
  320. func TestSMTPFromEnv(t *testing.T) {
  321. reset()
  322. os.Setenv("SFTPGO_SMTP__HOST", "smtp.example.com")
  323. os.Setenv("SFTPGO_SMTP__PORT", "587")
  324. t.Cleanup(func() {
  325. os.Unsetenv("SFTPGO_SMTP__HOST")
  326. os.Unsetenv("SFTPGO_SMTP__PORT")
  327. })
  328. configDir := ".."
  329. err := config.LoadConfig(configDir, "")
  330. assert.NoError(t, err)
  331. smtpConfig := config.GetSMTPConfig()
  332. assert.Equal(t, "smtp.example.com", smtpConfig.Host)
  333. assert.Equal(t, 587, smtpConfig.Port)
  334. }
  335. func TestMFAFromEnv(t *testing.T) {
  336. reset()
  337. os.Setenv("SFTPGO_MFA__TOTP__0__NAME", "main")
  338. os.Setenv("SFTPGO_MFA__TOTP__1__NAME", "additional_name")
  339. os.Setenv("SFTPGO_MFA__TOTP__1__ISSUER", "additional_issuer")
  340. os.Setenv("SFTPGO_MFA__TOTP__1__ALGO", "sha256")
  341. t.Cleanup(func() {
  342. os.Unsetenv("SFTPGO_MFA__TOTP__0__NAME")
  343. os.Unsetenv("SFTPGO_MFA__TOTP__1__NAME")
  344. os.Unsetenv("SFTPGO_MFA__TOTP__1__ISSUER")
  345. os.Unsetenv("SFTPGO_MFA__TOTP__1__ALGO")
  346. })
  347. configDir := ".."
  348. err := config.LoadConfig(configDir, "")
  349. assert.NoError(t, err)
  350. mfaConf := config.GetMFAConfig()
  351. require.Len(t, mfaConf.TOTP, 2)
  352. require.Equal(t, "main", mfaConf.TOTP[0].Name)
  353. require.Equal(t, "SFTPGo", mfaConf.TOTP[0].Issuer)
  354. require.Equal(t, "sha1", mfaConf.TOTP[0].Algo)
  355. require.Equal(t, "additional_name", mfaConf.TOTP[1].Name)
  356. require.Equal(t, "additional_issuer", mfaConf.TOTP[1].Issuer)
  357. require.Equal(t, "sha256", mfaConf.TOTP[1].Algo)
  358. }
  359. func TestDisabledMFAConfig(t *testing.T) {
  360. reset()
  361. configDir := ".."
  362. confName := tempConfigName + ".json"
  363. configFilePath := filepath.Join(configDir, confName)
  364. err := config.LoadConfig(configDir, "")
  365. assert.NoError(t, err)
  366. mfaConf := config.GetMFAConfig()
  367. assert.Len(t, mfaConf.TOTP, 1)
  368. reset()
  369. c := make(map[string]mfa.Config)
  370. c["mfa"] = mfa.Config{}
  371. jsonConf, err := json.Marshal(c)
  372. assert.NoError(t, err)
  373. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  374. assert.NoError(t, err)
  375. err = config.LoadConfig(configDir, confName)
  376. assert.NoError(t, err)
  377. mfaConf = config.GetMFAConfig()
  378. assert.Len(t, mfaConf.TOTP, 0)
  379. err = os.Remove(configFilePath)
  380. assert.NoError(t, err)
  381. }
  382. func TestPluginsFromEnv(t *testing.T) {
  383. reset()
  384. os.Setenv("SFTPGO_PLUGINS__0__TYPE", "notifier")
  385. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__FS_EVENTS", "upload,download")
  386. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__PROVIDER_EVENTS", "add,update")
  387. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__PROVIDER_OBJECTS", "user,admin")
  388. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__RETRY_MAX_TIME", "2")
  389. os.Setenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__RETRY_QUEUE_MAX_SIZE", "1000")
  390. os.Setenv("SFTPGO_PLUGINS__0__CMD", "plugin_start_cmd")
  391. os.Setenv("SFTPGO_PLUGINS__0__ARGS", "arg1,arg2")
  392. os.Setenv("SFTPGO_PLUGINS__0__SHA256SUM", "0a71ded61fccd59c4f3695b51c1b3d180da8d2d77ea09ccee20dac242675c193")
  393. os.Setenv("SFTPGO_PLUGINS__0__AUTO_MTLS", "1")
  394. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__SCHEME", kms.SchemeAWS)
  395. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__ENCRYPTED_STATUS", kms.SecretStatusAWS)
  396. os.Setenv("SFTPGO_PLUGINS__0__AUTH_OPTIONS__SCOPE", "14")
  397. t.Cleanup(func() {
  398. os.Unsetenv("SFTPGO_PLUGINS__0__TYPE")
  399. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__FS_EVENTS")
  400. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__PROVIDER_EVENTS")
  401. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__PROVIDER_OBJECTS")
  402. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__RETRY_MAX_TIME")
  403. os.Unsetenv("SFTPGO_PLUGINS__0__NOTIFIER_OPTIONS__RETRY_QUEUE_MAX_SIZE")
  404. os.Unsetenv("SFTPGO_PLUGINS__0__CMD")
  405. os.Unsetenv("SFTPGO_PLUGINS__0__ARGS")
  406. os.Unsetenv("SFTPGO_PLUGINS__0__SHA256SUM")
  407. os.Unsetenv("SFTPGO_PLUGINS__0__AUTO_MTLS")
  408. os.Unsetenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__SCHEME")
  409. os.Unsetenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__ENCRYPTED_STATUS")
  410. os.Unsetenv("SFTPGO_PLUGINS__0__AUTH_OPTIONS__SCOPE")
  411. })
  412. configDir := ".."
  413. err := config.LoadConfig(configDir, "")
  414. assert.NoError(t, err)
  415. pluginsConf := config.GetPluginsConfig()
  416. require.Len(t, pluginsConf, 1)
  417. pluginConf := pluginsConf[0]
  418. require.Equal(t, "notifier", pluginConf.Type)
  419. require.Len(t, pluginConf.NotifierOptions.FsEvents, 2)
  420. require.True(t, util.IsStringInSlice("upload", pluginConf.NotifierOptions.FsEvents))
  421. require.True(t, util.IsStringInSlice("download", pluginConf.NotifierOptions.FsEvents))
  422. require.Len(t, pluginConf.NotifierOptions.ProviderEvents, 2)
  423. require.Equal(t, "add", pluginConf.NotifierOptions.ProviderEvents[0])
  424. require.Equal(t, "update", pluginConf.NotifierOptions.ProviderEvents[1])
  425. require.Len(t, pluginConf.NotifierOptions.ProviderObjects, 2)
  426. require.Equal(t, "user", pluginConf.NotifierOptions.ProviderObjects[0])
  427. require.Equal(t, "admin", pluginConf.NotifierOptions.ProviderObjects[1])
  428. require.Equal(t, 2, pluginConf.NotifierOptions.RetryMaxTime)
  429. require.Equal(t, 1000, pluginConf.NotifierOptions.RetryQueueMaxSize)
  430. require.Equal(t, "plugin_start_cmd", pluginConf.Cmd)
  431. require.Len(t, pluginConf.Args, 2)
  432. require.Equal(t, "arg1", pluginConf.Args[0])
  433. require.Equal(t, "arg2", pluginConf.Args[1])
  434. require.Equal(t, "0a71ded61fccd59c4f3695b51c1b3d180da8d2d77ea09ccee20dac242675c193", pluginConf.SHA256Sum)
  435. require.True(t, pluginConf.AutoMTLS)
  436. require.Equal(t, kms.SchemeAWS, pluginConf.KMSOptions.Scheme)
  437. require.Equal(t, kms.SecretStatusAWS, pluginConf.KMSOptions.EncryptedStatus)
  438. require.Equal(t, 14, pluginConf.AuthOptions.Scope)
  439. configAsJSON, err := json.Marshal(pluginsConf)
  440. require.NoError(t, err)
  441. confName := tempConfigName + ".json"
  442. configFilePath := filepath.Join(configDir, confName)
  443. err = os.WriteFile(configFilePath, configAsJSON, os.ModePerm)
  444. assert.NoError(t, err)
  445. os.Setenv("SFTPGO_PLUGINS__0__CMD", "plugin_start_cmd1")
  446. os.Setenv("SFTPGO_PLUGINS__0__ARGS", "")
  447. os.Setenv("SFTPGO_PLUGINS__0__AUTO_MTLS", "0")
  448. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__SCHEME", kms.SchemeVaultTransit)
  449. os.Setenv("SFTPGO_PLUGINS__0__KMS_OPTIONS__ENCRYPTED_STATUS", kms.SecretStatusVaultTransit)
  450. err = config.LoadConfig(configDir, confName)
  451. assert.NoError(t, err)
  452. pluginsConf = config.GetPluginsConfig()
  453. require.Len(t, pluginsConf, 1)
  454. pluginConf = pluginsConf[0]
  455. require.Equal(t, "notifier", pluginConf.Type)
  456. require.Len(t, pluginConf.NotifierOptions.FsEvents, 2)
  457. require.True(t, util.IsStringInSlice("upload", pluginConf.NotifierOptions.FsEvents))
  458. require.True(t, util.IsStringInSlice("download", pluginConf.NotifierOptions.FsEvents))
  459. require.Len(t, pluginConf.NotifierOptions.ProviderEvents, 2)
  460. require.Equal(t, "add", pluginConf.NotifierOptions.ProviderEvents[0])
  461. require.Equal(t, "update", pluginConf.NotifierOptions.ProviderEvents[1])
  462. require.Len(t, pluginConf.NotifierOptions.ProviderObjects, 2)
  463. require.Equal(t, "user", pluginConf.NotifierOptions.ProviderObjects[0])
  464. require.Equal(t, "admin", pluginConf.NotifierOptions.ProviderObjects[1])
  465. require.Equal(t, 2, pluginConf.NotifierOptions.RetryMaxTime)
  466. require.Equal(t, 1000, pluginConf.NotifierOptions.RetryQueueMaxSize)
  467. require.Equal(t, "plugin_start_cmd1", pluginConf.Cmd)
  468. require.Len(t, pluginConf.Args, 0)
  469. require.Equal(t, "0a71ded61fccd59c4f3695b51c1b3d180da8d2d77ea09ccee20dac242675c193", pluginConf.SHA256Sum)
  470. require.False(t, pluginConf.AutoMTLS)
  471. require.Equal(t, kms.SchemeVaultTransit, pluginConf.KMSOptions.Scheme)
  472. require.Equal(t, kms.SecretStatusVaultTransit, pluginConf.KMSOptions.EncryptedStatus)
  473. require.Equal(t, 14, pluginConf.AuthOptions.Scope)
  474. err = os.Remove(configFilePath)
  475. assert.NoError(t, err)
  476. }
  477. func TestRateLimitersFromEnv(t *testing.T) {
  478. reset()
  479. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__AVERAGE", "100")
  480. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__PERIOD", "2000")
  481. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__BURST", "10")
  482. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__TYPE", "2")
  483. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__PROTOCOLS", "SSH, FTP")
  484. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__GENERATE_DEFENDER_EVENTS", "1")
  485. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__ENTRIES_SOFT_LIMIT", "50")
  486. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__ENTRIES_HARD_LIMIT", "100")
  487. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__0__ALLOW_LIST", ", 172.16.2.4, ")
  488. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__8__AVERAGE", "50")
  489. os.Setenv("SFTPGO_COMMON__RATE_LIMITERS__8__ALLOW_LIST", "192.168.1.1, 192.168.2.0/24")
  490. t.Cleanup(func() {
  491. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__AVERAGE")
  492. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__PERIOD")
  493. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__BURST")
  494. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__TYPE")
  495. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__PROTOCOLS")
  496. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__GENERATE_DEFENDER_EVENTS")
  497. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__ENTRIES_SOFT_LIMIT")
  498. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__ENTRIES_HARD_LIMIT")
  499. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__0__ALLOW_LIST")
  500. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__8__AVERAGE")
  501. os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__8__ALLOW_LIST")
  502. })
  503. configDir := ".."
  504. err := config.LoadConfig(configDir, "")
  505. assert.NoError(t, err)
  506. limiters := config.GetCommonConfig().RateLimitersConfig
  507. require.Len(t, limiters, 2)
  508. require.Equal(t, int64(100), limiters[0].Average)
  509. require.Equal(t, int64(2000), limiters[0].Period)
  510. require.Equal(t, 10, limiters[0].Burst)
  511. require.Equal(t, 2, limiters[0].Type)
  512. protocols := limiters[0].Protocols
  513. require.Len(t, protocols, 2)
  514. require.True(t, util.IsStringInSlice(common.ProtocolFTP, protocols))
  515. require.True(t, util.IsStringInSlice(common.ProtocolSSH, protocols))
  516. require.True(t, limiters[0].GenerateDefenderEvents)
  517. require.Equal(t, 50, limiters[0].EntriesSoftLimit)
  518. require.Equal(t, 100, limiters[0].EntriesHardLimit)
  519. require.Len(t, limiters[0].AllowList, 1)
  520. require.Equal(t, "172.16.2.4", limiters[0].AllowList[0])
  521. require.Equal(t, int64(50), limiters[1].Average)
  522. require.Len(t, limiters[1].AllowList, 2)
  523. require.Equal(t, "192.168.1.1", limiters[1].AllowList[0])
  524. require.Equal(t, "192.168.2.0/24", limiters[1].AllowList[1])
  525. // we check the default values here
  526. require.Equal(t, int64(1000), limiters[1].Period)
  527. require.Equal(t, 1, limiters[1].Burst)
  528. require.Equal(t, 2, limiters[1].Type)
  529. protocols = limiters[1].Protocols
  530. require.Len(t, protocols, 4)
  531. require.True(t, util.IsStringInSlice(common.ProtocolFTP, protocols))
  532. require.True(t, util.IsStringInSlice(common.ProtocolSSH, protocols))
  533. require.True(t, util.IsStringInSlice(common.ProtocolWebDAV, protocols))
  534. require.True(t, util.IsStringInSlice(common.ProtocolHTTP, protocols))
  535. require.False(t, limiters[1].GenerateDefenderEvents)
  536. require.Equal(t, 100, limiters[1].EntriesSoftLimit)
  537. require.Equal(t, 150, limiters[1].EntriesHardLimit)
  538. }
  539. func TestSFTPDBindingsFromEnv(t *testing.T) {
  540. reset()
  541. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  542. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__PORT", "2200")
  543. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__APPLY_PROXY_CONFIG", "false")
  544. os.Setenv("SFTPGO_SFTPD__BINDINGS__3__ADDRESS", "127.0.1.1")
  545. os.Setenv("SFTPGO_SFTPD__BINDINGS__3__PORT", "2203")
  546. t.Cleanup(func() {
  547. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS")
  548. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__PORT")
  549. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__APPLY_PROXY_CONFIG")
  550. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__3__ADDRESS")
  551. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__3__PORT")
  552. })
  553. configDir := ".."
  554. err := config.LoadConfig(configDir, "")
  555. assert.NoError(t, err)
  556. bindings := config.GetSFTPDConfig().Bindings
  557. require.Len(t, bindings, 2)
  558. require.Equal(t, 2200, bindings[0].Port)
  559. require.Equal(t, "127.0.0.1", bindings[0].Address)
  560. require.False(t, bindings[0].ApplyProxyConfig)
  561. require.Equal(t, 2203, bindings[1].Port)
  562. require.Equal(t, "127.0.1.1", bindings[1].Address)
  563. require.True(t, bindings[1].ApplyProxyConfig) // default value
  564. }
  565. func TestFTPDBindingsFromEnv(t *testing.T) {
  566. reset()
  567. os.Setenv("SFTPGO_FTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  568. os.Setenv("SFTPGO_FTPD__BINDINGS__0__PORT", "2200")
  569. os.Setenv("SFTPGO_FTPD__BINDINGS__0__APPLY_PROXY_CONFIG", "f")
  570. os.Setenv("SFTPGO_FTPD__BINDINGS__0__TLS_MODE", "2")
  571. os.Setenv("SFTPGO_FTPD__BINDINGS__0__FORCE_PASSIVE_IP", "127.0.1.2")
  572. os.Setenv("SFTPGO_FTPD__BINDINGS__0__PASSIVE_IP_OVERRIDES__0__IP", "172.16.1.1")
  573. os.Setenv("SFTPGO_FTPD__BINDINGS__0__TLS_CIPHER_SUITES", "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256")
  574. os.Setenv("SFTPGO_FTPD__BINDINGS__0__PASSIVE_CONNECTIONS_SECURITY", "1")
  575. os.Setenv("SFTPGO_FTPD__BINDINGS__9__ADDRESS", "127.0.1.1")
  576. os.Setenv("SFTPGO_FTPD__BINDINGS__9__PORT", "2203")
  577. os.Setenv("SFTPGO_FTPD__BINDINGS__9__TLS_MODE", "1")
  578. os.Setenv("SFTPGO_FTPD__BINDINGS__9__FORCE_PASSIVE_IP", "127.0.1.1")
  579. os.Setenv("SFTPGO_FTPD__BINDINGS__9__PASSIVE_IP_OVERRIDES__3__IP", "192.168.1.1")
  580. os.Setenv("SFTPGO_FTPD__BINDINGS__9__PASSIVE_IP_OVERRIDES__3__NETWORKS", "192.168.1.0/24, 192.168.3.0/25")
  581. os.Setenv("SFTPGO_FTPD__BINDINGS__9__CLIENT_AUTH_TYPE", "2")
  582. os.Setenv("SFTPGO_FTPD__BINDINGS__9__DEBUG", "1")
  583. os.Setenv("SFTPGO_FTPD__BINDINGS__9__ACTIVE_CONNECTIONS_SECURITY", "1")
  584. t.Cleanup(func() {
  585. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__ADDRESS")
  586. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__PORT")
  587. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__APPLY_PROXY_CONFIG")
  588. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__TLS_MODE")
  589. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__FORCE_PASSIVE_IP")
  590. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__PASSIVE_IP_OVERRIDES__0__IP")
  591. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__TLS_CIPHER_SUITES")
  592. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__ACTIVE_CONNECTIONS_SECURITY")
  593. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__ADDRESS")
  594. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__PORT")
  595. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__TLS_MODE")
  596. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__FORCE_PASSIVE_IP")
  597. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__PASSIVE_IP_OVERRIDES__3__IP")
  598. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__PASSIVE_IP_OVERRIDES__3__NETWORKS")
  599. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__CLIENT_AUTH_TYPE")
  600. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__DEBUG")
  601. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__ACTIVE_CONNECTIONS_SECURITY")
  602. })
  603. configDir := ".."
  604. err := config.LoadConfig(configDir, "")
  605. assert.NoError(t, err)
  606. bindings := config.GetFTPDConfig().Bindings
  607. require.Len(t, bindings, 2)
  608. require.Equal(t, 2200, bindings[0].Port)
  609. require.Equal(t, "127.0.0.1", bindings[0].Address)
  610. require.False(t, bindings[0].ApplyProxyConfig)
  611. require.Equal(t, 2, bindings[0].TLSMode)
  612. require.Equal(t, "127.0.1.2", bindings[0].ForcePassiveIP)
  613. require.Len(t, bindings[0].PassiveIPOverrides, 0)
  614. require.Equal(t, 0, bindings[0].ClientAuthType)
  615. require.Len(t, bindings[0].TLSCipherSuites, 2)
  616. require.Equal(t, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", bindings[0].TLSCipherSuites[0])
  617. require.Equal(t, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", bindings[0].TLSCipherSuites[1])
  618. require.False(t, bindings[0].Debug)
  619. require.Equal(t, 1, bindings[0].PassiveConnectionsSecurity)
  620. require.Equal(t, 0, bindings[0].ActiveConnectionsSecurity)
  621. require.Equal(t, 2203, bindings[1].Port)
  622. require.Equal(t, "127.0.1.1", bindings[1].Address)
  623. require.True(t, bindings[1].ApplyProxyConfig) // default value
  624. require.Equal(t, 1, bindings[1].TLSMode)
  625. require.Equal(t, "127.0.1.1", bindings[1].ForcePassiveIP)
  626. require.Len(t, bindings[1].PassiveIPOverrides, 1)
  627. require.Equal(t, "192.168.1.1", bindings[1].PassiveIPOverrides[0].IP)
  628. require.Len(t, bindings[1].PassiveIPOverrides[0].Networks, 2)
  629. require.Equal(t, "192.168.1.0/24", bindings[1].PassiveIPOverrides[0].Networks[0])
  630. require.Equal(t, "192.168.3.0/25", bindings[1].PassiveIPOverrides[0].Networks[1])
  631. require.Equal(t, 2, bindings[1].ClientAuthType)
  632. require.Nil(t, bindings[1].TLSCipherSuites)
  633. require.Equal(t, 0, bindings[1].PassiveConnectionsSecurity)
  634. require.Equal(t, 1, bindings[1].ActiveConnectionsSecurity)
  635. require.True(t, bindings[1].Debug)
  636. }
  637. func TestWebDAVBindingsFromEnv(t *testing.T) {
  638. reset()
  639. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__ADDRESS", "127.0.0.1")
  640. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__PORT", "8000")
  641. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS", "0")
  642. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_CIPHER_SUITES", "TLS_RSA_WITH_AES_128_CBC_SHA ")
  643. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_ALLOWED", "192.168.10.1")
  644. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__ADDRESS", "127.0.1.1")
  645. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__PORT", "9000")
  646. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__ENABLE_HTTPS", "1")
  647. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__CLIENT_AUTH_TYPE", "1")
  648. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__PREFIX", "/dav2")
  649. t.Cleanup(func() {
  650. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__ADDRESS")
  651. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__PORT")
  652. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS")
  653. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__TLS_CIPHER_SUITES")
  654. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__PROXY_ALLOWED")
  655. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__ADDRESS")
  656. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__PORT")
  657. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__ENABLE_HTTPS")
  658. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__CLIENT_AUTH_TYPE")
  659. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__PREFIX")
  660. })
  661. configDir := ".."
  662. err := config.LoadConfig(configDir, "")
  663. assert.NoError(t, err)
  664. bindings := config.GetWebDAVDConfig().Bindings
  665. require.Len(t, bindings, 3)
  666. require.Equal(t, 0, bindings[0].Port)
  667. require.Empty(t, bindings[0].Address)
  668. require.False(t, bindings[0].EnableHTTPS)
  669. require.Len(t, bindings[0].TLSCipherSuites, 0)
  670. require.Empty(t, bindings[0].Prefix)
  671. require.Equal(t, 8000, bindings[1].Port)
  672. require.Equal(t, "127.0.0.1", bindings[1].Address)
  673. require.False(t, bindings[1].EnableHTTPS)
  674. require.Equal(t, 0, bindings[1].ClientAuthType)
  675. require.Len(t, bindings[1].TLSCipherSuites, 1)
  676. require.Equal(t, "TLS_RSA_WITH_AES_128_CBC_SHA", bindings[1].TLSCipherSuites[0])
  677. require.Equal(t, "192.168.10.1", bindings[1].ProxyAllowed[0])
  678. require.Empty(t, bindings[1].Prefix)
  679. require.Equal(t, 9000, bindings[2].Port)
  680. require.Equal(t, "127.0.1.1", bindings[2].Address)
  681. require.True(t, bindings[2].EnableHTTPS)
  682. require.Equal(t, 1, bindings[2].ClientAuthType)
  683. require.Nil(t, bindings[2].TLSCipherSuites)
  684. require.Equal(t, "/dav2", bindings[2].Prefix)
  685. }
  686. func TestHTTPDBindingsFromEnv(t *testing.T) {
  687. reset()
  688. sockPath := filepath.Clean(os.TempDir())
  689. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__ADDRESS", sockPath)
  690. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__PORT", "0")
  691. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__TLS_CIPHER_SUITES", " TLS_AES_128_GCM_SHA256")
  692. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__ADDRESS", "127.0.0.1")
  693. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__PORT", "8000")
  694. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_HTTPS", "0")
  695. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__HIDE_LOGIN_URL", " 1")
  696. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ADDRESS", "127.0.1.1")
  697. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__PORT", "9000")
  698. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_ADMIN", "0")
  699. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_CLIENT", "0")
  700. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__RENDER_OPENAPI", "0")
  701. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_HTTPS", "1 ")
  702. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE", "1")
  703. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__TLS_CIPHER_SUITES", " TLS_AES_256_GCM_SHA384 , TLS_CHACHA20_POLY1305_SHA256")
  704. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_ALLOWED", " 192.168.9.1 , 172.16.25.0/24")
  705. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__HIDE_LOGIN_URL", "3")
  706. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__1__URL", "http://127.0.0.1/")
  707. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__1__FILE_EXTENSIONS", ".pdf, .txt")
  708. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__2__URL", "http://127.0.1.1/")
  709. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__3__FILE_EXTENSIONS", ".jpg, .txt")
  710. t.Cleanup(func() {
  711. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__ADDRESS")
  712. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__PORT")
  713. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__TLS_CIPHER_SUITES")
  714. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__ADDRESS")
  715. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__PORT")
  716. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_HTTPS")
  717. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__HIDE_LOGIN_URL")
  718. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ADDRESS")
  719. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__PORT")
  720. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_HTTPS")
  721. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_ADMIN")
  722. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_CLIENT")
  723. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__RENDER_OPENAPI")
  724. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE")
  725. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__TLS_CIPHER_SUITES")
  726. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__PROXY_ALLOWED")
  727. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__HIDE_LOGIN_URL")
  728. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__1__URL")
  729. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__1__FILE_EXTENSIONS")
  730. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__2__URL")
  731. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__WEB_CLIENT_INTEGRATIONS__3__FILE_EXTENSIONS")
  732. })
  733. configDir := ".."
  734. err := config.LoadConfig(configDir, "")
  735. assert.NoError(t, err)
  736. bindings := config.GetHTTPDConfig().Bindings
  737. require.Len(t, bindings, 3)
  738. require.Equal(t, 0, bindings[0].Port)
  739. require.Equal(t, sockPath, bindings[0].Address)
  740. require.False(t, bindings[0].EnableHTTPS)
  741. require.True(t, bindings[0].EnableWebAdmin)
  742. require.True(t, bindings[0].EnableWebClient)
  743. require.True(t, bindings[0].RenderOpenAPI)
  744. require.Len(t, bindings[0].TLSCipherSuites, 1)
  745. require.Equal(t, "TLS_AES_128_GCM_SHA256", bindings[0].TLSCipherSuites[0])
  746. require.Equal(t, 0, bindings[0].HideLoginURL)
  747. require.Equal(t, 8000, bindings[1].Port)
  748. require.Equal(t, "127.0.0.1", bindings[1].Address)
  749. require.False(t, bindings[1].EnableHTTPS)
  750. require.True(t, bindings[1].EnableWebAdmin)
  751. require.True(t, bindings[1].EnableWebClient)
  752. require.True(t, bindings[1].RenderOpenAPI)
  753. require.Nil(t, bindings[1].TLSCipherSuites)
  754. require.Equal(t, 1, bindings[1].HideLoginURL)
  755. require.Equal(t, 9000, bindings[2].Port)
  756. require.Equal(t, "127.0.1.1", bindings[2].Address)
  757. require.True(t, bindings[2].EnableHTTPS)
  758. require.False(t, bindings[2].EnableWebAdmin)
  759. require.False(t, bindings[2].EnableWebClient)
  760. require.False(t, bindings[2].RenderOpenAPI)
  761. require.Equal(t, 1, bindings[2].ClientAuthType)
  762. require.Len(t, bindings[2].TLSCipherSuites, 2)
  763. require.Equal(t, "TLS_AES_256_GCM_SHA384", bindings[2].TLSCipherSuites[0])
  764. require.Equal(t, "TLS_CHACHA20_POLY1305_SHA256", bindings[2].TLSCipherSuites[1])
  765. require.Len(t, bindings[2].ProxyAllowed, 2)
  766. require.Equal(t, "192.168.9.1", bindings[2].ProxyAllowed[0])
  767. require.Equal(t, "172.16.25.0/24", bindings[2].ProxyAllowed[1])
  768. require.Equal(t, 3, bindings[2].HideLoginURL)
  769. require.Len(t, bindings[2].WebClientIntegrations, 1)
  770. require.Equal(t, "http://127.0.0.1/", bindings[2].WebClientIntegrations[0].URL)
  771. require.Equal(t, []string{".pdf", ".txt"}, bindings[2].WebClientIntegrations[0].FileExtensions)
  772. }
  773. func TestHTTPClientCertificatesFromEnv(t *testing.T) {
  774. reset()
  775. configDir := ".."
  776. confName := tempConfigName + ".json"
  777. configFilePath := filepath.Join(configDir, confName)
  778. err := config.LoadConfig(configDir, "")
  779. assert.NoError(t, err)
  780. httpConf := config.GetHTTPConfig()
  781. httpConf.Certificates = append(httpConf.Certificates, httpclient.TLSKeyPair{
  782. Cert: "cert",
  783. Key: "key",
  784. })
  785. c := make(map[string]httpclient.Config)
  786. c["http"] = httpConf
  787. jsonConf, err := json.Marshal(c)
  788. require.NoError(t, err)
  789. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  790. require.NoError(t, err)
  791. err = config.LoadConfig(configDir, confName)
  792. require.NoError(t, err)
  793. require.Len(t, config.GetHTTPConfig().Certificates, 1)
  794. require.Equal(t, "cert", config.GetHTTPConfig().Certificates[0].Cert)
  795. require.Equal(t, "key", config.GetHTTPConfig().Certificates[0].Key)
  796. os.Setenv("SFTPGO_HTTP__CERTIFICATES__0__CERT", "cert0")
  797. os.Setenv("SFTPGO_HTTP__CERTIFICATES__0__KEY", "key0")
  798. os.Setenv("SFTPGO_HTTP__CERTIFICATES__8__CERT", "cert8")
  799. os.Setenv("SFTPGO_HTTP__CERTIFICATES__9__CERT", "cert9")
  800. os.Setenv("SFTPGO_HTTP__CERTIFICATES__9__KEY", "key9")
  801. t.Cleanup(func() {
  802. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__0__CERT")
  803. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__0__KEY")
  804. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__8__CERT")
  805. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__9__CERT")
  806. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__9__KEY")
  807. })
  808. err = config.LoadConfig(configDir, confName)
  809. require.NoError(t, err)
  810. require.Len(t, config.GetHTTPConfig().Certificates, 2)
  811. require.Equal(t, "cert0", config.GetHTTPConfig().Certificates[0].Cert)
  812. require.Equal(t, "key0", config.GetHTTPConfig().Certificates[0].Key)
  813. require.Equal(t, "cert9", config.GetHTTPConfig().Certificates[1].Cert)
  814. require.Equal(t, "key9", config.GetHTTPConfig().Certificates[1].Key)
  815. err = os.Remove(configFilePath)
  816. assert.NoError(t, err)
  817. config.Init()
  818. err = config.LoadConfig(configDir, "")
  819. require.NoError(t, err)
  820. require.Len(t, config.GetHTTPConfig().Certificates, 2)
  821. require.Equal(t, "cert0", config.GetHTTPConfig().Certificates[0].Cert)
  822. require.Equal(t, "key0", config.GetHTTPConfig().Certificates[0].Key)
  823. require.Equal(t, "cert9", config.GetHTTPConfig().Certificates[1].Cert)
  824. require.Equal(t, "key9", config.GetHTTPConfig().Certificates[1].Key)
  825. }
  826. func TestHTTPClientHeadersFromEnv(t *testing.T) {
  827. reset()
  828. configDir := ".."
  829. confName := tempConfigName + ".json"
  830. configFilePath := filepath.Join(configDir, confName)
  831. err := config.LoadConfig(configDir, "")
  832. assert.NoError(t, err)
  833. httpConf := config.GetHTTPConfig()
  834. httpConf.Headers = append(httpConf.Headers, httpclient.Header{
  835. Key: "key",
  836. Value: "value",
  837. URL: "url",
  838. })
  839. c := make(map[string]httpclient.Config)
  840. c["http"] = httpConf
  841. jsonConf, err := json.Marshal(c)
  842. require.NoError(t, err)
  843. err = os.WriteFile(configFilePath, jsonConf, os.ModePerm)
  844. require.NoError(t, err)
  845. err = config.LoadConfig(configDir, confName)
  846. require.NoError(t, err)
  847. require.Len(t, config.GetHTTPConfig().Headers, 1)
  848. require.Equal(t, "key", config.GetHTTPConfig().Headers[0].Key)
  849. require.Equal(t, "value", config.GetHTTPConfig().Headers[0].Value)
  850. require.Equal(t, "url", config.GetHTTPConfig().Headers[0].URL)
  851. os.Setenv("SFTPGO_HTTP__HEADERS__0__KEY", "key0")
  852. os.Setenv("SFTPGO_HTTP__HEADERS__0__VALUE", "value0")
  853. os.Setenv("SFTPGO_HTTP__HEADERS__0__URL", "url0")
  854. os.Setenv("SFTPGO_HTTP__HEADERS__8__KEY", "key8")
  855. os.Setenv("SFTPGO_HTTP__HEADERS__9__KEY", "key9")
  856. os.Setenv("SFTPGO_HTTP__HEADERS__9__VALUE", "value9")
  857. os.Setenv("SFTPGO_HTTP__HEADERS__9__URL", "url9")
  858. t.Cleanup(func() {
  859. os.Unsetenv("SFTPGO_HTTP__HEADERS__0__KEY")
  860. os.Unsetenv("SFTPGO_HTTP__HEADERS__0__VALUE")
  861. os.Unsetenv("SFTPGO_HTTP__HEADERS__0__URL")
  862. os.Unsetenv("SFTPGO_HTTP__HEADERS__8__KEY")
  863. os.Unsetenv("SFTPGO_HTTP__HEADERS__9__KEY")
  864. os.Unsetenv("SFTPGO_HTTP__HEADERS__9__VALUE")
  865. os.Unsetenv("SFTPGO_HTTP__HEADERS__9__URL")
  866. })
  867. err = config.LoadConfig(configDir, confName)
  868. require.NoError(t, err)
  869. require.Len(t, config.GetHTTPConfig().Headers, 2)
  870. require.Equal(t, "key0", config.GetHTTPConfig().Headers[0].Key)
  871. require.Equal(t, "value0", config.GetHTTPConfig().Headers[0].Value)
  872. require.Equal(t, "url0", config.GetHTTPConfig().Headers[0].URL)
  873. require.Equal(t, "key9", config.GetHTTPConfig().Headers[1].Key)
  874. require.Equal(t, "value9", config.GetHTTPConfig().Headers[1].Value)
  875. require.Equal(t, "url9", config.GetHTTPConfig().Headers[1].URL)
  876. err = os.Remove(configFilePath)
  877. assert.NoError(t, err)
  878. config.Init()
  879. err = config.LoadConfig(configDir, "")
  880. require.NoError(t, err)
  881. require.Len(t, config.GetHTTPConfig().Headers, 2)
  882. require.Equal(t, "key0", config.GetHTTPConfig().Headers[0].Key)
  883. require.Equal(t, "value0", config.GetHTTPConfig().Headers[0].Value)
  884. require.Equal(t, "url0", config.GetHTTPConfig().Headers[0].URL)
  885. require.Equal(t, "key9", config.GetHTTPConfig().Headers[1].Key)
  886. require.Equal(t, "value9", config.GetHTTPConfig().Headers[1].Value)
  887. require.Equal(t, "url9", config.GetHTTPConfig().Headers[1].URL)
  888. }
  889. func TestConfigFromEnv(t *testing.T) {
  890. reset()
  891. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  892. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__0__PORT", "12000")
  893. os.Setenv("SFTPGO_DATA_PROVIDER__PASSWORD_HASHING__ARGON2_OPTIONS__ITERATIONS", "41")
  894. os.Setenv("SFTPGO_DATA_PROVIDER__POOL_SIZE", "10")
  895. os.Setenv("SFTPGO_DATA_PROVIDER__IS_SHARED", "1")
  896. os.Setenv("SFTPGO_DATA_PROVIDER__ACTIONS__EXECUTE_ON", "add")
  897. os.Setenv("SFTPGO_KMS__SECRETS__URL", "local")
  898. os.Setenv("SFTPGO_KMS__SECRETS__MASTER_KEY_PATH", "path")
  899. os.Setenv("SFTPGO_TELEMETRY__TLS_CIPHER_SUITES", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA")
  900. t.Cleanup(func() {
  901. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS")
  902. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__0__PORT")
  903. os.Unsetenv("SFTPGO_DATA_PROVIDER__PASSWORD_HASHING__ARGON2_OPTIONS__ITERATIONS")
  904. os.Unsetenv("SFTPGO_DATA_PROVIDER__POOL_SIZE")
  905. os.Unsetenv("SFTPGO_DATA_PROVIDER__IS_SHARED")
  906. os.Unsetenv("SFTPGO_DATA_PROVIDER__ACTIONS__EXECUTE_ON")
  907. os.Unsetenv("SFTPGO_KMS__SECRETS__URL")
  908. os.Unsetenv("SFTPGO_KMS__SECRETS__MASTER_KEY_PATH")
  909. os.Unsetenv("SFTPGO_TELEMETRY__TLS_CIPHER_SUITES")
  910. })
  911. err := config.LoadConfig(".", "invalid config")
  912. assert.NoError(t, err)
  913. sftpdConfig := config.GetSFTPDConfig()
  914. assert.Equal(t, "127.0.0.1", sftpdConfig.Bindings[0].Address)
  915. assert.Equal(t, 12000, config.GetWebDAVDConfig().Bindings[0].Port)
  916. dataProviderConf := config.GetProviderConf()
  917. assert.Equal(t, uint32(41), dataProviderConf.PasswordHashing.Argon2Options.Iterations)
  918. assert.Equal(t, 10, dataProviderConf.PoolSize)
  919. assert.Equal(t, 1, dataProviderConf.IsShared)
  920. assert.Len(t, dataProviderConf.Actions.ExecuteOn, 1)
  921. assert.Contains(t, dataProviderConf.Actions.ExecuteOn, "add")
  922. kmsConfig := config.GetKMSConfig()
  923. assert.Equal(t, "local", kmsConfig.Secrets.URL)
  924. assert.Equal(t, "path", kmsConfig.Secrets.MasterKeyPath)
  925. telemetryConfig := config.GetTelemetryConfig()
  926. assert.Len(t, telemetryConfig.TLSCipherSuites, 2)
  927. assert.Equal(t, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", telemetryConfig.TLSCipherSuites[0])
  928. assert.Equal(t, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", telemetryConfig.TLSCipherSuites[1])
  929. }