Skip to content

Commit 5d3637d

Browse files
Merge pull request #62063 from nextcloud/fix/caldav-activity-uid-space-encoding2
fix(caldav): url-encode owner/user in activity event links
2 parents bc38796 + cd73b6c commit 5d3637d

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,13 @@ protected function generateObjectParameter(array $eventData, string $affectedUse
7272
$linkData = $eventData['link'];
7373
$calendarUri = $this->urlencodeLowerHex($linkData['calendar_uri']);
7474
if ($affectedUser === $linkData['owner']) {
75-
$objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . $linkData['owner'] . '/' . $calendarUri . '/' . $linkData['object_uri']);
75+
$objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . rawurlencode($linkData['owner']) . '/' . $calendarUri . '/' . $linkData['object_uri']);
7676
} else {
7777
// Can't use the "real" owner and calendar names here because we create a custom
7878
// calendar for incoming shares with the name "<calendar>_shared_by_<sharer>".
7979
// Hack: Fix the link by generating it for the incoming shared calendar instead,
8080
// as seen from the affected user.
81-
$objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . $affectedUser . '/' . $calendarUri . '_shared_by_' . $linkData['owner'] . '/' . $linkData['object_uri']);
81+
$objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . rawurlencode($affectedUser) . '/' . $calendarUri . '_shared_by_' . rawurlencode($linkData['owner']) . '/' . $linkData['object_uri']);
8282
}
8383
$params['link'] = $this->url->linkToRouteAbsolute('calendar.view.indexdirect.edit', [
8484
'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
@@ -146,11 +146,29 @@ public static function generateObjectParameterLinkEncodingDataProvider(): array
146146
],
147147
base64_encode('/remote.php/dav/calendars/sharee/Umlaut_%c3%a4%c3%bc%c3%b6%c3%9f/someuuid.ics'),
148148
],
149+
[ // Owned calendar, uid contains a space
150+
[
151+
'object_uri' => 'someuuid.ics',
152+
'calendar_uri' => 'personal',
153+
'owner' => 'Elisa Ciria'
154+
],
155+
base64_encode('/remote.php/dav/calendars/Elisa%20Ciria/personal/someuuid.ics'),
156+
'Elisa Ciria',
157+
],
158+
[ // Shared calendar, owner and affected user uids both contain a space
159+
[
160+
'object_uri' => 'someuuid.ics',
161+
'calendar_uri' => 'personal',
162+
'owner' => 'Elisa Ciria'
163+
],
164+
base64_encode('/remote.php/dav/calendars/John%20Doe/personal_shared_by_Elisa%20Ciria/someuuid.ics'),
165+
'John Doe',
166+
],
149167
];
150168
}
151169

152170
#[\PHPUnit\Framework\Attributes\DataProvider(methodName: 'generateObjectParameterLinkEncodingDataProvider')]
153-
public function testGenerateObjectParameterLinkEncoding(array $link, string $objectId): void {
171+
public function testGenerateObjectParameterLinkEncoding(array $link, string $objectId, string $affectedUser = 'sharee'): void {
154172
$generatedLink = [
155173
'objectId' => $objectId,
156174
];
@@ -171,7 +189,7 @@ public function testGenerateObjectParameterLinkEncoding(array $link, string $obj
171189
'name' => 'calendar',
172190
'link' => 'fullLink',
173191
];
174-
$this->assertEquals($result, $this->invokePrivate($this->provider, 'generateObjectParameter', [$objectParameter, 'sharee']));
192+
$this->assertEquals($result, $this->invokePrivate($this->provider, 'generateObjectParameter', [$objectParameter, $affectedUser]));
175193
}
176194

177195
public static function dataGenerateObjectParameterThrows(): array {

0 commit comments

Comments
 (0)