Sai Boorlagadda created GEODE-4291:
--------------------------------------

             Summary: Reducing the scope of JLineShell dependency for 
non-interactive clients.
                 Key: GEODE-4291
                 URL: https://issues.apache.org/jira/browse/GEODE-4291
             Project: Geode
          Issue Type: Improvement
          Components: gfsh, security
            Reporter: Sai Boorlagadda


When using `SSL`, clients have to include `springshell` dependency as geode 
expects the class on the classpath and fails with below exception:

{noformat}
[error 2018/01/12 09:56:57.829 PST <main> tid=0x1] 
java.lang.NoClassDefFoundError: org/springframework/shell/core/JLineShell
Exception in thread "main" java.lang.NoClassDefFoundError: 
org/springframework/shell/core/JLineShell
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at 
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at 
org.apache.geode.internal.GfeConsoleReaderFactory.createConsoleReader(GfeConsoleReaderFactory.java:42)
        at 
org.apache.geode.internal.GfeConsoleReaderFactory.<clinit>(GfeConsoleReaderFactory.java:33)
        at 
org.apache.geode.internal.net.SocketCreator.getKeyManagers(SocketCreator.java:537)
        at 
org.apache.geode.internal.net.SocketCreator.createAndConfigureSSLContext(SocketCreator.java:395)
        at 
org.apache.geode.internal.net.SocketCreator.initialize(SocketCreator.java:352)
        at 
org.apache.geode.internal.net.SocketCreator.<init>(SocketCreator.java:269)
        at 
org.apache.geode.internal.net.SocketCreatorFactory.createSSLSocketCreator(SocketCreatorFactory.java:105)
        at 
org.apache.geode.internal.net.SocketCreatorFactory.getSSLSocketCreator(SocketCreatorFactory.java:79)
        at 
org.apache.geode.internal.net.SocketCreatorFactory.getOrCreateSocketCreatorForSSLEnabledComponent(SocketCreatorFactory.java:95)
        at 
org.apache.geode.internal.net.SocketCreatorFactory.getSocketCreatorForComponent(SocketCreatorFactory.java:70)
        at 
org.apache.geode.distributed.internal.tcpserver.TcpClient.<init>(TcpClient.java:74)
        at 
org.apache.geode.cache.client.internal.AutoConnectionSourceImpl.<init>(AutoConnectionSourceImpl.java:118)
        at 
org.apache.geode.cache.client.internal.PoolImpl.getSourceImpl(PoolImpl.java:651)
        at 
org.apache.geode.cache.client.internal.PoolImpl.<init>(PoolImpl.java:248)
        at 
org.apache.geode.cache.client.internal.PoolImpl.create(PoolImpl.java:157)
        at 
org.apache.geode.internal.cache.PoolFactoryImpl.create(PoolFactoryImpl.java:338)
        at 
org.apache.geode.internal.cache.GemFireCacheImpl.determineDefaultPool(GemFireCacheImpl.java:2919)
        at 
org.apache.geode.internal.cache.GemFireCacheImpl.initializeDeclarativeCache(GemFireCacheImpl.java:1394)
        at 
org.apache.geode.internal.cache.GemFireCacheImpl.initialize(GemFireCacheImpl.java:1219)
        at 
org.apache.geode.internal.cache.GemFireCacheImpl.basicCreate(GemFireCacheImpl.java:768)
        at 
org.apache.geode.internal.cache.GemFireCacheImpl.createClient(GemFireCacheImpl.java:740)
        at 
org.apache.geode.cache.client.ClientCacheFactory.basicCreate(ClientCacheFactory.java:264)
        at 
org.apache.geode.cache.client.ClientCacheFactory.create(ClientCacheFactory.java:213)
        at 
org.apache.geode.examples.clientSecurity.Example.<init>(Example.java:70)
        at 
org.apache.geode.examples.clientSecurity.Example.adminUserCanPutAndGetEverywhere(Example.java:86)
        at 
org.apache.geode.examples.clientSecurity.Example.main(Example.java:78)
Caused by: java.lang.ClassNotFoundException: 
org.springframework.shell.core.JLineShell
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 38 more
{noformat}

As you can see in below code `GfeConsoleReader` is initialized and is at the 
beginning of the function which causes the above exception. While this should 
be a dependency only for gfsh (to read inputs from the interactive shell) and 
not for non-interactive clients (consider a default).

{code}
private KeyManager[] getKeyManagers() throws KeyStoreException, IOException,
      NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException 
{
    GfeConsoleReader consoleReader = 
GfeConsoleReaderFactory.getDefaultConsoleReader();

    if (sslConfig.getKeystore() == null) {
      return null;
    }

    KeyManager[] keyManagers = null;
    String keyStoreType = sslConfig.getKeystoreType();
    if (StringUtils.isEmpty(keyStoreType)) {
      // read from console, default on empty
      if (consoleReader.isSupported()) {
        keyStoreType =
            consoleReader.readLine("Please enter the keyStoreType 
(javax.net.ssl.keyStoreType) : ");
      } else {
        keyStoreType = KeyStore.getDefaultType();
      }
    }
{code}

A proposed fix is to avoid creating the `GfeConsoleReader` upfront and only do 
when it is required (for interactive shells).



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to