[
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)