update code style for wsgidav/seafile_dav_provider.py
This commit is contained in:
parent
ef5ea783a1
commit
b4261ee345
2 changed files with 95 additions and 55 deletions
|
@ -197,7 +197,7 @@ def OCMValidateHttpAuthHeader(session, environ):
|
|||
|
||||
res = q.first()
|
||||
if not res:
|
||||
_logger.warning('OCM validate http auth header failed: {}'.format(auth_header))
|
||||
_logger.info('OCM validate http auth header failed: {}'.format(auth_header))
|
||||
return False
|
||||
|
||||
repo_id = res[0]
|
||||
|
|
|
@ -6,13 +6,12 @@ from threading import Timer, Lock
|
|||
import wsgidav.util as util
|
||||
import os
|
||||
import time
|
||||
import base64
|
||||
import posixpath
|
||||
import unicodedata
|
||||
|
||||
import tempfile
|
||||
|
||||
from seaserv import seafile_api, CALC_SHARE_USAGE
|
||||
from seaserv import seafile_api
|
||||
from pysearpc import SearpcError
|
||||
from seafobj import commit_mgr, fs_mgr
|
||||
from seafobj.fs import SeafFile, SeafDir
|
||||
|
@ -28,14 +27,17 @@ SYNCHRONOUS = 1
|
|||
|
||||
INFINITE_QUOTA = -2
|
||||
|
||||
|
||||
def sort_repo_list(repos):
|
||||
return sorted(repos, key = lambda r: r.id)
|
||||
return sorted(repos, key=lambda r: r.id)
|
||||
|
||||
|
||||
class BlockMap(object):
|
||||
def __init__(self):
|
||||
self.block_sizes = []
|
||||
self.timestamp = time.time()
|
||||
|
||||
|
||||
class SeafileStream(object):
|
||||
'''Implements basic file-like interface'''
|
||||
def __init__(self, file_obj, block_map, block_map_lock):
|
||||
|
@ -66,7 +68,7 @@ class SeafileStream(object):
|
|||
self.block = None
|
||||
self.block_offset = 0
|
||||
else:
|
||||
ret += self.block[self.block_offset:self.block_offset+remain]
|
||||
ret += self.block[self.block_offset:self.block_offset + remain]
|
||||
self.block_offset += remain
|
||||
remain = 0
|
||||
|
||||
|
@ -109,9 +111,10 @@ class SeafileStream(object):
|
|||
self.block_offset = current_pos
|
||||
current_pos = 0
|
||||
|
||||
#===============================================================================
|
||||
|
||||
# ===============================================================================
|
||||
# SeafileResource
|
||||
#===============================================================================
|
||||
# ===============================================================================
|
||||
class SeafileResource(DAVNonCollection):
|
||||
def __init__(self, path, repo, rel_path, obj, environ, block_map={}, block_map_lock=None):
|
||||
super(SeafileResource, self).__init__(path, environ)
|
||||
|
@ -129,19 +132,23 @@ class SeafileResource(DAVNonCollection):
|
|||
# Getter methods for standard live properties
|
||||
def get_content_length(self):
|
||||
return self.obj.size
|
||||
|
||||
def get_content_type(self):
|
||||
# (mimetype, _mimeencoding) = mimetypes.guess_type(self.path)
|
||||
# print "mimetype(%s): %r, %r" % (self.path, mimetype, _mimeencoding)
|
||||
# if not mimetype:
|
||||
# mimetype = "application/octet-stream"
|
||||
# print "mimetype(%s): return %r" % (self.path, mimetype)
|
||||
# return mimetype
|
||||
# (mimetype, _mimeencoding) = mimetypes.guess_type(self.path)
|
||||
# print "mimetype(%s): %r, %r" % (self.path, mimetype, _mimeencoding)
|
||||
# if not mimetype:
|
||||
# mimetype = "application/octet-stream"
|
||||
# print "mimetype(%s): return %r" % (self.path, mimetype)
|
||||
# return mimetype
|
||||
return util.guess_mime_type(self.path)
|
||||
|
||||
def get_creation_date(self):
|
||||
# return int(time.time())
|
||||
# return int(time.time())
|
||||
return None
|
||||
|
||||
def get_display_name(self):
|
||||
return self.name
|
||||
|
||||
def get_etag(self):
|
||||
return self.obj.obj_id
|
||||
|
||||
|
@ -168,6 +175,7 @@ class SeafileResource(DAVNonCollection):
|
|||
|
||||
def support_etag(self):
|
||||
return True
|
||||
|
||||
def support_ranges(self):
|
||||
return True
|
||||
|
||||
|
@ -227,15 +235,17 @@ class SeafileResource(DAVNonCollection):
|
|||
if not with_errors:
|
||||
parent, filename = os.path.split(self.rel_path)
|
||||
contentlength = os.stat(self.tmpfile_path).st_size
|
||||
if not self.check_repo_owner_quota(isnewfile=isnewfile, contentlength=contentlength):
|
||||
if not self.check_repo_owner_quota(isnewfile=isnewfile,
|
||||
contentlength=contentlength):
|
||||
if self.tmpfile_path:
|
||||
try:
|
||||
os.unlink(self.tmpfile_path)
|
||||
finally:
|
||||
self.tmpfile_path = None
|
||||
raise DAVError(HTTP_FORBIDDEN, "The quota of the repo owner is exceeded")
|
||||
seafile_api.put_file(self.repo.id, self.tmpfile_path, parent, filename,
|
||||
self.username, None)
|
||||
|
||||
seafile_api.put_file(self.repo.id, self.tmpfile_path,
|
||||
parent, filename, self.username, None)
|
||||
except SearpcError as e:
|
||||
raise DAVError(HTTP_INTERNAL_ERROR, e.msg)
|
||||
finally:
|
||||
|
@ -258,7 +268,8 @@ class SeafileResource(DAVNonCollection):
|
|||
return True
|
||||
|
||||
parent, filename = os.path.split(self.rel_path)
|
||||
seafile_api.del_file(self.repo.id, parent, '[\"'+filename+'\"]', self.username)
|
||||
seafile_api.del_file(self.repo.id, parent,
|
||||
'[\"' + filename + '\"]', self.username)
|
||||
except SearpcError as e:
|
||||
raise DAVError(HTTP_INTERNAL_ERROR, e.msg)
|
||||
|
||||
|
@ -290,11 +301,16 @@ class SeafileResource(DAVNonCollection):
|
|||
|
||||
# some clients such as GoodReader requires "overwrite" semantics
|
||||
file_id_dest = seafile_api.get_file_id_by_path(dest_repo.id, rel_path)
|
||||
if file_id_dest != None:
|
||||
seafile_api.del_file(dest_repo.id, dest_dir, '[\"'+dest_file+'\"]', self.username)
|
||||
if file_id_dest is not None:
|
||||
seafile_api.del_file(dest_repo.id, dest_dir,
|
||||
'[\"' + dest_file + '\"]',
|
||||
self.username)
|
||||
|
||||
seafile_api.move_file(self.repo.id, src_dir, '[\"'+src_file+'\"]',
|
||||
dest_repo.id, dest_dir, '[\"'+dest_file+'\"]', 1, self.username, NEED_PROGRESS, SYNCHRONOUS)
|
||||
seafile_api.move_file(self.repo.id, src_dir,
|
||||
'[\"' + src_file + '\"]',
|
||||
dest_repo.id, dest_dir,
|
||||
'[\"' + dest_file + '\"]',
|
||||
1, self.username, NEED_PROGRESS, SYNCHRONOUS)
|
||||
except SearpcError as e:
|
||||
raise DAVError(HTTP_INTERNAL_ERROR, e.msg)
|
||||
|
||||
|
@ -326,16 +342,20 @@ class SeafileResource(DAVNonCollection):
|
|||
if not seafile_api.is_valid_filename(dest_repo.id, dest_file):
|
||||
raise DAVError(HTTP_BAD_REQUEST)
|
||||
|
||||
seafile_api.copy_file(self.repo.id, src_dir, '[\"'+src_file+'\"]',
|
||||
dest_repo.id, dest_dir, '[\"'+dest_file+'\"]', self.username, NEED_PROGRESS, SYNCHRONOUS)
|
||||
seafile_api.copy_file(self.repo.id, src_dir,
|
||||
'[\"' + src_file + '\"]',
|
||||
dest_repo.id, dest_dir,
|
||||
'[\"' + dest_file + '\"]',
|
||||
self.username, NEED_PROGRESS, SYNCHRONOUS)
|
||||
except SearpcError as e:
|
||||
raise DAVError(HTTP_INTERNAL_ERROR, e.msg)
|
||||
|
||||
return True
|
||||
|
||||
#===============================================================================
|
||||
|
||||
# ===============================================================================
|
||||
# SeafDirResource
|
||||
#===============================================================================
|
||||
# ===============================================================================
|
||||
class SeafDirResource(DAVCollection):
|
||||
def __init__(self, path, repo, rel_path, obj, environ):
|
||||
super(SeafDirResource, self).__init__(path, environ)
|
||||
|
@ -348,16 +368,20 @@ class SeafDirResource(DAVCollection):
|
|||
|
||||
# Getter methods for standard live properties
|
||||
def get_creation_date(self):
|
||||
# return int(time.time())
|
||||
# return int(time.time())
|
||||
return None
|
||||
|
||||
def get_display_name(self):
|
||||
return self.name
|
||||
|
||||
def get_directory_info(self):
|
||||
return None
|
||||
|
||||
def get_etag(self):
|
||||
return self.obj.obj_id
|
||||
|
||||
def get_last_modified(self):
|
||||
# return int(time.time())
|
||||
# return int(time.time())
|
||||
return None
|
||||
|
||||
def get_member_names(self):
|
||||
|
@ -423,7 +447,9 @@ class SeafDirResource(DAVCollection):
|
|||
|
||||
See DAVResource.createEmptyResource()
|
||||
"""
|
||||
assert not "/" in name
|
||||
|
||||
assert "/" not in name
|
||||
|
||||
if self.provider.readonly:
|
||||
raise DAVError(HTTP_FORBIDDEN)
|
||||
|
||||
|
@ -465,7 +491,9 @@ class SeafDirResource(DAVCollection):
|
|||
|
||||
See DAVResource.createCollection()
|
||||
"""
|
||||
assert not "/" in name
|
||||
|
||||
assert "/" not in name
|
||||
|
||||
if self.provider.readonly:
|
||||
raise DAVError(HTTP_FORBIDDEN)
|
||||
|
||||
|
@ -494,7 +522,9 @@ class SeafDirResource(DAVCollection):
|
|||
if not filename:
|
||||
raise DAVError(HTTP_BAD_REQUEST)
|
||||
|
||||
seafile_api.del_file(self.repo.id, parent, '[\"'+filename+'\"]', self.username)
|
||||
seafile_api.del_file(self.repo.id, parent,
|
||||
'[\"' + filename + '\"]',
|
||||
self.username)
|
||||
except SearpcError as e:
|
||||
raise DAVError(HTTP_INTERNAL_ERROR, e.msg)
|
||||
|
||||
|
@ -527,8 +557,11 @@ class SeafDirResource(DAVCollection):
|
|||
if not seafile_api.is_valid_filename(dest_repo.id, dest_file):
|
||||
raise DAVError(HTTP_BAD_REQUEST)
|
||||
|
||||
seafile_api.move_file(self.repo.id, src_dir, '[\"'+src_file+'\"]',
|
||||
dest_repo.id, dest_dir, '[\"'+dest_file+'\"]', 0, self.username, NEED_PROGRESS, SYNCHRONOUS)
|
||||
seafile_api.move_file(self.repo.id, src_dir,
|
||||
'[\"' + src_file + '\"]',
|
||||
dest_repo.id, dest_dir,
|
||||
'[\"' + dest_file + '\"]',
|
||||
0, self.username, NEED_PROGRESS, SYNCHRONOUS)
|
||||
except SearpcError as e:
|
||||
raise DAVError(HTTP_INTERNAL_ERROR, e.msg)
|
||||
|
||||
|
@ -561,15 +594,21 @@ class SeafDirResource(DAVCollection):
|
|||
if not seafile_api.is_valid_filename(dest_repo.id, dest_file):
|
||||
raise DAVError(HTTP_BAD_REQUEST)
|
||||
|
||||
seafile_api.copy_file(self.repo.id, src_dir, '[\"'+src_file+'\"]',
|
||||
dest_repo.id, dest_dir, '[\"'+dest_file+'\"]', self.username, NEED_PROGRESS, SYNCHRONOUS)
|
||||
seafile_api.copy_file(self.repo.id, src_dir,
|
||||
'[\"' + src_file + '\"]',
|
||||
dest_repo.id, dest_dir,
|
||||
'[\"' + dest_file + '\"]',
|
||||
self.username, NEED_PROGRESS, SYNCHRONOUS)
|
||||
except SearpcError as e:
|
||||
raise DAVError(HTTP_INTERNAL_ERROR, e.msg)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
class RootResource(DAVCollection):
|
||||
|
||||
def __init__(self, username, environ, show_repo_id):
|
||||
|
||||
super(RootResource, self).__init__("/", environ)
|
||||
self.username = username
|
||||
self.show_repo_id = show_repo_id
|
||||
|
@ -578,16 +617,20 @@ class RootResource(DAVCollection):
|
|||
|
||||
# Getter methods for standard live properties
|
||||
def get_creation_date(self):
|
||||
# return int(time.time())
|
||||
# return int(time.time())
|
||||
return None
|
||||
|
||||
def get_display_name(self):
|
||||
return ""
|
||||
|
||||
def get_directory_info(self):
|
||||
return None
|
||||
|
||||
def get_etag(self):
|
||||
return None
|
||||
|
||||
def getLastModified(self):
|
||||
# return int(time.time())
|
||||
# return int(time.time())
|
||||
return None
|
||||
|
||||
def get_member_names(self):
|
||||
|
@ -652,10 +695,9 @@ class RootResource(DAVCollection):
|
|||
|
||||
def _createRootRes(self, repo, name):
|
||||
obj = get_repo_root_seafdir(repo)
|
||||
return SeafDirResource("/"+name, repo, "", obj, self.environ)
|
||||
return SeafDirResource("/" + name, repo, "", obj, self.environ)
|
||||
|
||||
# --- Read / write ---------------------------------------------------------
|
||||
|
||||
def create_empty_resource(self, name):
|
||||
raise DAVError(HTTP_FORBIDDEN)
|
||||
|
||||
|
@ -672,9 +714,9 @@ class RootResource(DAVCollection):
|
|||
raise DAVError(HTTP_FORBIDDEN)
|
||||
|
||||
|
||||
#===============================================================================
|
||||
# ===============================================================================
|
||||
# SeafileProvider
|
||||
#===============================================================================
|
||||
# ===============================================================================
|
||||
class SeafileProvider(DAVProvider):
|
||||
|
||||
def __init__(self, show_repo_id, readonly=False):
|
||||
|
@ -692,7 +734,7 @@ class SeafileProvider(DAVProvider):
|
|||
delete_items = []
|
||||
with self.block_map_lock:
|
||||
for obj_id, block in self.block_map.items():
|
||||
if time.time() - block.timestamp >= 3600*24:
|
||||
if time.time() - block.timestamp >= 3600 * 24:
|
||||
delete_items.append(obj_id)
|
||||
for i in range(len(delete_items)):
|
||||
self.block_map.pop(delete_items[i])
|
||||
|
@ -705,10 +747,8 @@ class SeafileProvider(DAVProvider):
|
|||
rw = "Read-Only"
|
||||
return "%s for Seafile (%s)" % (self.__class__.__name__, rw)
|
||||
|
||||
|
||||
def get_resource_inst(self, path, environ):
|
||||
|
||||
_logger.error(environ)
|
||||
"""Return info dictionary for path.
|
||||
|
||||
See DAVProvider.getResourceInst()
|
||||
|
@ -726,18 +766,11 @@ class SeafileProvider(DAVProvider):
|
|||
org_id = environ.get("seafile.org_id", "")
|
||||
is_guest = environ.get("seafile.is_guest", False)
|
||||
|
||||
|
||||
_logger.error(1)
|
||||
_logger.error(path)
|
||||
|
||||
if environ.get("ocm_webdav_parent_path"):
|
||||
_logger.error("has ocm_webdav_parent_path")
|
||||
ocm_webdav_parent_path = environ.get("ocm_webdav_parent_path")
|
||||
path = posixpath.join(ocm_webdav_parent_path, path.strip('/'))
|
||||
|
||||
_logger.error(2)
|
||||
_logger.error(path)
|
||||
|
||||
if path == "/" or path == "":
|
||||
return RootResource(username, environ, self.show_repo_id)
|
||||
|
||||
|
@ -759,7 +792,6 @@ class SeafileProvider(DAVProvider):
|
|||
|
||||
|
||||
def resolvePath(path, username, org_id, is_guest):
|
||||
_logger.error('in resolvePath')
|
||||
path = unicodedata.normalize('NFC', path)
|
||||
segments = path.strip("/").split("/")
|
||||
if len(segments) == 0:
|
||||
|
@ -778,7 +810,7 @@ def resolvePath(path, username, org_id, is_guest):
|
|||
parent = obj
|
||||
obj = parent.lookup(segment)
|
||||
|
||||
if not obj or (isinstance(obj, SeafFile) and i != n_segs-1):
|
||||
if not obj or (isinstance(obj, SeafFile) and i != n_segs - 1):
|
||||
raise DAVError(HTTP_NOT_FOUND)
|
||||
|
||||
rel_path += "/" + segment
|
||||
|
@ -789,8 +821,8 @@ def resolvePath(path, username, org_id, is_guest):
|
|||
|
||||
return (repo, rel_path, obj)
|
||||
|
||||
|
||||
def resolveRepoPath(repo, path):
|
||||
_logger.error('in resolveRepoPath')
|
||||
path = unicodedata.normalize('NFC', path)
|
||||
segments = path.strip("/").split("/")
|
||||
|
||||
|
@ -801,17 +833,19 @@ def resolveRepoPath(repo, path):
|
|||
for segment in segments:
|
||||
obj = obj.lookup(segment)
|
||||
|
||||
if not obj or (isinstance(obj, SeafFile) and i != n_segs-1):
|
||||
if not obj or (isinstance(obj, SeafFile) and i != n_segs - 1):
|
||||
return None
|
||||
|
||||
i += 1
|
||||
|
||||
return obj
|
||||
|
||||
|
||||
def get_repo_root_seafdir(repo):
|
||||
root_id = commit_mgr.get_commit_root_id(repo.id, repo.version, repo.head_cmmt_id)
|
||||
return fs_mgr.load_seafdir(repo.store_id, repo.version, root_id)
|
||||
|
||||
|
||||
def getRepoByName(repo_name, username, org_id, is_guest):
|
||||
repos = getAccessibleRepos(username, org_id, is_guest)
|
||||
|
||||
|
@ -831,6 +865,7 @@ def getRepoByName(repo_name, username, org_id, is_guest):
|
|||
|
||||
return ret_repo
|
||||
|
||||
|
||||
def getAccessibleRepos(username, org_id, is_guest):
|
||||
all_repos = {}
|
||||
|
||||
|
@ -865,6 +900,7 @@ def getAccessibleRepos(username, org_id, is_guest):
|
|||
try:
|
||||
repos = get_group_repos(username, org_id)
|
||||
except SearpcError as e:
|
||||
util.warn(e)
|
||||
util.warn("Failed to get groups for %s" % username)
|
||||
for grepo in repos:
|
||||
if grepo:
|
||||
|
@ -876,18 +912,21 @@ def getAccessibleRepos(username, org_id, is_guest):
|
|||
|
||||
return all_repos.values()
|
||||
|
||||
|
||||
def get_group_repos(username, org_id):
|
||||
if org_id:
|
||||
return seafile_api.get_org_group_repos_by_user(username, org_id)
|
||||
else:
|
||||
return seafile_api.get_group_repos_by_user(username)
|
||||
|
||||
|
||||
def get_owned_repos(username, org_id):
|
||||
if org_id:
|
||||
return seafile_api.get_org_owned_repo_list(org_id, username)
|
||||
else:
|
||||
return seafile_api.get_owned_repo_list(username)
|
||||
|
||||
|
||||
def get_share_in_repo_list(username, org_id):
|
||||
"""List share in repos.
|
||||
"""
|
||||
|
@ -899,6 +938,7 @@ def get_share_in_repo_list(username, org_id):
|
|||
|
||||
return repo_list
|
||||
|
||||
|
||||
def list_inner_pub_repos(username, org_id, is_guest):
|
||||
if is_guest:
|
||||
return []
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue