internal_test.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. package httpd
  2. import (
  3. "context"
  4. "fmt"
  5. "html/template"
  6. "io/ioutil"
  7. "net/http"
  8. "net/http/httptest"
  9. "net/url"
  10. "os"
  11. "path/filepath"
  12. "runtime"
  13. "strings"
  14. "testing"
  15. "github.com/go-chi/chi"
  16. "github.com/stretchr/testify/assert"
  17. "github.com/drakkan/sftpgo/common"
  18. "github.com/drakkan/sftpgo/dataprovider"
  19. "github.com/drakkan/sftpgo/utils"
  20. "github.com/drakkan/sftpgo/vfs"
  21. )
  22. const (
  23. invalidURL = "http://foo\x7f.com/"
  24. inactiveURL = "http://127.0.0.1:12345"
  25. )
  26. func TestGetRespStatus(t *testing.T) {
  27. var err error
  28. err = &dataprovider.MethodDisabledError{}
  29. respStatus := getRespStatus(err)
  30. assert.Equal(t, http.StatusForbidden, respStatus)
  31. err = fmt.Errorf("generic error")
  32. respStatus = getRespStatus(err)
  33. assert.Equal(t, http.StatusInternalServerError, respStatus)
  34. }
  35. func TestCheckResponse(t *testing.T) {
  36. err := checkResponse(http.StatusOK, http.StatusCreated)
  37. assert.Error(t, err)
  38. err = checkResponse(http.StatusBadRequest, http.StatusBadRequest)
  39. assert.NoError(t, err)
  40. }
  41. func TestCheckFolder(t *testing.T) {
  42. expected := &vfs.BaseVirtualFolder{}
  43. actual := &vfs.BaseVirtualFolder{}
  44. err := checkFolder(expected, actual)
  45. assert.Error(t, err)
  46. expected.ID = 1
  47. actual.ID = 2
  48. err = checkFolder(expected, actual)
  49. assert.Error(t, err)
  50. expected.ID = 2
  51. actual.ID = 2
  52. expected.MappedPath = "path"
  53. err = checkFolder(expected, actual)
  54. assert.Error(t, err)
  55. expected.MappedPath = ""
  56. expected.LastQuotaUpdate = 1
  57. err = checkFolder(expected, actual)
  58. assert.Error(t, err)
  59. expected.LastQuotaUpdate = 0
  60. expected.UsedQuotaFiles = 1
  61. err = checkFolder(expected, actual)
  62. assert.Error(t, err)
  63. expected.UsedQuotaFiles = 0
  64. expected.UsedQuotaSize = 1
  65. err = checkFolder(expected, actual)
  66. assert.Error(t, err)
  67. expected.UsedQuotaSize = 0
  68. expected.Users = append(expected.Users, "user1")
  69. err = checkFolder(expected, actual)
  70. assert.Error(t, err)
  71. actual.Users = append(actual.Users, "user2")
  72. err = checkFolder(expected, actual)
  73. assert.Error(t, err)
  74. expected.Users = nil
  75. actual.Users = nil
  76. }
  77. func TestCheckUser(t *testing.T) {
  78. expected := &dataprovider.User{}
  79. actual := &dataprovider.User{}
  80. actual.Password = "password"
  81. err := checkUser(expected, actual)
  82. assert.Error(t, err)
  83. actual.Password = ""
  84. err = checkUser(expected, actual)
  85. assert.Error(t, err)
  86. expected.ID = 1
  87. actual.ID = 2
  88. err = checkUser(expected, actual)
  89. assert.Error(t, err)
  90. expected.ID = 2
  91. actual.ID = 2
  92. expected.Permissions = make(map[string][]string)
  93. expected.Permissions["/"] = []string{dataprovider.PermCreateDirs, dataprovider.PermDelete, dataprovider.PermDownload}
  94. actual.Permissions = make(map[string][]string)
  95. err = checkUser(expected, actual)
  96. assert.Error(t, err)
  97. actual.Permissions["/"] = []string{dataprovider.PermCreateDirs, dataprovider.PermCreateSymlinks}
  98. err = checkUser(expected, actual)
  99. assert.Error(t, err)
  100. expected.Permissions["/"] = append(expected.Permissions["/"], dataprovider.PermRename)
  101. err = checkUser(expected, actual)
  102. assert.Error(t, err)
  103. expected.Permissions = make(map[string][]string)
  104. expected.Permissions["/somedir"] = []string{dataprovider.PermAny}
  105. actual.Permissions = make(map[string][]string)
  106. actual.Permissions["/otherdir"] = []string{dataprovider.PermCreateDirs, dataprovider.PermCreateSymlinks}
  107. err = checkUser(expected, actual)
  108. assert.Error(t, err)
  109. expected.Permissions = make(map[string][]string)
  110. actual.Permissions = make(map[string][]string)
  111. actual.FsConfig.Provider = dataprovider.S3FilesystemProvider
  112. err = checkUser(expected, actual)
  113. assert.Error(t, err)
  114. actual.FsConfig.Provider = dataprovider.LocalFilesystemProvider
  115. expected.VirtualFolders = append(expected.VirtualFolders, vfs.VirtualFolder{
  116. BaseVirtualFolder: vfs.BaseVirtualFolder{
  117. MappedPath: os.TempDir(),
  118. },
  119. VirtualPath: "/vdir",
  120. })
  121. err = checkUser(expected, actual)
  122. assert.Error(t, err)
  123. actual.VirtualFolders = append(actual.VirtualFolders, vfs.VirtualFolder{
  124. BaseVirtualFolder: vfs.BaseVirtualFolder{
  125. MappedPath: os.TempDir(),
  126. },
  127. VirtualPath: "/vdir1",
  128. })
  129. err = checkUser(expected, actual)
  130. assert.Error(t, err)
  131. }
  132. func TestCompareUserFilters(t *testing.T) {
  133. expected := &dataprovider.User{}
  134. actual := &dataprovider.User{}
  135. actual.ID = 1
  136. expected.ID = 1
  137. expected.Filters.AllowedIP = []string{}
  138. actual.Filters.AllowedIP = []string{"192.168.1.2/32"}
  139. err := checkUser(expected, actual)
  140. assert.Error(t, err)
  141. expected.Filters.AllowedIP = []string{"192.168.1.3/32"}
  142. err = checkUser(expected, actual)
  143. assert.Error(t, err)
  144. expected.Filters.AllowedIP = []string{}
  145. actual.Filters.AllowedIP = []string{}
  146. expected.Filters.DeniedIP = []string{}
  147. actual.Filters.DeniedIP = []string{"192.168.1.2/32"}
  148. err = checkUser(expected, actual)
  149. assert.Error(t, err)
  150. expected.Filters.DeniedIP = []string{"192.168.1.3/32"}
  151. err = checkUser(expected, actual)
  152. assert.Error(t, err)
  153. expected.Filters.DeniedIP = []string{}
  154. actual.Filters.DeniedIP = []string{}
  155. expected.Filters.DeniedLoginMethods = []string{}
  156. actual.Filters.DeniedLoginMethods = []string{dataprovider.SSHLoginMethodPublicKey}
  157. err = checkUser(expected, actual)
  158. assert.Error(t, err)
  159. expected.Filters.DeniedLoginMethods = []string{dataprovider.LoginMethodPassword}
  160. err = checkUser(expected, actual)
  161. assert.Error(t, err)
  162. expected.Filters.DeniedLoginMethods = []string{}
  163. actual.Filters.DeniedLoginMethods = []string{}
  164. actual.Filters.DeniedProtocols = []string{common.ProtocolFTP}
  165. err = checkUser(expected, actual)
  166. assert.Error(t, err)
  167. expected.Filters.DeniedProtocols = []string{common.ProtocolWebDAV}
  168. err = checkUser(expected, actual)
  169. assert.Error(t, err)
  170. expected.Filters.DeniedProtocols = []string{}
  171. actual.Filters.DeniedProtocols = []string{}
  172. expected.Filters.MaxUploadFileSize = 0
  173. actual.Filters.MaxUploadFileSize = 100
  174. err = checkUser(expected, actual)
  175. assert.Error(t, err)
  176. actual.Filters.MaxUploadFileSize = 0
  177. expected.Filters.FileExtensions = append(expected.Filters.FileExtensions, dataprovider.ExtensionsFilter{
  178. Path: "/",
  179. AllowedExtensions: []string{".jpg", ".png"},
  180. DeniedExtensions: []string{".zip", ".rar"},
  181. })
  182. err = checkUser(expected, actual)
  183. assert.Error(t, err)
  184. actual.Filters.FileExtensions = append(actual.Filters.FileExtensions, dataprovider.ExtensionsFilter{
  185. Path: "/sub",
  186. AllowedExtensions: []string{".jpg", ".png"},
  187. DeniedExtensions: []string{".zip", ".rar"},
  188. })
  189. err = checkUser(expected, actual)
  190. assert.Error(t, err)
  191. actual.Filters.FileExtensions[0] = dataprovider.ExtensionsFilter{
  192. Path: "/",
  193. AllowedExtensions: []string{".jpg"},
  194. DeniedExtensions: []string{".zip", ".rar"},
  195. }
  196. err = checkUser(expected, actual)
  197. assert.Error(t, err)
  198. actual.Filters.FileExtensions[0] = dataprovider.ExtensionsFilter{
  199. Path: "/",
  200. AllowedExtensions: []string{".tiff", ".png"},
  201. DeniedExtensions: []string{".zip", ".rar"},
  202. }
  203. err = checkUser(expected, actual)
  204. assert.Error(t, err)
  205. actual.Filters.FileExtensions[0] = dataprovider.ExtensionsFilter{
  206. Path: "/",
  207. AllowedExtensions: []string{".jpg", ".png"},
  208. DeniedExtensions: []string{".tar.gz", ".rar"},
  209. }
  210. err = checkUser(expected, actual)
  211. assert.Error(t, err)
  212. actual.Filters.FileExtensions = nil
  213. actual.Filters.FilePatterns = nil
  214. expected.Filters.FileExtensions = nil
  215. expected.Filters.FilePatterns = nil
  216. expected.Filters.FilePatterns = append(expected.Filters.FilePatterns, dataprovider.PatternsFilter{
  217. Path: "/",
  218. AllowedPatterns: []string{"*.jpg", "*.png"},
  219. DeniedPatterns: []string{"*.zip", "*.rar"},
  220. })
  221. err = checkUser(expected, actual)
  222. assert.Error(t, err)
  223. actual.Filters.FilePatterns = append(actual.Filters.FilePatterns, dataprovider.PatternsFilter{
  224. Path: "/sub",
  225. AllowedPatterns: []string{"*.jpg", "*.png"},
  226. DeniedPatterns: []string{"*.zip", "*.rar"},
  227. })
  228. err = checkUser(expected, actual)
  229. assert.Error(t, err)
  230. actual.Filters.FilePatterns[0] = dataprovider.PatternsFilter{
  231. Path: "/",
  232. AllowedPatterns: []string{"*.jpg"},
  233. DeniedPatterns: []string{"*.zip", "*.rar"},
  234. }
  235. err = checkUser(expected, actual)
  236. assert.Error(t, err)
  237. actual.Filters.FilePatterns[0] = dataprovider.PatternsFilter{
  238. Path: "/",
  239. AllowedPatterns: []string{"*.tiff", "*.png"},
  240. DeniedPatterns: []string{"*.zip", "*.rar"},
  241. }
  242. err = checkUser(expected, actual)
  243. assert.Error(t, err)
  244. actual.Filters.FilePatterns[0] = dataprovider.PatternsFilter{
  245. Path: "/",
  246. AllowedPatterns: []string{"*.jpg", "*.png"},
  247. DeniedPatterns: []string{"*.tar.gz", "*.rar"},
  248. }
  249. err = checkUser(expected, actual)
  250. assert.Error(t, err)
  251. }
  252. func TestCompareUserFields(t *testing.T) {
  253. expected := &dataprovider.User{}
  254. actual := &dataprovider.User{}
  255. expected.Permissions = make(map[string][]string)
  256. actual.Permissions = make(map[string][]string)
  257. expected.Username = "test"
  258. err := compareEqualsUserFields(expected, actual)
  259. assert.Error(t, err)
  260. expected.Username = ""
  261. expected.HomeDir = "homedir"
  262. err = compareEqualsUserFields(expected, actual)
  263. assert.Error(t, err)
  264. expected.HomeDir = ""
  265. expected.UID = 1
  266. err = compareEqualsUserFields(expected, actual)
  267. assert.Error(t, err)
  268. expected.UID = 0
  269. expected.GID = 1
  270. err = compareEqualsUserFields(expected, actual)
  271. assert.Error(t, err)
  272. expected.GID = 0
  273. expected.MaxSessions = 2
  274. err = compareEqualsUserFields(expected, actual)
  275. assert.Error(t, err)
  276. expected.MaxSessions = 0
  277. expected.QuotaSize = 4096
  278. err = compareEqualsUserFields(expected, actual)
  279. assert.Error(t, err)
  280. expected.QuotaSize = 0
  281. expected.QuotaFiles = 2
  282. err = compareEqualsUserFields(expected, actual)
  283. assert.Error(t, err)
  284. expected.QuotaFiles = 0
  285. expected.Permissions["/"] = []string{dataprovider.PermCreateDirs}
  286. err = compareEqualsUserFields(expected, actual)
  287. assert.Error(t, err)
  288. expected.Permissions = nil
  289. expected.UploadBandwidth = 64
  290. err = compareEqualsUserFields(expected, actual)
  291. assert.Error(t, err)
  292. expected.UploadBandwidth = 0
  293. expected.DownloadBandwidth = 128
  294. err = compareEqualsUserFields(expected, actual)
  295. assert.Error(t, err)
  296. expected.DownloadBandwidth = 0
  297. expected.Status = 1
  298. err = compareEqualsUserFields(expected, actual)
  299. assert.Error(t, err)
  300. expected.Status = 0
  301. expected.ExpirationDate = 123
  302. err = compareEqualsUserFields(expected, actual)
  303. assert.Error(t, err)
  304. expected.ExpirationDate = 0
  305. expected.AdditionalInfo = "info"
  306. err = compareEqualsUserFields(expected, actual)
  307. assert.Error(t, err)
  308. }
  309. func TestCompareUserFsConfig(t *testing.T) {
  310. expected := &dataprovider.User{}
  311. actual := &dataprovider.User{}
  312. expected.FsConfig.Provider = dataprovider.S3FilesystemProvider
  313. err := compareUserFsConfig(expected, actual)
  314. assert.Error(t, err)
  315. expected.FsConfig.Provider = dataprovider.LocalFilesystemProvider
  316. expected.FsConfig.S3Config.Bucket = "bucket"
  317. err = compareUserFsConfig(expected, actual)
  318. assert.Error(t, err)
  319. expected.FsConfig.S3Config.Bucket = ""
  320. expected.FsConfig.S3Config.Region = "region"
  321. err = compareUserFsConfig(expected, actual)
  322. assert.Error(t, err)
  323. expected.FsConfig.S3Config.Region = ""
  324. expected.FsConfig.S3Config.AccessKey = "access key"
  325. err = compareUserFsConfig(expected, actual)
  326. assert.Error(t, err)
  327. expected.FsConfig.S3Config.AccessKey = ""
  328. actual.FsConfig.S3Config.AccessSecret.Payload = "access secret"
  329. err = compareUserFsConfig(expected, actual)
  330. assert.Error(t, err)
  331. secret, _ := utils.EncryptData("access secret")
  332. actual.FsConfig.S3Config.AccessSecret.Payload = ""
  333. expected.FsConfig.S3Config.AccessSecret.Payload = secret
  334. err = compareUserFsConfig(expected, actual)
  335. assert.Error(t, err)
  336. expected.FsConfig.S3Config.AccessSecret.Payload = "test"
  337. actual.FsConfig.S3Config.AccessSecret.Payload = ""
  338. err = compareUserFsConfig(expected, actual)
  339. assert.Error(t, err)
  340. expected.FsConfig.S3Config.AccessSecret.Status = vfs.SecretStatusPlain
  341. actual.FsConfig.S3Config.AccessSecret.Status = vfs.SecretStatusAES256GCM
  342. err = compareUserFsConfig(expected, actual)
  343. assert.Error(t, err)
  344. actual.FsConfig.S3Config.AccessSecret.Payload = "payload"
  345. actual.FsConfig.S3Config.AccessSecret.AdditionalData = "data"
  346. err = compareUserFsConfig(expected, actual)
  347. assert.Error(t, err)
  348. actual.FsConfig.S3Config.AccessSecret.AdditionalData = ""
  349. actual.FsConfig.S3Config.AccessSecret.Key = "key"
  350. err = compareUserFsConfig(expected, actual)
  351. assert.Error(t, err)
  352. expected.FsConfig.S3Config.AccessSecret.Status = ""
  353. expected.FsConfig.S3Config.AccessSecret.Payload = ""
  354. actual.FsConfig.S3Config.AccessSecret.Status = ""
  355. actual.FsConfig.S3Config.AccessSecret.Payload = ""
  356. actual.FsConfig.S3Config.AccessSecret.AdditionalData = ""
  357. actual.FsConfig.S3Config.AccessSecret.Key = ""
  358. expected.FsConfig.S3Config.Endpoint = "http://127.0.0.1:9000/"
  359. err = compareUserFsConfig(expected, actual)
  360. assert.Error(t, err)
  361. expected.FsConfig.S3Config.Endpoint = ""
  362. expected.FsConfig.S3Config.StorageClass = "Standard"
  363. err = compareUserFsConfig(expected, actual)
  364. assert.Error(t, err)
  365. expected.FsConfig.S3Config.StorageClass = ""
  366. expected.FsConfig.S3Config.KeyPrefix = "somedir/subdir"
  367. err = compareUserFsConfig(expected, actual)
  368. assert.Error(t, err)
  369. expected.FsConfig.S3Config.KeyPrefix = ""
  370. expected.FsConfig.S3Config.UploadPartSize = 10
  371. err = compareUserFsConfig(expected, actual)
  372. assert.Error(t, err)
  373. expected.FsConfig.S3Config.UploadPartSize = 0
  374. expected.FsConfig.S3Config.UploadConcurrency = 3
  375. err = compareUserFsConfig(expected, actual)
  376. assert.Error(t, err)
  377. }
  378. func TestCompareUserGCSConfig(t *testing.T) {
  379. expected := &dataprovider.User{}
  380. actual := &dataprovider.User{}
  381. expected.FsConfig.GCSConfig.KeyPrefix = "somedir/subdir"
  382. err := compareUserFsConfig(expected, actual)
  383. assert.Error(t, err)
  384. expected.FsConfig.GCSConfig.KeyPrefix = ""
  385. expected.FsConfig.GCSConfig.Bucket = "bucket"
  386. err = compareUserFsConfig(expected, actual)
  387. assert.Error(t, err)
  388. expected.FsConfig.GCSConfig.Bucket = ""
  389. expected.FsConfig.GCSConfig.StorageClass = "Standard"
  390. err = compareUserFsConfig(expected, actual)
  391. assert.Error(t, err)
  392. expected.FsConfig.GCSConfig.StorageClass = ""
  393. expected.FsConfig.GCSConfig.AutomaticCredentials = 1
  394. err = compareUserFsConfig(expected, actual)
  395. assert.Error(t, err)
  396. expected.FsConfig.GCSConfig.AutomaticCredentials = 0
  397. }
  398. func TestCompareUserAzureConfig(t *testing.T) {
  399. expected := &dataprovider.User{}
  400. actual := &dataprovider.User{}
  401. expected.FsConfig.AzBlobConfig.Container = "a"
  402. err := compareUserFsConfig(expected, actual)
  403. assert.Error(t, err)
  404. expected.FsConfig.AzBlobConfig.Container = ""
  405. expected.FsConfig.AzBlobConfig.AccountName = "aname"
  406. err = compareUserFsConfig(expected, actual)
  407. assert.Error(t, err)
  408. expected.FsConfig.AzBlobConfig.AccountName = ""
  409. expected.FsConfig.AzBlobConfig.AccountKey.Payload = "akey"
  410. err = compareUserFsConfig(expected, actual)
  411. assert.Error(t, err)
  412. expected.FsConfig.AzBlobConfig.AccountKey.Payload = ""
  413. expected.FsConfig.AzBlobConfig.Endpoint = "endpt"
  414. err = compareUserFsConfig(expected, actual)
  415. assert.Error(t, err)
  416. expected.FsConfig.AzBlobConfig.Endpoint = ""
  417. expected.FsConfig.AzBlobConfig.SASURL = "url"
  418. err = compareUserFsConfig(expected, actual)
  419. assert.Error(t, err)
  420. expected.FsConfig.AzBlobConfig.SASURL = ""
  421. expected.FsConfig.AzBlobConfig.UploadPartSize = 1
  422. err = compareUserFsConfig(expected, actual)
  423. assert.Error(t, err)
  424. expected.FsConfig.AzBlobConfig.UploadPartSize = 0
  425. expected.FsConfig.AzBlobConfig.UploadConcurrency = 1
  426. err = compareUserFsConfig(expected, actual)
  427. assert.Error(t, err)
  428. expected.FsConfig.AzBlobConfig.UploadConcurrency = 0
  429. expected.FsConfig.AzBlobConfig.KeyPrefix = "prefix/"
  430. err = compareUserFsConfig(expected, actual)
  431. assert.Error(t, err)
  432. expected.FsConfig.AzBlobConfig.KeyPrefix = ""
  433. expected.FsConfig.AzBlobConfig.UseEmulator = true
  434. err = compareUserFsConfig(expected, actual)
  435. assert.Error(t, err)
  436. expected.FsConfig.AzBlobConfig.UseEmulator = false
  437. expected.FsConfig.AzBlobConfig.AccessTier = "Hot"
  438. err = compareUserFsConfig(expected, actual)
  439. assert.Error(t, err)
  440. expected.FsConfig.AzBlobConfig.AccessTier = ""
  441. }
  442. func TestGCSWebInvalidFormFile(t *testing.T) {
  443. form := make(url.Values)
  444. form.Set("username", "test_username")
  445. form.Set("fs_provider", "2")
  446. req, _ := http.NewRequest(http.MethodPost, webUserPath, strings.NewReader(form.Encode()))
  447. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  448. err := req.ParseForm()
  449. assert.NoError(t, err)
  450. _, err = getFsConfigFromUserPostFields(req)
  451. assert.EqualError(t, err, http.ErrNotMultipart.Error())
  452. }
  453. func TestApiCallsWithBadURL(t *testing.T) {
  454. oldBaseURL := httpBaseURL
  455. oldAuthUsername := authUsername
  456. oldAuthPassword := authPassword
  457. SetBaseURLAndCredentials(invalidURL, oldAuthUsername, oldAuthPassword)
  458. folder := vfs.BaseVirtualFolder{
  459. MappedPath: os.TempDir(),
  460. }
  461. u := dataprovider.User{}
  462. _, _, err := UpdateUser(u, http.StatusBadRequest, "")
  463. assert.Error(t, err)
  464. _, err = RemoveUser(u, http.StatusNotFound)
  465. assert.Error(t, err)
  466. _, err = RemoveFolder(folder, http.StatusNotFound)
  467. assert.Error(t, err)
  468. _, _, err = GetUsers(1, 0, "", http.StatusBadRequest)
  469. assert.Error(t, err)
  470. _, _, err = GetFolders(1, 0, "", http.StatusBadRequest)
  471. assert.Error(t, err)
  472. _, err = UpdateQuotaUsage(u, "", http.StatusNotFound)
  473. assert.Error(t, err)
  474. _, err = UpdateFolderQuotaUsage(folder, "", http.StatusNotFound)
  475. assert.Error(t, err)
  476. _, err = CloseConnection("non_existent_id", http.StatusNotFound)
  477. assert.Error(t, err)
  478. _, _, err = Dumpdata("backup.json", "", http.StatusBadRequest)
  479. assert.Error(t, err)
  480. _, _, err = Loaddata("/tmp/backup.json", "", "", http.StatusBadRequest)
  481. assert.Error(t, err)
  482. SetBaseURLAndCredentials(oldBaseURL, oldAuthUsername, oldAuthPassword)
  483. }
  484. func TestApiCallToNotListeningServer(t *testing.T) {
  485. oldBaseURL := httpBaseURL
  486. oldAuthUsername := authUsername
  487. oldAuthPassword := authPassword
  488. SetBaseURLAndCredentials(inactiveURL, oldAuthUsername, oldAuthPassword)
  489. u := dataprovider.User{}
  490. _, _, err := AddUser(u, http.StatusBadRequest)
  491. assert.Error(t, err)
  492. _, _, err = UpdateUser(u, http.StatusNotFound, "")
  493. assert.Error(t, err)
  494. _, err = RemoveUser(u, http.StatusNotFound)
  495. assert.Error(t, err)
  496. _, _, err = GetUserByID(-1, http.StatusNotFound)
  497. assert.Error(t, err)
  498. _, _, err = GetUsers(100, 0, "", http.StatusOK)
  499. assert.Error(t, err)
  500. _, err = UpdateQuotaUsage(u, "", http.StatusNotFound)
  501. assert.Error(t, err)
  502. _, _, err = GetQuotaScans(http.StatusOK)
  503. assert.Error(t, err)
  504. _, err = StartQuotaScan(u, http.StatusNotFound)
  505. assert.Error(t, err)
  506. folder := vfs.BaseVirtualFolder{
  507. MappedPath: os.TempDir(),
  508. }
  509. _, err = StartFolderQuotaScan(folder, http.StatusNotFound)
  510. assert.Error(t, err)
  511. _, _, err = AddFolder(folder, http.StatusOK)
  512. assert.Error(t, err)
  513. _, err = RemoveFolder(folder, http.StatusOK)
  514. assert.Error(t, err)
  515. _, _, err = GetFolders(0, 0, "", http.StatusOK)
  516. assert.Error(t, err)
  517. _, err = UpdateFolderQuotaUsage(folder, "", http.StatusNotFound)
  518. assert.Error(t, err)
  519. _, _, err = GetFoldersQuotaScans(http.StatusOK)
  520. assert.Error(t, err)
  521. _, _, err = GetConnections(http.StatusOK)
  522. assert.Error(t, err)
  523. _, err = CloseConnection("non_existent_id", http.StatusNotFound)
  524. assert.Error(t, err)
  525. _, _, err = GetVersion(http.StatusOK)
  526. assert.Error(t, err)
  527. _, _, err = GetProviderStatus(http.StatusOK)
  528. assert.Error(t, err)
  529. _, _, err = Dumpdata("backup.json", "0", http.StatusOK)
  530. assert.Error(t, err)
  531. _, _, err = Loaddata("/tmp/backup.json", "", "", http.StatusOK)
  532. assert.Error(t, err)
  533. SetBaseURLAndCredentials(oldBaseURL, oldAuthUsername, oldAuthPassword)
  534. }
  535. func TestBasicAuth(t *testing.T) {
  536. oldAuthUsername := authUsername
  537. oldAuthPassword := authPassword
  538. authUserFile := filepath.Join(os.TempDir(), "http_users.txt")
  539. authUserData := []byte("test1:$2y$05$bcHSED7aO1cfLto6ZdDBOOKzlwftslVhtpIkRhAtSa4GuLmk5mola\n")
  540. err := ioutil.WriteFile(authUserFile, authUserData, os.ModePerm)
  541. assert.NoError(t, err)
  542. httpAuth, _ = newBasicAuthProvider(authUserFile)
  543. _, _, err = GetVersion(http.StatusUnauthorized)
  544. assert.NoError(t, err)
  545. SetBaseURLAndCredentials(httpBaseURL, "test1", "password1")
  546. _, _, err = GetVersion(http.StatusOK)
  547. assert.NoError(t, err)
  548. SetBaseURLAndCredentials(httpBaseURL, "test1", "wrong_password")
  549. resp, _ := sendHTTPRequest(http.MethodGet, buildURLRelativeToBase(metricsPath), nil, "")
  550. defer resp.Body.Close()
  551. assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
  552. authUserData = append(authUserData, []byte("test2:$1$OtSSTL8b$bmaCqEksI1e7rnZSjsIDR1\n")...)
  553. err = ioutil.WriteFile(authUserFile, authUserData, os.ModePerm)
  554. assert.NoError(t, err)
  555. SetBaseURLAndCredentials(httpBaseURL, "test2", "password2")
  556. _, _, err = GetVersion(http.StatusOK)
  557. assert.NoError(t, err)
  558. SetBaseURLAndCredentials(httpBaseURL, "test2", "wrong_password")
  559. _, _, err = GetVersion(http.StatusOK)
  560. assert.Error(t, err)
  561. authUserData = append(authUserData, []byte("test2:$apr1$gLnIkRIf$Xr/6aJfmIrihP4b2N2tcs/\n")...)
  562. err = ioutil.WriteFile(authUserFile, authUserData, os.ModePerm)
  563. assert.NoError(t, err)
  564. SetBaseURLAndCredentials(httpBaseURL, "test2", "password2")
  565. _, _, err = GetVersion(http.StatusOK)
  566. assert.NoError(t, err)
  567. SetBaseURLAndCredentials(httpBaseURL, "test2", "wrong_password")
  568. _, _, err = GetVersion(http.StatusOK)
  569. assert.Error(t, err)
  570. authUserData = append(authUserData, []byte("test3:$apr1$gLnIkRIf$Xr/6$aJfmIr$ihP4b2N2tcs/\n")...)
  571. err = ioutil.WriteFile(authUserFile, authUserData, os.ModePerm)
  572. assert.NoError(t, err)
  573. SetBaseURLAndCredentials(httpBaseURL, "test3", "wrong_password")
  574. _, _, err = GetVersion(http.StatusUnauthorized)
  575. assert.NoError(t, err)
  576. authUserData = append(authUserData, []byte("test4:$invalid$gLnIkRIf$Xr/6$aJfmIr$ihP4b2N2tcs/\n")...)
  577. err = ioutil.WriteFile(authUserFile, authUserData, os.ModePerm)
  578. assert.NoError(t, err)
  579. SetBaseURLAndCredentials(httpBaseURL, "test3", "password2")
  580. _, _, err = GetVersion(http.StatusUnauthorized)
  581. assert.NoError(t, err)
  582. if runtime.GOOS != "windows" {
  583. authUserData = append(authUserData, []byte("test5:$apr1$gLnIkRIf$Xr/6aJfmIrihP4b2N2tcs/\n")...)
  584. err = ioutil.WriteFile(authUserFile, authUserData, os.ModePerm)
  585. assert.NoError(t, err)
  586. err = os.Chmod(authUserFile, 0001)
  587. assert.NoError(t, err)
  588. SetBaseURLAndCredentials(httpBaseURL, "test5", "password2")
  589. _, _, err = GetVersion(http.StatusUnauthorized)
  590. assert.NoError(t, err)
  591. err = os.Chmod(authUserFile, os.ModePerm)
  592. assert.NoError(t, err)
  593. }
  594. authUserData = append(authUserData, []byte("\"foo\"bar\"\r\n")...)
  595. err = ioutil.WriteFile(authUserFile, authUserData, os.ModePerm)
  596. assert.NoError(t, err)
  597. SetBaseURLAndCredentials(httpBaseURL, "test2", "password2")
  598. _, _, err = GetVersion(http.StatusUnauthorized)
  599. assert.NoError(t, err)
  600. err = os.Remove(authUserFile)
  601. assert.NoError(t, err)
  602. SetBaseURLAndCredentials(httpBaseURL, oldAuthUsername, oldAuthPassword)
  603. httpAuth, _ = newBasicAuthProvider("")
  604. }
  605. func TestCloseConnectionHandler(t *testing.T) {
  606. req, _ := http.NewRequest(http.MethodDelete, activeConnectionsPath+"/connectionID", nil)
  607. rctx := chi.NewRouteContext()
  608. rctx.URLParams.Add("connectionID", "")
  609. req = req.WithContext(context.WithValue(req.Context(), chi.RouteCtxKey, rctx))
  610. rr := httptest.NewRecorder()
  611. handleCloseConnection(rr, req)
  612. assert.Equal(t, http.StatusBadRequest, rr.Code)
  613. }
  614. func TestRenderInvalidTemplate(t *testing.T) {
  615. tmpl, err := template.New("test").Parse("{{.Count}}")
  616. if assert.NoError(t, err) {
  617. templates["no_match"] = tmpl
  618. rw := httptest.NewRecorder()
  619. renderTemplate(rw, "no_match", map[string]string{})
  620. assert.Equal(t, http.StatusInternalServerError, rw.Code)
  621. }
  622. }
  623. func TestQuotaScanInvalidFs(t *testing.T) {
  624. user := dataprovider.User{
  625. Username: "test",
  626. HomeDir: os.TempDir(),
  627. FsConfig: dataprovider.Filesystem{
  628. Provider: dataprovider.S3FilesystemProvider,
  629. },
  630. }
  631. common.QuotaScans.AddUserQuotaScan(user.Username)
  632. err := doQuotaScan(user)
  633. assert.Error(t, err)
  634. }