Przeglądaj źródła

Merge pull request #40077 from nextcloud/bugfix/noid/purge-displayname-cache-on-delete

fix(cache): Remove displayname cache entry on delete
Joas Schilling 8 miesięcy temu
rodzic
commit
fec5ede099

+ 4 - 0
apps/files_sharing/lib/AppInfo/Application.php

@@ -65,12 +65,14 @@ use OCP\Files\Events\BeforeDirectFileDownloadEvent;
 use OCP\Files\Events\BeforeZipCreatedEvent;
 use OCP\Files\IRootFolder;
 use OCP\Group\Events\GroupChangedEvent;
+use OCP\Group\Events\GroupDeletedEvent;
 use OCP\Group\Events\UserAddedEvent;
 use OCP\IDBConnection;
 use OCP\IGroup;
 use OCP\IUserSession;
 use OCP\Share\Events\ShareCreatedEvent;
 use OCP\User\Events\UserChangedEvent;
+use OCP\User\Events\UserDeletedEvent;
 use OCP\Util;
 use Psr\Container\ContainerInterface;
 use Symfony\Component\EventDispatcher\GenericEvent as OldGenericEvent;
@@ -104,7 +106,9 @@ class Application extends App implements IBootstrap {
 
 		$context->registerNotifierService(Notifier::class);
 		$context->registerEventListener(UserChangedEvent::class, DisplayNameCache::class);
+		$context->registerEventListener(UserDeletedEvent::class, DisplayNameCache::class);
 		$context->registerEventListener(GroupChangedEvent::class, GroupDisplayNameCache::class);
+		$context->registerEventListener(GroupDeletedEvent::class, GroupDisplayNameCache::class);
 	}
 
 	public function boot(IBootContext $context): void {

+ 6 - 0
lib/private/Group/DisplayNameCache.php

@@ -29,6 +29,7 @@ use OCP\Cache\CappedMemoryCache;
 use OCP\EventDispatcher\Event;
 use OCP\EventDispatcher\IEventListener;
 use OCP\Group\Events\GroupChangedEvent;
+use OCP\Group\Events\GroupDeletedEvent;
 use OCP\ICache;
 use OCP\ICacheFactory;
 use OCP\IGroupManager;
@@ -83,5 +84,10 @@ class DisplayNameCache implements IEventListener {
 			$this->cache[$groupId] = $newDisplayName;
 			$this->memCache->set($groupId, $newDisplayName, 60 * 10); // 10 minutes
 		}
+		if ($event instanceof GroupDeletedEvent) {
+			$groupId = $event->getGroup()->getGID();
+			unset($this->cache[$groupId]);
+			$this->memCache->remove($groupId);
+		}
 	}
 }

+ 6 - 0
lib/private/User/DisplayNameCache.php

@@ -29,6 +29,7 @@ use OCP\ICache;
 use OCP\ICacheFactory;
 use OCP\IUserManager;
 use OCP\User\Events\UserChangedEvent;
+use OCP\User\Events\UserDeletedEvent;
 
 /**
  * Class that cache the relation UserId -> Display name
@@ -81,5 +82,10 @@ class DisplayNameCache implements IEventListener {
 			$this->cache[$userId] = $newDisplayName;
 			$this->memCache->set($userId, $newDisplayName, 60 * 10); // 10 minutes
 		}
+		if ($event instanceof UserDeletedEvent) {
+			$userId = $event->getUser()->getUID();
+			unset($this->cache[$userId]);
+			$this->memCache->remove($userId);
+		}
 	}
 }