Skip to content

Commit 2e096dd

Browse files
fix(caldav): url-encode owner/user in activity event links
Assisted-by: ClaudeCode:claude-sonnet-5 Signed-off-by: OttoDev <f20240223@goa.bits-pilani.ac.in>
1 parent 4134bd0 commit 2e096dd

3 files changed

Lines changed: 23 additions & 5 deletions

File tree

3rdparty

Submodule 3rdparty updated 573 files

apps/dav/lib/CalDAV/Activity/Provider/Event.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ protected function generateObjectParameter(array $eventData, string $affectedUse
7171
$linkData = $eventData['link'];
7272
$calendarUri = $this->urlencodeLowerHex($linkData['calendar_uri']);
7373
if ($affectedUser === $linkData['owner']) {
74-
$objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . $linkData['owner'] . '/' . $calendarUri . '/' . $linkData['object_uri']);
74+
$objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . rawurlencode($linkData['owner']) . '/' . $calendarUri . '/' . $linkData['object_uri']);
7575
} else {
7676
// Can't use the "real" owner and calendar names here because we create a custom
7777
// calendar for incoming shares with the name "<calendar>_shared_by_<sharer>".
7878
// Hack: Fix the link by generating it for the incoming shared calendar instead,
7979
// as seen from the affected user.
80-
$objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . $affectedUser . '/' . $calendarUri . '_shared_by_' . $linkData['owner'] . '/' . $linkData['object_uri']);
80+
$objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . rawurlencode($affectedUser) . '/' . $calendarUri . '_shared_by_' . rawurlencode($linkData['owner']) . '/' . $linkData['object_uri']);
8181
}
8282
$params['link'] = $this->url->linkToRouteAbsolute('calendar.view.indexdirect.edit', [
8383
'objectId' => $objectId,

apps/dav/tests/unit/CalDAV/Activity/Provider/EventTest.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,29 @@ public static function generateObjectParameterLinkEncodingDataProvider(): array
145145
],
146146
base64_encode('/remote.php/dav/calendars/sharee/Umlaut_%c3%a4%c3%bc%c3%b6%c3%9f/someuuid.ics'),
147147
],
148+
[ // Owned calendar, uid contains a space
149+
[
150+
'object_uri' => 'someuuid.ics',
151+
'calendar_uri' => 'personal',
152+
'owner' => 'Elisa Ciria'
153+
],
154+
base64_encode('/remote.php/dav/calendars/Elisa%20Ciria/personal/someuuid.ics'),
155+
'Elisa Ciria',
156+
],
157+
[ // Shared calendar, owner and affected user uids both contain a space
158+
[
159+
'object_uri' => 'someuuid.ics',
160+
'calendar_uri' => 'personal',
161+
'owner' => 'Elisa Ciria'
162+
],
163+
base64_encode('/remote.php/dav/calendars/John%20Doe/personal_shared_by_Elisa%20Ciria/someuuid.ics'),
164+
'John Doe',
165+
],
148166
];
149167
}
150168

151169
#[\PHPUnit\Framework\Attributes\DataProvider('generateObjectParameterLinkEncodingDataProvider')]
152-
public function testGenerateObjectParameterLinkEncoding(array $link, string $objectId): void {
170+
public function testGenerateObjectParameterLinkEncoding(array $link, string $objectId, string $affectedUser = 'sharee'): void {
153171
$generatedLink = [
154172
'objectId' => $objectId,
155173
];
@@ -170,7 +188,7 @@ public function testGenerateObjectParameterLinkEncoding(array $link, string $obj
170188
'name' => 'calendar',
171189
'link' => 'fullLink',
172190
];
173-
$this->assertEquals($result, $this->invokePrivate($this->provider, 'generateObjectParameter', [$objectParameter, 'sharee']));
191+
$this->assertEquals($result, $this->invokePrivate($this->provider, 'generateObjectParameter', [$objectParameter, $affectedUser]));
174192
}
175193

176194
public static function dataGenerateObjectParameterThrows(): array {

0 commit comments

Comments
 (0)