1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-07-18 17:22:05 +00:00
seahub/seahub/api2/endpoints/repo_share_links.py

151 lines
4.5 KiB
Python

# Copyright (c) 2012-2016 Seafile Ltd.
import os
import logging
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import SessionAuthentication
from django.utils.translation import ugettext as _
from seaserv import seafile_api
from seahub.api2.utils import api_error
from seahub.api2.throttling import UserRateThrottle
from seahub.api2.authentication import TokenAuthentication
from seahub.base.templatetags.seahub_tags import email2nickname, \
email2contact_email
from seahub.utils import gen_shared_link
from seahub.utils.repo import is_repo_admin
from seahub.utils.timeutils import datetime_to_isoformat_timestr
from seahub.wiki.models import Wiki
from seahub.share.models import FileShare
logger = logging.getLogger(__name__)
def get_share_link_info(fileshare):
data = {}
token = fileshare.token
path = fileshare.path
if path:
obj_name = '/' if path == '/' else os.path.basename(path.rstrip('/'))
else:
obj_name = ''
if fileshare.expire_date:
expire_date = datetime_to_isoformat_timestr(fileshare.expire_date)
else:
expire_date = ''
if fileshare.ctime:
ctime = datetime_to_isoformat_timestr(fileshare.ctime)
else:
ctime = ''
creator_email = fileshare.username
data['creator_email'] = creator_email
data['creator_name'] = email2nickname(creator_email)
data['creator_contact_email'] = email2contact_email(creator_email)
data['path'] = path
data['obj_name'] = obj_name
data['is_dir'] = True if fileshare.s_type == 'd' else False
data['token'] = token
data['link'] = gen_shared_link(token, fileshare.s_type)
data['ctime'] = ctime
data['expire_date'] = expire_date
return data
class RepoShareLinks(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated,)
throttle_classes = (UserRateThrottle,)
def get(self, request, repo_id):
""" Get all share links of a repo.
Permission checking:
1. repo owner or admin;
"""
# 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
username = request.user.username
if not is_repo_admin(username, repo_id):
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
result = []
fileshares = FileShare.objects.filter(repo_id=repo_id)
for fileshare in fileshares:
link_info = get_share_link_info(fileshare)
link_info['repo_id'] = repo_id
link_info['repo_name'] = repo.name
result.append(link_info)
return Response(result)
class RepoShareLink(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated,)
throttle_classes = (UserRateThrottle,)
def delete(self, request, repo_id, token):
""" Delete share link.
Permission checking:
1. repo owner or admin;
"""
# resource check
try:
fileshare = FileShare.objects.get(token=token)
except FileShare.DoesNotExist:
error_msg = 'Share link %s not found.' % token
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
# permission check
username = request.user.username
if not is_repo_admin(username, fileshare.repo_id):
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
has_published_library = False
if fileshare.path == '/':
try:
Wiki.objects.get(repo_id=fileshare.repo_id)
has_published_library = True
except Wiki.DoesNotExist:
pass
if has_published_library:
error_msg = _('There is an associated published library.')
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
try:
fileshare.delete()
except Exception as e:
logger.error(e)
error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
return Response({'success': True})