diff --git a/frontend/src/pages/share-admin/share-links.js b/frontend/src/pages/share-admin/share-links.js index c61a20bca9..b752820985 100644 --- a/frontend/src/pages/share-admin/share-links.js +++ b/frontend/src/pages/share-admin/share-links.js @@ -320,7 +320,7 @@ class ShareAdminShareLinks extends Component { constructor(props) { super(props); this.state = { - isCleanOrphanShareLinksDialogOpen: false, + isCleanInvalidShareLinksDialogOpen: false, loading: true, errorMsg: '', items: [], @@ -428,15 +428,15 @@ class ShareAdminShareLinks extends Component { }); } - toggleCleanOrphanShareLinksDialog = () => { - this.setState({isCleanOrphanShareLinksDialogOpen: !this.state.isCleanOrphanShareLinksDialogOpen}); + toggleCleanInvalidShareLinksDialog = () => { + this.setState({isCleanInvalidShareLinksDialogOpen: !this.state.isCleanInvalidShareLinksDialogOpen}); } - cleanOrphanShareLinks = () => { - seafileAPI.cleanOrphanShareLinks().then(res => { - const newItems = this.state.items.filter(item => item.obj_id !== ''); + cleanInvalidShareLinks = () => { + seafileAPI.cleanInvalidShareLinks().then(res => { + const newItems = this.state.items.filter(item => item.obj_id !== '').filter(item => !item.is_expired); this.setState({items: newItems}); - toaster.success(gettext('Successfully cleaned orphan share links.')); + toaster.success(gettext('Successfully cleaned invalid share links.')); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); @@ -451,7 +451,7 @@ class ShareAdminShareLinks extends Component { onSearchedClick={this.props.onSearchedClick} > - +
@@ -488,13 +488,13 @@ class ShareAdminShareLinks extends Component { sortItems={this.sortItems} /> } - {this.state.isCleanOrphanShareLinksDialogOpen && + {this.state.isCleanInvalidShareLinksDialogOpen && } diff --git a/frontend/src/pages/share-admin/upload-links.js b/frontend/src/pages/share-admin/upload-links.js index b835f37048..c777848e43 100644 --- a/frontend/src/pages/share-admin/upload-links.js +++ b/frontend/src/pages/share-admin/upload-links.js @@ -211,7 +211,7 @@ class ShareAdminUploadLinks extends Component { constructor(props) { super(props); this.state = { - isCleanOrphanUploadLinksDialogOpen: false, + isCleanInvalidUploadLinksDialogOpen: false, loading: true, errorMsg: '', items: [] @@ -253,15 +253,15 @@ class ShareAdminUploadLinks extends Component { }); } - toggleCleanOrphanUploadLinksDialog = () => { - this.setState({isCleanOrphanUploadLinksDialogOpen: !this.state.isCleanOrphanUploadLinksDialogOpen}); + toggleCleanInvalidUploadLinksDialog = () => { + this.setState({isCleanInvalidUploadLinksDialogOpen: !this.state.isCleanInvalidUploadLinksDialogOpen}); } - cleanOrphanUploadLinks = () => { - seafileAPI.cleanOrphanUploadLinks().then(res => { - const newItems = this.state.items.filter(item => item.obj_id !== ''); + cleanInvalidUploadLinks = () => { + seafileAPI.cleanInvalidUploadLinks().then(res => { + const newItems = this.state.items.filter(item => item.obj_id !== '').filter(item => !item.is_expired); this.setState({items: newItems}); - toaster.success(gettext('Successfully cleaned orphan upload links.')); + toaster.success(gettext('Successfully cleaned invalid upload links.')); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); @@ -275,7 +275,7 @@ class ShareAdminUploadLinks extends Component { onShowSidePanel={this.props.onShowSidePanel} onSearchedClick={this.props.onSearchedClick} > - +
@@ -297,13 +297,13 @@ class ShareAdminUploadLinks extends Component {
- {this.state.isCleanOrphanUploadLinksDialogOpen && + {this.state.isCleanInvalidUploadLinksDialogOpen && } diff --git a/seahub/api2/endpoints/share_links.py b/seahub/api2/endpoints/share_links.py index fb8c6ba2d7..ecabc1628a 100644 --- a/seahub/api2/endpoints/share_links.py +++ b/seahub/api2/endpoints/share_links.py @@ -1209,9 +1209,9 @@ class ShareLinkSaveItemsToRepo(APIView): src_parent_dir = os.path.dirname(src_dirent_path) src_dirent_name = os.path.basename(src_dirent_path) - dst_dirent_name = check_filename_with_rename(dst_repo_id, - dst_parent_dir, - src_dirent_name) + check_filename_with_rename(dst_repo_id, + dst_parent_dir, + src_dirent_name) else: # save items in folder share link src_parent_dir = request.POST.get('src_parent_dir', '') @@ -1337,14 +1337,14 @@ class ShareLinkRepoTagsTaggedFiles(APIView): return Response({'tagged_files': filtered_tagged_files}) -class ShareLinksCleanOrphan(APIView): +class ShareLinksCleanInvalid(APIView): authentication_classes = (TokenAuthentication, SessionAuthentication) permission_classes = (IsAuthenticated, CanGenerateShareLink) throttle_classes = (UserRateThrottle,) def delete(self, request): - """ Clean orphan share links. + """ Clean invalid share links. """ username = request.user.username @@ -1352,6 +1352,10 @@ class ShareLinksCleanOrphan(APIView): for share_link in share_links: + if share_link.is_expired(): + share_link.delete() + continue + repo_id = share_link.repo_id if not seafile_api.get_repo(repo_id): share_link.delete() diff --git a/seahub/api2/endpoints/upload_links.py b/seahub/api2/endpoints/upload_links.py index fbbfa32ddd..6f1ac8512b 100644 --- a/seahub/api2/endpoints/upload_links.py +++ b/seahub/api2/endpoints/upload_links.py @@ -481,13 +481,13 @@ class UploadLinkUpload(APIView): return Response(result) -class UploadLinksCleanOrphan(APIView): +class UploadLinksCleanInvalid(APIView): authentication_classes = (TokenAuthentication, SessionAuthentication) permission_classes = (IsAuthenticated, CanGenerateUploadLink) throttle_classes = (UserRateThrottle, ) def delete(self, request): - """ Clean orphan upload links. + """ Clean invalid upload links. """ username = request.user.username @@ -495,6 +495,10 @@ class UploadLinksCleanOrphan(APIView): for upload_link in upload_links: + if upload_link.is_expired(): + upload_link.delete() + continue + repo_id = upload_link.repo_id if not seafile_api.get_repo(repo_id): upload_link.delete() diff --git a/seahub/urls.py b/seahub/urls.py index af9ff88f47..88e21896e4 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -41,11 +41,11 @@ from seahub.api2.endpoints.search_group import SearchGroup from seahub.api2.endpoints.share_links import ShareLinks, ShareLink, \ ShareLinkOnlineOfficeLock, ShareLinkDirents, ShareLinkSaveFileToRepo, \ ShareLinkUpload, ShareLinkUploadDone, ShareLinkSaveItemsToRepo, \ - ShareLinkRepoTags, ShareLinkRepoTagsTaggedFiles, ShareLinksCleanOrphan + ShareLinkRepoTags, ShareLinkRepoTagsTaggedFiles, ShareLinksCleanInvalid from seahub.api2.endpoints.shared_folders import SharedFolders from seahub.api2.endpoints.shared_repos import SharedRepos, SharedRepo from seahub.api2.endpoints.upload_links import UploadLinks, UploadLink, \ - UploadLinkUpload, UploadLinksCleanOrphan + UploadLinkUpload, UploadLinksCleanInvalid from seahub.api2.endpoints.repos_batch import ReposBatchView, \ ReposBatchCopyDirView, ReposBatchCreateDirView, \ ReposBatchCopyItemView, ReposBatchMoveItemView, \ @@ -344,7 +344,7 @@ urlpatterns = [ ## user::shared-download-links url(r'^api/v2.1/share-links/$', ShareLinks.as_view(), name='api-v2.1-share-links'), - url(r'^api/v2.1/share-links/clean-orphan/$', ShareLinksCleanOrphan.as_view(), name='api-v2.1-share-links-clean-orphan'), + url(r'^api/v2.1/share-links/clean-invalid/$', ShareLinksCleanInvalid.as_view(), name='api-v2.1-share-links-clean-invalid'), url(r'^api/v2.1/share-links/(?P[a-f0-9]+)/$', ShareLink.as_view(), name='api-v2.1-share-link'), url(r'^api/v2.1/share-links/(?P[a-f0-9]+)/save-file-to-repo/$', ShareLinkSaveFileToRepo.as_view(), name='api-v2.1-share-link-save-file-to-repo'), url(r'^api/v2.1/share-links/(?P[a-f0-9]+)/save-items-to-repo/$', ShareLinkSaveItemsToRepo.as_view(), name='api-v2.1-share-link-save-items-to-repo'), @@ -359,7 +359,7 @@ urlpatterns = [ ## user::shared-upload-links url(r'^api/v2.1/upload-links/$', UploadLinks.as_view(), name='api-v2.1-upload-links'), - url(r'^api/v2.1/upload-links/clean-orphan/$', UploadLinksCleanOrphan.as_view(), name='api-v2.1-upload-links-clean-orphan'), + url(r'^api/v2.1/upload-links/clean-invalid/$', UploadLinksCleanInvalid.as_view(), name='api-v2.1-upload-links-clean-invalid'), url(r'^api/v2.1/upload-links/(?P[a-f0-9]+)/$', UploadLink.as_view(), name='api-v2.1-upload-link'), url(r'^api/v2.1/upload-links/(?P[a-f0-9]+)/upload/$', UploadLinkUpload.as_view(), name='api-v2.1-upload-link-upload'),