2012-08-18 12:33:10 +00:00
|
|
|
# encoding: utf-8
|
2012-07-14 02:47:59 +00:00
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
import stat
|
|
|
|
import simplejson as json
|
2012-08-18 12:33:10 +00:00
|
|
|
import settings
|
|
|
|
|
2012-09-01 05:35:21 +00:00
|
|
|
from django.http import HttpResponse
|
2012-08-18 12:33:10 +00:00
|
|
|
from django.contrib.sites.models import RequestSite
|
|
|
|
from django.core.urlresolvers import reverse
|
|
|
|
from django.template import loader
|
|
|
|
|
|
|
|
from djangorestframework.renderers import JSONRenderer
|
|
|
|
from djangorestframework.compat import View
|
|
|
|
from djangorestframework.mixins import ResponseMixin
|
|
|
|
from djangorestframework.response import Response
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-09-01 05:35:21 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
from functools import update_wrapper, wraps
|
|
|
|
except ImportError:
|
|
|
|
from django.utils.functional import update_wrapper, wraps # Python 2.4 fallback.
|
|
|
|
from django.utils.decorators import available_attrs
|
|
|
|
|
2012-08-21 12:18:06 +00:00
|
|
|
from auth.forms import AuthenticationForm
|
2012-08-18 12:33:10 +00:00
|
|
|
from auth import login as auth_login
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-08-18 12:33:10 +00:00
|
|
|
from pysearpc import SearpcError
|
2012-07-27 03:39:55 +00:00
|
|
|
from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, \
|
2012-07-14 02:47:59 +00:00
|
|
|
get_repo, get_commits, get_branches, \
|
2012-08-07 08:48:26 +00:00
|
|
|
seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, \
|
2012-08-30 12:15:17 +00:00
|
|
|
check_group_staff
|
2012-07-14 02:47:59 +00:00
|
|
|
|
|
|
|
from seahub.utils import list_to_string, \
|
|
|
|
get_httpserver_root, gen_token, \
|
2012-08-11 17:31:00 +00:00
|
|
|
check_filename_with_rename, get_accessible_repos, EMPTY_SHA1, \
|
2012-08-18 12:33:10 +00:00
|
|
|
gen_file_get_url, string2list
|
2012-07-14 02:47:59 +00:00
|
|
|
|
|
|
|
from seahub.views import access_to_repo, validate_owner
|
2012-08-18 12:33:10 +00:00
|
|
|
from seahub.contacts.signals import mail_sended
|
|
|
|
from share.models import FileShare
|
2012-07-14 12:26:41 +00:00
|
|
|
|
2012-09-01 05:35:21 +00:00
|
|
|
from mime import get_file_mime
|
2012-07-14 02:47:59 +00:00
|
|
|
|
|
|
|
json_content_type = 'application/json; charset=utf-8'
|
|
|
|
|
2012-09-01 05:35:21 +00:00
|
|
|
HTTP_ERRORS = {
|
|
|
|
'400':'Bad arguments',
|
|
|
|
'401':'Repo is not encrypted',
|
|
|
|
'402':'Incorrect password',
|
|
|
|
'403':'Can not access repo',
|
|
|
|
'404':'Repo not found',
|
|
|
|
'405':'Query password set error',
|
|
|
|
'406':'Password needed',
|
|
|
|
'407':'Method not supported',
|
|
|
|
'408':'Login failed',
|
|
|
|
'410':'Path does not exist',
|
|
|
|
'411':'Failed to get dirid by path',
|
|
|
|
'412':'Failed to get fileid by path',
|
|
|
|
'413':'Path needed',
|
|
|
|
'414':'Emails required',
|
|
|
|
'415':'Operation not supported',
|
|
|
|
'416':'Failed to list dir',
|
|
|
|
'417':'Set password error',
|
|
|
|
|
|
|
|
'499':'Unknow Error',
|
|
|
|
|
|
|
|
'500':'Internal server error',
|
|
|
|
'501':'Failed to get shared link',
|
|
|
|
'502':'Failed to send shared link',
|
|
|
|
}
|
|
|
|
|
|
|
|
def api_error(request, code='499', msg=None):
|
|
|
|
err_resp = { 'error_msg': msg if msg is not None else HTTP_ERRORS[code] }
|
|
|
|
return HttpResponse(json.dumps(err_resp), status=code,
|
|
|
|
content_type=json_content_type)
|
|
|
|
|
|
|
|
def api_user_passes_test(test_func):
|
|
|
|
"""
|
|
|
|
Decorator for views that checks that the user passes the given test,
|
|
|
|
redirecting to the log-in page if necessary. The test should be a callable
|
|
|
|
that takes the user object and returns True if the user passes.
|
|
|
|
"""
|
|
|
|
def decorator(view_func):
|
|
|
|
def _wrapped_view(obj, request, *args, **kwargs):
|
|
|
|
if test_func(request.user):
|
|
|
|
return view_func(obj, request, *args, **kwargs)
|
|
|
|
json_content_type = 'application/json; charset=utf-8'
|
|
|
|
|
|
|
|
return HttpResponse(json.dumps('login required'), status=401,
|
|
|
|
content_type=json_content_type)
|
|
|
|
return wraps(view_func, assigned=available_attrs(view_func))(_wrapped_view)
|
|
|
|
return decorator
|
|
|
|
|
|
|
|
|
|
|
|
def api_login_required(function=None):
|
|
|
|
"""
|
|
|
|
Decorator for views that checks that the user is logged in, redirecting
|
|
|
|
to the log-in page if necessary.
|
|
|
|
"""
|
|
|
|
actual_decorator = api_user_passes_test(
|
|
|
|
lambda u: u.is_authenticated()
|
|
|
|
)
|
|
|
|
if function:
|
|
|
|
return actual_decorator(function)
|
|
|
|
return actual_decorator
|
|
|
|
|
2012-07-25 02:40:14 +00:00
|
|
|
|
2012-07-24 14:10:26 +00:00
|
|
|
def calculate_repo_info(repo_list, username):
|
|
|
|
"""
|
|
|
|
Get some info for repo.
|
|
|
|
|
|
|
|
"""
|
|
|
|
for repo in repo_list:
|
|
|
|
try:
|
|
|
|
commit = get_commits(repo.id, 0, 1)[0]
|
|
|
|
repo.latest_modify = commit.ctime
|
2012-07-25 11:34:32 +00:00
|
|
|
repo.root = commit.root_id
|
2012-07-25 18:17:32 +00:00
|
|
|
repo.size = seafserv_threaded_rpc.server_repo_size(repo.id)
|
|
|
|
if not repo.size :
|
|
|
|
repo.size = 0;
|
2012-08-29 15:57:51 +00:00
|
|
|
|
2012-07-24 14:10:26 +00:00
|
|
|
password_need = False
|
2012-08-18 09:38:08 +00:00
|
|
|
if repo.encrypted:
|
2012-07-24 14:10:26 +00:00
|
|
|
try:
|
|
|
|
ret = seafserv_rpc.is_passwd_set(repo.id, username)
|
|
|
|
if ret != 1:
|
|
|
|
password_need = True
|
|
|
|
except SearpcErroe, e:
|
|
|
|
pass
|
|
|
|
repo.password_need = password_need
|
2012-08-29 15:57:51 +00:00
|
|
|
except Exception,e:
|
|
|
|
repo.latest_modify = 0
|
2012-07-24 14:10:26 +00:00
|
|
|
repo.commit = None
|
|
|
|
repo.size = -1
|
|
|
|
repo.password_need = None
|
2012-07-14 02:47:59 +00:00
|
|
|
|
|
|
|
def can_access_repo(request, repo_id):
|
|
|
|
repo_ap = seafserv_threaded_rpc.repo_query_access_property(repo_id)
|
|
|
|
if not repo_ap:
|
|
|
|
repo_ap = 'own'
|
|
|
|
|
|
|
|
# check whether user can view repo
|
|
|
|
return access_to_repo(request, repo_id, repo_ap)
|
|
|
|
|
2012-07-25 18:17:32 +00:00
|
|
|
def get_file_size (id):
|
2012-08-18 09:38:08 +00:00
|
|
|
size = seafserv_threaded_rpc.get_file_size(id)
|
2012-07-25 18:17:32 +00:00
|
|
|
if size:
|
|
|
|
return size
|
|
|
|
else:
|
|
|
|
return 0
|
|
|
|
|
2012-08-11 17:31:00 +00:00
|
|
|
def get_dir_entrys_by_id(request, dir_id):
|
2012-07-14 02:47:59 +00:00
|
|
|
dentrys = []
|
|
|
|
try:
|
2012-07-14 12:26:41 +00:00
|
|
|
dirs = seafserv_threaded_rpc.list_dir(dir_id)
|
2012-07-14 02:47:59 +00:00
|
|
|
except SearpcError, e:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, "416")
|
|
|
|
|
2012-07-14 02:47:59 +00:00
|
|
|
for dirent in dirs:
|
2012-07-24 14:10:26 +00:00
|
|
|
dtype = "file"
|
2012-07-14 02:47:59 +00:00
|
|
|
entry={}
|
2012-08-18 09:38:08 +00:00
|
|
|
if stat.S_ISDIR(dirent.mode):
|
2012-07-24 14:10:26 +00:00
|
|
|
dtype = "dir"
|
2012-07-14 02:47:59 +00:00
|
|
|
else:
|
2012-07-25 02:40:14 +00:00
|
|
|
mime = get_file_mime (dirent.obj_name)
|
|
|
|
if mime:
|
|
|
|
entry["mime"] = mime
|
2012-07-14 02:47:59 +00:00
|
|
|
try:
|
2012-07-25 18:17:32 +00:00
|
|
|
entry["size"] = get_file_size(dirent.obj_id)
|
2012-07-24 14:10:26 +00:00
|
|
|
except Exception, e:
|
2012-07-14 02:47:59 +00:00
|
|
|
entry["size"]=0
|
2012-08-18 09:38:08 +00:00
|
|
|
|
2012-07-24 14:10:26 +00:00
|
|
|
entry["type"]=dtype
|
2012-07-14 02:47:59 +00:00
|
|
|
entry["name"]=dirent.obj_name
|
|
|
|
entry["id"]=dirent.obj_id
|
|
|
|
dentrys.append(entry)
|
2012-08-11 17:31:00 +00:00
|
|
|
response = HttpResponse(json.dumps(dentrys), status=200,
|
|
|
|
content_type=json_content_type)
|
|
|
|
response["oid"] = dir_id
|
|
|
|
return response
|
|
|
|
|
2012-08-26 13:03:58 +00:00
|
|
|
def set_repo_password(request, repo, password):
|
2012-08-26 12:44:47 +00:00
|
|
|
if not password:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '406')
|
2012-08-26 12:44:47 +00:00
|
|
|
|
|
|
|
try:
|
2012-08-26 13:03:58 +00:00
|
|
|
seafserv_threaded_rpc.set_passwd(repo.id, request.user.username, password)
|
2012-08-26 12:44:47 +00:00
|
|
|
except SearpcError, e:
|
|
|
|
if e.msg == 'Bad arguments':
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '400')
|
2012-08-26 12:44:47 +00:00
|
|
|
elif e.msg == 'Repo is not encrypted':
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '401')
|
2012-08-26 12:44:47 +00:00
|
|
|
elif e.msg == 'Incorrect password':
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '402')
|
2012-08-26 12:44:47 +00:00
|
|
|
elif e.msg == 'Internal server error':
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '500')
|
2012-08-26 12:44:47 +00:00
|
|
|
else:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '417', e.msg)
|
2012-08-11 17:31:00 +00:00
|
|
|
|
2012-08-18 09:38:08 +00:00
|
|
|
def check_repo_access_permission(request, repo):
|
|
|
|
if not repo:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '404')
|
2012-08-11 17:31:00 +00:00
|
|
|
|
2012-08-18 09:38:08 +00:00
|
|
|
if not can_access_repo(request, repo.id):
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '403')
|
2012-08-18 09:38:08 +00:00
|
|
|
|
|
|
|
password_set = False
|
|
|
|
if repo.encrypted:
|
|
|
|
try:
|
|
|
|
ret = seafserv_rpc.is_passwd_set(repo.id, request.user.username)
|
|
|
|
if ret == 1:
|
|
|
|
password_set = True
|
|
|
|
except SearpcError, e:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '405', e.msg)
|
2012-08-18 09:38:08 +00:00
|
|
|
|
2012-08-26 12:44:47 +00:00
|
|
|
if not password_set:
|
|
|
|
password = request.REQUEST['password']
|
|
|
|
if not password:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '406')
|
2012-08-26 12:44:47 +00:00
|
|
|
|
2012-08-26 13:03:58 +00:00
|
|
|
return set_repo_password(request, repo, password)
|
2012-08-11 17:31:00 +00:00
|
|
|
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-07-21 17:16:43 +00:00
|
|
|
def api_login(request):
|
|
|
|
if request.method == "POST" :
|
|
|
|
form = AuthenticationForm(data=request.POST)
|
|
|
|
else:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '407')
|
2012-07-21 17:16:43 +00:00
|
|
|
|
|
|
|
if form.is_valid():
|
|
|
|
auth_login(request, form.get_user())
|
|
|
|
return HttpResponse(json.dumps(request.session.session_key), status=200,
|
|
|
|
content_type=json_content_type)
|
|
|
|
else:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '408')
|
|
|
|
|
2012-07-21 17:16:43 +00:00
|
|
|
|
|
|
|
class Ping(ResponseMixin, View):
|
|
|
|
|
|
|
|
def get(self, request):
|
2012-08-11 17:31:00 +00:00
|
|
|
response = HttpResponse(json.dumps("pong"), status=200, content_type=json_content_type)
|
2012-08-10 13:27:44 +00:00
|
|
|
if request.user.is_authenticated():
|
2012-08-11 17:31:00 +00:00
|
|
|
response["logined"] = True
|
2012-08-10 13:27:44 +00:00
|
|
|
else:
|
2012-08-11 17:31:00 +00:00
|
|
|
response["logined"] = False
|
|
|
|
return response
|
2012-07-21 17:16:43 +00:00
|
|
|
|
2012-07-14 12:26:41 +00:00
|
|
|
class ReposView(ResponseMixin, View):
|
|
|
|
renderers = (JSONRenderer,)
|
|
|
|
|
|
|
|
@api_login_required
|
|
|
|
def get(self, request):
|
|
|
|
email = request.user.username
|
|
|
|
|
|
|
|
owned_repos = seafserv_threaded_rpc.list_owned_repos(email)
|
2012-07-24 14:10:26 +00:00
|
|
|
calculate_repo_info (owned_repos, email)
|
2012-07-14 12:26:41 +00:00
|
|
|
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
|
|
|
|
|
|
|
|
n_repos = seafserv_threaded_rpc.list_share_repos(email,
|
|
|
|
'to_email', -1, -1)
|
2012-07-24 14:10:26 +00:00
|
|
|
calculate_repo_info (n_repos, email)
|
2012-07-14 12:26:41 +00:00
|
|
|
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
|
|
|
|
|
|
|
|
repos_json = []
|
|
|
|
for r in owned_repos:
|
|
|
|
repo = {
|
2012-07-24 14:10:26 +00:00
|
|
|
"type":"repo",
|
2012-08-18 09:38:08 +00:00
|
|
|
"id":r.id,
|
2012-07-24 14:10:26 +00:00
|
|
|
"owner":email,
|
2012-08-18 09:38:08 +00:00
|
|
|
"name":r.name,
|
|
|
|
"desc":r.desc,
|
2012-08-29 15:57:51 +00:00
|
|
|
"mtime":r.latest_modify,
|
2012-07-25 11:34:32 +00:00
|
|
|
"root":r.root,
|
2012-07-24 14:10:26 +00:00
|
|
|
"size":r.size,
|
|
|
|
"password_need":r.password_need,
|
2012-07-14 12:26:41 +00:00
|
|
|
}
|
|
|
|
repos_json.append(repo)
|
|
|
|
|
|
|
|
for r in n_repos:
|
|
|
|
repo = {
|
2012-07-24 14:10:26 +00:00
|
|
|
"type":"repo",
|
2012-08-18 09:38:08 +00:00
|
|
|
"id":r.id,
|
|
|
|
"owner":r.shared_email,
|
|
|
|
"name":r.name,
|
|
|
|
"desc":r.desc,
|
2012-08-29 15:57:51 +00:00
|
|
|
"mtime":r.latest_modify,
|
2012-07-25 11:34:32 +00:00
|
|
|
"root":r.root,
|
2012-07-24 14:10:26 +00:00
|
|
|
"size":r.size,
|
|
|
|
"password_need":r.password_need,
|
2012-07-14 12:26:41 +00:00
|
|
|
}
|
|
|
|
repos_json.append(repo)
|
|
|
|
|
|
|
|
response = Response(200, repos_json)
|
|
|
|
return self.render(response)
|
|
|
|
|
2012-07-21 17:16:43 +00:00
|
|
|
|
2012-07-14 12:26:41 +00:00
|
|
|
class RepoView(ResponseMixin, View):
|
|
|
|
renderers = (JSONRenderer,)
|
|
|
|
|
|
|
|
@api_login_required
|
|
|
|
def get_repo_info(request, repo_id):
|
|
|
|
# check whether user can view repo
|
2012-08-18 09:38:08 +00:00
|
|
|
repo = get_repo(repo_id)
|
2012-08-26 12:44:47 +00:00
|
|
|
if not repo:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '404')
|
2012-08-26 12:44:47 +00:00
|
|
|
|
|
|
|
if not can_access_repo(request, repo.id):
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '403')
|
2012-07-14 12:26:41 +00:00
|
|
|
|
|
|
|
# check whether use is repo owner
|
|
|
|
if validate_owner(request, repo_id):
|
|
|
|
owner = "self"
|
|
|
|
else:
|
|
|
|
owner = "share"
|
2012-07-14 02:47:59 +00:00
|
|
|
|
|
|
|
try:
|
2012-07-14 12:26:41 +00:00
|
|
|
repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime
|
|
|
|
except:
|
|
|
|
repo.latest_modify = None
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-07-14 12:26:41 +00:00
|
|
|
# query repo infomation
|
2012-08-26 12:44:47 +00:00
|
|
|
repo.size = seafserv_threaded_rpc.server_repo_size(repo_id)
|
2012-07-14 12:26:41 +00:00
|
|
|
current_commit = get_commits(repo_id, 0, 1)[0]
|
|
|
|
repo_json = {
|
2012-07-24 14:10:26 +00:00
|
|
|
"type":"repo",
|
2012-08-18 09:38:08 +00:00
|
|
|
"id":repo.id,
|
2012-07-14 02:47:59 +00:00
|
|
|
"owner":owner,
|
2012-08-18 09:38:08 +00:00
|
|
|
"name":repo.name,
|
|
|
|
"desc":repo.desc,
|
2012-07-14 02:47:59 +00:00
|
|
|
"mtime":repo.lastest_modify,
|
2012-08-26 12:44:47 +00:00
|
|
|
"password_need":repo.password_need,
|
|
|
|
"size":repo.size,
|
2012-07-25 11:34:32 +00:00
|
|
|
"root":current_commit.root_id,
|
2012-07-14 02:47:59 +00:00
|
|
|
}
|
|
|
|
|
2012-07-14 12:26:41 +00:00
|
|
|
response = Response(200, repo_json)
|
|
|
|
return self.render(response)
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-08-26 12:44:47 +00:00
|
|
|
@api_login_required
|
|
|
|
def post(self, request, repo_id):
|
|
|
|
resp = check_repo_access_permission(request, get_repo(repo_id))
|
|
|
|
if resp:
|
|
|
|
return resp
|
|
|
|
op = request.GET.get('op', 'setpassword')
|
|
|
|
if op == 'setpassword':
|
|
|
|
return HttpResponse(json.dumps("success"), status=200,
|
|
|
|
content_type=json_content_type)
|
|
|
|
|
|
|
|
return HttpResponse(json.dumps("unsupported operation"), status=200,
|
|
|
|
content_type=json_content_type)
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-07-14 12:26:41 +00:00
|
|
|
class RepoDirPathView(ResponseMixin, View):
|
|
|
|
renderers = (JSONRenderer,)
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-07-14 12:26:41 +00:00
|
|
|
@api_login_required
|
|
|
|
def get(self, request, repo_id):
|
|
|
|
repo = get_repo(repo_id)
|
2012-08-18 09:38:08 +00:00
|
|
|
resp = check_repo_access_permission(request, repo)
|
|
|
|
if resp:
|
|
|
|
return resp
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-08-18 09:38:08 +00:00
|
|
|
current_commit = get_commits(repo_id, 0, 1)[0]
|
|
|
|
path = request.GET.get('p', '/')
|
|
|
|
if path[-1] != '/':
|
|
|
|
path = path + '/'
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-08-18 09:38:08 +00:00
|
|
|
dir_id = None
|
|
|
|
try:
|
|
|
|
dir_id = seafserv_threaded_rpc.get_dirid_by_path(current_commit.id,
|
|
|
|
path.encode('utf-8'))
|
|
|
|
except SearpcError, e:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, "411", e.msg)
|
|
|
|
|
|
|
|
if not dir_id:
|
|
|
|
return api_error(request, '410')
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-08-18 09:38:08 +00:00
|
|
|
old_oid = request.GET.get('oid', None)
|
|
|
|
if old_oid and old_oid == dir_id :
|
2012-08-22 17:03:55 +00:00
|
|
|
response = HttpResponse(json.dumps("uptodate"), status=200,
|
|
|
|
content_type=json_content_type)
|
2012-08-21 13:08:10 +00:00
|
|
|
response["oid"] = dir_id
|
2012-08-22 17:03:55 +00:00
|
|
|
return response
|
2012-08-18 09:38:08 +00:00
|
|
|
else:
|
|
|
|
return get_dir_entrys_by_id(request, dir_id)
|
2012-07-14 02:47:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2012-07-14 12:26:41 +00:00
|
|
|
class RepoDirIdView(ResponseMixin, View):
|
|
|
|
renderers = (JSONRenderer,)
|
2012-07-14 02:47:59 +00:00
|
|
|
|
2012-07-14 12:26:41 +00:00
|
|
|
@api_login_required
|
|
|
|
def get(self, request, repo_id, dir_id):
|
|
|
|
repo = get_repo(repo_id)
|
2012-08-18 09:38:08 +00:00
|
|
|
resp = check_repo_access_permission(request, repo)
|
|
|
|
if resp:
|
|
|
|
return resp
|
2012-07-14 12:26:41 +00:00
|
|
|
|
|
|
|
return get_dir_entrys_by_id(request, dir_id)
|
|
|
|
|
2012-08-18 12:33:10 +00:00
|
|
|
def get_shared_link(request, repo_id, path):
|
|
|
|
l = FileShare.objects.filter(repo_id=repo_id).filter(\
|
|
|
|
username=request.user.username).filter(path=path)
|
|
|
|
token = None
|
|
|
|
if len(l) > 0:
|
|
|
|
fileshare = l[0]
|
|
|
|
token = fileshare.token
|
|
|
|
else:
|
|
|
|
token = gen_token(max_length=10)
|
2012-07-14 12:26:41 +00:00
|
|
|
|
2012-08-18 12:33:10 +00:00
|
|
|
fs = FileShare()
|
|
|
|
fs.username = request.user.username
|
|
|
|
fs.repo_id = repo_id
|
|
|
|
fs.path = path
|
|
|
|
fs.token = token
|
2012-08-11 17:31:00 +00:00
|
|
|
|
2012-08-18 12:33:10 +00:00
|
|
|
try:
|
|
|
|
fs.save()
|
|
|
|
except IntegrityError, e:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_err(request, '501')
|
2012-08-18 12:33:10 +00:00
|
|
|
|
|
|
|
domain = RequestSite(request).domain
|
|
|
|
file_shared_link = 'http://%s%sf/%s/' % (domain,
|
|
|
|
settings.SITE_ROOT, token)
|
|
|
|
return HttpResponse(json.dumps(file_shared_link), status=200, content_type=json_content_type)
|
|
|
|
|
|
|
|
def get_repo_file(request, repo_id, file_id, file_name, op):
|
|
|
|
if op == 'download':
|
|
|
|
token = gen_token()
|
|
|
|
seafserv_rpc.web_save_access_token(token, repo_id, file_id,
|
|
|
|
op, request.user.username)
|
|
|
|
redirect_url = gen_file_get_url(token, file_name)
|
|
|
|
response = HttpResponse(json.dumps(redirect_url), status=200,
|
|
|
|
content_type=json_content_type)
|
|
|
|
response["oid"] = file_id
|
|
|
|
return response
|
|
|
|
|
|
|
|
if op == 'sharelink':
|
|
|
|
path = request.GET.get('p', None)
|
|
|
|
assert path, 'path must be passed in the url'
|
|
|
|
return get_shared_link(request, repo_id, path)
|
|
|
|
|
|
|
|
def send_share_link(request, repo_id, path, emails):
|
|
|
|
l = FileShare.objects.filter(repo_id=repo_id).filter(\
|
|
|
|
username=request.user.username).filter(path=path)
|
|
|
|
if len(l) > 0:
|
|
|
|
fileshare = l[0]
|
|
|
|
token = fileshare.token
|
|
|
|
else:
|
|
|
|
token = gen_token(max_length=10)
|
|
|
|
|
|
|
|
fs = FileShare()
|
|
|
|
fs.username = request.user.username
|
|
|
|
fs.repo_id = repo_id
|
|
|
|
fs.path = path
|
|
|
|
fs.token = token
|
|
|
|
|
|
|
|
try:
|
|
|
|
fs.save()
|
|
|
|
except IntegrityError, e:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_err(request, '501')
|
2012-08-18 12:33:10 +00:00
|
|
|
|
|
|
|
domain = RequestSite(request).domain
|
|
|
|
file_shared_link = 'http://%s%sf/%s/' % (domain,
|
|
|
|
settings.SITE_ROOT, token)
|
|
|
|
|
|
|
|
t = loader.get_template('shared_link_email.html')
|
|
|
|
to_email_list = string2list(emails)
|
|
|
|
for to_email in to_email_list:
|
|
|
|
mail_sended.send(sender=None, user=request.user.username,
|
|
|
|
email=to_email)
|
|
|
|
c = {
|
|
|
|
'email': request.user.username,
|
|
|
|
'to_email': to_email,
|
|
|
|
'file_shared_link': file_shared_link,
|
|
|
|
}
|
|
|
|
try:
|
|
|
|
send_mail('您的好友通过SeaCloud分享了一个文件给您',
|
|
|
|
t.render(Context(c)), None, [to_email],
|
|
|
|
fail_silently=False)
|
|
|
|
except:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '502')
|
2012-08-18 12:33:10 +00:00
|
|
|
return HttpResponse(json.dumps(file_shared_link), status=200, content_type=json_content_type)
|
2012-08-11 17:31:00 +00:00
|
|
|
|
|
|
|
class RepoFileIdView(ResponseMixin, View):
|
2012-07-14 12:26:41 +00:00
|
|
|
renderers = (JSONRenderer,)
|
|
|
|
|
|
|
|
@api_login_required
|
|
|
|
def get(self, request, repo_id, file_id):
|
2012-08-11 17:31:00 +00:00
|
|
|
repo = get_repo(repo_id)
|
2012-08-18 09:38:08 +00:00
|
|
|
resp = check_repo_access_permission(request, repo)
|
|
|
|
if resp:
|
|
|
|
return resp
|
2012-08-11 17:31:00 +00:00
|
|
|
|
|
|
|
file_name = request.GET.get('file_name', file_id)
|
2012-08-18 12:33:10 +00:00
|
|
|
return get_repo_file (request, repo_id, file_id, file_name, 'download')
|
2012-08-11 17:31:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
class RepoFilePathView(ResponseMixin, View):
|
|
|
|
|
|
|
|
@api_login_required
|
|
|
|
def get(self, request, repo_id):
|
2012-07-14 12:26:41 +00:00
|
|
|
repo = get_repo(repo_id)
|
2012-08-18 09:38:08 +00:00
|
|
|
resp = check_repo_access_permission(request, repo)
|
|
|
|
if resp:
|
|
|
|
return resp
|
2012-08-11 17:31:00 +00:00
|
|
|
|
2012-08-18 09:38:08 +00:00
|
|
|
path = request.GET.get('p', None)
|
|
|
|
if not path:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '413')
|
2012-07-14 12:26:41 +00:00
|
|
|
|
2012-08-11 17:31:00 +00:00
|
|
|
file_id = None
|
|
|
|
try:
|
2012-08-18 12:33:10 +00:00
|
|
|
file_id = seafserv_threaded_rpc.get_file_by_path(repo_id,
|
2012-08-11 17:31:00 +00:00
|
|
|
path.encode('utf-8'))
|
|
|
|
except SearpcError, e:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '412', e.msg)
|
2012-08-11 17:31:00 +00:00
|
|
|
|
|
|
|
if not file_id:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '410')
|
2012-08-11 17:31:00 +00:00
|
|
|
|
|
|
|
file_name = request.GET.get('file_name', file_id)
|
2012-08-18 12:33:10 +00:00
|
|
|
op = request.GET.get('op', 'download')
|
|
|
|
return get_repo_file(request, repo_id, file_id, file_name, op)
|
2012-07-14 12:26:41 +00:00
|
|
|
|
2012-08-18 09:38:08 +00:00
|
|
|
@api_login_required
|
|
|
|
def post(self, request, repo_id):
|
2012-08-18 12:33:10 +00:00
|
|
|
repo = get_repo(repo_id)
|
|
|
|
resp = check_repo_access_permission(request, repo)
|
|
|
|
if resp:
|
|
|
|
return resp
|
|
|
|
|
|
|
|
path = request.GET.get('p', None)
|
|
|
|
if not path:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '413')
|
2012-08-18 12:33:10 +00:00
|
|
|
|
|
|
|
op = request.GET.get('op', 'delete')
|
|
|
|
if op == 'delete':
|
|
|
|
pass
|
|
|
|
if op == 'sendsharelink':
|
|
|
|
emails = request.POST.get('email', None)
|
|
|
|
if not emails:
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '414')
|
2012-08-18 12:33:10 +00:00
|
|
|
return send_share_link(request, path, emails)
|
|
|
|
|
2012-09-01 05:35:21 +00:00
|
|
|
return api_error(request, '415')
|
2012-08-18 12:33:10 +00:00
|
|
|
|