You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "Swapnil Bawaskar (JIRA)" <ji...@apache.org> on 2018/04/09 22:37:23 UTC

[jira] [Closed] (GEODE-4291) Avoid asking user input in SocketCreator

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

Swapnil Bawaskar closed GEODE-4291.
-----------------------------------

> 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
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.5.0
>
>
> 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
(v7.6.3#76005)