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

Empty authorization roles serialized as JSON cannot be parsed

    XMLWordPrintable

Details

    • Hide
      Subject: [PATCH] ISPN-14466
      ---
      Index: core/src/test/java/org/infinispan/configuration/ConfigurationConversionTest.java
      IDEA additional info:
      Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
      <+>UTF-8
      ===================================================================
      diff --git a/core/src/test/java/org/infinispan/configuration/ConfigurationConversionTest.java b/core/src/test/java/org/infinispan/configuration/ConfigurationConversionTest.java
      new file mode 100644
      --- /dev/null	(date 1680777230889)
      +++ b/core/src/test/java/org/infinispan/configuration/ConfigurationConversionTest.java	(date 1680777230889)
      @@ -0,0 +1,52 @@
      +package org.infinispan.configuration;
      +
      +import org.infinispan.commons.configuration.io.ConfigurationReader;
      +import org.infinispan.commons.configuration.io.ConfigurationResourceResolver;
      +import org.infinispan.commons.configuration.io.ConfigurationWriter;
      +import org.infinispan.commons.configuration.io.NamingStrategy;
      +import org.infinispan.commons.dataconversion.MediaType;
      +import org.infinispan.commons.io.StringBuilderWriter;
      +import org.infinispan.configuration.cache.Configuration;
      +import org.infinispan.configuration.cache.ConfigurationBuilder;
      +import org.infinispan.configuration.parsing.CacheParser;
      +import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
      +import org.infinispan.configuration.parsing.ParserRegistry;
      +import org.testng.annotations.Test;
      +
      +import java.util.Map;
      +import java.util.Properties;
      +
      +@Test(groups = "functional", testName= "configuration.ConfigurationConversionTest")
      +public class ConfigurationConversionTest {
      +    @Test
      +    public void testAuthorizationRoles() {
      +        String xml = "<distributed-cache owners=\"2\" mode=\"SYNC\" statistics=\"false\">\n" +
      +                "          <security>\n" +
      +                "            <authorization />\n" +
      +                "          </security>\n" +
      +                "        <encoding media-type=\"application/x-java-serialized-object\" />\n" +
      +                "      </distributed-cache> ";
      +        String json = convert(xml, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON);
      +        convert(json, MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML);
      +    }
      +
      +    private String convert(String source, MediaType src, MediaType dst) {
      +        ParserRegistry parserRegistry = new ParserRegistry();
      +        Properties properties = new Properties();
      +        properties.put(CacheParser.IGNORE_MISSING_TEMPLATES, "true");
      +        ConfigurationReader reader = ConfigurationReader.from(source)
      +                .withResolver(ConfigurationResourceResolver.DEFAULT)
      +                .withType(src)
      +                .withProperties(properties)
      +                .withNamingStrategy(NamingStrategy.KEBAB_CASE).build();
      +        ConfigurationBuilderHolder holder = new ConfigurationBuilderHolder();
      +        parserRegistry.parse(reader, holder);
      +        Map.Entry<String, ConfigurationBuilder> entry = holder.getNamedConfigurationBuilders().entrySet().iterator().next();
      +        Configuration configuration = entry.getValue().build();
      +        StringBuilderWriter out = new StringBuilderWriter();
      +        try (ConfigurationWriter writer = ConfigurationWriter.to(out).withType(dst).clearTextSecrets(true).prettyPrint(true).build()) {
      +            parserRegistry.serialize(writer, entry.getKey(), configuration);
      +        }
      +        return out.toString();
      +    }
      +}
      
      
      Show
      Subject: [PATCH] ISPN-14466 --- Index: core/src/test/java/org/infinispan/configuration/ConfigurationConversionTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/core/src/test/java/org/infinispan/configuration/ConfigurationConversionTest.java b/core/src/test/java/org/infinispan/configuration/ConfigurationConversionTest.java new file mode 100644 --- /dev/ null (date 1680777230889) +++ b/core/src/test/java/org/infinispan/configuration/ConfigurationConversionTest.java (date 1680777230889) @@ -0,0 +1,52 @@ + package org.infinispan.configuration; + + import org.infinispan.commons.configuration.io.ConfigurationReader; + import org.infinispan.commons.configuration.io.ConfigurationResourceResolver; + import org.infinispan.commons.configuration.io.ConfigurationWriter; + import org.infinispan.commons.configuration.io.NamingStrategy; + import org.infinispan.commons.dataconversion.MediaType; + import org.infinispan.commons.io.StringBuilderWriter; + import org.infinispan.configuration.cache.Configuration; + import org.infinispan.configuration.cache.ConfigurationBuilder; + import org.infinispan.configuration.parsing.CacheParser; + import org.infinispan.configuration.parsing.ConfigurationBuilderHolder; + import org.infinispan.configuration.parsing.ParserRegistry; + import org.testng.annotations.Test; + + import java.util.Map; + import java.util.Properties; + +@Test(groups = "functional" , testName= "configuration.ConfigurationConversionTest" ) + public class ConfigurationConversionTest { + @Test + public void testAuthorizationRoles() { + String xml = "<distributed-cache owners=\" 2\ " mode=\" SYNC\ " statistics=\" false \ ">\n" + + " <security>\n" + + " <authorization />\n" + + " </security>\n" + + " <encoding media-type=\" application/x-java-serialized-object\ " />\n" + + " </distributed-cache> " ; + String json = convert(xml, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON); + convert(json, MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML); + } + + private String convert( String source, MediaType src, MediaType dst) { + ParserRegistry parserRegistry = new ParserRegistry(); + Properties properties = new Properties(); + properties.put(CacheParser.IGNORE_MISSING_TEMPLATES, " true " ); + ConfigurationReader reader = ConfigurationReader.from(source) + .withResolver(ConfigurationResourceResolver.DEFAULT) + .withType(src) + .withProperties(properties) + .withNamingStrategy(NamingStrategy.KEBAB_CASE).build(); + ConfigurationBuilderHolder holder = new ConfigurationBuilderHolder(); + parserRegistry.parse(reader, holder); + Map.Entry< String , ConfigurationBuilder> entry = holder.getNamedConfigurationBuilders().entrySet().iterator().next(); + Configuration configuration = entry.getValue().build(); + StringBuilderWriter out = new StringBuilderWriter(); + try (ConfigurationWriter writer = ConfigurationWriter.to(out).withType(dst).clearTextSecrets( true ).prettyPrint( true ).build()) { + parserRegistry.serialize(writer, entry.getKey(), configuration); + } + return out.toString(); + } +}
    • Workaround Exists
    • Hide

      Explicitly define all roles applicable to the cache, e.g. <authorization roles="role1 role2"/>.

      Show
      Explicitly define all roles applicable to the cache, e.g. <authorization roles="role1 role2"/> .

    Description

      The following XML:

            <distributed-cache owners="2" mode="SYNC" statistics="false">
                <security>
                  <authorization />
                </security>
              <encoding media-type="application/x-java-serialized-object" />
            </distributed-cache> 
      

      Is serialized to JSON as:

      {"myxmlcache":{"distributed-cache":{"owners":"2","mode":"SYNC","statistics":false,"encoding":{"media-type":"application/x-java-serialized-object"},"security":{"authorization":{"enabled":true,"roles":[]}}}}}
      

      When attempting to parse ^ JSON, the CacheParser throws the following exception:

      org.infinispan.commons.configuration.io.ConfigurationReaderException: Unexpected element 'roles' encountered[1,0]
      
      	at org.infinispan.configuration.parsing.ParseUtils.unexpectedElement(ParseUtils.java:41)
      	at org.infinispan.configuration.parsing.ParseUtils.requireNoContent(ParseUtils.java:160)
      	at org.infinispan.configuration.parsing.CacheParser.parseCacheAuthorization(CacheParser.java:357)
      	at org.infinispan.configuration.parsing.CacheParser.parseCacheSecurity(CacheParser.java:328)
      	at org.infinispan.configuration.parsing.CacheParser.parseCacheElement(CacheParser.java:451)
      	at org.infinispan.configuration.parsing.CacheParser.parseSharedStateCacheElement(CacheParser.java:226)
      	at org.infinispan.configuration.parsing.CacheParser.parseDistributedCache(CacheParser.java:1084)
      	at org.infinispan.configuration.parsing.CacheParser.readElement(CacheParser.java:122)
      	at org.infinispan.configuration.parsing.ParserRegistry.parseElement(ParserRegistry.java:209)
      	at org.infinispan.configuration.parsing.ParserRegistry.parse(ParserRegistry.java:187)
      	at org.infinispan.configuration.ConfigurationConversionTest.convert(ConfigurationConversionTest.java:43)
      	at org.infinispan.configuration.ConfigurationConversionTest.testAuthorizationRoles(ConfigurationConversionTest.java:30)
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
      	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
      	at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
      	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
      	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
      	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
      	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
      	at org.testng.TestRunner.privateRun(TestRunner.java:648)
      	at org.testng.TestRunner.run(TestRunner.java:505)
      	at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
      	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
      	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
      	at org.testng.SuiteRunner.run(SuiteRunner.java:364)
      	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
      	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
      	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
      	at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
      	at org.testng.TestNG.runSuites(TestNG.java:1049)
      	at org.testng.TestNG.run(TestNG.java:1017)
      	at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
      	at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
      

      Attachments

        Activity

          People

            ttarrant@redhat.com Tristan Tarrant
            remerson@redhat.com Ryan Emerson
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: