config_test.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. package config_test
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "testing"
  9. "github.com/spf13/viper"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/require"
  12. "github.com/drakkan/sftpgo/common"
  13. "github.com/drakkan/sftpgo/config"
  14. "github.com/drakkan/sftpgo/dataprovider"
  15. "github.com/drakkan/sftpgo/ftpd"
  16. "github.com/drakkan/sftpgo/httpclient"
  17. "github.com/drakkan/sftpgo/httpd"
  18. "github.com/drakkan/sftpgo/sftpd"
  19. "github.com/drakkan/sftpgo/utils"
  20. "github.com/drakkan/sftpgo/webdavd"
  21. )
  22. const (
  23. tempConfigName = "temp"
  24. )
  25. func reset() {
  26. viper.Reset()
  27. config.Init()
  28. }
  29. func TestLoadConfigTest(t *testing.T) {
  30. reset()
  31. configDir := ".."
  32. err := config.LoadConfig(configDir, "")
  33. assert.NoError(t, err)
  34. assert.NotEqual(t, httpd.Conf{}, config.GetHTTPConfig())
  35. assert.NotEqual(t, dataprovider.Config{}, config.GetProviderConf())
  36. assert.NotEqual(t, sftpd.Configuration{}, config.GetSFTPDConfig())
  37. assert.NotEqual(t, httpclient.Config{}, config.GetHTTPConfig())
  38. confName := tempConfigName + ".json"
  39. configFilePath := filepath.Join(configDir, confName)
  40. err = config.LoadConfig(configDir, confName)
  41. assert.NoError(t, err)
  42. err = ioutil.WriteFile(configFilePath, []byte("{invalid json}"), os.ModePerm)
  43. assert.NoError(t, err)
  44. err = config.LoadConfig(configDir, confName)
  45. assert.NoError(t, err)
  46. err = ioutil.WriteFile(configFilePath, []byte("{\"sftpd\": {\"bind_port\": \"a\"}}"), os.ModePerm)
  47. assert.NoError(t, err)
  48. err = config.LoadConfig(configDir, confName)
  49. assert.Error(t, err)
  50. err = os.Remove(configFilePath)
  51. assert.NoError(t, err)
  52. }
  53. func TestLoadConfigFileNotFound(t *testing.T) {
  54. reset()
  55. viper.SetConfigName("configfile")
  56. err := config.LoadConfig(os.TempDir(), "")
  57. assert.NoError(t, err)
  58. }
  59. func TestEmptyBanner(t *testing.T) {
  60. reset()
  61. configDir := ".."
  62. confName := tempConfigName + ".json"
  63. configFilePath := filepath.Join(configDir, confName)
  64. err := config.LoadConfig(configDir, "")
  65. assert.NoError(t, err)
  66. sftpdConf := config.GetSFTPDConfig()
  67. sftpdConf.Banner = " "
  68. c := make(map[string]sftpd.Configuration)
  69. c["sftpd"] = sftpdConf
  70. jsonConf, _ := json.Marshal(c)
  71. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  72. assert.NoError(t, err)
  73. err = config.LoadConfig(configDir, confName)
  74. assert.NoError(t, err)
  75. sftpdConf = config.GetSFTPDConfig()
  76. assert.NotEmpty(t, strings.TrimSpace(sftpdConf.Banner))
  77. err = os.Remove(configFilePath)
  78. assert.NoError(t, err)
  79. ftpdConf := config.GetFTPDConfig()
  80. ftpdConf.Banner = " "
  81. c1 := make(map[string]ftpd.Configuration)
  82. c1["ftpd"] = ftpdConf
  83. jsonConf, _ = json.Marshal(c1)
  84. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  85. assert.NoError(t, err)
  86. err = config.LoadConfig(configDir, confName)
  87. assert.NoError(t, err)
  88. ftpdConf = config.GetFTPDConfig()
  89. assert.NotEmpty(t, strings.TrimSpace(ftpdConf.Banner))
  90. err = os.Remove(configFilePath)
  91. assert.NoError(t, err)
  92. }
  93. func TestInvalidUploadMode(t *testing.T) {
  94. reset()
  95. configDir := ".."
  96. confName := tempConfigName + ".json"
  97. configFilePath := filepath.Join(configDir, confName)
  98. err := config.LoadConfig(configDir, "")
  99. assert.NoError(t, err)
  100. commonConf := config.GetCommonConfig()
  101. commonConf.UploadMode = 10
  102. c := make(map[string]common.Configuration)
  103. c["common"] = commonConf
  104. jsonConf, err := json.Marshal(c)
  105. assert.NoError(t, err)
  106. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  107. assert.NoError(t, err)
  108. err = config.LoadConfig(configDir, confName)
  109. assert.NoError(t, err)
  110. assert.Equal(t, 0, config.GetCommonConfig().UploadMode)
  111. err = os.Remove(configFilePath)
  112. assert.NoError(t, err)
  113. }
  114. func TestInvalidExternalAuthScope(t *testing.T) {
  115. reset()
  116. configDir := ".."
  117. confName := tempConfigName + ".json"
  118. configFilePath := filepath.Join(configDir, confName)
  119. err := config.LoadConfig(configDir, "")
  120. assert.NoError(t, err)
  121. providerConf := config.GetProviderConf()
  122. providerConf.ExternalAuthScope = 10
  123. c := make(map[string]dataprovider.Config)
  124. c["data_provider"] = providerConf
  125. jsonConf, err := json.Marshal(c)
  126. assert.NoError(t, err)
  127. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  128. assert.NoError(t, err)
  129. err = config.LoadConfig(configDir, confName)
  130. assert.NoError(t, err)
  131. assert.Equal(t, 0, config.GetProviderConf().ExternalAuthScope)
  132. err = os.Remove(configFilePath)
  133. assert.NoError(t, err)
  134. }
  135. func TestInvalidCredentialsPath(t *testing.T) {
  136. reset()
  137. configDir := ".."
  138. confName := tempConfigName + ".json"
  139. configFilePath := filepath.Join(configDir, confName)
  140. err := config.LoadConfig(configDir, "")
  141. assert.NoError(t, err)
  142. providerConf := config.GetProviderConf()
  143. providerConf.CredentialsPath = ""
  144. c := make(map[string]dataprovider.Config)
  145. c["data_provider"] = providerConf
  146. jsonConf, err := json.Marshal(c)
  147. assert.NoError(t, err)
  148. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  149. assert.NoError(t, err)
  150. err = config.LoadConfig(configDir, confName)
  151. assert.NoError(t, err)
  152. assert.Equal(t, "credentials", config.GetProviderConf().CredentialsPath)
  153. err = os.Remove(configFilePath)
  154. assert.NoError(t, err)
  155. }
  156. func TestInvalidProxyProtocol(t *testing.T) {
  157. reset()
  158. configDir := ".."
  159. confName := tempConfigName + ".json"
  160. configFilePath := filepath.Join(configDir, confName)
  161. err := config.LoadConfig(configDir, "")
  162. assert.NoError(t, err)
  163. commonConf := config.GetCommonConfig()
  164. commonConf.ProxyProtocol = 10
  165. c := make(map[string]common.Configuration)
  166. c["common"] = commonConf
  167. jsonConf, err := json.Marshal(c)
  168. assert.NoError(t, err)
  169. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  170. assert.NoError(t, err)
  171. err = config.LoadConfig(configDir, confName)
  172. assert.NoError(t, err)
  173. assert.Equal(t, 0, config.GetCommonConfig().ProxyProtocol)
  174. err = os.Remove(configFilePath)
  175. assert.NoError(t, err)
  176. }
  177. func TestInvalidUsersBaseDir(t *testing.T) {
  178. reset()
  179. configDir := ".."
  180. confName := tempConfigName + ".json"
  181. configFilePath := filepath.Join(configDir, confName)
  182. err := config.LoadConfig(configDir, "")
  183. assert.NoError(t, err)
  184. providerConf := config.GetProviderConf()
  185. providerConf.UsersBaseDir = "."
  186. c := make(map[string]dataprovider.Config)
  187. c["data_provider"] = providerConf
  188. jsonConf, err := json.Marshal(c)
  189. assert.NoError(t, err)
  190. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  191. assert.NoError(t, err)
  192. err = config.LoadConfig(configDir, confName)
  193. assert.NoError(t, err)
  194. assert.Empty(t, config.GetProviderConf().UsersBaseDir)
  195. err = os.Remove(configFilePath)
  196. assert.NoError(t, err)
  197. }
  198. func TestCommonParamsCompatibility(t *testing.T) {
  199. reset()
  200. configDir := ".."
  201. confName := tempConfigName + ".json"
  202. configFilePath := filepath.Join(configDir, confName)
  203. err := config.LoadConfig(configDir, "")
  204. assert.NoError(t, err)
  205. sftpdConf := config.GetSFTPDConfig()
  206. sftpdConf.IdleTimeout = 21 //nolint:staticcheck
  207. sftpdConf.Actions.Hook = "http://hook"
  208. sftpdConf.Actions.ExecuteOn = []string{"upload"}
  209. sftpdConf.SetstatMode = 1 //nolint:staticcheck
  210. sftpdConf.UploadMode = common.UploadModeAtomicWithResume //nolint:staticcheck
  211. sftpdConf.ProxyProtocol = 1 //nolint:staticcheck
  212. sftpdConf.ProxyAllowed = []string{"192.168.1.1"} //nolint:staticcheck
  213. c := make(map[string]sftpd.Configuration)
  214. c["sftpd"] = sftpdConf
  215. jsonConf, err := json.Marshal(c)
  216. assert.NoError(t, err)
  217. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  218. assert.NoError(t, err)
  219. err = config.LoadConfig(configDir, confName)
  220. assert.NoError(t, err)
  221. commonConf := config.GetCommonConfig()
  222. assert.Equal(t, 21, commonConf.IdleTimeout)
  223. assert.Equal(t, "http://hook", commonConf.Actions.Hook)
  224. assert.Len(t, commonConf.Actions.ExecuteOn, 1)
  225. assert.True(t, utils.IsStringInSlice("upload", commonConf.Actions.ExecuteOn))
  226. assert.Equal(t, 1, commonConf.SetstatMode)
  227. assert.Equal(t, 1, commonConf.ProxyProtocol)
  228. assert.Len(t, commonConf.ProxyAllowed, 1)
  229. assert.True(t, utils.IsStringInSlice("192.168.1.1", commonConf.ProxyAllowed))
  230. err = os.Remove(configFilePath)
  231. assert.NoError(t, err)
  232. }
  233. func TestHostKeyCompatibility(t *testing.T) {
  234. reset()
  235. configDir := ".."
  236. confName := tempConfigName + ".json"
  237. configFilePath := filepath.Join(configDir, confName)
  238. err := config.LoadConfig(configDir, "")
  239. assert.NoError(t, err)
  240. sftpdConf := config.GetSFTPDConfig()
  241. sftpdConf.Keys = []sftpd.Key{ //nolint:staticcheck
  242. {
  243. PrivateKey: "rsa",
  244. },
  245. {
  246. PrivateKey: "ecdsa",
  247. },
  248. }
  249. c := make(map[string]sftpd.Configuration)
  250. c["sftpd"] = sftpdConf
  251. jsonConf, err := json.Marshal(c)
  252. assert.NoError(t, err)
  253. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  254. assert.NoError(t, err)
  255. err = config.LoadConfig(configDir, confName)
  256. assert.NoError(t, err)
  257. sftpdConf = config.GetSFTPDConfig()
  258. assert.Equal(t, 2, len(sftpdConf.HostKeys))
  259. assert.True(t, utils.IsStringInSlice("rsa", sftpdConf.HostKeys))
  260. assert.True(t, utils.IsStringInSlice("ecdsa", sftpdConf.HostKeys))
  261. err = os.Remove(configFilePath)
  262. assert.NoError(t, err)
  263. }
  264. func TestSetGetConfig(t *testing.T) {
  265. reset()
  266. sftpdConf := config.GetSFTPDConfig()
  267. sftpdConf.MaxAuthTries = 10
  268. config.SetSFTPDConfig(sftpdConf)
  269. assert.Equal(t, sftpdConf.MaxAuthTries, config.GetSFTPDConfig().MaxAuthTries)
  270. dataProviderConf := config.GetProviderConf()
  271. dataProviderConf.Host = "test host"
  272. config.SetProviderConf(dataProviderConf)
  273. assert.Equal(t, dataProviderConf.Host, config.GetProviderConf().Host)
  274. httpdConf := config.GetHTTPDConfig()
  275. httpdConf.Bindings = append(httpdConf.Bindings, httpd.Binding{Address: "0.0.0.0"})
  276. config.SetHTTPDConfig(httpdConf)
  277. assert.Equal(t, httpdConf.Bindings[0].Address, config.GetHTTPDConfig().Bindings[0].Address)
  278. commonConf := config.GetCommonConfig()
  279. commonConf.IdleTimeout = 10
  280. config.SetCommonConfig(commonConf)
  281. assert.Equal(t, commonConf.IdleTimeout, config.GetCommonConfig().IdleTimeout)
  282. ftpdConf := config.GetFTPDConfig()
  283. ftpdConf.CertificateFile = "cert"
  284. ftpdConf.CertificateKeyFile = "key"
  285. config.SetFTPDConfig(ftpdConf)
  286. assert.Equal(t, ftpdConf.CertificateFile, config.GetFTPDConfig().CertificateFile)
  287. assert.Equal(t, ftpdConf.CertificateKeyFile, config.GetFTPDConfig().CertificateKeyFile)
  288. webDavConf := config.GetWebDAVDConfig()
  289. webDavConf.CertificateFile = "dav_cert"
  290. webDavConf.CertificateKeyFile = "dav_key"
  291. config.SetWebDAVDConfig(webDavConf)
  292. assert.Equal(t, webDavConf.CertificateFile, config.GetWebDAVDConfig().CertificateFile)
  293. assert.Equal(t, webDavConf.CertificateKeyFile, config.GetWebDAVDConfig().CertificateKeyFile)
  294. kmsConf := config.GetKMSConfig()
  295. kmsConf.Secrets.MasterKeyPath = "apath"
  296. kmsConf.Secrets.URL = "aurl"
  297. config.SetKMSConfig(kmsConf)
  298. assert.Equal(t, kmsConf.Secrets.MasterKeyPath, config.GetKMSConfig().Secrets.MasterKeyPath)
  299. assert.Equal(t, kmsConf.Secrets.URL, config.GetKMSConfig().Secrets.URL)
  300. telemetryConf := config.GetTelemetryConfig()
  301. telemetryConf.BindPort = 10001
  302. telemetryConf.BindAddress = "0.0.0.0"
  303. config.SetTelemetryConfig(telemetryConf)
  304. assert.Equal(t, telemetryConf.BindPort, config.GetTelemetryConfig().BindPort)
  305. assert.Equal(t, telemetryConf.BindAddress, config.GetTelemetryConfig().BindAddress)
  306. }
  307. func TestServiceToStart(t *testing.T) {
  308. reset()
  309. configDir := ".."
  310. err := config.LoadConfig(configDir, "")
  311. assert.NoError(t, err)
  312. assert.True(t, config.HasServicesToStart())
  313. sftpdConf := config.GetSFTPDConfig()
  314. sftpdConf.Bindings[0].Port = 0
  315. config.SetSFTPDConfig(sftpdConf)
  316. assert.False(t, config.HasServicesToStart())
  317. ftpdConf := config.GetFTPDConfig()
  318. ftpdConf.Bindings[0].Port = 2121
  319. config.SetFTPDConfig(ftpdConf)
  320. assert.True(t, config.HasServicesToStart())
  321. ftpdConf.Bindings[0].Port = 0
  322. config.SetFTPDConfig(ftpdConf)
  323. webdavdConf := config.GetWebDAVDConfig()
  324. webdavdConf.Bindings[0].Port = 9000
  325. config.SetWebDAVDConfig(webdavdConf)
  326. assert.True(t, config.HasServicesToStart())
  327. webdavdConf.Bindings[0].Port = 0
  328. config.SetWebDAVDConfig(webdavdConf)
  329. assert.False(t, config.HasServicesToStart())
  330. sftpdConf.Bindings[0].Port = 2022
  331. config.SetSFTPDConfig(sftpdConf)
  332. assert.True(t, config.HasServicesToStart())
  333. }
  334. func TestSFTPDBindingsCompatibility(t *testing.T) {
  335. reset()
  336. configDir := ".."
  337. confName := tempConfigName + ".json"
  338. configFilePath := filepath.Join(configDir, confName)
  339. err := config.LoadConfig(configDir, "")
  340. assert.NoError(t, err)
  341. sftpdConf := config.GetSFTPDConfig()
  342. require.Len(t, sftpdConf.Bindings, 1)
  343. sftpdConf.Bindings = nil
  344. sftpdConf.BindPort = 9022 //nolint:staticcheck
  345. sftpdConf.BindAddress = "127.0.0.1" //nolint:staticcheck
  346. c := make(map[string]sftpd.Configuration)
  347. c["sftpd"] = sftpdConf
  348. jsonConf, err := json.Marshal(c)
  349. assert.NoError(t, err)
  350. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  351. assert.NoError(t, err)
  352. err = config.LoadConfig(configDir, confName)
  353. assert.NoError(t, err)
  354. sftpdConf = config.GetSFTPDConfig()
  355. // the default binding should be replaced with the deprecated configuration
  356. require.Len(t, sftpdConf.Bindings, 1)
  357. require.Equal(t, 9022, sftpdConf.Bindings[0].Port)
  358. require.Equal(t, "127.0.0.1", sftpdConf.Bindings[0].Address)
  359. require.True(t, sftpdConf.Bindings[0].ApplyProxyConfig)
  360. err = config.LoadConfig(configDir, confName)
  361. assert.NoError(t, err)
  362. sftpdConf = config.GetSFTPDConfig()
  363. require.Len(t, sftpdConf.Bindings, 1)
  364. require.Equal(t, 9022, sftpdConf.Bindings[0].Port)
  365. require.Equal(t, "127.0.0.1", sftpdConf.Bindings[0].Address)
  366. require.True(t, sftpdConf.Bindings[0].ApplyProxyConfig)
  367. err = os.Remove(configFilePath)
  368. assert.NoError(t, err)
  369. }
  370. func TestFTPDBindingsCompatibility(t *testing.T) {
  371. reset()
  372. configDir := ".."
  373. confName := tempConfigName + ".json"
  374. configFilePath := filepath.Join(configDir, confName)
  375. err := config.LoadConfig(configDir, "")
  376. assert.NoError(t, err)
  377. ftpdConf := config.GetFTPDConfig()
  378. require.Len(t, ftpdConf.Bindings, 1)
  379. ftpdConf.Bindings = nil
  380. ftpdConf.BindPort = 9022 //nolint:staticcheck
  381. ftpdConf.BindAddress = "127.1.0.1" //nolint:staticcheck
  382. ftpdConf.ForcePassiveIP = "127.1.1.1" //nolint:staticcheck
  383. ftpdConf.TLSMode = 2 //nolint:staticcheck
  384. c := make(map[string]ftpd.Configuration)
  385. c["ftpd"] = ftpdConf
  386. jsonConf, err := json.Marshal(c)
  387. assert.NoError(t, err)
  388. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  389. assert.NoError(t, err)
  390. err = config.LoadConfig(configDir, confName)
  391. assert.NoError(t, err)
  392. ftpdConf = config.GetFTPDConfig()
  393. // the default binding should be replaced with the deprecated configuration
  394. require.Len(t, ftpdConf.Bindings, 1)
  395. require.Equal(t, 9022, ftpdConf.Bindings[0].Port)
  396. require.Equal(t, "127.1.0.1", ftpdConf.Bindings[0].Address)
  397. require.True(t, ftpdConf.Bindings[0].ApplyProxyConfig)
  398. require.Equal(t, 2, ftpdConf.Bindings[0].TLSMode)
  399. require.Equal(t, "127.1.1.1", ftpdConf.Bindings[0].ForcePassiveIP)
  400. err = os.Remove(configFilePath)
  401. assert.NoError(t, err)
  402. }
  403. func TestWebDAVDBindingsCompatibility(t *testing.T) {
  404. reset()
  405. configDir := ".."
  406. confName := tempConfigName + ".json"
  407. configFilePath := filepath.Join(configDir, confName)
  408. err := config.LoadConfig(configDir, "")
  409. assert.NoError(t, err)
  410. webdavConf := config.GetWebDAVDConfig()
  411. require.Len(t, webdavConf.Bindings, 1)
  412. webdavConf.Bindings = nil
  413. webdavConf.BindPort = 9080 //nolint:staticcheck
  414. webdavConf.BindAddress = "127.0.0.1" //nolint:staticcheck
  415. c := make(map[string]webdavd.Configuration)
  416. c["webdavd"] = webdavConf
  417. jsonConf, err := json.Marshal(c)
  418. assert.NoError(t, err)
  419. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  420. assert.NoError(t, err)
  421. err = config.LoadConfig(configDir, confName)
  422. assert.NoError(t, err)
  423. webdavConf = config.GetWebDAVDConfig()
  424. // the default binding should be replaced with the deprecated configuration
  425. require.Len(t, webdavConf.Bindings, 1)
  426. require.Equal(t, 9080, webdavConf.Bindings[0].Port)
  427. require.Equal(t, "127.0.0.1", webdavConf.Bindings[0].Address)
  428. require.False(t, webdavConf.Bindings[0].EnableHTTPS)
  429. err = os.Remove(configFilePath)
  430. assert.NoError(t, err)
  431. }
  432. func TestHTTPDBindingsCompatibility(t *testing.T) {
  433. reset()
  434. configDir := ".."
  435. confName := tempConfigName + ".json"
  436. configFilePath := filepath.Join(configDir, confName)
  437. err := config.LoadConfig(configDir, "")
  438. assert.NoError(t, err)
  439. httpdConf := config.GetHTTPDConfig()
  440. require.Len(t, httpdConf.Bindings, 1)
  441. httpdConf.Bindings = nil
  442. httpdConf.BindPort = 9080 //nolint:staticcheck
  443. httpdConf.BindAddress = "127.1.1.1" //nolint:staticcheck
  444. c := make(map[string]httpd.Conf)
  445. c["httpd"] = httpdConf
  446. jsonConf, err := json.Marshal(c)
  447. assert.NoError(t, err)
  448. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  449. assert.NoError(t, err)
  450. err = config.LoadConfig(configDir, confName)
  451. assert.NoError(t, err)
  452. httpdConf = config.GetHTTPDConfig()
  453. // the default binding should be replaced with the deprecated configuration
  454. require.Len(t, httpdConf.Bindings, 1)
  455. require.Equal(t, 9080, httpdConf.Bindings[0].Port)
  456. require.Equal(t, "127.1.1.1", httpdConf.Bindings[0].Address)
  457. require.False(t, httpdConf.Bindings[0].EnableHTTPS)
  458. require.True(t, httpdConf.Bindings[0].EnableWebAdmin)
  459. err = os.Remove(configFilePath)
  460. assert.NoError(t, err)
  461. }
  462. func TestSFTPDBindingsFromEnv(t *testing.T) {
  463. reset()
  464. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  465. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__PORT", "2200")
  466. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__APPLY_PROXY_CONFIG", "false")
  467. os.Setenv("SFTPGO_SFTPD__BINDINGS__3__ADDRESS", "127.0.1.1")
  468. os.Setenv("SFTPGO_SFTPD__BINDINGS__3__PORT", "2203")
  469. os.Setenv("SFTPGO_SFTPD__BINDINGS__3__APPLY_PROXY_CONFIG", "1")
  470. t.Cleanup(func() {
  471. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS")
  472. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__PORT")
  473. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__APPLY_PROXY_CONFIG")
  474. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__3__ADDRESS")
  475. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__3__PORT")
  476. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__3__APPLY_PROXY_CONFIG")
  477. })
  478. configDir := ".."
  479. err := config.LoadConfig(configDir, "")
  480. assert.NoError(t, err)
  481. bindings := config.GetSFTPDConfig().Bindings
  482. require.Len(t, bindings, 2)
  483. require.Equal(t, 2200, bindings[0].Port)
  484. require.Equal(t, "127.0.0.1", bindings[0].Address)
  485. require.False(t, bindings[0].ApplyProxyConfig)
  486. require.Equal(t, 2203, bindings[1].Port)
  487. require.Equal(t, "127.0.1.1", bindings[1].Address)
  488. require.True(t, bindings[1].ApplyProxyConfig)
  489. }
  490. func TestFTPDBindingsFromEnv(t *testing.T) {
  491. reset()
  492. os.Setenv("SFTPGO_FTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  493. os.Setenv("SFTPGO_FTPD__BINDINGS__0__PORT", "2200")
  494. os.Setenv("SFTPGO_FTPD__BINDINGS__0__APPLY_PROXY_CONFIG", "f")
  495. os.Setenv("SFTPGO_FTPD__BINDINGS__0__TLS_MODE", "2")
  496. os.Setenv("SFTPGO_FTPD__BINDINGS__0__FORCE_PASSIVE_IP", "127.0.1.2")
  497. os.Setenv("SFTPGO_FTPD__BINDINGS__9__ADDRESS", "127.0.1.1")
  498. os.Setenv("SFTPGO_FTPD__BINDINGS__9__PORT", "2203")
  499. os.Setenv("SFTPGO_FTPD__BINDINGS__9__APPLY_PROXY_CONFIG", "t")
  500. os.Setenv("SFTPGO_FTPD__BINDINGS__9__TLS_MODE", "1")
  501. os.Setenv("SFTPGO_FTPD__BINDINGS__9__FORCE_PASSIVE_IP", "127.0.1.1")
  502. os.Setenv("SFTPGO_FTPD__BINDINGS__9__CLIENT_AUTH_TYPE", "1")
  503. t.Cleanup(func() {
  504. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__ADDRESS")
  505. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__PORT")
  506. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__APPLY_PROXY_CONFIG")
  507. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__TLS_MODE")
  508. os.Unsetenv("SFTPGO_FTPD__BINDINGS__0__FORCE_PASSIVE_IP")
  509. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__ADDRESS")
  510. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__PORT")
  511. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__APPLY_PROXY_CONFIG")
  512. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__TLS_MODE")
  513. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__FORCE_PASSIVE_IP")
  514. os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__CLIENT_AUTH_TYPE")
  515. })
  516. configDir := ".."
  517. err := config.LoadConfig(configDir, "")
  518. assert.NoError(t, err)
  519. bindings := config.GetFTPDConfig().Bindings
  520. require.Len(t, bindings, 2)
  521. require.Equal(t, 2200, bindings[0].Port)
  522. require.Equal(t, "127.0.0.1", bindings[0].Address)
  523. require.False(t, bindings[0].ApplyProxyConfig)
  524. require.Equal(t, 2, bindings[0].TLSMode)
  525. require.Equal(t, "127.0.1.2", bindings[0].ForcePassiveIP)
  526. require.Equal(t, 0, bindings[0].ClientAuthType)
  527. require.Equal(t, 2203, bindings[1].Port)
  528. require.Equal(t, "127.0.1.1", bindings[1].Address)
  529. require.True(t, bindings[1].ApplyProxyConfig)
  530. require.Equal(t, 1, bindings[1].TLSMode)
  531. require.Equal(t, "127.0.1.1", bindings[1].ForcePassiveIP)
  532. require.Equal(t, 1, bindings[1].ClientAuthType)
  533. }
  534. func TestWebDAVBindingsFromEnv(t *testing.T) {
  535. reset()
  536. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__ADDRESS", "127.0.0.1")
  537. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__PORT", "8000")
  538. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS", "0")
  539. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__ADDRESS", "127.0.1.1")
  540. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__PORT", "9000")
  541. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__ENABLE_HTTPS", "1")
  542. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__2__CLIENT_AUTH_TYPE", "1")
  543. t.Cleanup(func() {
  544. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__ADDRESS")
  545. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__PORT")
  546. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__1__ENABLE_HTTPS")
  547. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__ADDRESS")
  548. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__PORT")
  549. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__ENABLE_HTTPS")
  550. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__CLIENT_AUTH_TYPE")
  551. })
  552. configDir := ".."
  553. err := config.LoadConfig(configDir, "")
  554. assert.NoError(t, err)
  555. bindings := config.GetWebDAVDConfig().Bindings
  556. require.Len(t, bindings, 3)
  557. require.Equal(t, 0, bindings[0].Port)
  558. require.Empty(t, bindings[0].Address)
  559. require.False(t, bindings[0].EnableHTTPS)
  560. require.Equal(t, 8000, bindings[1].Port)
  561. require.Equal(t, "127.0.0.1", bindings[1].Address)
  562. require.False(t, bindings[1].EnableHTTPS)
  563. require.Equal(t, 0, bindings[1].ClientAuthType)
  564. require.Equal(t, 9000, bindings[2].Port)
  565. require.Equal(t, "127.0.1.1", bindings[2].Address)
  566. require.True(t, bindings[2].EnableHTTPS)
  567. require.Equal(t, 1, bindings[2].ClientAuthType)
  568. }
  569. func TestHTTPDBindingsFromEnv(t *testing.T) {
  570. reset()
  571. sockPath := filepath.Clean(os.TempDir())
  572. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__ADDRESS", sockPath)
  573. os.Setenv("SFTPGO_HTTPD__BINDINGS__0__PORT", "0")
  574. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__ADDRESS", "127.0.0.1")
  575. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__PORT", "8000")
  576. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_HTTPS", "0")
  577. os.Setenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_WEB_ADMIN", "1")
  578. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ADDRESS", "127.0.1.1")
  579. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__PORT", "9000")
  580. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_ADMIN", "0")
  581. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_HTTPS", "1")
  582. os.Setenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE", "1")
  583. t.Cleanup(func() {
  584. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__ADDRESS")
  585. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__0__PORT")
  586. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__ADDRESS")
  587. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__PORT")
  588. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_HTTPS")
  589. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__1__ENABLE_WEB_ADMIN")
  590. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ADDRESS")
  591. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__PORT")
  592. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_HTTPS")
  593. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__ENABLE_WEB_ADMIN")
  594. os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__CLIENT_AUTH_TYPE")
  595. })
  596. configDir := ".."
  597. err := config.LoadConfig(configDir, "")
  598. assert.NoError(t, err)
  599. bindings := config.GetHTTPDConfig().Bindings
  600. require.Len(t, bindings, 3)
  601. require.Equal(t, 0, bindings[0].Port)
  602. require.Equal(t, sockPath, bindings[0].Address)
  603. require.False(t, bindings[0].EnableHTTPS)
  604. require.True(t, bindings[0].EnableWebAdmin)
  605. require.Equal(t, 8000, bindings[1].Port)
  606. require.Equal(t, "127.0.0.1", bindings[1].Address)
  607. require.False(t, bindings[1].EnableHTTPS)
  608. require.True(t, bindings[1].EnableWebAdmin)
  609. require.Equal(t, 9000, bindings[2].Port)
  610. require.Equal(t, "127.0.1.1", bindings[2].Address)
  611. require.True(t, bindings[2].EnableHTTPS)
  612. require.False(t, bindings[2].EnableWebAdmin)
  613. require.Equal(t, 1, bindings[2].ClientAuthType)
  614. }
  615. func TestHTTPClientCertificatesFromEnv(t *testing.T) {
  616. reset()
  617. configDir := ".."
  618. confName := tempConfigName + ".json"
  619. configFilePath := filepath.Join(configDir, confName)
  620. err := config.LoadConfig(configDir, "")
  621. assert.NoError(t, err)
  622. httpConf := config.GetHTTPConfig()
  623. httpConf.Certificates = append(httpConf.Certificates, httpclient.TLSKeyPair{
  624. Cert: "cert",
  625. Key: "key",
  626. })
  627. c := make(map[string]httpclient.Config)
  628. c["http"] = httpConf
  629. jsonConf, err := json.Marshal(c)
  630. require.NoError(t, err)
  631. err = ioutil.WriteFile(configFilePath, jsonConf, os.ModePerm)
  632. require.NoError(t, err)
  633. err = config.LoadConfig(configDir, confName)
  634. require.NoError(t, err)
  635. require.Len(t, config.GetHTTPConfig().Certificates, 1)
  636. require.Equal(t, "cert", config.GetHTTPConfig().Certificates[0].Cert)
  637. require.Equal(t, "key", config.GetHTTPConfig().Certificates[0].Key)
  638. os.Setenv("SFTPGO_HTTP__CERTIFICATES__0__CERT", "cert0")
  639. os.Setenv("SFTPGO_HTTP__CERTIFICATES__0__KEY", "key0")
  640. os.Setenv("SFTPGO_HTTP__CERTIFICATES__8__CERT", "cert8")
  641. os.Setenv("SFTPGO_HTTP__CERTIFICATES__9__CERT", "cert9")
  642. os.Setenv("SFTPGO_HTTP__CERTIFICATES__9__KEY", "key9")
  643. t.Cleanup(func() {
  644. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__0__CERT")
  645. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__0__KEY")
  646. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__8__CERT")
  647. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__9__CERT")
  648. os.Unsetenv("SFTPGO_HTTP__CERTIFICATES__9__KEY")
  649. })
  650. err = config.LoadConfig(configDir, confName)
  651. require.NoError(t, err)
  652. require.Len(t, config.GetHTTPConfig().Certificates, 2)
  653. require.Equal(t, "cert0", config.GetHTTPConfig().Certificates[0].Cert)
  654. require.Equal(t, "key0", config.GetHTTPConfig().Certificates[0].Key)
  655. require.Equal(t, "cert9", config.GetHTTPConfig().Certificates[1].Cert)
  656. require.Equal(t, "key9", config.GetHTTPConfig().Certificates[1].Key)
  657. err = os.Remove(configFilePath)
  658. assert.NoError(t, err)
  659. config.Init()
  660. err = config.LoadConfig(configDir, "")
  661. require.NoError(t, err)
  662. require.Len(t, config.GetHTTPConfig().Certificates, 2)
  663. require.Equal(t, "cert0", config.GetHTTPConfig().Certificates[0].Cert)
  664. require.Equal(t, "key0", config.GetHTTPConfig().Certificates[0].Key)
  665. require.Equal(t, "cert9", config.GetHTTPConfig().Certificates[1].Cert)
  666. require.Equal(t, "key9", config.GetHTTPConfig().Certificates[1].Key)
  667. }
  668. func TestConfigFromEnv(t *testing.T) {
  669. reset()
  670. os.Setenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS", "127.0.0.1")
  671. os.Setenv("SFTPGO_WEBDAVD__BINDINGS__0__PORT", "12000")
  672. os.Setenv("SFTPGO_DATA_PROVIDER__PASSWORD_HASHING__ARGON2_OPTIONS__ITERATIONS", "41")
  673. os.Setenv("SFTPGO_DATA_PROVIDER__POOL_SIZE", "10")
  674. os.Setenv("SFTPGO_DATA_PROVIDER__ACTIONS__EXECUTE_ON", "add")
  675. os.Setenv("SFTPGO_KMS__SECRETS__URL", "local")
  676. os.Setenv("SFTPGO_KMS__SECRETS__MASTER_KEY_PATH", "path")
  677. t.Cleanup(func() {
  678. os.Unsetenv("SFTPGO_SFTPD__BINDINGS__0__ADDRESS")
  679. os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__0__PORT")
  680. os.Unsetenv("SFTPGO_DATA_PROVIDER__PASSWORD_HASHING__ARGON2_OPTIONS__ITERATIONS")
  681. os.Unsetenv("SFTPGO_DATA_PROVIDER__POOL_SIZE")
  682. os.Unsetenv("SFTPGO_DATA_PROVIDER__ACTIONS__EXECUTE_ON")
  683. os.Unsetenv("SFTPGO_KMS__SECRETS__URL")
  684. os.Unsetenv("SFTPGO_KMS__SECRETS__MASTER_KEY_PATH")
  685. })
  686. err := config.LoadConfig(".", "invalid config")
  687. assert.NoError(t, err)
  688. sftpdConfig := config.GetSFTPDConfig()
  689. assert.Equal(t, "127.0.0.1", sftpdConfig.Bindings[0].Address)
  690. assert.Equal(t, 12000, config.GetWebDAVDConfig().Bindings[0].Port)
  691. dataProviderConf := config.GetProviderConf()
  692. assert.Equal(t, uint32(41), dataProviderConf.PasswordHashing.Argon2Options.Iterations)
  693. assert.Equal(t, 10, dataProviderConf.PoolSize)
  694. assert.Len(t, dataProviderConf.Actions.ExecuteOn, 1)
  695. assert.Contains(t, dataProviderConf.Actions.ExecuteOn, "add")
  696. kmsConfig := config.GetKMSConfig()
  697. assert.Equal(t, "local", kmsConfig.Secrets.URL)
  698. assert.Equal(t, "path", kmsConfig.Secrets.MasterKeyPath)
  699. }