diff --git a/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php
index 6ac8bf28877c2..611bd4953a101 100644
--- a/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php
+++ b/apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php
@@ -144,19 +144,31 @@ private function addBulletList(IEMailTemplate $template,
IL10N $l10n,
string $calendarDisplayName,
VEvent $vevent):void {
- $template->addBodyListItem($calendarDisplayName, $l10n->t('Calendar:'),
- $this->getAbsoluteImagePath('actions/info.png'));
+ $template->addBodyListItem(
+ htmlspecialchars($calendarDisplayName),
+ $l10n->t('Calendar:'),
+ $this->getAbsoluteImagePath('actions/info.png'),
+ htmlspecialchars($calendarDisplayName),
+ );
$template->addBodyListItem($this->generateDateString($l10n, $vevent), $l10n->t('Date:'),
$this->getAbsoluteImagePath('places/calendar.png'));
if (isset($vevent->LOCATION)) {
- $template->addBodyListItem((string)$vevent->LOCATION, $l10n->t('Where:'),
- $this->getAbsoluteImagePath('actions/address.png'));
+ $template->addBodyListItem(
+ htmlspecialchars((string)$vevent->LOCATION),
+ $l10n->t('Where:'),
+ $this->getAbsoluteImagePath('actions/address.png'),
+ htmlspecialchars((string)$vevent->LOCATION),
+ );
}
if (isset($vevent->DESCRIPTION)) {
- $template->addBodyListItem((string)$vevent->DESCRIPTION, $l10n->t('Description:'),
- $this->getAbsoluteImagePath('actions/more.png'));
+ $template->addBodyListItem(
+ htmlspecialchars((string)$vevent->DESCRIPTION),
+ $l10n->t('Description:'),
+ $this->getAbsoluteImagePath('actions/more.png'),
+ htmlspecialchars((string)$vevent->DESCRIPTION),
+ );
}
}
diff --git a/apps/dav/lib/CalDAV/Schedule/IMipService.php b/apps/dav/lib/CalDAV/Schedule/IMipService.php
index 9fe0e0b9a80ea..7b75cda699752 100644
--- a/apps/dav/lib/CalDAV/Schedule/IMipService.php
+++ b/apps/dav/lib/CalDAV/Schedule/IMipService.php
@@ -25,6 +25,7 @@
use Sabre\VObject\Parameter;
use Sabre\VObject\Property;
use Sabre\VObject\Recur\EventIterator;
+use function htmlspecialchars;
class IMipService {
@@ -80,10 +81,11 @@ private function generateDiffString(VEvent $vevent, VEvent $oldVEvent, string $p
if (!isset($vevent->$property)) {
return $default;
}
- $newstring = $vevent->$property->getValue();
+ $value = $vevent->$property->getValue();
+ $newstring = $value === null ? null : htmlspecialchars($value);
if (isset($oldVEvent->$property) && $oldVEvent->$property->getValue() !== $newstring) {
$oldstring = $oldVEvent->$property->getValue();
- return sprintf($strikethrough, $oldstring, $newstring);
+ return sprintf($strikethrough, htmlspecialchars($oldstring), $newstring);
}
return $newstring;
}
@@ -96,8 +98,8 @@ private function generateLinkifiedDiffString(VEvent $vevent, VEvent $oldVEvent,
return $default;
}
/** @var string|null $newString */
- $newString = $vevent->$property->getValue();
- $oldString = isset($oldVEvent->$property) ? $oldVEvent->$property->getValue() : null;
+ $newString = htmlspecialchars($vevent->$property->getValue());
+ $oldString = isset($oldVEvent->$property) ? htmlspecialchars($oldVEvent->$property->getValue()) : null;
if ($oldString !== $newString) {
return sprintf(
"%s
%s",
@@ -797,10 +799,10 @@ public function buildCancelledBodyData(VEvent $vEvent): array {
$strikethrough = "%s";
$newMeetingWhen = $this->generateWhenString($eventReaderCurrent);
- $newSummary = isset($vEvent->SUMMARY) && (string)$vEvent->SUMMARY !== '' ? (string)$vEvent->SUMMARY : $this->l10n->t('Untitled event');
- $newDescription = isset($vEvent->DESCRIPTION) && (string)$vEvent->DESCRIPTION !== '' ? (string)$vEvent->DESCRIPTION : $defaultVal;
+ $newSummary = htmlspecialchars(isset($vEvent->SUMMARY) && (string)$vEvent->SUMMARY !== '' ? (string)$vEvent->SUMMARY : $this->l10n->t('Untitled event'));
+ $newDescription = htmlspecialchars(isset($vEvent->DESCRIPTION) && (string)$vEvent->DESCRIPTION !== '' ? (string)$vEvent->DESCRIPTION : $defaultVal);
$newUrl = isset($vEvent->URL) && (string)$vEvent->URL !== '' ? sprintf('%1$s', $vEvent->URL) : $defaultVal;
- $newLocation = isset($vEvent->LOCATION) && (string)$vEvent->LOCATION !== '' ? (string)$vEvent->LOCATION : $defaultVal;
+ $newLocation = htmlspecialchars(isset($vEvent->LOCATION) && (string)$vEvent->LOCATION !== '' ? (string)$vEvent->LOCATION : $defaultVal);
$newLocationHtml = $this->linkify($newLocation) ?? $newLocation;
$data = [];
@@ -1067,22 +1069,22 @@ public function addAttendees(IEMailTemplate $template, VEvent $vevent) {
*/
public function addBulletList(IEMailTemplate $template, VEvent $vevent, $data) {
$template->addBodyListItem(
- $data['meeting_title_html'] ?? $data['meeting_title'], $this->l10n->t('Title:'),
+ $data['meeting_title_html'] ?? htmlspecialchars($data['meeting_title']), $this->l10n->t('Title:'),
$this->getAbsoluteImagePath('caldav/title.png'), $data['meeting_title'], '', IMipPlugin::IMIP_INDENT);
if ($data['meeting_when'] !== '') {
- $template->addBodyListItem($data['meeting_when_html'] ?? $data['meeting_when'], $this->l10n->t('When:'),
+ $template->addBodyListItem($data['meeting_when_html'] ?? htmlspecialchars($data['meeting_when']), $this->l10n->t('When:'),
$this->getAbsoluteImagePath('caldav/time.png'), $data['meeting_when'], '', IMipPlugin::IMIP_INDENT);
}
if ($data['meeting_location'] !== '') {
- $template->addBodyListItem($data['meeting_location_html'] ?? $data['meeting_location'], $this->l10n->t('Location:'),
+ $template->addBodyListItem($data['meeting_location_html'] ?? htmlspecialchars($data['meeting_location']), $this->l10n->t('Location:'),
$this->getAbsoluteImagePath('caldav/location.png'), $data['meeting_location'], '', IMipPlugin::IMIP_INDENT);
}
if ($data['meeting_url'] !== '') {
- $template->addBodyListItem($data['meeting_url_html'] ?? $data['meeting_url'], $this->l10n->t('Link:'),
+ $template->addBodyListItem($data['meeting_url_html'] ?? htmlspecialchars($data['meeting_url']), $this->l10n->t('Link:'),
$this->getAbsoluteImagePath('caldav/link.png'), $data['meeting_url'], '', IMipPlugin::IMIP_INDENT);
}
if (isset($data['meeting_occurring'])) {
- $template->addBodyListItem($data['meeting_occurring_html'] ?? $data['meeting_occurring'], $this->l10n->t('Occurring:'),
+ $template->addBodyListItem($data['meeting_occurring_html'] ?? htmlspecialchars($data['meeting_occurring']), $this->l10n->t('Occurring:'),
$this->getAbsoluteImagePath('caldav/time.png'), $data['meeting_occurring'], '', IMipPlugin::IMIP_INDENT);
}
@@ -1090,7 +1092,7 @@ public function addBulletList(IEMailTemplate $template, VEvent $vevent, $data) {
/* Put description last, like an email body, since it can be arbitrarily long */
if ($data['meeting_description']) {
- $template->addBodyListItem($data['meeting_description_html'] ?? $data['meeting_description'], $this->l10n->t('Description:'),
+ $template->addBodyListItem($data['meeting_description_html'] ?? htmlspecialchars($data['meeting_description']), $this->l10n->t('Description:'),
$this->getAbsoluteImagePath('caldav/description.png'), $data['meeting_description'], '', IMipPlugin::IMIP_INDENT);
}
}