From 97596749c2dd2acc624c4b89492b53b91e5810cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sat, 18 Apr 2026 16:55:20 +0200 Subject: [PATCH 01/10] Add baikal compatible route for DAV --- src/Controller/DAVController.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Controller/DAVController.php b/src/Controller/DAVController.php index abb1e5d..42bc8b5 100644 --- a/src/Controller/DAVController.php +++ b/src/Controller/DAVController.php @@ -313,6 +313,8 @@ private function initExceptionListener() } #[Route('/dav/{path}', name: 'dav', requirements: ['path' => '.*'])] + #[Route('/dav.php/{path}', name: 'dav-old', requirements: ['path' => '.*'])] + #[Route('/dav.php', name: 'dav-old2', requirements: ['path' => '.*'])] public function dav(Request $request, ?string $path, ?Profiler $profiler = null) { // We don't want the toolbar on the /dav/* routes From a30353f1d66f6c04bceecc96f04b640e588422ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sat, 18 Apr 2026 16:56:35 +0200 Subject: [PATCH 02/10] Add baikal compatible route for DAV --- src/Controller/DAVController.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Controller/DAVController.php b/src/Controller/DAVController.php index 42bc8b5..5f36d06 100644 --- a/src/Controller/DAVController.php +++ b/src/Controller/DAVController.php @@ -314,7 +314,6 @@ private function initExceptionListener() #[Route('/dav/{path}', name: 'dav', requirements: ['path' => '.*'])] #[Route('/dav.php/{path}', name: 'dav-old', requirements: ['path' => '.*'])] - #[Route('/dav.php', name: 'dav-old2', requirements: ['path' => '.*'])] public function dav(Request $request, ?string $path, ?Profiler $profiler = null) { // We don't want the toolbar on the /dav/* routes From 2dc28ae1f60e869e38f4b894ac7963ec55418859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sat, 18 Apr 2026 19:39:53 +0200 Subject: [PATCH 03/10] Use database count instead of fetching all data --- src/Controller/Admin/DashboardController.php | 20 ++++++++++---------- templates/dashboard.html.twig | 10 +++++----- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php index 84a25d4..ad23c2a 100644 --- a/src/Controller/Admin/DashboardController.php +++ b/src/Controller/Admin/DashboardController.php @@ -17,20 +17,20 @@ class DashboardController extends AbstractController #[Route('/dashboard', name: 'dashboard')] public function dashboard(ManagerRegistry $doctrine): Response { - $users = $doctrine->getRepository(User::class)->findAll(); - $calendars = $doctrine->getRepository(CalendarInstance::class)->findAll(); - $addressbooks = $doctrine->getRepository(AddressBook::class)->findAll(); - $events = $doctrine->getRepository(CalendarObject::class)->findAll(); - $contacts = $doctrine->getRepository(Card::class)->findAll(); + $usersCount = $doctrine->getRepository(User::class)->count([]); + $calendarsCount = $doctrine->getRepository(CalendarInstance::class)->count([]); + $addressbooksCount = $doctrine->getRepository(AddressBook::class)->count([]); + $eventsCount = $doctrine->getRepository(CalendarObject::class)->count([]); + $contactsCount = $doctrine->getRepository(Card::class)->count([]); $timezoneParameter = $this->getParameter('timezone'); return $this->render('dashboard.html.twig', [ - 'users' => $users, - 'calendars' => $calendars, - 'addressbooks' => $addressbooks, - 'events' => $events, - 'contacts' => $contacts, + 'users' => $usersCount, + 'calendars' => $calendarsCount, + 'addressbooks' => $addressbooksCount, + 'events' => $eventsCount, + 'contacts' => $contactsCount, 'timezone' => [ 'actual_default' => date_default_timezone_get(), 'not_set_in_app' => '' === $timezoneParameter, diff --git a/templates/dashboard.html.twig b/templates/dashboard.html.twig index 3ec0e13..d8b9e3e 100644 --- a/templates/dashboard.html.twig +++ b/templates/dashboard.html.twig @@ -57,19 +57,19 @@
  • - {{ "dashboard.users"|trans }} {{ users|length }} + {{ "dashboard.users"|trans }} {{ users }}
  • -
    {{ "dashboard.calendars"|trans }} {{ "dashboard.calendars.help"|trans }}
    {{ calendars|length }} +
    {{ "dashboard.calendars"|trans }} {{ "dashboard.calendars.help"|trans }}
    {{ calendars }}
  • - ↳ {{ "dashboard.events"|trans }} {{ events|length }} + ↳ {{ "dashboard.events"|trans }} {{ events }}
  • - {{ "dashboard.address_books"|trans }} {{ addressbooks|length }} + {{ "dashboard.address_books"|trans }} {{ addressbooks }}
  • - ↳ {{ "dashboard.contacts"|trans }} {{ contacts|length }} + ↳ {{ "dashboard.contacts"|trans }} {{ contacts }}
From b14c3031564fc5ca1aa066c849d398243f1a7a39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sat, 18 Apr 2026 20:42:42 +0200 Subject: [PATCH 04/10] Add legacy DAV route for backward compatibility --- src/Controller/DAVController.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Controller/DAVController.php b/src/Controller/DAVController.php index 5f36d06..5c070fe 100644 --- a/src/Controller/DAVController.php +++ b/src/Controller/DAVController.php @@ -312,8 +312,20 @@ private function initExceptionListener() }); } + #[Route('/dav.php/{path?}', name: 'dav-old', requirements: ['path' => '.*'])] + public function davLegacy(Request $request, ?string $path): Response + { + return $this->redirect($this->generateUrl('dav', ['path' => $path ?? '']).$this->buildQueryString($request), 301); + } + + private function buildQueryString(Request $request): string + { + $qs = $request->getQueryString(); + + return $qs ? '?'.$qs : ''; + } + #[Route('/dav/{path}', name: 'dav', requirements: ['path' => '.*'])] - #[Route('/dav.php/{path}', name: 'dav-old', requirements: ['path' => '.*'])] public function dav(Request $request, ?string $path, ?Profiler $profiler = null) { // We don't want the toolbar on the /dav/* routes From 751336a2734282789fb76b9551de5fef98f54419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sun, 19 Apr 2026 00:10:14 +0200 Subject: [PATCH 05/10] Move redirection from code to reverse proxy --- docker/configurations/Caddyfile | 6 ++++++ src/Controller/DAVController.php | 13 ------------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/docker/configurations/Caddyfile b/docker/configurations/Caddyfile index c28aaf0..a8690c8 100644 --- a/docker/configurations/Caddyfile +++ b/docker/configurations/Caddyfile @@ -7,6 +7,12 @@ redir /.well-known/caldav /dav/ redir /.well-known/carddav /dav/ + @davphp { + path_regexp dav ^/dav\.php(/(.*))?$ + } + # Samotný rewrite s využitím zachycené skupiny + rewrite @davphp /dav/{re.dav.2} + root * /var/www/davis/public php_fastcgi unix//var/run/php-fpm/php-fpm.sock { # Preserve the original X-Forwarded-Proto from upstream, as it might be HTTPS diff --git a/src/Controller/DAVController.php b/src/Controller/DAVController.php index 5c070fe..abb1e5d 100644 --- a/src/Controller/DAVController.php +++ b/src/Controller/DAVController.php @@ -312,19 +312,6 @@ private function initExceptionListener() }); } - #[Route('/dav.php/{path?}', name: 'dav-old', requirements: ['path' => '.*'])] - public function davLegacy(Request $request, ?string $path): Response - { - return $this->redirect($this->generateUrl('dav', ['path' => $path ?? '']).$this->buildQueryString($request), 301); - } - - private function buildQueryString(Request $request): string - { - $qs = $request->getQueryString(); - - return $qs ? '?'.$qs : ''; - } - #[Route('/dav/{path}', name: 'dav', requirements: ['path' => '.*'])] public function dav(Request $request, ?string $path, ?Profiler $profiler = null) { From 5e015731a1431233e4a9b0a3f2244360652a53a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sun, 19 Apr 2026 00:12:05 +0200 Subject: [PATCH 06/10] Move redirection from code to reverse proxy --- docker/configurations/Caddyfile | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/configurations/Caddyfile b/docker/configurations/Caddyfile index a8690c8..0d1b398 100644 --- a/docker/configurations/Caddyfile +++ b/docker/configurations/Caddyfile @@ -10,7 +10,6 @@ @davphp { path_regexp dav ^/dav\.php(/(.*))?$ } - # Samotný rewrite s využitím zachycené skupiny rewrite @davphp /dav/{re.dav.2} root * /var/www/davis/public From 7a5368f7625416410834b37ad742f6f20fad2250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sun, 19 Apr 2026 00:20:57 +0200 Subject: [PATCH 07/10] Rename parameters --- src/Controller/Admin/DashboardController.php | 12 ++++++------ templates/dashboard.html.twig | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php index ad23c2a..57aa154 100644 --- a/src/Controller/Admin/DashboardController.php +++ b/src/Controller/Admin/DashboardController.php @@ -19,18 +19,18 @@ public function dashboard(ManagerRegistry $doctrine): Response { $usersCount = $doctrine->getRepository(User::class)->count([]); $calendarsCount = $doctrine->getRepository(CalendarInstance::class)->count([]); - $addressbooksCount = $doctrine->getRepository(AddressBook::class)->count([]); + $addressBooksCount = $doctrine->getRepository(AddressBook::class)->count([]); $eventsCount = $doctrine->getRepository(CalendarObject::class)->count([]); $contactsCount = $doctrine->getRepository(Card::class)->count([]); $timezoneParameter = $this->getParameter('timezone'); return $this->render('dashboard.html.twig', [ - 'users' => $usersCount, - 'calendars' => $calendarsCount, - 'addressbooks' => $addressbooksCount, - 'events' => $eventsCount, - 'contacts' => $contactsCount, + 'usersCount' => $usersCount, + 'calendarsCount' => $calendarsCount, + 'addressBooksCount' => $addressBooksCount, + 'eventsCount' => $eventsCount, + 'contactsCount' => $contactsCount, 'timezone' => [ 'actual_default' => date_default_timezone_get(), 'not_set_in_app' => '' === $timezoneParameter, diff --git a/templates/dashboard.html.twig b/templates/dashboard.html.twig index d8b9e3e..941fdf9 100644 --- a/templates/dashboard.html.twig +++ b/templates/dashboard.html.twig @@ -57,19 +57,19 @@
  • - {{ "dashboard.users"|trans }} {{ users }} + {{ "dashboard.users"|trans }} {{ usersCount }}
  • -
    {{ "dashboard.calendars"|trans }} {{ "dashboard.calendars.help"|trans }}
    {{ calendars }} +
    {{ "dashboard.calendars"|trans }} {{ "dashboard.calendars.help"|trans }}
    {{ calendarsCount }}
  • - ↳ {{ "dashboard.events"|trans }} {{ events }} + ↳ {{ "dashboard.events"|trans }} {{ eventsCount }}
  • - {{ "dashboard.address_books"|trans }} {{ addressbooks }} + {{ "dashboard.address_books"|trans }} {{ addressBooksCount }}
  • - ↳ {{ "dashboard.contacts"|trans }} {{ contacts }} + ↳ {{ "dashboard.contacts"|trans }} {{ contactsCount }}
From 73c0c046150483aedb4f26b0b803eb6bbb71d452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sun, 19 Apr 2026 00:36:05 +0200 Subject: [PATCH 08/10] Add redirection to nginx.conf --- docker/configurations/nginx.conf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/configurations/nginx.conf b/docker/configurations/nginx.conf index 1e83652..21cdd57 100644 --- a/docker/configurations/nginx.conf +++ b/docker/configurations/nginx.conf @@ -17,6 +17,8 @@ server { rewrite ^/.well-known/caldav /dav/ redirect; rewrite ^/.well-known/carddav /dav/ redirect; + rewrite ^/dav\.php(/.*)?$ /dav$1 redirect; + charset utf-8; location ~ /(\.ht) { @@ -29,11 +31,12 @@ server { } location ~ ^(.+\.php)(.*)$ { + fastcgi_split_path_info ^(.+\.php)(.*)$; + try_files $fastcgi_script_name =404; include fastcgi_params; fastcgi_pass docker-davis; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; - fastcgi_split_path_info ^(.+\.php)(.*)$; } } From 880432ef0be247b3469e6ce779358f78048dbee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sun, 3 May 2026 13:20:22 +0200 Subject: [PATCH 09/10] Fix user deletions --- src/Controller/Admin/UserController.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Controller/Admin/UserController.php b/src/Controller/Admin/UserController.php index 0ab498d..cba5fd9 100644 --- a/src/Controller/Admin/UserController.php +++ b/src/Controller/Admin/UserController.php @@ -140,8 +140,14 @@ public function userDelete(ManagerRegistry $doctrine, int $userId, TranslatorInt $principalProxyWrite = $doctrine->getRepository(Principal::class)->findOneByUri($principal->getUri().Principal::WRITE_PROXY_SUFFIX); $entityManager->remove($principal); - $entityManager->remove($principalProxyRead); - $entityManager->remove($principalProxyWrite); + + if ($principalProxyRead) { + $entityManager->remove($principalProxyRead); + } + + if ($principalProxyWrite) { + $entityManager->remove($principalProxyWrite); + } $principalUri = Principal::PREFIX.$user->getUsername(); From cf29bfb70d4b6bf5361c2fdd23886fe136eb24b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Trkan?= Date: Sun, 3 May 2026 13:25:56 +0200 Subject: [PATCH 10/10] revert www server config --- docker/configurations/Caddyfile | 5 ----- docker/configurations/nginx.conf | 5 +---- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/docker/configurations/Caddyfile b/docker/configurations/Caddyfile index 0d1b398..c28aaf0 100644 --- a/docker/configurations/Caddyfile +++ b/docker/configurations/Caddyfile @@ -7,11 +7,6 @@ redir /.well-known/caldav /dav/ redir /.well-known/carddav /dav/ - @davphp { - path_regexp dav ^/dav\.php(/(.*))?$ - } - rewrite @davphp /dav/{re.dav.2} - root * /var/www/davis/public php_fastcgi unix//var/run/php-fpm/php-fpm.sock { # Preserve the original X-Forwarded-Proto from upstream, as it might be HTTPS diff --git a/docker/configurations/nginx.conf b/docker/configurations/nginx.conf index 21cdd57..1e83652 100644 --- a/docker/configurations/nginx.conf +++ b/docker/configurations/nginx.conf @@ -17,8 +17,6 @@ server { rewrite ^/.well-known/caldav /dav/ redirect; rewrite ^/.well-known/carddav /dav/ redirect; - rewrite ^/dav\.php(/.*)?$ /dav$1 redirect; - charset utf-8; location ~ /(\.ht) { @@ -31,12 +29,11 @@ server { } location ~ ^(.+\.php)(.*)$ { - fastcgi_split_path_info ^(.+\.php)(.*)$; - try_files $fastcgi_script_name =404; include fastcgi_params; fastcgi_pass docker-davis; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_split_path_info ^(.+\.php)(.*)$; } }