Update storage.
This commit is contained in:
parent
6dca3a96e1
commit
3926b2d837
@ -188,11 +188,74 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
statvfs = os.statvfs(path)
|
||||
return statvfs.f_bavail * statvfs.f_frsize
|
||||
|
||||
|
||||
async def create_node(self, request, response_xml, full_path, depth):
|
||||
requested_path = request.match_info.get("filename", "")
|
||||
abs_path = pathlib.Path(full_path)
|
||||
relative_path = str(full_path.relative_to(request['home']))
|
||||
|
||||
href_path = f"{relative_path}".strip("/")
|
||||
#href_path = href_path.replace("./","/")
|
||||
href_path = href_path.replace("//", "/")
|
||||
response = etree.SubElement(response_xml, "{DAV:}response")
|
||||
href = etree.SubElement(response, "{DAV:}href")
|
||||
href.text = href_path
|
||||
propstat = etree.SubElement(response, "{DAV:}propstat")
|
||||
prop = etree.SubElement(propstat, "{DAV:}prop")
|
||||
res_type = etree.SubElement(prop, "{DAV:}resourcetype")
|
||||
if full_path.is_dir():
|
||||
etree.SubElement(res_type, "{DAV:}collection")
|
||||
creation_date, last_modified = self.get_current_utc_time(full_path)
|
||||
etree.SubElement(prop, "{DAV:}creationdate").text = creation_date
|
||||
etree.SubElement(prop, "{DAV:}quota-used-bytes").text = str(
|
||||
full_path.stat().st_size
|
||||
if full_path.is_file()
|
||||
else self.get_directory_size(full_path)
|
||||
)
|
||||
etree.SubElement(prop, "{DAV:}quota-available-bytes").text = str(
|
||||
self.get_disk_free_space(request['home'])
|
||||
)
|
||||
etree.SubElement(prop, "{DAV:}getlastmodified").text = last_modified
|
||||
etree.SubElement(prop, "{DAV:}displayname").text = full_path.name
|
||||
etree.SubElement(prop, "{DAV:}lockdiscovery")
|
||||
mimetype, _ = mimetypes.guess_type(full_path.name)
|
||||
etree.SubElement(prop, "{DAV:}contenttype").text = mimetype
|
||||
etree.SubElement(prop, "{DAV:}getcontentlength").text = str(
|
||||
full_path.stat().st_size
|
||||
if full_path.is_file()
|
||||
else self.get_directory_size(full_path)
|
||||
)
|
||||
supported_lock = etree.SubElement(prop, "{DAV:}supportedlock")
|
||||
lock_entry_1 = etree.SubElement(supported_lock, "{DAV:}lockentry")
|
||||
lock_scope_1 = etree.SubElement(lock_entry_1, "{DAV:}lockscope")
|
||||
etree.SubElement(lock_scope_1, "{DAV:}exclusive")
|
||||
lock_type_1 = etree.SubElement(lock_entry_1, "{DAV:}locktype")
|
||||
etree.SubElement(lock_type_1, "{DAV:}write")
|
||||
lock_entry_2 = etree.SubElement(supported_lock, "{DAV:}lockentry")
|
||||
lock_scope_2 = etree.SubElement(lock_entry_2, "{DAV:}lockscope")
|
||||
etree.SubElement(lock_scope_2, "{DAV:}shared")
|
||||
lock_type_2 = etree.SubElement(lock_entry_2, "{DAV:}locktype")
|
||||
etree.SubElement(lock_type_2, "{DAV:}write")
|
||||
etree.SubElement(propstat, "{DAV:}status").text = "HTTP/1.1 200 OK"
|
||||
|
||||
if abs_path.is_dir() and depth != -1:
|
||||
for item in abs_path.iterdir():
|
||||
await self.create_node(request,response_xml, item, depth - 1)
|
||||
|
||||
|
||||
|
||||
|
||||
async def handle_propfind(self, request):
|
||||
if not await self.authenticate(request):
|
||||
return aiohttp.web.Response(
|
||||
status=401, headers={"WWW-Authenticate": 'Basic realm="WebDAV"'}
|
||||
)
|
||||
|
||||
depth = 0
|
||||
try:
|
||||
depth = int(request.headers.get("Depth", "0"))
|
||||
except ValueError:
|
||||
pass
|
||||
requested_path = request.match_info.get("filename", "")
|
||||
abs_path = request['home'] / requested_path
|
||||
if not abs_path.exists():
|
||||
@ -200,54 +263,9 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
nsmap = {"D": "DAV:"}
|
||||
response_xml = etree.Element("{DAV:}multistatus", nsmap=nsmap)
|
||||
directories = [requested_path]
|
||||
if abs_path.is_dir():
|
||||
directories.extend(os.listdir(abs_path))
|
||||
for item in directories:
|
||||
full_path = abs_path / item if item != requested_path else abs_path
|
||||
href_path = f"/{requested_path}/{item}/" if item != requested_path else f"/{requested_path}/"
|
||||
href_path = href_path.replace("//", "/")
|
||||
response = etree.SubElement(response_xml, "{DAV:}response")
|
||||
href = etree.SubElement(response, "{DAV:}href")
|
||||
if not full_path.is_dir():
|
||||
href_path = href_path.rstrip("/")
|
||||
href.text = href_path
|
||||
propstat = etree.SubElement(response, "{DAV:}propstat")
|
||||
prop = etree.SubElement(propstat, "{DAV:}prop")
|
||||
res_type = etree.SubElement(prop, "{DAV:}resourcetype")
|
||||
if full_path.is_dir():
|
||||
etree.SubElement(res_type, "{DAV:}collection")
|
||||
creation_date, last_modified = self.get_current_utc_time(full_path)
|
||||
etree.SubElement(prop, "{DAV:}creationdate").text = creation_date
|
||||
etree.SubElement(prop, "{DAV:}quota-used-bytes").text = str(
|
||||
full_path.stat().st_size
|
||||
if full_path.is_file()
|
||||
else self.get_directory_size(full_path)
|
||||
)
|
||||
etree.SubElement(prop, "{DAV:}quota-available-bytes").text = str(
|
||||
self.get_disk_free_space(request['home'])
|
||||
)
|
||||
etree.SubElement(prop, "{DAV:}getlastmodified").text = last_modified
|
||||
etree.SubElement(prop, "{DAV:}displayname").text = full_path.name
|
||||
etree.SubElement(prop, "{DAV:}lockdiscovery")
|
||||
mimetype, _ = mimetypes.guess_type(full_path.name)
|
||||
etree.SubElement(prop, "{DAV:}contenttype").text = mimetype
|
||||
etree.SubElement(prop, "{DAV:}getcontentlength").text = str(
|
||||
full_path.stat().st_size
|
||||
if full_path.is_file()
|
||||
else self.get_directory_size(full_path)
|
||||
)
|
||||
supported_lock = etree.SubElement(prop, "{DAV:}supportedlock")
|
||||
lock_entry_1 = etree.SubElement(supported_lock, "{DAV:}lockentry")
|
||||
lock_scope_1 = etree.SubElement(lock_entry_1, "{DAV:}lockscope")
|
||||
etree.SubElement(lock_scope_1, "{DAV:}exclusive")
|
||||
lock_type_1 = etree.SubElement(lock_entry_1, "{DAV:}locktype")
|
||||
etree.SubElement(lock_type_1, "{DAV:}write")
|
||||
lock_entry_2 = etree.SubElement(supported_lock, "{DAV:}lockentry")
|
||||
lock_scope_2 = etree.SubElement(lock_entry_2, "{DAV:}lockscope")
|
||||
etree.SubElement(lock_scope_2, "{DAV:}shared")
|
||||
lock_type_2 = etree.SubElement(lock_entry_2, "{DAV:}locktype")
|
||||
etree.SubElement(lock_type_2, "{DAV:}write")
|
||||
etree.SubElement(propstat, "{DAV:}status").text = "HTTP/1.1 200 OK"
|
||||
|
||||
await self.create_node(request, response_xml, abs_path, depth)
|
||||
|
||||
xml_output = etree.tostring(
|
||||
response_xml, encoding="utf-8", xml_declaration=True
|
||||
).decode()
|
||||
|
Loading…
Reference in New Issue
Block a user