cryptfs_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. // Copyright (C) 2019-2023 Nicola Murino
  2. //
  3. // This program is free software: you can redistribute it and/or modify
  4. // it under the terms of the GNU Affero General Public License as published
  5. // by the Free Software Foundation, version 3.
  6. //
  7. // This program is distributed in the hope that it will be useful,
  8. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. // GNU Affero General Public License for more details.
  11. //
  12. // You should have received a copy of the GNU Affero General Public License
  13. // along with this program. If not, see <https://www.gnu.org/licenses/>.
  14. package sftpd_test
  15. import (
  16. "crypto/sha256"
  17. "fmt"
  18. "net/http"
  19. "os"
  20. "path"
  21. "path/filepath"
  22. "testing"
  23. "time"
  24. "github.com/minio/sio"
  25. "github.com/sftpgo/sdk"
  26. "github.com/stretchr/testify/assert"
  27. "github.com/drakkan/sftpgo/v2/internal/dataprovider"
  28. "github.com/drakkan/sftpgo/v2/internal/httpdtest"
  29. "github.com/drakkan/sftpgo/v2/internal/kms"
  30. "github.com/drakkan/sftpgo/v2/internal/vfs"
  31. )
  32. const (
  33. testPassphrase = "test passphrase"
  34. )
  35. func TestBasicSFTPCryptoHandling(t *testing.T) {
  36. usePubKey := false
  37. u := getTestUserWithCryptFs(usePubKey)
  38. u.QuotaSize = 6553600
  39. user, _, err := httpdtest.AddUser(u, http.StatusCreated)
  40. assert.NoError(t, err)
  41. conn, client, err := getSftpClient(user, usePubKey)
  42. if assert.NoError(t, err) {
  43. defer conn.Close()
  44. defer client.Close()
  45. testFilePath := filepath.Join(homeBasePath, testFileName)
  46. testFileSize := int64(65535)
  47. encryptedFileSize, err := getEncryptedFileSize(testFileSize)
  48. assert.NoError(t, err)
  49. expectedQuotaSize := user.UsedQuotaSize + encryptedFileSize
  50. expectedQuotaFiles := user.UsedQuotaFiles + 1
  51. err = createTestFile(testFilePath, testFileSize)
  52. assert.NoError(t, err)
  53. err = sftpUploadFile(testFilePath, path.Join("/missing_dir", testFileName), testFileSize, client)
  54. assert.Error(t, err)
  55. err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
  56. assert.NoError(t, err)
  57. localDownloadPath := filepath.Join(homeBasePath, testDLFileName)
  58. err = sftpDownloadFile(testFileName, localDownloadPath, testFileSize, client)
  59. assert.NoError(t, err)
  60. initialHash, err := computeHashForFile(sha256.New(), testFilePath)
  61. assert.NoError(t, err)
  62. downloadedFileHash, err := computeHashForFile(sha256.New(), localDownloadPath)
  63. assert.NoError(t, err)
  64. assert.Equal(t, initialHash, downloadedFileHash)
  65. info, err := os.Stat(filepath.Join(user.HomeDir, testFileName))
  66. if assert.NoError(t, err) {
  67. assert.Equal(t, encryptedFileSize, info.Size())
  68. }
  69. user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK)
  70. assert.NoError(t, err)
  71. assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles)
  72. assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize)
  73. result, err := client.ReadDir(".")
  74. assert.NoError(t, err)
  75. if assert.Len(t, result, 1) {
  76. assert.Equal(t, testFileSize, result[0].Size())
  77. }
  78. info, err = client.Stat(testFileName)
  79. if assert.NoError(t, err) {
  80. assert.Equal(t, testFileSize, info.Size())
  81. }
  82. err = client.Remove(testFileName)
  83. assert.NoError(t, err)
  84. _, err = client.Lstat(testFileName)
  85. assert.Error(t, err)
  86. user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK)
  87. assert.NoError(t, err)
  88. assert.Equal(t, expectedQuotaFiles-1, user.UsedQuotaFiles)
  89. assert.Equal(t, expectedQuotaSize-encryptedFileSize, user.UsedQuotaSize)
  90. err = os.Remove(testFilePath)
  91. assert.NoError(t, err)
  92. err = os.Remove(localDownloadPath)
  93. assert.NoError(t, err)
  94. }
  95. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  96. assert.NoError(t, err)
  97. err = os.RemoveAll(user.GetHomeDir())
  98. assert.NoError(t, err)
  99. }
  100. func TestOpenReadWriteCryptoFs(t *testing.T) {
  101. // read and write is not supported on crypto fs
  102. usePubKey := false
  103. u := getTestUserWithCryptFs(usePubKey)
  104. u.QuotaSize = 6553600
  105. user, _, err := httpdtest.AddUser(u, http.StatusCreated)
  106. assert.NoError(t, err)
  107. conn, client, err := getSftpClient(user, usePubKey)
  108. if assert.NoError(t, err) {
  109. defer conn.Close()
  110. defer client.Close()
  111. sftpFile, err := client.OpenFile(testFileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC)
  112. if assert.NoError(t, err) {
  113. testData := []byte("sample test data")
  114. n, err := sftpFile.Write(testData)
  115. assert.NoError(t, err)
  116. assert.Equal(t, len(testData), n)
  117. buffer := make([]byte, 128)
  118. _, err = sftpFile.ReadAt(buffer, 1)
  119. if assert.Error(t, err) {
  120. assert.Contains(t, err.Error(), "SSH_FX_OP_UNSUPPORTED")
  121. }
  122. err = sftpFile.Close()
  123. assert.NoError(t, err)
  124. }
  125. }
  126. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  127. assert.NoError(t, err)
  128. err = os.RemoveAll(user.GetHomeDir())
  129. assert.NoError(t, err)
  130. }
  131. func TestEmptyFile(t *testing.T) {
  132. usePubKey := true
  133. u := getTestUserWithCryptFs(usePubKey)
  134. user, _, err := httpdtest.AddUser(u, http.StatusCreated)
  135. assert.NoError(t, err)
  136. conn, client, err := getSftpClient(user, usePubKey)
  137. if assert.NoError(t, err) {
  138. defer conn.Close()
  139. defer client.Close()
  140. sftpFile, err := client.OpenFile(testFileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC)
  141. if assert.NoError(t, err) {
  142. testData := []byte("")
  143. n, err := sftpFile.Write(testData)
  144. assert.NoError(t, err)
  145. assert.Equal(t, len(testData), n)
  146. err = sftpFile.Close()
  147. assert.NoError(t, err)
  148. }
  149. info, err := client.Stat(testFileName)
  150. if assert.NoError(t, err) {
  151. assert.Equal(t, int64(0), info.Size())
  152. }
  153. localDownloadPath := filepath.Join(homeBasePath, testDLFileName)
  154. err = sftpDownloadFile(testFileName, localDownloadPath, 0, client)
  155. assert.NoError(t, err)
  156. encryptedFileSize, err := getEncryptedFileSize(0)
  157. assert.NoError(t, err)
  158. info, err = os.Stat(filepath.Join(user.HomeDir, testFileName))
  159. if assert.NoError(t, err) {
  160. assert.Equal(t, encryptedFileSize, info.Size())
  161. }
  162. err = os.Remove(localDownloadPath)
  163. assert.NoError(t, err)
  164. }
  165. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  166. assert.NoError(t, err)
  167. err = os.RemoveAll(user.GetHomeDir())
  168. assert.NoError(t, err)
  169. }
  170. func TestUploadResumeCryptFs(t *testing.T) {
  171. // resuming uploads is not supported
  172. usePubKey := true
  173. u := getTestUserWithCryptFs(usePubKey)
  174. user, _, err := httpdtest.AddUser(u, http.StatusCreated)
  175. assert.NoError(t, err)
  176. err = os.RemoveAll(user.GetHomeDir())
  177. assert.NoError(t, err)
  178. conn, client, err := getSftpClient(user, usePubKey)
  179. if assert.NoError(t, err) {
  180. defer conn.Close()
  181. defer client.Close()
  182. testFilePath := filepath.Join(homeBasePath, testFileName)
  183. testFileSize := int64(65535)
  184. appendDataSize := int64(65535)
  185. err = createTestFile(testFilePath, testFileSize)
  186. assert.NoError(t, err)
  187. err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
  188. assert.NoError(t, err)
  189. err = appendToTestFile(testFilePath, appendDataSize)
  190. assert.NoError(t, err)
  191. err = sftpUploadResumeFile(testFilePath, testFileName, testFileSize, false, client)
  192. if assert.Error(t, err) {
  193. assert.Contains(t, err.Error(), "SSH_FX_OP_UNSUPPORTED")
  194. }
  195. }
  196. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  197. assert.NoError(t, err)
  198. err = os.RemoveAll(user.GetHomeDir())
  199. assert.NoError(t, err)
  200. }
  201. func TestQuotaFileReplaceCryptFs(t *testing.T) {
  202. usePubKey := false
  203. u := getTestUserWithCryptFs(usePubKey)
  204. u.QuotaFiles = 1000
  205. user, _, err := httpdtest.AddUser(u, http.StatusCreated)
  206. assert.NoError(t, err)
  207. err = os.RemoveAll(user.GetHomeDir())
  208. assert.NoError(t, err)
  209. testFileSize := int64(65535)
  210. testFilePath := filepath.Join(homeBasePath, testFileName)
  211. encryptedFileSize, err := getEncryptedFileSize(testFileSize)
  212. assert.NoError(t, err)
  213. conn, client, err := getSftpClient(user, usePubKey)
  214. if assert.NoError(t, err) { //nolint:dupl
  215. defer conn.Close()
  216. defer client.Close()
  217. expectedQuotaSize := user.UsedQuotaSize + encryptedFileSize
  218. expectedQuotaFiles := user.UsedQuotaFiles + 1
  219. err = createTestFile(testFilePath, testFileSize)
  220. assert.NoError(t, err)
  221. err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
  222. assert.NoError(t, err)
  223. // now replace the same file, the quota must not change
  224. err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
  225. assert.NoError(t, err)
  226. user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK)
  227. assert.NoError(t, err)
  228. assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles)
  229. assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize)
  230. // now create a symlink, replace it with a file and check the quota
  231. // replacing a symlink is like uploading a new file
  232. err = client.Symlink(testFileName, testFileName+".link")
  233. assert.NoError(t, err)
  234. user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK)
  235. assert.NoError(t, err)
  236. assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles)
  237. assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize)
  238. expectedQuotaFiles = expectedQuotaFiles + 1
  239. expectedQuotaSize = expectedQuotaSize + encryptedFileSize
  240. err = sftpUploadFile(testFilePath, testFileName+".link", testFileSize, client)
  241. assert.NoError(t, err)
  242. user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK)
  243. assert.NoError(t, err)
  244. assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles)
  245. assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize)
  246. }
  247. // now set a quota size restriction and upload the same file, upload should fail for space limit exceeded
  248. user.QuotaSize = encryptedFileSize*2 - 1
  249. user, _, err = httpdtest.UpdateUser(user, http.StatusOK, "")
  250. assert.NoError(t, err)
  251. conn, client, err = getSftpClient(user, usePubKey)
  252. if assert.NoError(t, err) {
  253. defer conn.Close()
  254. defer client.Close()
  255. err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
  256. assert.Error(t, err, "quota size exceeded, file upload must fail")
  257. err = client.Remove(testFileName)
  258. assert.NoError(t, err)
  259. }
  260. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  261. assert.NoError(t, err)
  262. err = os.Remove(testFilePath)
  263. assert.NoError(t, err)
  264. err = os.RemoveAll(user.GetHomeDir())
  265. assert.NoError(t, err)
  266. }
  267. func TestQuotaScanCryptFs(t *testing.T) {
  268. usePubKey := false
  269. user, _, err := httpdtest.AddUser(getTestUserWithCryptFs(usePubKey), http.StatusCreated)
  270. assert.NoError(t, err)
  271. testFileSize := int64(65535)
  272. encryptedFileSize, err := getEncryptedFileSize(testFileSize)
  273. assert.NoError(t, err)
  274. expectedQuotaSize := user.UsedQuotaSize + encryptedFileSize
  275. expectedQuotaFiles := user.UsedQuotaFiles + 1
  276. conn, client, err := getSftpClient(user, usePubKey)
  277. if assert.NoError(t, err) {
  278. defer conn.Close()
  279. defer client.Close()
  280. testFilePath := filepath.Join(homeBasePath, testFileName)
  281. err = createTestFile(testFilePath, testFileSize)
  282. assert.NoError(t, err)
  283. err = sftpUploadFile(testFilePath, testFileName, testFileSize, client)
  284. assert.NoError(t, err)
  285. err = os.Remove(testFilePath)
  286. assert.NoError(t, err)
  287. }
  288. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  289. assert.NoError(t, err)
  290. // create user with the same home dir, so there is at least an untracked file
  291. user, _, err = httpdtest.AddUser(getTestUser(usePubKey), http.StatusCreated)
  292. assert.NoError(t, err)
  293. _, err = httpdtest.StartQuotaScan(user, http.StatusAccepted)
  294. assert.NoError(t, err)
  295. assert.Eventually(t, func() bool {
  296. scans, _, err := httpdtest.GetQuotaScans(http.StatusOK)
  297. if err == nil {
  298. return len(scans) == 0
  299. }
  300. return false
  301. }, 1*time.Second, 50*time.Millisecond)
  302. user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK)
  303. assert.NoError(t, err)
  304. assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles)
  305. assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize)
  306. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  307. assert.NoError(t, err)
  308. err = os.RemoveAll(user.GetHomeDir())
  309. assert.NoError(t, err)
  310. }
  311. func TestGetMimeTypeCryptFs(t *testing.T) {
  312. usePubKey := true
  313. user, _, err := httpdtest.AddUser(getTestUserWithCryptFs(usePubKey), http.StatusCreated)
  314. assert.NoError(t, err)
  315. conn, client, err := getSftpClient(user, usePubKey)
  316. if assert.NoError(t, err) {
  317. defer conn.Close()
  318. defer client.Close()
  319. sftpFile, err := client.OpenFile(testFileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC)
  320. if assert.NoError(t, err) {
  321. testData := []byte("some UTF-8 text so we should get a text/plain mime type")
  322. n, err := sftpFile.Write(testData)
  323. assert.NoError(t, err)
  324. assert.Equal(t, len(testData), n)
  325. err = sftpFile.Close()
  326. assert.NoError(t, err)
  327. }
  328. }
  329. user.FsConfig.CryptConfig.Passphrase = kms.NewPlainSecret(testPassphrase)
  330. fs, err := user.GetFilesystem("connID")
  331. if assert.NoError(t, err) {
  332. assert.True(t, vfs.IsCryptOsFs(fs))
  333. mime, err := fs.GetMimeType(filepath.Join(user.GetHomeDir(), testFileName))
  334. assert.NoError(t, err)
  335. assert.Equal(t, "text/plain; charset=utf-8", mime)
  336. }
  337. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  338. assert.NoError(t, err)
  339. err = os.RemoveAll(user.GetHomeDir())
  340. assert.NoError(t, err)
  341. }
  342. func TestTruncate(t *testing.T) {
  343. // truncate is not supported
  344. usePubKey := true
  345. user, _, err := httpdtest.AddUser(getTestUserWithCryptFs(usePubKey), http.StatusCreated)
  346. assert.NoError(t, err)
  347. conn, client, err := getSftpClient(user, usePubKey)
  348. if assert.NoError(t, err) {
  349. defer conn.Close()
  350. defer client.Close()
  351. f, err := client.OpenFile(testFileName, os.O_WRONLY|os.O_CREATE)
  352. if assert.NoError(t, err) {
  353. err = f.Truncate(0)
  354. assert.NoError(t, err)
  355. err = f.Truncate(1)
  356. assert.Error(t, err)
  357. }
  358. err = f.Close()
  359. assert.NoError(t, err)
  360. err = client.Truncate(testFileName, 0)
  361. assert.Error(t, err)
  362. }
  363. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  364. assert.NoError(t, err)
  365. err = os.RemoveAll(user.GetHomeDir())
  366. assert.NoError(t, err)
  367. }
  368. func TestSCPBasicHandlingCryptoFs(t *testing.T) {
  369. if scpPath == "" {
  370. t.Skip("scp command not found, unable to execute this test")
  371. }
  372. usePubKey := true
  373. u := getTestUserWithCryptFs(usePubKey)
  374. u.QuotaSize = 6553600
  375. user, _, err := httpdtest.AddUser(u, http.StatusCreated)
  376. assert.NoError(t, err)
  377. testFilePath := filepath.Join(homeBasePath, testFileName)
  378. testFileSize := int64(131074)
  379. encryptedFileSize, err := getEncryptedFileSize(testFileSize)
  380. assert.NoError(t, err)
  381. expectedQuotaSize := user.UsedQuotaSize + encryptedFileSize
  382. expectedQuotaFiles := user.UsedQuotaFiles + 1
  383. err = createTestFile(testFilePath, testFileSize)
  384. assert.NoError(t, err)
  385. remoteUpPath := fmt.Sprintf("%[email protected]:%v", user.Username, "/")
  386. remoteDownPath := fmt.Sprintf("%[email protected]:%v", user.Username, path.Join("/", testFileName))
  387. localPath := filepath.Join(homeBasePath, "scp_download.dat")
  388. // test to download a missing file
  389. err = scpDownload(localPath, remoteDownPath, false, false)
  390. assert.Error(t, err, "downloading a missing file via scp must fail")
  391. err = scpUpload(testFilePath, remoteUpPath, false, false)
  392. assert.NoError(t, err)
  393. err = scpDownload(localPath, remoteDownPath, false, false)
  394. assert.NoError(t, err)
  395. fi, err := os.Stat(localPath)
  396. if assert.NoError(t, err) {
  397. assert.Equal(t, testFileSize, fi.Size())
  398. }
  399. fi, err = os.Stat(filepath.Join(user.GetHomeDir(), testFileName))
  400. if assert.NoError(t, err) {
  401. assert.Equal(t, encryptedFileSize, fi.Size())
  402. }
  403. err = os.Remove(localPath)
  404. assert.NoError(t, err)
  405. user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK)
  406. assert.NoError(t, err)
  407. assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles)
  408. assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize)
  409. // now overwrite the existing file
  410. err = scpUpload(testFilePath, remoteUpPath, false, false)
  411. assert.NoError(t, err)
  412. user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK)
  413. assert.NoError(t, err)
  414. assert.Equal(t, expectedQuotaFiles, user.UsedQuotaFiles)
  415. assert.Equal(t, expectedQuotaSize, user.UsedQuotaSize)
  416. assert.NoError(t, err)
  417. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  418. assert.NoError(t, err)
  419. err = os.RemoveAll(user.GetHomeDir())
  420. assert.NoError(t, err)
  421. err = os.Remove(testFilePath)
  422. assert.NoError(t, err)
  423. }
  424. func TestSCPRecursiveCryptFs(t *testing.T) {
  425. if scpPath == "" {
  426. t.Skip("scp command not found, unable to execute this test")
  427. }
  428. usePubKey := true
  429. u := getTestUserWithCryptFs(usePubKey)
  430. user, _, err := httpdtest.AddUser(u, http.StatusCreated)
  431. assert.NoError(t, err)
  432. testBaseDirName := "atestdir"
  433. testBaseDirPath := filepath.Join(homeBasePath, testBaseDirName)
  434. testBaseDirDownName := "test_dir_down" //nolint:goconst
  435. testBaseDirDownPath := filepath.Join(homeBasePath, testBaseDirDownName)
  436. testFilePath := filepath.Join(homeBasePath, testBaseDirName, testFileName)
  437. testFilePath1 := filepath.Join(homeBasePath, testBaseDirName, testBaseDirName, testFileName)
  438. testFileSize := int64(131074)
  439. err = createTestFile(testFilePath, testFileSize)
  440. assert.NoError(t, err)
  441. err = createTestFile(testFilePath1, testFileSize)
  442. assert.NoError(t, err)
  443. remoteDownPath := fmt.Sprintf("%[email protected]:%v", user.Username, path.Join("/", testBaseDirName))
  444. remoteUpPath := fmt.Sprintf("%[email protected]:%v", user.Username, "/")
  445. err = scpUpload(testBaseDirPath, remoteUpPath, true, false)
  446. assert.NoError(t, err)
  447. // overwrite existing dir
  448. err = scpUpload(testBaseDirPath, remoteUpPath, true, false)
  449. assert.NoError(t, err)
  450. err = scpDownload(testBaseDirDownPath, remoteDownPath, true, true)
  451. assert.NoError(t, err)
  452. // test download without passing -r
  453. err = scpDownload(testBaseDirDownPath, remoteDownPath, true, false)
  454. assert.Error(t, err, "recursive download without -r must fail")
  455. fi, err := os.Stat(filepath.Join(testBaseDirDownPath, testFileName))
  456. if assert.NoError(t, err) {
  457. assert.Equal(t, testFileSize, fi.Size())
  458. }
  459. fi, err = os.Stat(filepath.Join(testBaseDirDownPath, testBaseDirName, testFileName))
  460. if assert.NoError(t, err) {
  461. assert.Equal(t, testFileSize, fi.Size())
  462. }
  463. // upload to a non existent dir
  464. remoteUpPath = fmt.Sprintf("%[email protected]:%v", user.Username, "/non_existent_dir")
  465. err = scpUpload(testBaseDirPath, remoteUpPath, true, false)
  466. assert.Error(t, err, "uploading via scp to a non existent dir must fail")
  467. err = os.RemoveAll(testBaseDirPath)
  468. assert.NoError(t, err)
  469. err = os.RemoveAll(testBaseDirDownPath)
  470. assert.NoError(t, err)
  471. err = os.RemoveAll(user.GetHomeDir())
  472. assert.NoError(t, err)
  473. _, err = httpdtest.RemoveUser(user, http.StatusOK)
  474. assert.NoError(t, err)
  475. }
  476. func getEncryptedFileSize(size int64) (int64, error) {
  477. encSize, err := sio.EncryptedSize(uint64(size))
  478. return int64(encSize) + 33, err
  479. }
  480. func getTestUserWithCryptFs(usePubKey bool) dataprovider.User {
  481. u := getTestUser(usePubKey)
  482. u.FsConfig.Provider = sdk.CryptedFilesystemProvider
  483. u.FsConfig.CryptConfig.Passphrase = kms.NewPlainSecret(testPassphrase)
  484. return u
  485. }