Skip to content

Commit 2e9dfc5

Browse files
committed
fix(imip): dont propagate attendee changes in reply message
Signed-off-by: Hamza Mahjoubi <hamzamahjoubi221@gmail.com>
1 parent 28a2965 commit 2e9dfc5

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

apps/dav/lib/CalDAV/CalDavBackend.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3628,4 +3628,21 @@ protected function purgeObjectInvitations(string $eventId): void {
36283628
->where($cmd->expr()->eq('uid', $cmd->createNamedParameter($eventId, IQueryBuilder::PARAM_STR), IQueryBuilder::PARAM_STR));
36293629
$cmd->executeStatement();
36303630
}
3631+
3632+
public function findEventDataByUri(string $uid, string $organizerUri): ?array {
3633+
$principalUri = $this->principalBackend->findByUri($organizerUri, 'principals/users');
3634+
$query = $this->db->getQueryBuilder();
3635+
$query->select('co.*')
3636+
->from('calendarobjects', 'co')
3637+
->join('co', 'calendars', 'c', $query->expr()->eq('co.calendarid', 'c.id'))
3638+
->where($query->expr()->eq('co.uid', $query->createNamedParameter($uid)))
3639+
->andWhere($query->expr()->eq('c.principaluri', $query->createNamedParameter($principalUri)));
3640+
$stmt = $query->executeQuery();
3641+
$row = $stmt->fetch();
3642+
$stmt->closeCursor();
3643+
if (!$row) {
3644+
return null;
3645+
}
3646+
return $this->rowToCalendarObject($row);
3647+
}
36313648
}

apps/dav/lib/CalDAV/Schedule/IMipPlugin.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ public function schedule(Message $iTipMessage) {
185185
switch (strtolower($iTipMessage->method)) {
186186
case self::METHOD_REPLY:
187187
$method = self::METHOD_REPLY;
188-
$data = $this->imipService->buildBodyData($vEvent, $oldVevent);
188+
$organizerEvent = $this->imipService->getOrganizerVEvent($vEvent->uid, $iTipMessage->recipient);
189+
$data = $this->imipService->buildReplyBodyData($organizerEvent);
189190
$replyingAttendee = $this->imipService->getReplyingAttendee($iTipMessage);
190191
break;
191192
case self::METHOD_CANCEL:

apps/dav/lib/CalDAV/Schedule/IMipService.php

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
namespace OCA\DAV\CalDAV\Schedule;
1010

1111
use OC\URLGenerator;
12+
use OCA\DAV\CalDAV\CaldavBackend;
1213
use OCA\DAV\CalDAV\EventReader;
1314
use OCP\AppFramework\Utility\ITimeFactory;
1415
use OCP\IConfig;
@@ -23,6 +24,7 @@
2324
use Sabre\VObject\ITip\Message;
2425
use Sabre\VObject\Parameter;
2526
use Sabre\VObject\Property;
27+
use Sabre\VObject\Reader;
2628
use Sabre\VObject\Recur\EventIterator;
2729

2830
class IMipService {
@@ -44,6 +46,7 @@ public function __construct(
4446
private ISecureRandom $random,
4547
private L10NFactory $l10nFactory,
4648
private ITimeFactory $timeFactory,
49+
private CaldavBackend $caldavBackend,
4750
) {
4851
$language = $this->l10nFactory->findGenericLanguage();
4952
$locale = $this->l10nFactory->findLocale($language);
@@ -159,7 +162,35 @@ public function buildBodyData(VEvent $vEvent, ?VEvent $oldVEvent): array {
159162
if ($eventReaderCurrent->recurs()) {
160163
$data['meeting_occurring'] = $this->generateOccurringString($eventReaderCurrent);
161164
}
162-
165+
return $data;
166+
}
167+
168+
/**
169+
* @param VEvent $vEvent
170+
* @return array
171+
*/
172+
public function buildReplyBodyData(VEvent $vEvent): array {
173+
// construct event reader
174+
$eventReader = new EventReader($vEvent);
175+
$defaultVal = '';
176+
$data = [];
177+
$data['meeting_when'] = $this->generateWhenString($eventReader);
178+
179+
foreach (self::STRING_DIFF as $key => $property) {
180+
$data[$key] = self::readPropertyWithDefault($vEvent, $property, $defaultVal);
181+
}
182+
183+
if (($locationHtml = $this->linkify($data['meeting_location'])) !== null) {
184+
$data['meeting_location_html'] = $locationHtml;
185+
}
186+
187+
$data['meeting_url_html'] = $data['meeting_url'] ? sprintf('<a href="%1$s">%1$s</a>', $data['meeting_url']) : '';
188+
189+
// generate occurring next string
190+
if ($eventReader->recurs()) {
191+
$data['meeting_occurring'] = $this->generateOccurringString($eventReader);
192+
}
193+
163194
return $data;
164195
}
165196

@@ -1142,6 +1173,11 @@ public function getReplyingAttendee(Message $iTipMessage): ?Property {
11421173
return null;
11431174
}
11441175

1176+
public function getOrganizerVEvent(string $uid, string $organizerUri): VEvent {
1177+
$organizerEvent = $this->caldavBackend->findEventDataByUri($uid, $organizerUri);
1178+
return Reader::read($organizerEvent['calendardata'])->VEVENT ;
1179+
}
1180+
11451181
public function isRoomOrResource(Property $attendee): bool {
11461182
$cuType = $attendee->offsetGet('CUTYPE');
11471183
if (!$cuType instanceof Parameter) {

0 commit comments

Comments
 (0)