diff --git a/frontend/src/pages/lib-content-view/lib-content-view.js b/frontend/src/pages/lib-content-view/lib-content-view.js index 8a5c0a007a..c0b5438b6e 100644 --- a/frontend/src/pages/lib-content-view/lib-content-view.js +++ b/frontend/src/pages/lib-content-view/lib-content-view.js @@ -2,6 +2,7 @@ import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import cookie from 'react-cookies'; import moment from 'moment'; +import { navigate } from '@reach/router'; import { gettext, siteRoot, username, isDocs, enableVideoThumbnail } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; @@ -135,6 +136,10 @@ class LibContentView extends React.Component { const repoInfo = new RepoInfo(repoRes.data); const isGroupOwnedRepo = repoInfo.owner_email.indexOf('@seafile_group') > -1; + this.setState({ + currentRepoInfo: repoInfo, + }); + if (repoInfo.permission.startsWith('custom-')) { const permissionID = repoInfo.permission.split('-')[1]; const permissionRes = await seafileAPI.getCustomPermission(repoID, permissionID); @@ -143,14 +148,13 @@ class LibContentView extends React.Component { this.isNeedUpdateHistoryState = false; this.setState({ - currentRepoInfo: repoInfo, repoName: repoInfo.repo_name, libNeedDecrypt: repoInfo.lib_need_decrypt, repoEncrypted: repoInfo.encrypted, isGroupOwnedRepo: isGroupOwnedRepo, path: path }); - + if (!repoInfo.lib_need_decrypt) { this.loadDirData(path); } @@ -164,6 +168,11 @@ class LibContentView extends React.Component { let errorMsg = gettext('Permission denied'); toaster.danger(errorMsg); + } else if (error.response.status == 404) { + this.setState({ + isDirentListLoading: false, + errorMsg: gettext('Library share permission not found.') + }); } else { this.setState({ isDirentListLoading: false, @@ -1747,6 +1756,22 @@ class LibContentView extends React.Component { this.updateUsedRepoTags(); } + + handleSubmit = (e) => { + let options = { + 'share_type': 'personal', + 'from': this.state.currentRepoInfo.owner_email + }; + seafileAPI.leaveShareRepo(this.props.repoID, options).then(res => { + navigate(siteRoot + 'shared-libs/'); + }).catch((error) => { + let errorMsg = Utils.getErrorMsg(error, true); + toaster.danger(errorMsg); + }); + + e.preventDefault(); + } + render() { if (this.state.libNeedDecrypt) { return ( @@ -1759,6 +1784,15 @@ class LibContentView extends React.Component { ); } + if (this.state.errorMsg) { + return ( + +

{this.state.errorMsg}

+ +
+ ) + } + if (!this.state.currentRepoInfo) { return ''; } diff --git a/seahub/api2/endpoints/custom_share_permissions.py b/seahub/api2/endpoints/custom_share_permissions.py index df08d24572..abdd44173b 100644 --- a/seahub/api2/endpoints/custom_share_permissions.py +++ b/seahub/api2/endpoints/custom_share_permissions.py @@ -12,7 +12,8 @@ from seaserv import seafile_api from seahub.api2.authentication import TokenAuthentication from seahub.api2.throttling import UserRateThrottle from seahub.api2.utils import api_error -from seahub.share.utils import is_repo_admin +from seahub.share.utils import is_repo_admin, normalize_custom_permission_name +from seahub.utils.repo import get_repo_owner from seahub.share.models import CustomSharePermissions from seahub.views import check_folder_permission @@ -107,14 +108,11 @@ class CustomSharePermissionView(APIView): # main try: permission_obj = CustomSharePermissions.objects.get(id=permission_id) - if not permission_obj: - return api_error(status.HTTP_404_NOT_FOUND, 'Permission %s not found.' % permission_id) - res = permission_obj.to_dict() - except Exception as e: - logger.error(e) - error_msg = 'Internal Server Error' - return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + except CustomSharePermissions.DoesNotExist: + error_msg = 'Permission %s not found.' % permission_id + return api_error(status.HTTP_404_NOT_FOUND, error_msg) + res = permission_obj.to_dict() return Response({'permission': res}) def put(self, request, repo_id, permission_id): @@ -169,6 +167,7 @@ class CustomSharePermissionView(APIView): """Delete a custom share permission """ username = request.user.username + # permission check if not is_repo_admin(username, repo_id): return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.') @@ -181,22 +180,19 @@ class CustomSharePermissionView(APIView): try: permission_obj = CustomSharePermissions.objects.get(id=permission_id) - except Exception as e: - logger.error(e) - error_msg = 'Internal Server Error' - return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) - if not permission_obj: - return api_error(status.HTTP_404_NOT_FOUND, 'custom permission %s not found.' % permission_id) + except CustomSharePermissions.DoesNotExist: + error_msg = 'Permission %s not found.' % permission_id + return api_error(status.HTTP_404_NOT_FOUND, error_msg) - # main - try: - permission_obj = CustomSharePermissions.objects.get(id=permission_id) - if not permission_obj: - return api_error(status.HTTP_404_NOT_FOUND, 'Permission %s not found.' % permission_id) - permission_obj.delete() - except Exception as e: - logger.error(e) - error_msg = 'Internal Server Error' - return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + # delete related repo share + permission = normalize_custom_permission_name(permission_id) + repo_owner = get_repo_owner(request, repo_id) + share_items = seafile_api.list_repo_shared_to(repo_owner, repo_id) + for share in share_items: + if share.perm == permission: + seafile_api.remove_share(repo_id, repo_owner, share.user) + + # delete custom permission + permission_obj.delete() return Response({'success': True})