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'),