[ 
https://issues.apache.org/jira/browse/GEODE-4291?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sai Boorlagadda updated GEODE-4291:
-----------------------------------
    Description: 
When using *SSL*, clients have to include 
*org.springframework.shell:spring-shell* dependency as geode expects the class 
on the class path 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 asking user input at this level and use default 
values (this is only for optional parameters and validation of mandatory 
parameters happens much earlier and covers the case of missing ones).

  was:
When using *SSL*, clients have to include 
*org.springframework.shell:spring-shell* dependency as geode expects the class 
on the class path 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 (ie for interactive clients like gfsh).


> Avoid asking user input in SocketCreator
> ----------------------------------------
>
>                 Key: GEODE-4291
>                 URL: https://issues.apache.org/jira/browse/GEODE-4291
>             Project: Geode
>          Issue Type: Improvement
>          Components: gfsh, security
>            Reporter: Sai Boorlagadda
>            Assignee: Sai Boorlagadda
>
> When using *SSL*, clients have to include 
> *org.springframework.shell:spring-shell* dependency as geode expects the 
> class on the class path 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 asking user input at this level and use default 
> values (this is only for optional parameters and validation of mandatory 
> parameters happens much earlier and covers the case of missing ones).



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

Reply via email to