diff --git a/frontend/src/components/dialog/generate-share-link.js b/frontend/src/components/dialog/generate-share-link.js index 6713f3ecaf..c6929b5378 100644 --- a/frontend/src/components/dialog/generate-share-link.js +++ b/frontend/src/components/dialog/generate-share-link.js @@ -128,6 +128,8 @@ class GenerateShareLink extends React.Component { seafileAPI.createShareLink(repoID, itemPath, password, expireDays, permissions).then((res) => { let sharedLinkInfo = new SharedLinkInfo(res.data); this.setState({sharedLinkInfo: sharedLinkInfo}); + }).catch((error) => { + toaster.danger(error.response.data.error_msg); }); } } diff --git a/seahub/api2/endpoints/share_links.py b/seahub/api2/endpoints/share_links.py index 8d4bef7cb8..32a34f5931 100644 --- a/seahub/api2/endpoints/share_links.py +++ b/seahub/api2/endpoints/share_links.py @@ -296,17 +296,21 @@ class ShareLinks(APIView): org_id = request.user.org.org_id if is_org_context(request) else None if s_type == 'f': fs = FileShare.objects.get_file_link_by_path(username, repo_id, path) - if not fs: - fs = FileShare.objects.create_file_link(username, repo_id, path, - password, expire_date, - permission=perm, org_id=org_id) + if fs: + error_msg = _(u'Share link %s already exists.' % fs.token) + return api_error(status.HTTP_400_BAD_REQUEST, error_msg) + fs = FileShare.objects.create_file_link(username, repo_id, path, + password, expire_date, + permission=perm, org_id=org_id) elif s_type == 'd': fs = FileShare.objects.get_dir_link_by_path(username, repo_id, path) - if not fs: - fs = FileShare.objects.create_dir_link(username, repo_id, path, - password, expire_date, - permission=perm, org_id=org_id) + if fs: + error_msg = _(u'Share link %s already exists.' % fs.token) + return api_error(status.HTTP_400_BAD_REQUEST, error_msg) + fs = FileShare.objects.create_dir_link(username, repo_id, path, + password, expire_date, + permission=perm, org_id=org_id) link_info = get_share_link_info(fs) return Response(link_info) diff --git a/tests/api/endpoints/test_share_links.py b/tests/api/endpoints/test_share_links.py index 2ce3259c11..d7fe686a0c 100644 --- a/tests/api/endpoints/test_share_links.py +++ b/tests/api/endpoints/test_share_links.py @@ -105,6 +105,23 @@ class ShareLinksTest(BaseTestCase): self._remove_share_link(json_resp['token']) + def test_create_duplicate_file_share_link(self): + self.login_as(self.user) + + resp = self.client.post(self.url, {'path': self.file_path, 'repo_id': self.repo_id}) + self.assertEqual(200, resp.status_code) + json_resp = json.loads(resp.content) + assert json_resp['token'] is not None + token = json_resp['token'] + + resp = self.client.post(self.url, {'path': self.file_path, 'repo_id': self.repo_id}) + self.assertEqual(400, resp.status_code) + json_resp = json.loads(resp.content) + assert json_resp['error_msg'] is not None + assert token in json_resp['error_msg'] + + self._remove_share_link(token) + def test_create_file_share_link_in_enc_repo(self): self.login_as(self.user) @@ -208,6 +225,23 @@ class ShareLinksTest(BaseTestCase): self._remove_share_link(json_resp['token']) + def test_create_duplicate_dir_share_link(self): + self.login_as(self.user) + + resp = self.client.post(self.url, {'path': self.folder_path, 'repo_id': self.repo_id}) + self.assertEqual(200, resp.status_code) + json_resp = json.loads(resp.content) + assert json_resp['token'] is not None + token = json_resp['token'] + + resp = self.client.post(self.url, {'path': self.folder_path, 'repo_id': self.repo_id}) + self.assertEqual(400, resp.status_code) + json_resp = json.loads(resp.content) + assert json_resp['error_msg'] is not None + assert token in json_resp['error_msg'] + + self._remove_share_link(token) + def test_create_link_with_invalid_repo_permission(self): # login with admin to create share link in user repo self.login_as(self.admin)