aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2024-03-21 19:49:33 +0100
committerChristoph Wurst <christoph@winzerhof-wurst.at>2024-03-21 19:49:33 +0100
commit26138f018633b41c0b3a2a15ad2198d796db760c (patch)
tree235ff19c29c6eb38f123128e97c74d49d8cd9c25
parenta35edaa1b13f60b3fb28f61e9d36b562e0b26024 (diff)
downloadnextcloud-server-feat/dav/calendar-object-admin-audit-log.tar.gz
nextcloud-server-feat/dav/calendar-object-admin-audit-log.zip
feat(dav): Track calendar object changes in admin audit logfeat/dav/calendar-object-admin-audit-log
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
-rw-r--r--apps/dav/composer/composer/autoload_classmap.php1
-rw-r--r--apps/dav/composer/composer/autoload_static.php1
-rw-r--r--apps/dav/lib/AppInfo/Application.php6
-rw-r--r--apps/dav/lib/Listener/AdminAuditListener.php115
4 files changed, 123 insertions, 0 deletions
diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php
index d10cf4af867..548bb53df63 100644
--- a/apps/dav/composer/composer/autoload_classmap.php
+++ b/apps/dav/composer/composer/autoload_classmap.php
@@ -268,6 +268,7 @@ return array(
'OCA\\DAV\\HookManager' => $baseDir . '/../lib/HookManager.php',
'OCA\\DAV\\Listener\\ActivityUpdaterListener' => $baseDir . '/../lib/Listener/ActivityUpdaterListener.php',
'OCA\\DAV\\Listener\\AddressbookListener' => $baseDir . '/../lib/Listener/AddressbookListener.php',
+ 'OCA\\DAV\\Listener\\AdminAuditListener' => $baseDir . '/../lib/Listener/AdminAuditListener.php',
'OCA\\DAV\\Listener\\BirthdayListener' => $baseDir . '/../lib/Listener/BirthdayListener.php',
'OCA\\DAV\\Listener\\CalendarContactInteractionListener' => $baseDir . '/../lib/Listener/CalendarContactInteractionListener.php',
'OCA\\DAV\\Listener\\CalendarDeletionDefaultUpdaterListener' => $baseDir . '/../lib/Listener/CalendarDeletionDefaultUpdaterListener.php',
diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php
index c8455965480..e64ccfe991e 100644
--- a/apps/dav/composer/composer/autoload_static.php
+++ b/apps/dav/composer/composer/autoload_static.php
@@ -283,6 +283,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\HookManager' => __DIR__ . '/..' . '/../lib/HookManager.php',
'OCA\\DAV\\Listener\\ActivityUpdaterListener' => __DIR__ . '/..' . '/../lib/Listener/ActivityUpdaterListener.php',
'OCA\\DAV\\Listener\\AddressbookListener' => __DIR__ . '/..' . '/../lib/Listener/AddressbookListener.php',
+ 'OCA\\DAV\\Listener\\AdminAuditListener' => __DIR__ . '/..' . '/../lib/Listener/AdminAuditListener.php',
'OCA\\DAV\\Listener\\BirthdayListener' => __DIR__ . '/..' . '/../lib/Listener/BirthdayListener.php',
'OCA\\DAV\\Listener\\CalendarContactInteractionListener' => __DIR__ . '/..' . '/../lib/Listener/CalendarContactInteractionListener.php',
'OCA\\DAV\\Listener\\CalendarDeletionDefaultUpdaterListener' => __DIR__ . '/..' . '/../lib/Listener/CalendarDeletionDefaultUpdaterListener.php',
diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php
index deb28797952..441032c79c3 100644
--- a/apps/dav/lib/AppInfo/Application.php
+++ b/apps/dav/lib/AppInfo/Application.php
@@ -72,6 +72,7 @@ use OCA\DAV\Events\SubscriptionDeletedEvent;
use OCA\DAV\HookManager;
use OCA\DAV\Listener\ActivityUpdaterListener;
use OCA\DAV\Listener\AddressbookListener;
+use OCA\DAV\Listener\AdminAuditListener;
use OCA\DAV\Listener\BirthdayListener;
use OCA\DAV\Listener\CalendarContactInteractionListener;
use OCA\DAV\Listener\CalendarDeletionDefaultUpdaterListener;
@@ -153,6 +154,7 @@ class Application extends App implements IBootstrap {
*/
$context->registerEventListener(CalendarCreatedEvent::class, ActivityUpdaterListener::class);
$context->registerEventListener(CalendarDeletedEvent::class, ActivityUpdaterListener::class);
+ $context->registerEventListener(CalendarDeletedEvent::class, AdminAuditListener::class);
$context->registerEventListener(CalendarDeletedEvent::class, CalendarObjectReminderUpdaterListener::class);
$context->registerEventListener(CalendarDeletedEvent::class, CalendarDeletionDefaultUpdaterListener::class);
$context->registerEventListener(CalendarMovedToTrashEvent::class, ActivityUpdaterListener::class);
@@ -161,16 +163,20 @@ class Application extends App implements IBootstrap {
$context->registerEventListener(CalendarRestoredEvent::class, ActivityUpdaterListener::class);
$context->registerEventListener(CalendarRestoredEvent::class, CalendarObjectReminderUpdaterListener::class);
$context->registerEventListener(CalendarObjectCreatedEvent::class, ActivityUpdaterListener::class);
+ $context->registerEventListener(CalendarObjectCreatedEvent::class, AdminAuditListener::class);
$context->registerEventListener(CalendarObjectCreatedEvent::class, CalendarContactInteractionListener::class);
$context->registerEventListener(CalendarObjectCreatedEvent::class, CalendarObjectReminderUpdaterListener::class);
$context->registerEventListener(CalendarObjectUpdatedEvent::class, ActivityUpdaterListener::class);
+ $context->registerEventListener(CalendarObjectUpdatedEvent::class, AdminAuditListener::class);
$context->registerEventListener(CalendarObjectUpdatedEvent::class, CalendarContactInteractionListener::class);
$context->registerEventListener(CalendarObjectUpdatedEvent::class, CalendarObjectReminderUpdaterListener::class);
$context->registerEventListener(CalendarObjectDeletedEvent::class, ActivityUpdaterListener::class);
$context->registerEventListener(CalendarObjectDeletedEvent::class, CalendarObjectReminderUpdaterListener::class);
$context->registerEventListener(CalendarObjectMovedEvent::class, ActivityUpdaterListener::class);
+ $context->registerEventListener(CalendarObjectMovedEvent::class, AdminAuditListener::class);
$context->registerEventListener(CalendarObjectMovedEvent::class, CalendarObjectReminderUpdaterListener::class);
$context->registerEventListener(CalendarObjectMovedToTrashEvent::class, ActivityUpdaterListener::class);
+ $context->registerEventListener(CalendarObjectMovedToTrashEvent::class, AdminAuditListener::class);
$context->registerEventListener(CalendarObjectMovedToTrashEvent::class, CalendarObjectReminderUpdaterListener::class);
$context->registerEventListener(CalendarObjectRestoredEvent::class, ActivityUpdaterListener::class);
$context->registerEventListener(CalendarObjectRestoredEvent::class, CalendarObjectReminderUpdaterListener::class);
diff --git a/apps/dav/lib/Listener/AdminAuditListener.php b/apps/dav/lib/Listener/AdminAuditListener.php
new file mode 100644
index 00000000000..b5cdc997290
--- /dev/null
+++ b/apps/dav/lib/Listener/AdminAuditListener.php
@@ -0,0 +1,115 @@
+<?php
+
+declare(strict_types=1);
+
+/*
+ * @copyright 2024 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2024 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OCA\DAV\Listener;
+
+use OCA\DAV\Events\CalendarObjectCreatedEvent;
+use OCA\DAV\Events\CalendarObjectDeletedEvent;
+use OCA\DAV\Events\CalendarObjectMovedEvent;
+use OCA\DAV\Events\CalendarObjectMovedToTrashEvent;
+use OCA\DAV\Events\CalendarObjectUpdatedEvent;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventDispatcher;
+use OCP\EventDispatcher\IEventListener;
+use OCP\Log\Audit\CriticalActionPerformedEvent;
+
+/**
+ * @template-extends IEventListener<CalendarObjectCreatedEvent|CalendarObjectUpdatedEvent|CalendarObjectMovedEvent|CalendarObjectDeletedEvent|Event>
+ */
+class AdminAuditListener implements IEventListener {
+
+ private IEventDispatcher $eventDispatcher;
+
+ public function __construct(IEventDispatcher $eventDispatcher) {
+ $this->eventDispatcher = $eventDispatcher;
+ }
+
+ public function handle(Event $event): void {
+ if ($event instanceof CalendarObjectCreatedEvent) {
+ $this->eventDispatcher->dispatchTyped(
+ new CriticalActionPerformedEvent(
+ 'Calendar event %s created in calendar %s of principal %s',
+ [
+ $event->getObjectData()['uri'] ?? '?',
+ $event->getCalendarData()['uri'] ?? '?',
+ $event->getCalendarData()['principaluri'] ?? '?',
+ ],
+ )
+ );
+ }
+ if ($event instanceof CalendarObjectUpdatedEvent) {
+ $this->eventDispatcher->dispatchTyped(
+ new CriticalActionPerformedEvent(
+ 'Calendar event %s in calendar %s of principal %s updated',
+ [
+ $event->getObjectData()['uri'] ?? '?',
+ $event->getCalendarData()['uri'] ?? '?',
+ $event->getCalendarData()['principaluri'] ?? '?',
+ ],
+ )
+ );
+ }
+ if ($event instanceof CalendarObjectMovedEvent) {
+ $this->eventDispatcher->dispatchTyped(
+ new CriticalActionPerformedEvent(
+ 'Calendar event %s moved from calendar %s of principal %s updated to calendar %s of principal %s',
+ [
+ $event->getObjectData()['uri'] ?? '?',
+ $event->getSourceCalendarData()['uri'] ?? '?',
+ $event->getSourceCalendarData()['principaluri'] ?? '?',
+ $event->getTargetCalendarData()['uri'] ?? '?',
+ $event->getTargetCalendarData()['principaluri'] ?? '?',
+ ],
+ )
+ );
+ }
+ if ($event instanceof CalendarObjectMovedToTrashEvent) {
+ $this->eventDispatcher->dispatchTyped(
+ new CriticalActionPerformedEvent(
+ 'Calendar event %s in calendar %s of principal %s moved to trash',
+ [
+ $event->getObjectData()['uri'] ?? '?',
+ $event->getCalendarData()['uri'] ?? '?',
+ $event->getCalendarData()['principaluri'] ?? '?',
+ ],
+ )
+ );
+ }
+ if ($event instanceof CalendarObjectDeletedEvent) {
+ $this->eventDispatcher->dispatchTyped(
+ new CriticalActionPerformedEvent(
+ 'Calendar event %s moved from calendar %s of principal %s updated to calendar %s of principal %s',
+ [
+ $event->getObjectData()['uri'] ?? '?',
+ $event->getSourceCalendarData()['uri'] ?? '?',
+ $event->getSourceCalendarData()['principaluri'] ?? '?',
+ $event->getTargetCalendarData()['uri'] ?? '?',
+ $event->getTargetCalendarData()['principaluri'] ?? '?',
+ ],
+ )
+ );
+ }
+ }
+}