Uploaded image for project: 'Infinispan'
  1. Infinispan
  2. ISPN-13837

XmlPullParserException is thrown when adding several roles to security cache configuration over JSON

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • Major
    • None
    • 14.0.0.Dev02
    • Configuration
    • None

    Description

      When I am trying to add cache (over REST or Console) using JSON code from documentation: https://infinispan.org/docs/stable/titles/security/security.html#custom_roles_and_permissions i.e.

      {
        "distributed-cache": {
          "security": {
            "authorization": {
              "enabled": true,
              "roles": ["admin","supervisor"]
            }
          }
        }
      } 

      I am getting the following exception on the server:

      2022-04-20 00:59:41,452 ERROR (blocking-thread-infinispan-4-e2e-p3-t3) [org.infinispan.interceptors.impl.InvocationContextInterceptor] ISPN000136: Error executing command PutKeyValueCommand on Cache 'org.infinispan.CONFIG', writing keys [ScopedState{scope='cache', name='t'}] org.infinispan.commons.CacheListenerException: ISPN000280: Caught exception [org.infinispan.commons.configuration.io.xml.XmlPullParserException] while invoking method [public java.util.concurrent.CompletionStage org.infinispan.globalstate.impl.GlobalConfigurationStateListener.handleCreate(org.infinispan.notifications.cachelistener.event.CacheEntryCreatedEvent)] on listener instance: org.infinispan.globalstate.impl.GlobalConfigurationStateListener@11d3d5a0
          at org.infinispan.notifications.impl.AbstractListenerImpl$ListenerInvocationImpl.lambda$invoke$1(AbstractListenerImpl.java:430)
          at org.infinispan.notifications.impl.AbstractListenerImpl$ListenerInvocationImpl.invoke(AbstractListenerImpl.java:450)
          at org.infinispan.notifications.cachelistener.CacheNotifierImpl$BaseCacheEntryListenerInvocation.doRealInvocation(CacheNotifierImpl.java:1793)
          at org.infinispan.notifications.cachelistener.CacheNotifierImpl$BaseCacheEntryListenerInvocation.doRealInvocation(CacheNotifierImpl.java:1789)
          at org.infinispan.notifications.cachelistener.CacheNotifierImpl$BaseCacheEntryListenerInvocation.invokeNoChecks(CacheNotifierImpl.java:1784)
          at org.infinispan.notifications.cachelistener.CacheNotifierImpl$BaseCacheEntryListenerInvocation.invoke(CacheNotifierImpl.java:1757)
          at org.infinispan.notifications.cachelistener.CacheNotifierImpl.doNotifyCreated(CacheNotifierImpl.java:428)
          at org.infinispan.notifications.cachelistener.CacheNotifierImpl.notifyCacheEntryCreated(CacheNotifierImpl.java:410)
          at org.infinispan.notifications.cachelistener.NotifyHelper.entryCommitted(NotifyHelper.java:63)
          at org.infinispan.interceptors.locking.ClusteringDependentLogic$ReplicationLogic.commitSingleEntry(ClusteringDependentLogic.java:561)
          at org.infinispan.interceptors.locking.ClusteringDependentLogic$AbstractClusteringDependentLogic.commitEntry(ClusteringDependentLogic.java:243)
          at org.infinispan.interceptors.impl.EntryWrappingInterceptor.commitContextEntry(EntryWrappingInterceptor.java:650)
          at org.infinispan.interceptors.impl.EntryWrappingInterceptor.commitEntryIfNeeded(EntryWrappingInterceptor.java:936)
          at org.infinispan.interceptors.impl.EntryWrappingInterceptor.commitContextEntries(EntryWrappingInterceptor.java:630)
          at org.infinispan.interceptors.impl.EntryWrappingInterceptor.applyChanges(EntryWrappingInterceptor.java:724)
          at org.infinispan.interceptors.impl.EntryWrappingInterceptor.applyAndFixVersion(EntryWrappingInterceptor.java:789)
          at org.infinispan.interceptors.SyncInvocationStage.thenApply(SyncInvocationStage.java:44)
          at org.infinispan.interceptors.impl.EntryWrappingInterceptor.setSkipRemoteGetsAndInvokeNextForDataCommand(EntryWrappingInterceptor.java:784)
          at org.infinispan.interceptors.impl.EntryWrappingInterceptor.visitPutKeyValueCommand(EntryWrappingInterceptor.java:338)
          at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:63)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndFinally(BaseAsyncInterceptor.java:155)
          at org.infinispan.interceptors.locking.AbstractLockingInterceptor.lambda$nonTxLockAndInvokeNext$3(AbstractLockingInterceptor.java:318)
          at org.infinispan.interceptors.SyncInvocationStage.andHandle(SyncInvocationStage.java:69)
          at org.infinispan.interceptors.locking.AbstractLockingInterceptor.nonTxLockAndInvokeNext(AbstractLockingInterceptor.java:313)
          at org.infinispan.interceptors.locking.AbstractLockingInterceptor.visitNonTxDataWriteCommand(AbstractLockingInterceptor.java:138)
          at org.infinispan.interceptors.locking.NonTransactionalLockingInterceptor.visitDataWriteCommand(NonTransactionalLockingInterceptor.java:41)
          at org.infinispan.interceptors.locking.AbstractLockingInterceptor.visitPutKeyValueCommand(AbstractLockingInterceptor.java:82)
          at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:63)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndHandle(BaseAsyncInterceptor.java:188)
          at org.infinispan.statetransfer.StateTransferInterceptor.handleNonTxWriteCommand(StateTransferInterceptor.java:312)
          at org.infinispan.statetransfer.StateTransferInterceptor.handleWriteCommand(StateTransferInterceptor.java:256)
          at org.infinispan.statetransfer.StateTransferInterceptor.visitPutKeyValueCommand(StateTransferInterceptor.java:96)
          at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:63)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:59)
          at org.infinispan.interceptors.impl.CacheMgmtInterceptor.updateStoreStatistics(CacheMgmtInterceptor.java:265)
          at org.infinispan.interceptors.impl.CacheMgmtInterceptor.visitPutKeyValueCommand(CacheMgmtInterceptor.java:224)
          at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:63)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:59)
          at org.infinispan.interceptors.DDAsyncInterceptor.handleDefault(DDAsyncInterceptor.java:55)
          at org.infinispan.interceptors.DDAsyncInterceptor.visitPutKeyValueCommand(DDAsyncInterceptor.java:61)
          at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:63)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndExceptionally(BaseAsyncInterceptor.java:128)
          at org.infinispan.interceptors.impl.InvocationContextInterceptor.visitCommand(InvocationContextInterceptor.java:89)
          at org.infinispan.interceptors.impl.AsyncInterceptorChainImpl.invokeAsync(AsyncInterceptorChainImpl.java:220)
          at org.infinispan.cache.impl.InvocationHelper.doInvokeAsync(InvocationHelper.java:284)
          at org.infinispan.cache.impl.InvocationHelper.invokeAsync(InvocationHelper.java:145)
          at org.infinispan.cache.impl.InvocationHelper.invokeAsync(InvocationHelper.java:128)
          at org.infinispan.cache.impl.CacheImpl.putIfAbsentAsync(CacheImpl.java:1471)
          at org.infinispan.cache.impl.CacheImpl.putIfAbsentAsync(CacheImpl.java:1464)
          at org.infinispan.cache.impl.CacheImpl.putIfAbsentAsync(CacheImpl.java:444)
          at org.infinispan.cache.impl.AbstractDelegatingCache.putIfAbsentAsync(AbstractDelegatingCache.java:203)
          at org.infinispan.cache.impl.AbstractDelegatingCache.putIfAbsentAsync(AbstractDelegatingCache.java:203)
          at org.infinispan.cache.impl.EncoderCache.putIfAbsentAsync(EncoderCache.java:296)
          at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.createCache(GlobalConfigurationManagerImpl.java:259)
          at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.getOrCreateCache(GlobalConfigurationManagerImpl.java:205)
          at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.createCache(GlobalConfigurationManagerImpl.java:199)
          at org.infinispan.manager.DefaultCacheManagerAdmin.createCache(DefaultCacheManagerAdmin.java:41)
          at org.infinispan.rest.resources.CacheResourceV2.lambda$createOrUpdate$12(CacheResourceV2.java:525)
          at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
          at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
          at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
          at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
          at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
          at java.base/java.lang.Thread.run(Thread.java:833)
      Caused by: org.infinispan.commons.configuration.io.xml.XmlPullParserException: expected = after attribute name (position: TEXT seen ...\n                    <authorization enabled="true" roles="["admin"... @7:66) 
          at org.infinispan.commons.configuration.io.xml.MXParser.parseAttribute(MXParser.java:1750)
          at org.infinispan.commons.configuration.io.xml.MXParser.parseStartTag(MXParser.java:1545)
          at org.infinispan.commons.configuration.io.xml.MXParser.nextImpl(MXParser.java:933)
          at org.infinispan.commons.configuration.io.xml.MXParser.next(MXParser.java:901)
          at org.infinispan.commons.configuration.io.xml.XmlConfigurationReader.nextEvent(XmlConfigurationReader.java:103)
          at org.infinispan.commons.configuration.io.xml.XmlConfigurationReader.nextElement(XmlConfigurationReader.java:131)
          at org.infinispan.commons.configuration.io.ConfigurationReader.inTag(ConfigurationReader.java:143)
          at org.infinispan.configuration.parsing.CacheParser.parseCacheSecurity(CacheParser.java:424)
          at org.infinispan.configuration.parsing.CacheParser.parseCacheElement(CacheParser.java:548)
          at org.infinispan.configuration.parsing.CacheParser.parseSharedStateCacheElement(CacheParser.java:220)
          at org.infinispan.configuration.parsing.CacheParser.parseDistributedCache(CacheParser.java:1242)
          at org.infinispan.configuration.parsing.Parser.parseCaches(Parser.java:856)
          at org.infinispan.configuration.parsing.Parser.parseContainer(Parser.java:736)
          at org.infinispan.configuration.parsing.Parser.readElement(Parser.java:86)
          at org.infinispan.configuration.parsing.ParserRegistry.parseElement(ParserRegistry.java:208)
          at org.infinispan.configuration.parsing.ParserRegistry.parse(ParserRegistry.java:186)
          at org.infinispan.configuration.parsing.ParserRegistry.parse(ParserRegistry.java:174)
          at org.infinispan.configuration.parsing.ParserRegistry.parse(ParserRegistry.java:156)
          at org.infinispan.configuration.parsing.ParserRegistry.parse(ParserRegistry.java:140)
          at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.buildConfiguration(GlobalConfigurationManagerImpl.java:302)
          at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.createCacheLocally(GlobalConfigurationManagerImpl.java:277)
          at org.infinispan.globalstate.impl.GlobalConfigurationStateListener.handleCreate(GlobalConfigurationStateListener.java:46)
          at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
          at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          at java.base/java.lang.reflect.Method.invoke(Method.java:568)
          at org.infinispan.notifications.impl.AbstractListenerImpl$ListenerInvocationImpl.lambda$invoke$1(AbstractListenerImpl.java:424)
          ... 63 more
       

      The workaround for the problem is changing the cache JSON to:

      {
        "distributed-cache": {
          "security": {
            "authorization": {
              "enabled": true,
              "roles": "admin supervisor"
            }
          }
        }
      } 

      So I am not sure if this is a documentation bug or xml parsing issue - I am setting the component of the bug to "Configuration"

      Attachments

        Issue Links

          Activity

            People

              ttarrant@redhat.com Tristan Tarrant
              amanukya@redhat.com Anna Manukyan
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated: