config_test.go 54 KB

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