Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added asgi_webdav/page/__init__.py
Empty file.
73 changes: 73 additions & 0 deletions asgi_webdav/page/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
from collections.abc import Callable
from dataclasses import dataclass

from asgi_webdav.request import DAVRequest
from asgi_webdav.response import DAVResponse


@dataclass
class PageURL:
path: str
view: Callable
require_user: bool = True
require_admin: bool = False


class PageResponseBase:
pass


class PageResponseHTML(PageResponseBase):
pass


class PageResponseJSON(PageResponseBase):
pass


class PageResponseRedirect(PageResponseBase):
pass


"""
HttpResponseBadRequest
HttpResponseNotAllowed
HttpResponseNotFound
HttpResponseForbidden
HttpResponseServerError
"""


class PageView:
async def __call__(self, request: DAVRequest) -> DAVResponse:
status, content = self._get_response(request)
return DAVResponse(status=status, content=content.encode("utf-8"))

def _get_response(self, request: DAVRequest) -> (int, str):
raise NotImplementedError()


class PageTemplateView(PageView):
pass


class PageEntry:
urls: list[PageURL]

def __init__(self):
self._data = dict()
for url_obj in self.urls:
self._data[url_obj.path] = url_obj

async def enter(self, request: DAVRequest) -> DAVResponse:
url_obj = self._data.get(request.path.raw)
if url_obj is None:
return DAVResponse(404)

if url_obj.require_user and request.user is None:
return DAVResponse(403, content=b"Requires user privileges")

if url_obj.require_admin and not request.user.admin:
return DAVResponse(403, content=b"Requires administrator privileges")

return await url_obj.view(request)
42 changes: 42 additions & 0 deletions asgi_webdav/page/inside.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from jinja2 import DictLoader, Environment

from asgi_webdav.log import get_log_messages
from asgi_webdav.page.base import PageEntry, PageURL, PageView
from asgi_webdav.request import DAVRequest

jinja_template_mapping = {
"info.html": """System Info:
Session Info:
User: {{ username }}
"""
}
env = Environment(loader=DictLoader(jinja_template_mapping))


class IndexView(PageView):
def _get_response(self, request: DAVRequest) -> (int, str):
return 200, '<a href="/_/admin/logging">Logging page</a>'


class InfoView(PageView):
def _get_response(self, request: DAVRequest) -> (int, str):
return 200, env.get_template("info.html").render(username=request.user.username)


class LoggingView(PageView):
def _get_response(self, request: DAVRequest) -> (int, str):
data = ""
for message in get_log_messages():
data += message + "<br>"
return 200, data


urls = [
PageURL("/_", IndexView()),
PageURL("/_/info", InfoView(), require_admin=True),
PageURL("/_/admin/logging", LoggingView()),
]


class InsidePage(PageEntry):
urls = urls
21 changes: 7 additions & 14 deletions asgi_webdav/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
init_config_from_file,
init_config_from_obj,
)
from asgi_webdav.constants import AppEntryParameters, ASGIScope, DAVMethod, DevMode
from asgi_webdav.constants import AppEntryParameters, ASGIScope, DevMode
from asgi_webdav.exception import DAVExceptionProviderInitFailed
from asgi_webdav.log import get_dav_logging_config
from asgi_webdav.middleware.cors import ASGIMiddlewareCORS
from asgi_webdav.page.inside import InsidePage
from asgi_webdav.request import DAVRequest
from asgi_webdav.response import DAVResponse
from asgi_webdav.web_dav import WebDAV
from asgi_webdav.web_page import WebPage

logger = getLogger(__name__)

Expand All @@ -41,7 +41,7 @@ def __init__(self, config: Config):
logger.info(_service_abnormal_exit_message)
sys.exit(1)

self.web_page = WebPage()
self.inside_page = InsidePage()

async def __call__(self, scope: ASGIScope, receive, send) -> None:
request, response = await self.handle(scope, receive, send)
Expand Down Expand Up @@ -70,18 +70,11 @@ async def handle(
logger.debug(request)
return request, self.dav_auth.create_response_401(request, message)

# process Admin request
if (
request.method == DAVMethod.GET
and request.src_path.count >= 1
and request.src_path.parts[0] == "_"
):
# route to inside page
if request.src_path.count >= 1 and request.src_path.parts[0] == "_":
# route /_
status, data = await self.web_page.enter(request)
return request, DAVResponse(
status=status,
content=data.encode("utf-8"),
)
response = await self.inside_page.enter(request)
return request, response

# process WebDAV request
try:
Expand Down
41 changes: 0 additions & 41 deletions asgi_webdav/web_page.py

This file was deleted.

1 change: 1 addition & 0 deletions build_docker_and_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@ docker run -dit --restart unless-stopped \
-e DEBUG=true \
-e WEBDAV_LOGGING_LEVEL=DEBUG \
--name asgi-webdav cr.h.rexzhang.com/ray1ex/asgi-webdav

docker image prune -f
docker container logs -f asgi-webdav
3 changes: 3 additions & 0 deletions requirements/standalone.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,6 @@ httptools

# response compress
brotli # c runtime

# inside page
jinja2