seafile功能修改与添加的思路梳理
Posted 平原上的维克多
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了seafile功能修改与添加的思路梳理相关的知识,希望对你有一定的参考价值。
在seahub的前端代码中找到对seafileAPI的调用代码!
componentDidMount() {
const {repoID, folderPath, isDepartmentRepo} = this.props;
const request = isDepartmentRepo ?
seafileAPI.listDepartmentRepoUserFolderPerm(repoID, folderPath) :
**seafileAPI.listUserFolderPerm(repoID, folderPath);**
request.then((res) => {
if (res.data.length !== 0) {
this.setState({userFolderPermItems: res.data});
}
});
}
接下来到seafile-api.js中找到该函数的定义:
listUserFolderPerm(repoID, folderPath) {
let url = this.server + '/api2/repos/' + repoID + '/user-folder-perm/';
if (folderPath) {
url = url + '?folder_path=' + encodeURIComponent(folderPath);
}
return this.req.get(url);
}
再到seahub/seahub/api2/urls.py中查找路径映射都的视图:
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/user-folder-perm/$', RepoUserFolderPerm.as_view(), name="api2-repo-user-folder-perm")
接下来前往该视图
class RepoUserFolderPerm(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated,)
throttle_classes = (UserRateThrottle,)
def _get_user_folder_perm_info(self, email, repo_id, path, perm):
result = {}
if email and repo_id and path and perm:
result['repo_id'] = repo_id
result['user_email'] = email
result['user_name'] = email2nickname(email)
result['folder_path'] = path
result['folder_name'] = path if path == '/' else os.path.basename(path.rstrip('/'))
result['permission'] = perm
return result
def get(self, request, repo_id, format=None):
""" List repo user folder perms (by folder_path).
Permission checking:
1. ( repo owner | admin ) & pro edition & enable folder perm.
"""
# resource check
repo = seafile_api.get_repo(repo_id)
if not repo:
error_msg = 'Library %s not found.' % repo_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
# permission check
if is_org_context(request):
repo_owner = seafile_api.get_org_repo_owner(repo_id)
else:
repo_owner = seafile_api.get_repo_owner(repo_id)
username = request.user.username
if not (is_pro_version() and can_set_folder_perm_by_user(username, repo, repo_owner)):
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
# get perm list
results = []
path = request.GET.get('folder_path', None)
folder_perms = seafile_api.list_folder_user_perm_by_repo(repo_id)
for perm in folder_perms:
result = {}
if path:
if path == perm.path:
result = self._get_user_folder_perm_info(
perm.user, perm.repo_id, perm.path, perm.permission)
else:
result = self._get_user_folder_perm_info(
perm.user, perm.repo_id, perm.path, perm.permission)
if result:
results.append(result)
return Response(results)
def post(self, request, repo_id, format=None):
""" Add repo user folder perm.
Permission checking:
1. ( repo owner | admin ) & pro edition & enable folder perm.
"""
# argument check
path = request.data.get('folder_path', None)
if not path:
error_msg = 'folder_path invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
perm = request.data.get('permission', None)
if not perm or perm not in get_available_repo_perms():
error_msg = 'permission invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# resource check
repo = seafile_api.get_repo(repo_id)
if not repo:
error_msg = 'Library %s not found.' % repo_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
path = path.rstrip('/') if path != '/' else path
if not seafile_api.get_dir_id_by_path(repo_id, path):
error_msg = 'Folder %s not found.' % path
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
# permission check
if is_org_context(request):
repo_owner = seafile_api.get_org_repo_owner(repo_id)
else:
repo_owner = seafile_api.get_repo_owner(repo_id)
username = request.user.username
if not (is_pro_version() and can_set_folder_perm_by_user(username, repo, repo_owner)):
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
# add repo user folder perm
result = {}
result['failed'] = []
result['success'] = []
users = request.data.getlist('user_email')
for user in users:
if not is_valid_username(user):
result['failed'].append({
'user_email': user,
'error_msg': 'user_email invalid.'
})
continue
try:
User.objects.get(email=user)
except User.DoesNotExist:
result['failed'].append({
'user_email': user,
'error_msg': 'User %s not found.' % user
})
continue
permission = seafile_api.get_folder_user_perm(repo_id, path, user)
if permission:
result['failed'].append({
'user_email': user,
'error_msg': 'Permission already exists.'
})
continue
try:
seafile_api.add_folder_user_perm(repo_id, path, perm, user)
send_perm_audit_msg('add-repo-perm', username, user, repo_id, path, perm)
except SearpcError as e:
logger.error(e)
result['failed'].append({
'user_email': user,
'error_msg': 'Internal Server Error'
})
new_perm = seafile_api.get_folder_user_perm(repo_id, path, user)
new_perm_info = self._get_user_folder_perm_info(
user, repo_id, path, new_perm)
result['success'].append(new_perm_info)
return Response(result)
def put(self, request, repo_id, format=None):
""" Modify repo user folder perm.
Permission checking:
1. ( repo owner | admin ) & pro edition & enable folder perm.
"""
# argument check
path = request.data.get('folder_path', None)
if not path:
error_msg = 'folder_path invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
perm = request.data.get('permission', None)
if not perm or perm not in get_available_repo_perms():
error_msg = 'permission invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
user = request.data.get('user_email', None)
if not user:
error_msg = 'user_email invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# resource check
repo = seafile_api.get_repo(repo_id)
if not repo:
error_msg = 'Library %s not found.' % repo_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
path = path.rstrip('/') if path != '/' else path
if not seafile_api.get_dir_id_by_path(repo_id, path):
error_msg = 'Folder %s not found.' % path
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
try:
User.objects.get(email=user)
except User.DoesNotExist:
error_msg = 'User %s not found.' % user
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
# permission check
if is_org_context(request):
repo_owner = seafile_api.get_org_repo_owner(repo_id)
else:
repo_owner = seafile_api.get_repo_owner(repo_id)
username = request.user.username
if not (is_pro_version() and can_set_folder_perm_by_user(username, repo, repo_owner)):
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
permission = seafile_api.get_folder_user_perm(repo_id, path, user)
if not permission:
error_msg = 'Folder permission not found.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
# modify permission
try:
seafile_api.set_folder_user_perm(repo_id, path, perm, user)
send_perm_audit_msg('modify-repo-perm', username, user, repo_id, path, perm)
new_perm = seafile_api.get_folder_user_perm(repo_id, path, user)
result = self._get_user_folder_perm_info(user, repo_id, path, new_perm)
return Response(result)
except SearpcError as e:
logger.error(e)
error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
def delete(self, request, repo_id, format=None):
""" Remove repo user folder perms.
Permission checking:
1. ( repo owner | admin ) & pro edition & enable folder perm.
"""
# argument check
user = request.data.get('user_email', None)
path = request.data.get('folder_path', None)
if not user:
error_msg = 'user_email invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
if not path:
error_msg = 'folder_path invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# resource check
repo = seafile_api.get_repo(repo_id)
if not repo:
error_msg = 'Library %s not found.' % repo_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
try:
User.objects.get(email=user)
except User.DoesNotExist:
error_msg = 'User %s not found.' % user
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
# permission check
if is_org_context(request):
repo_owner = seafile_api.get_org_repo_owner(repo_id)
else:
repo_owner = seafile_api.get_repo_owner(repo_id)
username = request.user.username
if not (is_pro_version() and can_set_folder_perm_by_user(username, repo, repo_owner)):
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
# delete permission
path = path.rstrip('/') if path != '/' else path
permission = seafile_api.get_folder_user_perm(repo_id, path, user)
if not permission:
return Response({'success': True})
try:
seafile_api.rm_folder_user_perm(repo_id, path, user)
send_perm_audit_msg('delete-repo-perm', username,
user, repo_id, path, permission)
return Response({'success': True})
except SearpcError as e:
logger.error(e)
error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
在seahub的后端python代码中找到对seafile-api的调用函数后前往seafile-server查找相应函数
def get_repo_owner(self, repo_id):
"""
Return: repo owner in string
"""
return seafserv_threaded_rpc.get_repo_owner(repo_id)
以上是关于seafile功能修改与添加的思路梳理的主要内容,如果未能解决你的问题,请参考以下文章
[原创] debian 9.3 搭建Jira+Confluence+Bitbucket+crowd+seafile (零) 修改端口的问题