This commit is contained in:
retoor 2025-04-08 20:31:15 +02:00
parent d2e2bb8117
commit d23ed3711a

View File

@ -15,11 +15,21 @@ import aiohttp
import aiohttp.web
from lxml import etree
@aiohttp.web.middleware
async def debug_middleware(request, handler):
print(request.method, request.path, request.headers)
return await handler(request)
class WebdavApplication(aiohttp.web.Application):
def __init__(self, parent, *args, **kwargs):
super().__init__(*args, **kwargs)
middlewares = [debug_middleware]
super().__init__(middlewares=middlewares, *args, **kwargs)
self.locks = {}
self.relative_url = "/webdav"
print(self.router)
self.router.add_route("OPTIONS", "/{filename:.*}", self.handle_options)
self.router.add_route("GET", "/{filename:.*}", self.handle_get)
@ -30,8 +40,8 @@ class WebdavApplication(aiohttp.web.Application):
self.router.add_route("COPY", "/{filename:.*}", self.handle_copy)
self.router.add_route("PROPFIND", "/{filename:.*}", self.handle_propfind)
self.router.add_route("PROPPATCH", "/{filename:.*}", self.handle_proppatch)
# self.router.add_route("LOCK", "/{filename:.*}", self.handle_lock)
# self.router.add_route("UNLOCK", "/{filename:.*}", self.handle_unlock)
self.router.add_route("LOCK", "/{filename:.*}", self.handle_lock)
self.router.add_route("UNLOCK", "/{filename:.*}", self.handle_unlock)
self.parent = parent
@property
@ -46,11 +56,11 @@ class WebdavApplication(aiohttp.web.Application):
# session = request.session
# if session.get('uid'):
# request['user'] = await self.services.user.get(uid=session['uid'])
# try:
# request['home'] = await self.services.user.get_home_folder(user_uid=request['user']['uid'])
# except:
# pass
# return request['user']
#try:
# request['home'] = await self.services.user.get_home_folder(user_uid=request['user']['uid'])
#except:
# pass
#return request['user']
auth_header = request.headers.get("Authorization", "")
if not auth_header.startswith("Basic "):
@ -66,6 +76,7 @@ class WebdavApplication(aiohttp.web.Application):
request["user"]["uid"]
)
except Exception as ex:
print("GRRRRRRRRRR")
print(ex)
pass
return request["user"]
@ -98,6 +109,7 @@ class WebdavApplication(aiohttp.web.Application):
status=401, headers={"WWW-Authenticate": 'Basic realm="WebDAV"'}
)
file_path = request["home"] / request.match_info["filename"]
print("WRITETO_", file_path)
file_path.parent.mkdir(parents=True, exist_ok=True)
async with aiofiles.open(file_path, "wb") as f:
while chunk := await request.content.read(1024):
@ -195,9 +207,11 @@ class WebdavApplication(aiohttp.web.Application):
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 = f"{self.relative_url}/{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
@ -240,7 +254,7 @@ class WebdavApplication(aiohttp.web.Application):
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:
if abs_path.is_dir():
for item in abs_path.iterdir():
await self.create_node(request, response_xml, item, depth - 1)
@ -255,7 +269,11 @@ class WebdavApplication(aiohttp.web.Application):
depth = int(request.headers.get("Depth", "0"))
except ValueError:
pass
print(request)
requested_path = request.match_info.get("filename", "")
abs_path = request["home"] / requested_path
if not abs_path.exists():
return aiohttp.web.Response(status=404, text="Directory not found")
@ -267,6 +285,7 @@ class WebdavApplication(aiohttp.web.Application):
xml_output = etree.tostring(
response_xml, encoding="utf-8", xml_declaration=True
).decode()
print(xml_output)
return aiohttp.web.Response(
status=207, text=xml_output, content_type="application/xml"
)