[TikiWiki-commits] [Git][tikiwiki/tiki][29.x] [FIX] Calendar: allow logged-in session auth for CaldAv export
"MAGENE Sem Joel \(@Jomagene\) via TikiWiki-cvs" <[email protected]>
| Newsgroups | gmane.comp.cms.tiki.cvs |
|---|---|
| Message-ID | <6a1865c2bde77_381bb9d002008e@gitlab-sidekiq-low-urgency-cpu-bound-v2-7cddd569c8-6gmnt.mail> |
MAGENE Sem Joel pushed to branch 29.x at Tiki Wiki CMS Groupware / Tiki
Commits:
a3ba1d93 by MAGENE Sem Joel at 2026-05-28T15:50:06+00:00
[FIX] Calendar: allow logged-in session auth for CaldAv export
---
* [FIX] Calendar: allow logged-in session auth for CaldAv export
---
* [FIX] Calendar: allow logged-in session auth for CaldAv export
---
* [FIX] CalDAV export: treat cross-calendar recurrence links as standalone events in calendar export
* [FIX] CalDav export: resolve calendar-object URIs in calendar context to avoid cross-calendar mismatch
* [FIX] Calendar: allow logged-in session auth for CaldAv export
See merge request tikiwiki/tiki!10113
(cherry picked from commit 313d9a703e1162ef41fdbccf005e7c8e3f13bcdb)
See merge request tikiwiki/tiki!10398
(cherry picked from commit d5a81f1dcd4a5a71e6e1688a456416eb74cb1f62)
See merge request tikiwiki/tiki!10399
- - - - -
2 changed files:
- lib/core/Tiki/SabreDav/CalDAVBackend.php
- tiki-caldav.php
Changes:
=====================================
lib/core/Tiki/SabreDav/CalDAVBackend.php
=====================================
@@ -160,14 +160,32 @@ class CalDAVBackend extends CalDAV\Backend\AbstractBackend implements
}
}
- protected function mapCalendarObjectUriToItem($objectUri)
+ protected function mapCalendarObjectUriToItem($objectUri, $calendarId = null)
{
$calendarlib = TikiLib::lib('calendar');
if (preg_match('#calendar-object-(r?)(.*)$#', $objectUri, $m)) {
if ($m[1]) {
$item = new \CalRecurrence($m[2]);
} else {
- $item = $calendarlib->get_item($m[2]);
+ // Prefer URI resolution, but when a calendar context is known, pick
+ // the candidate that belongs to that calendar to avoid URI/id collisions.
+ $itemByUri = $calendarlib->get_item_by_uri($objectUri);
+ $itemById = null;
+ if (ctype_digit((string)$m[2])) {
+ $itemById = $calendarlib->get_item((int)$m[2]);
+ }
+
+ if ($calendarId !== null) {
+ if (is_array($itemByUri) && (int)$itemByUri['calendarId'] === (int)$calendarId) {
+ $item = $itemByUri;
+ } elseif (is_array($itemById) && (int)$itemById['calendarId'] === (int)$calendarId) {
+ $item = $itemById;
+ } else {
+ $item = $itemByUri ?: $itemById;
+ }
+ } else {
+ $item = $itemByUri ?: $itemById;
+ }
}
} else {
$item = $calendarlib->get_item_by_uri($objectUri);
@@ -178,6 +196,17 @@ class CalDAVBackend extends CalDAV\Backend\AbstractBackend implements
return $item;
}
+ protected function recurrenceBelongsToCalendar($recurrenceId, $calendarId)
+ {
+ $rec = new \CalRecurrence($recurrenceId);
+ if ((int)$rec->getCalendarId() !== (int)$calendarId || ! $rec->getFirstItemId()) {
+ return false;
+ }
+
+ $firstItem = TikiLib::lib('calendar')->get_item($rec->getFirstItemId());
+ return is_array($firstItem) && (int)$firstItem['calendarId'] === (int)$calendarId;
+ }
+
protected function getCalendarUri($calendarId)
{
return Utilities::getCalendarUri($calendarId);
@@ -412,14 +441,19 @@ class CalDAVBackend extends CalDAV\Backend\AbstractBackend implements
$result = [];
$recurrences = [];
foreach ($objects as $row) {
- if ($row['recurrenceId']) {
+ $rowForExport = $row;
+ if ($row['recurrenceId'] && $this->recurrenceBelongsToCalendar($row['recurrenceId'], $calendarId)) {
$recurrences[] = $row['recurrenceId'];
continue;
+ } elseif ($row['recurrenceId']) {
+ // Stale cross-calendar links should be exported as standalone events.
+ $rowForExport['recurrenceId'] = null;
+ $rowForExport['recurrenceStart'] = null;
}
- $calendardata = $this->constructCalendarData($row);
+ $calendardata = $this->constructCalendarData($rowForExport);
$result[] = [
'id' => $row['calitemId'],
- 'uri' => $this->getCalendarObjectUri($row),
+ 'uri' => $this->getCalendarObjectUri($rowForExport),
'lastmodified' => (int)$row['lastModif'],
'etag' => '"' . md5($calendardata) . '"',
'size' => strlen($calendardata), // TODO: add to Tiki: calendardata
@@ -467,7 +501,7 @@ class CalDAVBackend extends CalDAV\Backend\AbstractBackend implements
$this->ensureCalendarAccess($calendarId, $instanceId, null, 'view_calendar', 'read');
- $row = $this->mapCalendarObjectUriToItem($objectUri);
+ $row = $this->mapCalendarObjectUriToItem($objectUri, $calendarId);
if (! is_array($row)) {
$rec = $row;
$row = ['calitemId' => $rec->getFirstItemId(), 'calendarId' => $rec->getCalendarId(), 'lastModif' => $rec->getLastModif()];
@@ -674,7 +708,7 @@ class CalDAVBackend extends CalDAV\Backend\AbstractBackend implements
}
list($calendarId, $instanceId) = $calendarId;
- $item = $this->mapCalendarObjectUriToItem($objectUri);
+ $item = $this->mapCalendarObjectUriToItem($objectUri, $calendarId);
if (! is_array($item)) {
$rec = $item;
$item = ['calitemId' => $rec->getFirstItemId()];
@@ -732,7 +766,7 @@ class CalDAVBackend extends CalDAV\Backend\AbstractBackend implements
}
list($calendarId, $instanceId) = $calendarId;
- $item = $this->mapCalendarObjectUriToItem($objectUri);
+ $item = $this->mapCalendarObjectUriToItem($objectUri, $calendarId);
if (! is_array($item)) {
$rec = $item;
$item = ['calitemId' => $rec->getFirstItemId()];
=====================================
tiki-caldav.php
=====================================
@@ -10,12 +10,18 @@
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
use Tiki\SabreDav\BasicAuth;
+use Tiki\SabreDav\InternalAuth;
use Tiki\SabreDav\Utilities;
define('TIKI_CALDAV', true);
require_once 'tiki-setup.php';
$access->check_feature('feature_calendar');
-$authBackend = new BasicAuth();
+// Reuse current web session when available (e.g. admin UI export links),
+// while keeping HTTP Basic auth for external CalDAV clients.
+$hasBasicCredentials = ! empty($_SERVER['PHP_AUTH_USER']) || ! empty($_SERVER['HTTP_AUTHORIZATION']);
+$authBackend = $hasBasicCredentials
+ ? new BasicAuth()
+ : ((! empty($user) && $user !== 'Anonymous') ? new InternalAuth() : new BasicAuth());
$server = Utilities::buildSabreDavServer($authBackend, 'caldav');
$server->start();
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/a3ba1d935f6a1c83eecdde18518f8a7b749aa7c7
--
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/a3ba1d935f6a1c83eecdde18518f8a7b749aa7c7
You're receiving this email because of your account on gitlab.com. Manage all notifications: https://gitlab.com/-/profile/notifications | Help: https://gitlab.com/help
_______________________________________________
TikiWiki-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs