diff options
-rw-r--r-- | README.md | 14 | ||||
-rw-r--r-- | radicale_infcloud/__init__.py | 52 | ||||
-rw-r--r-- | radicale_infcloud/web/config.js | 4 | ||||
-rwxr-xr-x | setup.py | 4 |
4 files changed, 23 insertions, 51 deletions
@@ -1,6 +1,7 @@ # InfCloud for Radicale -Integrate [InfCloud](https://www.inf-it.com/open-source/clients/infcloud/) into [Radicale](http://radicale.org/)'s web interface. +Integrate [InfCloud](https://www.inf-it.com/open-source/clients/infcloud/) into +[Radicale](http://radicale.org/)'s web interface. InfCloud allows you to to manage appointments, tasks and contacts in the browser. @@ -10,12 +11,12 @@ for InfCloud to work properly. Otherwise the "Refresh" button is broken. ## Installation ```shell -$ python3 -m pip install --upgrade https://github.com/Unrud/RadicaleInfCloud/archive/master.tar.gz +python3 -m pip install --upgrade https://github.com/Unrud/RadicaleInfCloud/archive/master.tar.gz ``` ## Configuration -Set the configuration option `type` in the `web` section to ``radicale_infcloud``. +Set the configuration option `type` in the `web` section to `radicale_infcloud`. ```ini [web] @@ -24,6 +25,9 @@ type = radicale_infcloud ## License -[AGPL-3.0](https://github.com/Unrud/RadicaleWeb/blob/master/COPYING) because [InfCloud](https://github.com/Unrud/RadicaleInfCloud/blob/master/radicale_infcloud/web/) is included. +[AGPL-3.0](https://github.com/Unrud/RadicaleWeb/blob/master/COPYING) because +[InfCloud](https://github.com/Unrud/RadicaleInfCloud/blob/master/radicale_infcloud/web/) +is included. -[GPL-3.0](https://github.com/Unrud/RadicaleWeb/blob/master/COPYING_GPL) for `radicale_infcloud/__init__.py` +[GPL-3.0](https://github.com/Unrud/RadicaleWeb/blob/master/COPYING_GPL) +for `radicale_infcloud/__init__.py` diff --git a/radicale_infcloud/__init__.py b/radicale_infcloud/__init__.py index 8dc04df..409ef28 100644 --- a/radicale_infcloud/__init__.py +++ b/radicale_infcloud/__init__.py @@ -1,5 +1,5 @@ # RadicaleWeb web interface for Radicale. -# Copyright © 2017-2018, 2020 Unrud <unrud@outlook.com> +# Copyright © 2017-2018, 2020, 2022 Unrud <unrud@outlook.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -14,14 +14,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -import os -import posixpath -import time from http import client -from radicale import httputils, pathutils -from radicale.log import logger +from radicale import httputils from radicale.web import internal -from radicale.web.internal import MIMETYPES, FALLBACK_MIMETYPE import pkg_resources @@ -34,42 +29,17 @@ class Web(internal.Web): self.infcloud_folder = pkg_resources.resource_filename(__name__, "web") def get(self, environ, base_prefix, path, user): - if not path.startswith("/.web/infcloud/") and path != "/.web/infcloud": - status, headers, answer = super().get(environ, base_prefix, path, - user) - if status == client.OK and path in ("/.web/", "/.web/index.html"): - answer = answer.replace(b"""\ + if path == "/.web/infcloud/" or path.startswith("/.web/infcloud"): + status, headers, answer = httputils.serve_folder( + self.infcloud_folder, base_prefix, path, "/.web/infcloud") + else: + status, headers, answer = super().get( + environ, base_prefix, path, user) + if status == client.OK and path in ("/.web/", "/.web/index.html"): + answer = answer.replace(b"""\ <nav> <ul>""", b"""\ <nav> <ul> <li><a href="infcloud">InfCloud</a></li>""") - return status, headers, answer - assert pathutils.sanitize_path(path) == path - try: - filesystem_path = pathutils.path_to_filesystem( - self.infcloud_folder, path[len("/.web/infcloud"):].strip("/")) - except ValueError as e: - logger.debug("Web content with unsafe path %r requested: %s", - path, e, exc_info=True) - return httputils.NOT_FOUND - if os.path.isdir(filesystem_path) and not path.endswith("/"): - location = posixpath.basename(path) + "/" - return (client.FOUND, - {"Location": location, "Content-Type": "text/plain"}, - "Redirected to %s" % location) - if os.path.isdir(filesystem_path): - filesystem_path = os.path.join(filesystem_path, "index.html") - if not os.path.isfile(filesystem_path): - return httputils.NOT_FOUND - content_type = MIMETYPES.get( - os.path.splitext(filesystem_path)[1].lower(), FALLBACK_MIMETYPE) - with open(filesystem_path, "rb") as f: - answer = f.read() - last_modified = time.strftime( - "%a, %d %b %Y %H:%M:%S GMT", - time.gmtime(os.fstat(f.fileno()).st_mtime)) - headers = { - "Content-Type": content_type, - "Last-Modified": last_modified} - return client.OK, headers, answer + return status, headers, answer diff --git a/radicale_infcloud/web/config.js b/radicale_infcloud/web/config.js index 560c1d1..ca1badf 100644 --- a/radicale_infcloud/web/config.js +++ b/radicale_infcloud/web/config.js @@ -337,9 +337,7 @@ var globalEnableDevelBuilds=true; // port, ... (client installed into Davical "htdocs" subdirectory; // works "out of the box", no additional setup required): var globalNetworkCheckSettings={ - href: location.protocol+'//'+location.hostname+ - (location.port ? ':'+location.port: '')+ - location.pathname.replace(RegExp('(/+[^/]+/*){2}(index\.html)?$'),'')+'/', + href: (new URL('../..', location.href)).href, timeOut: 90000, lockTimeOut: 10000, checkContentType: true, @@ -4,7 +4,7 @@ import os from setuptools import setup -VERSION = "3.0.0" +VERSION = "3.1.1" os.chdir("radicale_infcloud") web_data = sum(([os.path.join(root, f) for f in files @@ -23,4 +23,4 @@ setup( platforms="Any", packages=["radicale_infcloud"], package_data={"radicale_infcloud": web_data}, - install_requires=["radicale>=3.0.0"]) + install_requires=["radicale>=3.1.1"]) |