-
-
- {canGenerateShareLink && (
- - {gettext('Share Links')}
- )}
- - {gettext('Upload Links')}
-
-
-
-
+
+
+
+
+
+
+
+
+ {canGenerateShareLink && (
+ - {gettext('Share Links')}
+ )}
+ - {gettext('Upload Links')}
+
+
+
+
+
-
+ {this.state.isCleanOrphanUploadLinksDialogOpen &&
+
+ }
+
);
}
}
+ShareAdminUploadLinks.propTypes = propTypes;
+
export default ShareAdminUploadLinks;
diff --git a/seahub/api2/endpoints/share_links.py b/seahub/api2/endpoints/share_links.py
index a763fde1c9..fb8c6ba2d7 100644
--- a/seahub/api2/endpoints/share_links.py
+++ b/seahub/api2/endpoints/share_links.py
@@ -73,6 +73,13 @@ def get_share_link_info(fileshare):
else:
obj_name = ''
+ if fileshare.s_type == 'd':
+ folder_path = normalize_dir_path(fileshare.path)
+ obj_id = seafile_api.get_dir_id_by_path(repo_id, folder_path)
+ else:
+ file_path = normalize_file_path(fileshare.path)
+ obj_id = seafile_api.get_file_id_by_path(repo_id, file_path)
+
if fileshare.expire_date:
expire_date = datetime_to_isoformat_timestr(fileshare.expire_date)
else:
@@ -89,6 +96,7 @@ def get_share_link_info(fileshare):
data['path'] = path
data['obj_name'] = obj_name
+ data['obj_id'] = obj_id or ""
data['is_dir'] = True if fileshare.s_type == 'd' else False
data['token'] = token
@@ -1327,3 +1335,37 @@ class ShareLinkRepoTagsTaggedFiles(APIView):
filtered_tagged_files.append(tagged_file)
return Response({'tagged_files': filtered_tagged_files})
+
+
+class ShareLinksCleanOrphan(APIView):
+
+ authentication_classes = (TokenAuthentication, SessionAuthentication)
+ permission_classes = (IsAuthenticated, CanGenerateShareLink)
+ throttle_classes = (UserRateThrottle,)
+
+ def delete(self, request):
+ """ Clean orphan share links.
+ """
+
+ username = request.user.username
+ share_links = FileShare.objects.filter(username=username)
+
+ for share_link in share_links:
+
+ repo_id = share_link.repo_id
+ if not seafile_api.get_repo(repo_id):
+ share_link.delete()
+ continue
+
+ if share_link.s_type == 'd':
+ folder_path = normalize_dir_path(share_link.path)
+ obj_id = seafile_api.get_dir_id_by_path(repo_id, folder_path)
+ else:
+ file_path = normalize_file_path(share_link.path)
+ obj_id = seafile_api.get_file_id_by_path(repo_id, file_path)
+
+ if not obj_id:
+ share_link.delete()
+ continue
+
+ return Response({'success': True})
diff --git a/seahub/api2/endpoints/upload_links.py b/seahub/api2/endpoints/upload_links.py
index b196c51ddb..fbbfa32ddd 100644
--- a/seahub/api2/endpoints/upload_links.py
+++ b/seahub/api2/endpoints/upload_links.py
@@ -27,6 +27,7 @@ from seahub.api2.permissions import CanGenerateUploadLink
from seahub.share.models import UploadLinkShare, check_share_link_common
from seahub.utils import gen_shared_upload_link, gen_file_upload_url, \
is_pro_version, get_password_strength_level, is_valid_password
+
from seahub.views import check_folder_permission
from seahub.utils.timeutils import datetime_to_isoformat_timestr
@@ -54,6 +55,8 @@ def get_upload_link_info(uls):
else:
obj_name = ''
+ obj_id = seafile_api.get_dir_id_by_path(repo_id, path)
+
if uls.ctime:
ctime = datetime_to_isoformat_timestr(uls.ctime)
else:
@@ -68,6 +71,7 @@ def get_upload_link_info(uls):
data['repo_name'] = repo.repo_name if repo else ''
data['path'] = path
data['obj_name'] = obj_name
+ data['obj_id'] = obj_id or ""
data['view_cnt'] = uls.view_cnt
data['ctime'] = ctime
data['link'] = gen_shared_upload_link(token)
@@ -475,3 +479,30 @@ class UploadLinkUpload(APIView):
result = {}
result['upload_link'] = gen_file_upload_url(token, 'upload-api')
return Response(result)
+
+
+class UploadLinksCleanOrphan(APIView):
+ authentication_classes = (TokenAuthentication, SessionAuthentication)
+ permission_classes = (IsAuthenticated, CanGenerateUploadLink)
+ throttle_classes = (UserRateThrottle, )
+
+ def delete(self, request):
+ """ Clean orphan upload links.
+ """
+
+ username = request.user.username
+ upload_links = UploadLinkShare.objects.filter(username=username)
+
+ for upload_link in upload_links:
+
+ repo_id = upload_link.repo_id
+ if not seafile_api.get_repo(repo_id):
+ upload_link.delete()
+ continue
+
+ obj_id = seafile_api.get_dir_id_by_path(repo_id, upload_link.path)
+ if not obj_id:
+ upload_link.delete()
+ continue
+
+ return Response({'success': True})
diff --git a/seahub/urls.py b/seahub/urls.py
index d68243ffaa..6e51ffc2ad 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -40,11 +40,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
+ ShareLinkRepoTags, ShareLinkRepoTagsTaggedFiles, ShareLinksCleanOrphan
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
+ UploadLinkUpload, UploadLinksCleanOrphan
from seahub.api2.endpoints.repos_batch import ReposBatchView, \
ReposBatchCopyDirView, ReposBatchCreateDirView, \
ReposBatchCopyItemView, ReposBatchMoveItemView, \
@@ -341,6 +341,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/(?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'),
@@ -355,6 +356,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/(?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'),