[
https://issues.apache.org/jira/browse/GEODE-4291?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Sai Boorlagadda updated GEODE-4291:
-----------------------------------
Summary: Avoid asking user input in SocketCreator (was: Reducing the scope
of JLineShell dependency for non-interactive clients.)
> 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 creating the `GfeConsoleReader` upfront and only
> do when it is required (ie for interactive clients like gfsh).
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)