From e63b69a55e334311809092587b896b2544cb1ee0 Mon Sep 17 00:00:00 2001 From: Martin Wendt Date: Sat, 2 Dec 2023 21:51:00 +0100 Subject: [PATCH] New option `suppress_version_info` New option `suppress_version_info` to suppress WsgiDAV's version info in responses (default: false) --- CHANGELOG.md | 5 +++++ sample_wsgidav.yaml | 3 +++ wsgidav/dav_error.py | 7 ++++--- wsgidav/default_conf.py | 2 ++ wsgidav/dir_browser/_dir_browser.py | 3 +-- wsgidav/server/ext_wsgiutils_server.py | 7 +++---- wsgidav/server/server_cli.py | 15 +++++++++------ wsgidav/server/server_sample.py | 4 ++-- wsgidav/util.py | 11 ++++++++--- wsgidav/wsgidav_app.py | 8 +++++--- 10 files changed, 42 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a5d84cf..241435b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## 4.3.1 / Unreleased +- New option `suppress_version_info` to suppress WsgiDAV's version info in + responses (default: false). +- #298: `--root` argument honors `fs_dav_provider` configuration. +- #301: `_DAVResource` should have `is_link()` method to avoid dir_browser issues. + ## 4.3.0 / 2023-09-24 - BREAKING: diff --git a/sample_wsgidav.yaml b/sample_wsgidav.yaml index a618b6c7..a3f30939 100644 --- a/sample_wsgidav.yaml +++ b/sample_wsgidav.yaml @@ -288,6 +288,9 @@ lock_storage: true #: Set verbosity level (can be overridden by -v or -q arguments) verbose: 3 +#: Suppress version info in HTTP response headers and error responses +suppress_version_info: false + logging: #: Enable logging when using wsgidav in library mode (always on, when running as CLI) enable: null diff --git a/wsgidav/dav_error.py b/wsgidav/dav_error.py index 357f1960..ba809493 100644 --- a/wsgidav/dav_error.py +++ b/wsgidav/dav_error.py @@ -9,7 +9,7 @@ import datetime from html import escape as html_escape -from wsgidav import __version__, util, xml_tools +from wsgidav import util, xml_tools from wsgidav.xml_tools import etree __docformat__ = "reStructuredText" @@ -254,8 +254,9 @@ def get_response_page(self): html.append("

{}

".format(html_escape(self.get_user_info()))) html.append("
") html.append( - "WsgiDAV/{} - {}".format( - __version__, html_escape(str(datetime.datetime.now()), "utf-8") + "{} - {}".format( + util.public_wsgidav_info, + html_escape(str(datetime.datetime.now()), "utf-8"), ) ) html.append("") diff --git a/wsgidav/default_conf.py b/wsgidav/default_conf.py index 1d6ca981..016f84a1 100644 --- a/wsgidav/default_conf.py +++ b/wsgidav/default_conf.py @@ -81,6 +81,8 @@ #: 5 - show full request/response header info (HTTP Logging) #: request body and GET response bodies not shown "verbose": DEFAULT_VERBOSE, + #: Suppress version info in HTTP response headers and error responses + "suppress_version_info": False, #: Log options "logging": { "enable": None, # True: activate 'wsgidav' logger (in library mode) diff --git a/wsgidav/dir_browser/_dir_browser.py b/wsgidav/dir_browser/_dir_browser.py index 7aefbd57..4de75aeb 100644 --- a/wsgidav/dir_browser/_dir_browser.py +++ b/wsgidav/dir_browser/_dir_browser.py @@ -91,7 +91,6 @@ def __call__(self, environ, start_response): and dav_res and dav_res.is_collection ): - if util.get_content_length(environ) != 0: self._fail( HTTP_MEDIATYPE_NOT_SUPPORTED, @@ -195,7 +194,7 @@ def _get_context(self, environ, dav_res): if trailer: trailer = trailer.replace( "${version}", - f"WsgiDAV/{__version__}", + f"{util.public_wsgidav_info}", ) trailer = trailer.replace("${time}", util.get_rfc1123_time()) diff --git a/wsgidav/server/ext_wsgiutils_server.py b/wsgidav/server/ext_wsgiutils_server.py index 95513ae7..b2be75b3 100644 --- a/wsgidav/server/ext_wsgiutils_server.py +++ b/wsgidav/server/ext_wsgiutils_server.py @@ -67,7 +67,7 @@ from io import StringIO from urllib.parse import urlparse -from wsgidav import __version__, util +from wsgidav import util _logger = util.get_module_logger(__name__) @@ -88,7 +88,6 @@ class ExtHandler(BaseHTTPServer.BaseHTTPRequestHandler): - _SUPPORTED_METHODS = [ "HEAD", "GET", @@ -109,8 +108,8 @@ class ExtHandler(BaseHTTPServer.BaseHTTPRequestHandler): # Enable automatic keep-alive: protocol_version = "HTTP/1.1" - server_version = "WsgiDAV/{} ExtServer/{} {}".format( - __version__, + server_version = "{} ExtServer/{} {}".format( + util.public_wsgidav_info, _version, BaseHTTPServer.BaseHTTPRequestHandler.server_version, ) diff --git a/wsgidav/server/server_cli.py b/wsgidav/server/server_cli.py index ccb7ec11..ba7400b9 100644 --- a/wsgidav/server/server_cli.py +++ b/wsgidav/server/server_cli.py @@ -427,6 +427,9 @@ def _init_config(): # # import pydevd # # pydevd.settrace() + if config["suppress_version_info"]: + util.public_wsgidav_info = "WsgiDAV" + return cli_opts, config @@ -440,7 +443,7 @@ def _run_cheroot(app, config, _server): return False version = ( - f"WsgiDAV/{__version__} {wsgi.Server.version} Python/{util.PYTHON_VERSION}" + f"{util.public_wsgidav_info} {wsgi.Server.version} Python/{util.PYTHON_VERSION}" ) # wsgi.Server.version = version @@ -532,7 +535,7 @@ def _run_gevent(app, config, server): info = _get_common_info(config) version = f"gevent/{gevent.__version__}" - version = f"WsgiDAV/{__version__} {version} Python {util.PYTHON_VERSION}" + version = f"{util.public_wsgidav_info} {version} Python {util.PYTHON_VERSION}" # Override or add custom args server_args = { @@ -627,7 +630,7 @@ def load(self): server_args.update(custom_args) version = f"gunicorn/{gunicorn.__version__}" - version = f"WsgiDAV/{__version__} {version} Python {util.PYTHON_VERSION}" + version = f"{util.public_wsgidav_info} {version} Python {util.PYTHON_VERSION}" _logger.info(f"Running {version} ...") GunicornApplication(app, server_args).run() @@ -650,7 +653,7 @@ def _run_paste(app, config, server): info = _get_common_info(config) version = httpserver.WSGIHandler.server_version - version = f"WsgiDAV/{__version__} {version} Python {util.PYTHON_VERSION}" + version = f"{util.public_wsgidav_info} {version} Python {util.PYTHON_VERSION}" # See http://pythonpaste.org/modules/httpserver.html for more options server = httpserver.serve( @@ -724,7 +727,7 @@ def _run_uvicorn(app, config, server): server_args.update(custom_args) version = f"uvicorn/{uvicorn.__version__}" - version = f"WsgiDAV/{__version__} {version} Python {util.PYTHON_VERSION}" + version = f"{util.public_wsgidav_info} {version} Python {util.PYTHON_VERSION}" _logger.info(f"Running {version} ...") uvicorn.run(app, **server_args) @@ -735,7 +738,7 @@ def _run_wsgiref(app, config, _server): from wsgiref.simple_server import WSGIRequestHandler, make_server version = WSGIRequestHandler.server_version - version = f"WsgiDAV/{__version__} {version}" # Python {util.PYTHON_VERSION}" + version = f"{util.public_wsgidav_info} {version}" # Python {util.PYTHON_VERSION}" _logger.info(f"Running {version} ...") _logger.warning( diff --git a/wsgidav/server/server_sample.py b/wsgidav/server/server_sample.py index b1865750..674662a5 100644 --- a/wsgidav/server/server_sample.py +++ b/wsgidav/server/server_sample.py @@ -7,7 +7,7 @@ """ from cheroot import wsgi -from wsgidav import __version__, util +from wsgidav import util from wsgidav.fs_dav_provider import FilesystemProvider from wsgidav.wsgidav_app import WsgiDAVApp @@ -36,7 +36,7 @@ def main(): # For an example, use cheroot: version = ( - f"WsgiDAV/{__version__} {wsgi.Server.version} Python/{util.PYTHON_VERSION}" + f"{util.public_wsgidav_info} {wsgi.Server.version} Python/{util.PYTHON_VERSION}" ) server = wsgi.Server( diff --git a/wsgidav/util.py b/wsgidav/util.py index 6e1b542d..dbae2f19 100644 --- a/wsgidav/util.py +++ b/wsgidav/util.py @@ -25,6 +25,7 @@ from typing import Iterable, Optional, Tuple from urllib.parse import quote +from wsgidav import __version__ from wsgidav.dav_error import ( HTTP_BAD_REQUEST, HTTP_CREATED, @@ -45,12 +46,16 @@ BASE_LOGGER_NAME = "wsgidav" _logger = logging.getLogger(BASE_LOGGER_NAME) -PYTHON_VERSION = "{}.{}.{}".format( - sys.version_info[0], sys.version_info[1], sys.version_info[2] -) +#: Currently used Python version as string +PYTHON_VERSION = ".".join([str(s) for s in sys.version_info[:3]]) filesystemencoding = sys.getfilesystemencoding() +#: Project name and version presented to the clients +#: This is reset to ``"WsgiDAV"`` if ``suppress_version_info`` is set in the +#: configuration. +public_wsgidav_info = f"WsgiDAV/{__version__}" + class NO_DEFAULT: """""" diff --git a/wsgidav/wsgidav_app.py b/wsgidav/wsgidav_app.py index e1f782e2..b3a5c79b 100644 --- a/wsgidav/wsgidav_app.py +++ b/wsgidav/wsgidav_app.py @@ -54,7 +54,7 @@ import time from urllib.parse import unquote -from wsgidav import __version__, util +from wsgidav import util from wsgidav.dav_provider import DAVProvider from wsgidav.default_conf import DEFAULT_CONFIG from wsgidav.fs_dav_provider import FilesystemProvider @@ -278,8 +278,10 @@ def __init__(self, config): _logger.error("Could not add middleware {}.".format(mw)) _logger.info( - "WsgiDAV/{} Python/{} {}".format( - __version__, util.PYTHON_VERSION, platform.platform(aliased=True) + "{} Python/{} {}".format( + util.public_wsgidav_info, + util.PYTHON_VERSION, + platform.platform(aliased=True), ) )