|
@@ -9558,6 +9558,356 @@ func TestShareUncompressed(t *testing.T) {
|
|
|
assert.NoError(t, err)
|
|
|
}
|
|
|
|
|
|
+func TestDownloadFromShareError(t *testing.T) {
|
|
|
+ u := getTestUser()
|
|
|
+ u.DownloadDataTransfer = 1
|
|
|
+ user, _, err := httpdtest.AddUser(u, http.StatusCreated)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ user.UsedDownloadDataTransfer = 1024*1024 - 32768
|
|
|
+ _, err = httpdtest.UpdateTransferQuotaUsage(user, "add", http.StatusOK)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ user, _, err = httpdtest.GetUserByUsername(user.Username, http.StatusOK)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, int64(1024*1024-32768), user.UsedDownloadDataTransfer)
|
|
|
+ testFileName := "test_share_file.dat"
|
|
|
+ testFileSize := int64(524288)
|
|
|
+ testFilePath := filepath.Join(user.GetHomeDir(), testFileName)
|
|
|
+ err = createTestFile(testFilePath, testFileSize)
|
|
|
+ assert.NoError(t, err)
|
|
|
+
|
|
|
+ token, err := getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ share := dataprovider.Share{
|
|
|
+ Name: "test share root browse",
|
|
|
+ Scope: dataprovider.ShareScopeRead,
|
|
|
+ Paths: []string{"/"},
|
|
|
+ MaxTokens: 2,
|
|
|
+ }
|
|
|
+ asJSON, err := json.Marshal(share)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ req, err := http.NewRequest(http.MethodPost, userSharesPath, bytes.NewBuffer(asJSON))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ setBearerForReq(req, token)
|
|
|
+ rr := executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusCreated, rr)
|
|
|
+ objectID := rr.Header().Get("X-Object-ID")
|
|
|
+ assert.NotEmpty(t, objectID)
|
|
|
+
|
|
|
+ defer func() {
|
|
|
+ rcv := recover()
|
|
|
+ assert.Equal(t, http.ErrAbortHandler, rcv)
|
|
|
+
|
|
|
+ share, err = dataprovider.ShareExists(objectID, user.Username)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, 0, share.UsedTokens)
|
|
|
+
|
|
|
+ _, err = httpdtest.RemoveUser(user, http.StatusOK)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.RemoveAll(user.GetHomeDir())
|
|
|
+ assert.NoError(t, err)
|
|
|
+ }()
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path="+testFileName), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ executeRequest(req)
|
|
|
+}
|
|
|
+
|
|
|
+func TestBrowseShares(t *testing.T) {
|
|
|
+ user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated)
|
|
|
+ assert.NoError(t, err)
|
|
|
+
|
|
|
+ testFileName := "testsharefile.dat"
|
|
|
+ testFileNameLink := "testsharefile.link"
|
|
|
+ shareDir := "share"
|
|
|
+ subDir := "sub"
|
|
|
+ testFileSize := int64(65536)
|
|
|
+ testFilePath := filepath.Join(user.GetHomeDir(), shareDir, testFileName)
|
|
|
+ testLinkPath := filepath.Join(user.GetHomeDir(), shareDir, testFileNameLink)
|
|
|
+ err = createTestFile(testFilePath, testFileSize)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = createTestFile(filepath.Join(user.GetHomeDir(), shareDir, subDir, testFileName), testFileSize)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.Symlink(testFilePath, testLinkPath)
|
|
|
+ assert.NoError(t, err)
|
|
|
+
|
|
|
+ token, err := getJWTAPIUserTokenFromTestServer(defaultUsername, defaultPassword)
|
|
|
+ assert.NoError(t, err)
|
|
|
+
|
|
|
+ share := dataprovider.Share{
|
|
|
+ Name: "test share browse",
|
|
|
+ Scope: dataprovider.ShareScopeRead,
|
|
|
+ Paths: []string{shareDir},
|
|
|
+ MaxTokens: 0,
|
|
|
+ }
|
|
|
+ asJSON, err := json.Marshal(share)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ req, err := http.NewRequest(http.MethodPost, userSharesPath, bytes.NewBuffer(asJSON))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ setBearerForReq(req, token)
|
|
|
+ rr := executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusCreated, rr)
|
|
|
+ objectID := rr.Header().Get("X-Object-ID")
|
|
|
+ assert.NotEmpty(t, objectID)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "files?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+ assert.Contains(t, rr.Body.String(), "Please set the path to a valid file")
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "dirs?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ contents := make([]map[string]interface{}, 0)
|
|
|
+ err = json.Unmarshal(rr.Body.Bytes(), &contents)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Len(t, contents, 2)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "dirs?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ contents = make([]map[string]interface{}, 0)
|
|
|
+ err = json.Unmarshal(rr.Body.Bytes(), &contents)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Len(t, contents, 2)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "dirs?path=%2F"+subDir), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ contents = make([]map[string]interface{}, 0)
|
|
|
+ err = json.Unmarshal(rr.Body.Bytes(), &contents)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Len(t, contents, 1)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path=%2F.."), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+ assert.Contains(t, rr.Body.String(), "Invalid share path")
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "dirs?path=%2F.."), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "dirs?path=%2F.."), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "files?path=%2F..%2F"+testFileName), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path="+testFileName), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ contentDisposition := rr.Header().Get("Content-Disposition")
|
|
|
+ assert.NotEmpty(t, contentDisposition)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "files?path="+testFileName), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ contentDisposition = rr.Header().Get("Content-Disposition")
|
|
|
+ assert.NotEmpty(t, contentDisposition)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path="+subDir+"%2F"+testFileName), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ contentDisposition = rr.Header().Get("Content-Disposition")
|
|
|
+ assert.NotEmpty(t, contentDisposition)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path=missing"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ assert.Contains(t, rr.Body.String(), "file does not exist")
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "files?path=missing"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusNotFound, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "dirs?path=missing"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusNotFound, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "dirs?path=missing"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusNotFound, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path="+testFileNameLink), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ assert.Contains(t, rr.Body.String(), "non regular files are not supported for shares")
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "files?path="+testFileNameLink), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+ assert.Contains(t, rr.Body.String(), "non regular files are not supported for shares")
|
|
|
+
|
|
|
+ // share a symlink
|
|
|
+ share = dataprovider.Share{
|
|
|
+ Name: "test share browse",
|
|
|
+ Scope: dataprovider.ShareScopeRead,
|
|
|
+ Paths: []string{path.Join(shareDir, testFileNameLink)},
|
|
|
+ MaxTokens: 0,
|
|
|
+ }
|
|
|
+ asJSON, err = json.Marshal(share)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ req, err = http.NewRequest(http.MethodPost, userSharesPath, bytes.NewBuffer(asJSON))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ setBearerForReq(req, token)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusCreated, rr)
|
|
|
+ objectID = rr.Header().Get("X-Object-ID")
|
|
|
+ assert.NotEmpty(t, objectID)
|
|
|
+ // uncompressed download should not work
|
|
|
+ req, err = http.NewRequest(http.MethodGet, webClientPubSharesPath+"/"+objectID+"?compress=false", nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ assert.Equal(t, "application/zip", rr.Header().Get("Content-Type"))
|
|
|
+ // this share is not browsable, it does not contains a directory
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "dirs"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "files?path="+testFileName), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "dirs?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+ assert.Contains(t, rr.Body.String(), "The shared object is not a directory and so it is not browsable")
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+ assert.Contains(t, rr.Body.String(), "The shared object is not a directory and so it is not browsable")
|
|
|
+
|
|
|
+ // now test a missing shareID
|
|
|
+ objectID = "123456"
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "dirs"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusNotFound, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "files?path="+testFileName), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusNotFound, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "dirs?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusNotFound, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusNotFound, rr)
|
|
|
+ // share a missing base path
|
|
|
+ share = dataprovider.Share{
|
|
|
+ Name: "test share",
|
|
|
+ Scope: dataprovider.ShareScopeRead,
|
|
|
+ Paths: []string{path.Join(shareDir, "missingdir")},
|
|
|
+ MaxTokens: 0,
|
|
|
+ }
|
|
|
+ asJSON, err = json.Marshal(share)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ req, err = http.NewRequest(http.MethodPost, userSharesPath, bytes.NewBuffer(asJSON))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ setBearerForReq(req, token)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusCreated, rr)
|
|
|
+ objectID = rr.Header().Get("X-Object-ID")
|
|
|
+ assert.NotEmpty(t, objectID)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "dirs"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusInternalServerError, rr)
|
|
|
+ assert.Contains(t, rr.Body.String(), "unable to check the share directory")
|
|
|
+ // share multiple paths
|
|
|
+ share = dataprovider.Share{
|
|
|
+ Name: "test share",
|
|
|
+ Scope: dataprovider.ShareScopeRead,
|
|
|
+ Paths: []string{shareDir, "/anotherdir"},
|
|
|
+ MaxTokens: 0,
|
|
|
+ }
|
|
|
+ asJSON, err = json.Marshal(share)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ req, err = http.NewRequest(http.MethodPost, userSharesPath, bytes.NewBuffer(asJSON))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ setBearerForReq(req, token)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusCreated, rr)
|
|
|
+ objectID = rr.Header().Get("X-Object-ID")
|
|
|
+ assert.NotEmpty(t, objectID)
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusBadRequest, rr)
|
|
|
+ assert.Contains(t, rr.Body.String(), "A share with multiple paths is not browsable")
|
|
|
+ // share the root path
|
|
|
+ share = dataprovider.Share{
|
|
|
+ Name: "test share root",
|
|
|
+ Scope: dataprovider.ShareScopeRead,
|
|
|
+ Paths: []string{"/"},
|
|
|
+ MaxTokens: 0,
|
|
|
+ }
|
|
|
+ asJSON, err = json.Marshal(share)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ req, err = http.NewRequest(http.MethodPost, userSharesPath, bytes.NewBuffer(asJSON))
|
|
|
+ assert.NoError(t, err)
|
|
|
+ setBearerForReq(req, token)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusCreated, rr)
|
|
|
+ objectID = rr.Header().Get("X-Object-ID")
|
|
|
+ assert.NotEmpty(t, objectID)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(webClientPubSharesPath, objectID, "browse?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+
|
|
|
+ req, err = http.NewRequest(http.MethodGet, path.Join(sharesPath, objectID, "dirs?path=%2F"), nil)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ rr = executeRequest(req)
|
|
|
+ checkResponseCode(t, http.StatusOK, rr)
|
|
|
+ contents = make([]map[string]interface{}, 0)
|
|
|
+ err = json.Unmarshal(rr.Body.Bytes(), &contents)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Len(t, contents, 1)
|
|
|
+
|
|
|
+ _, err = httpdtest.RemoveUser(user, http.StatusOK)
|
|
|
+ assert.NoError(t, err)
|
|
|
+ err = os.RemoveAll(user.GetHomeDir())
|
|
|
+ assert.NoError(t, err)
|
|
|
+}
|
|
|
+
|
|
|
func TestUserAPIShareErrors(t *testing.T) {
|
|
|
user, _, err := httpdtest.AddUser(getTestUser(), http.StatusCreated)
|
|
|
assert.NoError(t, err)
|