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)