internal_test.go 25 KB

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