diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2024-03-21 19:49:33 +0100 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2024-03-21 19:49:33 +0100 |
commit | 26138f018633b41c0b3a2a15ad2198d796db760c (patch) | |
tree | 235ff19c29c6eb38f123128e97c74d49d8cd9c25 | |
parent | a35edaa1b13f60b3fb28f61e9d36b562e0b26024 (diff) | |
download | nextcloud-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.php | 1 | ||||
-rw-r--r-- | apps/dav/composer/composer/autoload_static.php | 1 | ||||
-rw-r--r-- | apps/dav/lib/AppInfo/Application.php | 6 | ||||
-rw-r--r-- | apps/dav/lib/Listener/AdminAuditListener.php | 115 |
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'] ?? '?', + ], + ) + ); + } + } +} |