Details
-
Bug
-
Resolution: Unresolved
-
Minor
-
11.8
-
None
-
Unit
-
Unknown
-
N/A
-
N/A
-
Description
Steps to reproduce
- Create a subwiki
- Log in with a user of the subwiki and view pages rendered asynchronously (so that rendering results associated with right checks for that user are cached)
- Delete the subwiki
Expected
The wiki is deleted without error.
Actual
The wiki is deleted, but an error is logged for each cached right check involving the deleted wiki:
ERROR o.x.s.a.DefaultAuthorizationManager - Failed to load rights for user [subwiki:XWiki.LocalSubWikiUser] on [subwiki:XWiki.LocalSubWikiUser]. org.xwiki.security.authorization.AuthorizationException: Failed to get groups for user or group [subwiki:XWiki.LocalSubWikiUser] in wiki [Wiki subwiki] at org.xwiki.security.internal.DefaultUserBridge.getGroupsReferencesFor(DefaultUserBridge.java:129) ... at org.xwiki.security.authorization.DefaultAuthorizationManager.hasAccess(DefaultAuthorizationManager.java:116) at org.xwiki.rendering.async.internal.AsyncRendererCache.checkRight(AsyncRendererCache.java:301) at org.xwiki.rendering.async.internal.AsyncRendererCache.cleanCacheForRight(AsyncRendererCache.java:295) at org.xwiki.rendering.async.internal.AsyncRendererCacheListener.onEvent(AsyncRendererCacheListener.java:88) at org.xwiki.security.authorization.internal.DefaultSecurityCacheRulesInvalidatorListener.onEvent(DefaultSecurityCacheRulesInvalidatorListener.java:180) at com.xpn.xwiki.XWiki.afterDelete(XWiki.java:4718) ... at org.xwiki.wiki.internal.manager.DefaultWikiDeleter.delete(DefaultWikiDeleter.java:68) at org.xwiki.wiki.internal.manager.DefaultWikiManager.delete(DefaultWikiManager.java:147) at org.xwiki.wiki.script.WikiManagerScriptService.deleteWiki(WikiManagerScriptService.java:222) Caused by: com.xpn.xwiki.XWikiException: Error number 0 in 0: Exception while executing query. Named query = [listGroupsForUser] Caused by: org.xwiki.query.QueryException: Exception while executing query. Named query = [listGroupsForUser] Caused by: com.xpn.xwiki.XWikiException: Error number 2 in 0: No wiki with id [subwiki] could be found
Analysis
DefaultWikiDeleter#delete deletes the wiki descriptor document before the wiki database. Deleting the descriptor triggers a RightUpdatedEvent (DefaultSecurityCacheRulesInvalidatorListener), on which AsyncRendererCacheListener calls AsyncRendererCache#cleanCacheForRight(): every right check associated with a cached rendering result is evaluated again, including the ones whose user or entity belongs to the wiki being deleted. Since the wiki descriptor is gone, evaluating them fails and DefaultAuthorizationManager logs an error (and returns false, so the cache entries are removed anyway). The WikiDeletedEvent handling of AsyncRendererCacheListener comes later, after the database is deleted, and doesn't remove the right checks of the deleted wiki.
A possible fix: in AsyncRendererCache, remove the entries associated with a right check whose user or entity belongs to a wiki that doesn't exist anymore, without evaluating it.
Found in the logs of SubWikiIT (xwiki-platform-wiki-test-docker) in the XWiki Environment Tests job on CI (master builds 1406 and 1409, in 6 of the 8 environment runs), when the test deletes the subwiki it created.
Attachments
Issue Links
- depends on
-
XWIKI-25436 Introduce events framing the deletion of a wiki
-
- In Progress
-
- is related to
-
XWIKI-25440 Begin and end events are not reliably tracked on the other cluster members
-
- Open
-
- relates to
-
XWIKI-16728 Throw an event when a right may have changed
-
- Closed
-
-
XWIKI-16726 Automatically associate async results to right checks
-
- Closed
-