From 938e8d3a46aa46f3067eed7f55ab6a91568ae295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Mon, 1 Dec 2025 12:23:52 +0100 Subject: [PATCH] feat(admin_audit): Log cache insert/delete to audit log MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit That allows to see files added/removed by a filesystem scan for instance. Signed-off-by: Côme Chilliet --- .../composer/composer/autoload_classmap.php | 1 + .../composer/composer/autoload_static.php | 5 +- apps/admin_audit/lib/AppInfo/Application.php | 7 +++ .../lib/Listener/CacheEventListener.php | 51 +++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 apps/admin_audit/lib/Listener/CacheEventListener.php diff --git a/apps/admin_audit/composer/composer/autoload_classmap.php b/apps/admin_audit/composer/composer/autoload_classmap.php index b67d90e7689..d5643b0d543 100644 --- a/apps/admin_audit/composer/composer/autoload_classmap.php +++ b/apps/admin_audit/composer/composer/autoload_classmap.php @@ -19,6 +19,7 @@ return array( 'OCA\\AdminAudit\\IAuditLogger' => $baseDir . '/../lib/IAuditLogger.php', 'OCA\\AdminAudit\\Listener\\AppManagementEventListener' => $baseDir . '/../lib/Listener/AppManagementEventListener.php', 'OCA\\AdminAudit\\Listener\\AuthEventListener' => $baseDir . '/../lib/Listener/AuthEventListener.php', + 'OCA\\AdminAudit\\Listener\\CacheEventListener' => $baseDir . '/../lib/Listener/CacheEventListener.php', 'OCA\\AdminAudit\\Listener\\ConsoleEventListener' => $baseDir . '/../lib/Listener/ConsoleEventListener.php', 'OCA\\AdminAudit\\Listener\\CriticalActionPerformedEventListener' => $baseDir . '/../lib/Listener/CriticalActionPerformedEventListener.php', 'OCA\\AdminAudit\\Listener\\FileEventListener' => $baseDir . '/../lib/Listener/FileEventListener.php', diff --git a/apps/admin_audit/composer/composer/autoload_static.php b/apps/admin_audit/composer/composer/autoload_static.php index f8fd457edd8..70affe657e7 100644 --- a/apps/admin_audit/composer/composer/autoload_static.php +++ b/apps/admin_audit/composer/composer/autoload_static.php @@ -7,14 +7,14 @@ namespace Composer\Autoload; class ComposerStaticInitAdminAudit { public static $prefixLengthsPsr4 = array ( - 'O' => + 'O' => array ( 'OCA\\AdminAudit\\' => 15, ), ); public static $prefixDirsPsr4 = array ( - 'OCA\\AdminAudit\\' => + 'OCA\\AdminAudit\\' => array ( 0 => __DIR__ . '/..' . '/../lib', ), @@ -34,6 +34,7 @@ class ComposerStaticInitAdminAudit 'OCA\\AdminAudit\\IAuditLogger' => __DIR__ . '/..' . '/../lib/IAuditLogger.php', 'OCA\\AdminAudit\\Listener\\AppManagementEventListener' => __DIR__ . '/..' . '/../lib/Listener/AppManagementEventListener.php', 'OCA\\AdminAudit\\Listener\\AuthEventListener' => __DIR__ . '/..' . '/../lib/Listener/AuthEventListener.php', + 'OCA\\AdminAudit\\Listener\\CacheEventListener' => __DIR__ . '/..' . '/../lib/Listener/CacheEventListener.php', 'OCA\\AdminAudit\\Listener\\ConsoleEventListener' => __DIR__ . '/..' . '/../lib/Listener/ConsoleEventListener.php', 'OCA\\AdminAudit\\Listener\\CriticalActionPerformedEventListener' => __DIR__ . '/..' . '/../lib/Listener/CriticalActionPerformedEventListener.php', 'OCA\\AdminAudit\\Listener\\FileEventListener' => __DIR__ . '/..' . '/../lib/Listener/FileEventListener.php', diff --git a/apps/admin_audit/lib/AppInfo/Application.php b/apps/admin_audit/lib/AppInfo/Application.php index 63a1d065bc8..077cc4c47ad 100644 --- a/apps/admin_audit/lib/AppInfo/Application.php +++ b/apps/admin_audit/lib/AppInfo/Application.php @@ -20,6 +20,7 @@ use OCA\AdminAudit\AuditLogger; use OCA\AdminAudit\IAuditLogger; use OCA\AdminAudit\Listener\AppManagementEventListener; use OCA\AdminAudit\Listener\AuthEventListener; +use OCA\AdminAudit\Listener\CacheEventListener; use OCA\AdminAudit\Listener\ConsoleEventListener; use OCA\AdminAudit\Listener\CriticalActionPerformedEventListener; use OCA\AdminAudit\Listener\FileEventListener; @@ -40,6 +41,8 @@ use OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengeFailed; use OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengePassed; use OCP\Console\ConsoleEvent; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files\Cache\CacheEntryInsertedEvent; +use OCP\Files\Cache\CacheEntryRemovedEvent; use OCP\Files\Events\Node\BeforeNodeDeletedEvent; use OCP\Files\Events\Node\BeforeNodeReadEvent; use OCP\Files\Events\Node\NodeCopiedEvent; @@ -123,6 +126,10 @@ class Application extends App implements IBootstrap { // Console events $context->registerEventListener(ConsoleEvent::class, ConsoleEventListener::class); + + // Cache events + $context->registerEventListener(CacheEntryInsertedEvent::class, CacheEventListener::class); + $context->registerEventListener(CacheEntryRemovedEvent::class, CacheEventListener::class); } public function boot(IBootContext $context): void { diff --git a/apps/admin_audit/lib/Listener/CacheEventListener.php b/apps/admin_audit/lib/Listener/CacheEventListener.php new file mode 100644 index 00000000000..63d7017b3c0 --- /dev/null +++ b/apps/admin_audit/lib/Listener/CacheEventListener.php @@ -0,0 +1,51 @@ + + */ +class CacheEventListener extends Action implements IEventListener { + public function handle(Event $event): void { + if ($event instanceof CacheEntryInsertedEvent) { + $this->entryInserted($event); + } elseif ($event instanceof CacheEntryRemovedEvent) { + $this->entryRemoved($event); + } + } + + private function entryInserted(CacheEntryInsertedEvent $event): void { + $this->log('Cache entry inserted for fileid "%1$d", path "%2$s" on storageid "%3$d"', + [ + 'fileid' => $event->getFileId(), + 'path' => $event->getPath(), + 'storageid' => $event->getStorageId(), + ], + ['fileid', 'path', 'storageid'] + ); + } + + private function entryRemoved(CacheEntryRemovedEvent $event): void { + $this->log('Cache entry removed for fileid "%1$d", path "%2$s" on storageid "%3$d"', + [ + 'fileid' => $event->getFileId(), + 'path' => $event->getPath(), + 'storageid' => $event->getStorageId(), + ], + ['fileid', 'path', 'storageid'] + ); + } +}