From 3c762e1476e417dede1570f04e1f662deb1f50fa Mon Sep 17 00:00:00 2001 From: Stefan Hacker Date: Sun, 12 Apr 2026 13:53:24 +0200 Subject: [PATCH] fix: Well-Known DAV - OPTIONS liefert jetzt korrekt DAV-Header Flask hat trotz expliziter OPTIONS-Route Auto-OPTIONS generiert, wodurch der DAV-Header fehlte. DAVx5 sieht so keinen Calendar- Access und lehnt den Server ab. Konsolidiert zu einem Handler mit method-basiertem Dispatch und provide_automatic_options=False, damit Flask nicht dazwischenfunkt. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/app/__init__.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/backend/app/__init__.py b/backend/app/__init__.py index b85719d..20d1aeb 100644 --- a/backend/app/__init__.py +++ b/backend/app/__init__.py @@ -97,22 +97,27 @@ def create_app(config_class=Config): # Well-known URLs for CalDAV/CardDAV auto-discovery (iOS, DAVx5, etc.). # 301-Redirect bei PROPFIND ist bei einigen Clients zickig, deshalb # delegieren wir intern direkt an die DAV-Handler, statt zu redirecten. + from flask import request from app.dav.caldav import propfind as dav_propfind, options as dav_options - @app.route('/.well-known/caldav', methods=['GET', 'HEAD']) - @app.route('/.well-known/carddav', methods=['GET', 'HEAD']) - def wellknown_redirect(): + def _wellknown_dav(): + if request.method == 'PROPFIND': + return dav_propfind(subpath='') + if request.method == 'OPTIONS': + return dav_options() return redirect('/dav/', code=301) - @app.route('/.well-known/caldav', methods=['PROPFIND']) - @app.route('/.well-known/carddav', methods=['PROPFIND']) - def wellknown_propfind(): - return dav_propfind(subpath='') - - @app.route('/.well-known/caldav', methods=['OPTIONS']) - @app.route('/.well-known/carddav', methods=['OPTIONS']) - def wellknown_options(): - return dav_options() + app.add_url_rule( + '/.well-known/caldav', view_func=_wellknown_dav, + methods=['GET', 'HEAD', 'PROPFIND', 'OPTIONS'], + provide_automatic_options=False, + ) + app.add_url_rule( + '/.well-known/carddav', view_func=_wellknown_dav, + endpoint='_wellknown_carddav', + methods=['GET', 'HEAD', 'PROPFIND', 'OPTIONS'], + provide_automatic_options=False, + ) # iCal export (public, no auth) @app.route('/ical/')