update code style for wsgidav/seafile_dav_provider.py

This commit is contained in:
lian 2023-02-17 16:28:46 +08:00
parent ef5ea783a1
commit b4261ee345
2 changed files with 95 additions and 55 deletions

View file

@ -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]

View file

@ -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 []