This is an automated email from the ASF dual-hosted git repository.

pradeep pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new a94f6e0  RANGER-2567: Ranger fails to connect wired Solr
a94f6e0 is described below

commit a94f6e0d1f39ea51743ea54849313d198237e70f
Author: Pradeep <prad...@apache.org>
AuthorDate: Fri Sep 13 14:20:14 2019 +0530

    RANGER-2567: Ranger fails to connect wired Solr
---
 .../audit/destination/SolrAuditDestination.java    | 156 ++++++++++++++++++++
 .../ranger/audit/provider/BaseAuditHandler.java    |  20 +++
 .../hadoop/config/RangerConfiguration.java         |  49 ++++++-
 .../hadoop/utils/RangerCredentialProvider.java     |  38 ++---
 .../ranger/server/tomcat/EmbeddedServer.java       | 162 +++++++++++++++++++++
 5 files changed, 405 insertions(+), 20 deletions(-)

diff --git 
a/agents-audit/src/main/java/org/apache/ranger/audit/destination/SolrAuditDestination.java
 
b/agents-audit/src/main/java/org/apache/ranger/audit/destination/SolrAuditDestination.java
index 35487e9..7631e58 100644
--- 
a/agents-audit/src/main/java/org/apache/ranger/audit/destination/SolrAuditDestination.java
+++ 
b/agents-audit/src/main/java/org/apache/ranger/audit/destination/SolrAuditDestination.java
@@ -19,6 +19,7 @@
 
 package org.apache.ranger.audit.destination;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ranger.audit.model.AuditEventBase;
@@ -36,13 +37,32 @@ import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
 import java.lang.reflect.Field;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
 import java.security.PrivilegedExceptionAction;
+import java.security.SecureRandom;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Properties;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+
 import java.util.Arrays;
 import java.util.Optional;
 
@@ -84,6 +104,12 @@ public class SolrAuditDestination extends AuditDestination {
                        synchronized(SolrAuditDestination.class) {
                                me = solrClient;
                                if (solrClient == null) {
+                                       KeyManager[]   kmList     = 
getKeyManagers();
+                                       TrustManager[] tmList     = 
getTrustManagers();
+                                       SSLContext     sslContext = 
getSSLContext(kmList, tmList);
+                                       if(sslContext != null) {
+                                               
SSLContext.setDefault(sslContext);
+                                       }
                                        String urls = 
MiscUtil.getStringProperty(props, propPrefix
                                                        + "." + PROP_SOLR_URLS);
                                        if (urls != null) {
@@ -321,4 +347,134 @@ public class SolrAuditDestination extends 
AuditDestination {
                }
                LOG.info("<==SolrAuditDestination.init()" );
        }
+
+       private KeyManager[] getKeyManagers() {
+               KeyManager[] kmList = null;
+               String credentialProviderPath = 
MiscUtil.getStringProperty(props, RANGER_POLICYMGR_CLIENT_KEY_FILE_CREDENTIAL);
+               String keyStoreAlias = 
RANGER_POLICYMGR_CLIENT_KEY_FILE_CREDENTIAL_ALIAS;
+               String keyStoreFile = MiscUtil.getStringProperty(props, 
RANGER_POLICYMGR_CLIENT_KEY_FILE);
+               String keyStoreFilepwd = 
MiscUtil.getCredentialString(credentialProviderPath, keyStoreAlias);
+               if (StringUtils.isNotEmpty(keyStoreFile) && 
StringUtils.isNotEmpty(keyStoreFilepwd)) {
+                       InputStream in = null;
+
+                       try {
+                               in = getFileInputStream(keyStoreFile);
+
+                               if (in != null) {
+                                       String keyStoreType = 
MiscUtil.getStringProperty(props, RANGER_POLICYMGR_CLIENT_KEY_FILE_TYPE);
+                                       keyStoreType = 
StringUtils.isNotEmpty(keyStoreType) ? keyStoreType : 
RANGER_POLICYMGR_CLIENT_KEY_FILE_TYPE_DEFAULT;
+                                       KeyStore keyStore = 
KeyStore.getInstance(keyStoreType);
+
+                                       keyStore.load(in, 
keyStoreFilepwd.toCharArray());
+
+                                       KeyManagerFactory keyManagerFactory = 
KeyManagerFactory.getInstance(RANGER_SSL_KEYMANAGER_ALGO_TYPE);
+
+                                       keyManagerFactory.init(keyStore, 
keyStoreFilepwd.toCharArray());
+
+                                       kmList = 
keyManagerFactory.getKeyManagers();
+                               } else {
+                                       LOG.error("Unable to obtain keystore 
from file [" + keyStoreFile + "]");
+                               }
+                       } catch (KeyStoreException e) {
+                               LOG.error("Unable to obtain from KeyStore :" + 
e.getMessage(), e);
+                       } catch (NoSuchAlgorithmException e) {
+                               LOG.error("SSL algorithm is NOT available in 
the environment", e);
+                       } catch (CertificateException e) {
+                               LOG.error("Unable to obtain the requested 
certification ", e);
+                       } catch (FileNotFoundException e) {
+                               LOG.error("Unable to find the necessary SSL 
Keystore Files", e);
+                       } catch (IOException e) {
+                               LOG.error("Unable to read the necessary SSL 
Keystore Files", e);
+                       } catch (UnrecoverableKeyException e) {
+                               LOG.error("Unable to recover the key from 
keystore", e);
+                       } finally {
+                               close(in, keyStoreFile);
+                       }
+               }
+
+               return kmList;
+       }
+
+       private TrustManager[] getTrustManagers() {
+               TrustManager[] tmList = null;
+               String credentialProviderPath = 
MiscUtil.getStringProperty(props, RANGER_POLICYMGR_TRUSTSTORE_FILE_CREDENTIAL);
+               String trustStoreAlias = 
RANGER_POLICYMGR_TRUSTSTORE_FILE_CREDENTIAL_ALIAS;
+               String trustStoreFile = MiscUtil.getStringProperty(props, 
RANGER_POLICYMGR_TRUSTSTORE_FILE);
+               String trustStoreFilepwd = 
MiscUtil.getCredentialString(credentialProviderPath, trustStoreAlias);
+               if (StringUtils.isNotEmpty(trustStoreFile) && 
StringUtils.isNotEmpty(trustStoreFilepwd)) {
+                       InputStream in = null;
+
+                       try {
+                               in = getFileInputStream(trustStoreFile);
+
+                               if (in != null) {
+                                       String trustStoreType = 
MiscUtil.getStringProperty(props, RANGER_POLICYMGR_TRUSTSTORE_FILE_TYPE);
+                                       trustStoreType = 
StringUtils.isNotEmpty(trustStoreType) ? trustStoreType : 
RANGER_POLICYMGR_TRUSTSTORE_FILE_TYPE_DEFAULT;
+                                       KeyStore trustStore = 
KeyStore.getInstance(trustStoreType);
+
+                                       trustStore.load(in, 
trustStoreFilepwd.toCharArray());
+
+                                       TrustManagerFactory trustManagerFactory 
= TrustManagerFactory.getInstance(RANGER_SSL_TRUSTMANAGER_ALGO_TYPE);
+
+                                       trustManagerFactory.init(trustStore);
+
+                                       tmList = 
trustManagerFactory.getTrustManagers();
+                               } else {
+                                       LOG.error("Unable to obtain truststore 
from file [" + trustStoreFile + "]");
+                               }
+                       } catch (KeyStoreException e) {
+                               LOG.error("Unable to obtain from KeyStore", e);
+                       } catch (NoSuchAlgorithmException e) {
+                               LOG.error("SSL algorithm is NOT available in 
the environment :" + e.getMessage(), e);
+                       } catch (CertificateException e) {
+                               LOG.error("Unable to obtain the requested 
certification :" + e.getMessage(), e);
+                       } catch (FileNotFoundException e) {
+                               LOG.error("Unable to find the necessary SSL 
TrustStore File:" + trustStoreFile, e);
+                       } catch (IOException e) {
+                               LOG.error("Unable to read the necessary SSL 
TrustStore Files :" + trustStoreFile, e);
+                       } finally {
+                               close(in, trustStoreFile);
+                       }
+               }
+
+               return tmList;
+       }
+
+       private SSLContext getSSLContext(KeyManager[] kmList, TrustManager[] 
tmList) {
+               SSLContext sslContext = null;
+               try {
+                       sslContext = 
SSLContext.getInstance(RANGER_SSL_CONTEXT_ALGO_TYPE);
+                       if (sslContext != null) {
+                               sslContext.init(kmList, tmList, new 
SecureRandom());
+                       }
+               } catch (NoSuchAlgorithmException e) {
+                       LOG.error("SSL algorithm is not available in the 
environment", e);
+               } catch (KeyManagementException e) {
+                       LOG.error("Unable to initialise the SSLContext", e);
+               }
+               return sslContext;
+       }
+
+       private InputStream getFileInputStream(String fileName) throws 
IOException {
+               InputStream in = null;
+               if (StringUtils.isNotEmpty(fileName)) {
+                       File file = new File(fileName);
+                       if (file != null && file.exists()) {
+                               in = new FileInputStream(file);
+                       } else {
+                               in = 
ClassLoader.getSystemResourceAsStream(fileName);
+                       }
+               }
+               return in;
+       }
+
+       private void close(InputStream str, String filename) {
+               if (str != null) {
+                       try {
+                               str.close();
+                       } catch (IOException excp) {
+                               LOG.error("Error while closing file: [" + 
filename + "]", excp);
+                       }
+               }
+       }
 }
diff --git 
a/agents-audit/src/main/java/org/apache/ranger/audit/provider/BaseAuditHandler.java
 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/BaseAuditHandler.java
index dac5c94..6138ca0 100644
--- 
a/agents-audit/src/main/java/org/apache/ranger/audit/provider/BaseAuditHandler.java
+++ 
b/agents-audit/src/main/java/org/apache/ranger/audit/provider/BaseAuditHandler.java
@@ -28,11 +28,31 @@ import com.google.gson.GsonBuilder;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicLong;
 
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.TrustManagerFactory;
+
 public abstract class BaseAuditHandler implements AuditHandler {
        private static final Log LOG = 
LogFactory.getLog(BaseAuditHandler.class);
 
        static final String AUDIT_LOG_FAILURE_REPORT_MIN_INTERVAL_PROP = 
"xasecure.audit.log.failure.report.min.interval.ms";
        protected static final String AUDIT_DB_CREDENTIAL_PROVIDER_FILE = 
"xasecure.audit.credential.provider.file";
+
+       public static final String RANGER_POLICYMGR_CLIENT_KEY_FILE             
     = "xasecure.policymgr.clientssl.keystore";
+       public static final String RANGER_POLICYMGR_CLIENT_KEY_FILE_TYPE        
     = "xasecure.policymgr.clientssl.keystore.type";
+       public static final String RANGER_POLICYMGR_CLIENT_KEY_FILE_CREDENTIAL  
     = "xasecure.policymgr.clientssl.keystore.credential.file";
+       public static final String 
RANGER_POLICYMGR_CLIENT_KEY_FILE_CREDENTIAL_ALIAS = "sslKeyStore";
+       public static final String 
RANGER_POLICYMGR_CLIENT_KEY_FILE_TYPE_DEFAULT     = "jks";
+
+       public static final String RANGER_POLICYMGR_TRUSTSTORE_FILE             
     = "xasecure.policymgr.clientssl.truststore";
+       public static final String RANGER_POLICYMGR_TRUSTSTORE_FILE_TYPE        
     = "xasecure.policymgr.clientssl.truststore.type";
+       public static final String RANGER_POLICYMGR_TRUSTSTORE_FILE_CREDENTIAL  
     = "xasecure.policymgr.clientssl.truststore.credential.file";
+       public static final String 
RANGER_POLICYMGR_TRUSTSTORE_FILE_CREDENTIAL_ALIAS = "sslTrustStore";
+       public static final String 
RANGER_POLICYMGR_TRUSTSTORE_FILE_TYPE_DEFAULT     = "jks";
+
+       public static final String RANGER_SSL_KEYMANAGER_ALGO_TYPE              
                         = KeyManagerFactory.getDefaultAlgorithm();
+       public static final String RANGER_SSL_TRUSTMANAGER_ALGO_TYPE            
                 = TrustManagerFactory.getDefaultAlgorithm();
+       public static final String RANGER_SSL_CONTEXT_ALGO_TYPE                 
                     = "TLS";
+
        public static final String PROP_CONFIG = "config";
 
        private int mLogFailureReportMinIntervalInMs = 60 * 1000;
diff --git 
a/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerConfiguration.java
 
b/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerConfiguration.java
index 0c2e473..481fbcc 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerConfiguration.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/authorization/hadoop/config/RangerConfiguration.java
@@ -20,6 +20,7 @@
 
 package org.apache.ranger.authorization.hadoop.config;
 
+import java.io.File;
 import java.net.URL;
 import java.util.Properties;
 
@@ -39,7 +40,8 @@ public class RangerConfiguration extends Configuration {
        public void addResourcesForServiceType(String serviceType) {
                String auditCfg    = "ranger-" + serviceType + "-audit.xml";
                String securityCfg = "ranger-" + serviceType + "-security.xml";
-               
+               String sslCfg      = "ranger-" + serviceType + 
"-policymgr-ssl.xml";
+
                if ( !addResourceIfReadable(auditCfg)) {
                        addAuditResource(serviceType);
                }
@@ -47,6 +49,11 @@ public class RangerConfiguration extends Configuration {
                if ( !addResourceIfReadable(securityCfg)) {
                        addSecurityResource(serviceType);
                }
+
+               if ( !addResourceIfReadable(sslCfg)) {
+                       addSslConfigResource(serviceType);
+               }
+
        }
 
        public boolean addAdminResources() {
@@ -185,4 +192,44 @@ public class RangerConfiguration extends Configuration {
                }
        }
 
+       private void addSslConfigResource(String serviceType) {
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("==> addSslConfigResource(Service Type: " + 
serviceType);
+               }
+               try {
+                       String sslConfigFile = 
config.get(RangerLegacyConfigBuilder.getPropertyName(RangerConfigConstants.RANGER_PLUGIN_REST_SSL_CONFIG_FILE,
 serviceType));
+                       URL url = getSSLConfigResource(sslConfigFile);
+                       if (url != null) {
+                               addResource(url);
+                               if (LOG.isDebugEnabled()) {
+                                       LOG.debug("SSL config file URL:" + 
url.getPath());
+                               }
+                       }
+               } catch (Throwable t) {
+                       LOG.warn(" Unable to find SSL Configs");
+                       if (LOG.isDebugEnabled()) {
+                               LOG.debug(" Unable to find SSL Configs");
+                       }
+               }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== addSslConfigResource(Service Type: " + 
serviceType + ")");
+               }
+       }
+
+       private URL getSSLConfigResource(String fileName) throws Throwable {
+               URL ret = null;
+               try {
+                       if (fileName != null) {
+                               File f = new File(fileName);
+                               if (f.exists() && f.canRead()) {
+                                       ret = f.toURI().toURL();
+                               }
+                       }
+               } catch (Throwable t) {
+                       LOG.error("Unable to read SSL configuration file:" + 
fileName);
+                       throw t;
+               }
+               return ret;
+       }
+
 }
diff --git 
a/agents-cred/src/main/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProvider.java
 
b/agents-cred/src/main/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProvider.java
index 61d0f21..07bae00 100644
--- 
a/agents-cred/src/main/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProvider.java
+++ 
b/agents-cred/src/main/java/org/apache/ranger/authorization/hadoop/utils/RangerCredentialProvider.java
@@ -43,18 +43,18 @@ public final class RangerCredentialProvider {
        }
 
        public String getCredentialString(String url, String alias) {
-               List<CredentialProvider> providers = 
getCredentialProviders(url);
-
-               if (providers != null) {
-                       for (CredentialProvider provider : providers) {
-                               try {
-                                       CredentialProvider.CredentialEntry 
credEntry = provider.getCredentialEntry(alias);
-
-                                       if (credEntry != null && 
credEntry.getCredential() != null) {
-                                               return new 
String(credEntry.getCredential());
+               if (url != null && alias != null) {
+                       List<CredentialProvider> providers = 
getCredentialProviders(url);
+                       if (providers != null) {
+                               for (CredentialProvider provider : providers) {
+                                       try {
+                                               
CredentialProvider.CredentialEntry credEntry = 
provider.getCredentialEntry(alias);
+                                               if (credEntry != null && 
credEntry.getCredential() != null) {
+                                                       return new 
String(credEntry.getCredential());
+                                               }
+                                       } catch (Exception ie) {
+                                               LOG.error("Unable to get the 
Credential Provider from the Configuration", ie);
                                        }
-                               } catch(Exception ie) {
-                                       LOG.error("Unable to get the Credential 
Provider from the Configuration", ie);  
                                }
                        }
                }
@@ -62,14 +62,14 @@ public final class RangerCredentialProvider {
        }
 
        List<CredentialProvider> getCredentialProviders(String url) {
-               try {
-                       Configuration conf = new Configuration();
-
-                       
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, url);
-
-                       return CredentialProviderFactory.getProviders(conf);
-               } catch(Exception ie) {
-                       LOG.error("Unable to get the Credential Provider from 
the Configuration", ie);
+               if (url != null) {
+                       try {
+                               Configuration conf = new Configuration();
+                               
conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, url);
+                               return 
CredentialProviderFactory.getProviders(conf);
+                       } catch (Exception ie) {
+                               LOG.error("Unable to get the Credential 
Provider from the Configuration", ie);
+                       }
                }
                return null;
        }
diff --git 
a/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
 
b/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
index b39212a..295fcb9 100644
--- 
a/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
+++ 
b/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
@@ -20,11 +20,22 @@
 package org.apache.ranger.server.tomcat;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
 import java.security.PrivilegedAction;
+import java.security.SecureRandom;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.Properties;
+import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.List;
 
@@ -33,12 +44,20 @@ import org.apache.catalina.LifecycleException;
 import org.apache.catalina.connector.Connector;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.valves.AccessLogValve;
+import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.security.SecureClientLogin;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.security.alias.CredentialProvider;
 import org.apache.hadoop.security.alias.CredentialProviderFactory;
 import org.apache.hadoop.security.alias.JavaKeyStoreProvider;
+import org.apache.ranger.authorization.hadoop.utils.RangerCredentialProvider;
 import org.apache.ranger.plugin.util.XMLUtils;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
 import javax.security.auth.Subject;
 
 public class EmbeddedServer {
@@ -64,6 +83,11 @@ public class EmbeddedServer {
        private static final String ADMIN_SERVER_NAME = "rangeradmin";
        
        private Properties serverConfigProperties = new Properties();
+       public static final String RANGER_KEYSTORE_FILE_TYPE_DEFAULT = "jks";
+       public static final String RANGER_TRUSTSTORE_FILE_TYPE_DEFAULT = "jks";
+       public static final String RANGER_SSL_CONTEXT_ALGO_TYPE = "TLS";
+       public static final String RANGER_SSL_KEYMANAGER_ALGO_TYPE = 
KeyManagerFactory.getDefaultAlgorithm();
+       public static final String RANGER_SSL_TRUSTMANAGER_ALGO_TYPE = 
TrustManagerFactory.getDefaultAlgorithm();
 
        public static void main(String[] args) {
                new EmbeddedServer(args).start();
@@ -83,6 +107,10 @@ public class EmbeddedServer {
        public static String DEFAULT_SHUTDOWN_COMMAND = "SHUTDOWN";
        
        public void start() {
+               SSLContext sslContext = getSSLContext();
+               if (sslContext != null) {
+                       SSLContext.setDefault(sslContext);
+               }
                final Tomcat server = new Tomcat();
 
                String logDir =  null;
@@ -448,4 +476,138 @@ public class EmbeddedServer {
                }
                return credential;
        }
+
+       private SSLContext getSSLContext() {
+               KeyManager[] kmList = getKeyManagers();
+               TrustManager[] tmList = getTrustManagers();
+               SSLContext sslContext = null;
+               if (tmList != null) {
+                       try {
+                               sslContext = 
SSLContext.getInstance(RANGER_SSL_CONTEXT_ALGO_TYPE);
+                               sslContext.init(kmList, tmList, new 
SecureRandom());
+                       } catch (NoSuchAlgorithmException e) {
+                               LOG.severe("SSL algorithm is not available in 
the environment. Reason: " + e.toString());
+                       } catch (KeyManagementException e) {
+                               LOG.severe("Unable to initials the SSLContext. 
Reason: " + e.toString());
+                       }
+               }
+               return sslContext;
+       }
+
+       private KeyManager[] getKeyManagers() {
+               KeyManager[] kmList = null;
+               String keyStoreFile = getConfig("ranger.keystore.file");
+               String keyStoreAlias = getConfig("ranger.keystore.alias");
+               String credentialProviderPath = 
getConfig("ranger.credential.provider.path");
+               String keyStoreFilepwd = getCredential(credentialProviderPath, 
keyStoreAlias);
+
+               if (StringUtils.isNotEmpty(keyStoreFile) && 
StringUtils.isNotEmpty(keyStoreFilepwd)) {
+                       InputStream in = null;
+
+                       try {
+                               in = getFileInputStream(keyStoreFile);
+
+                               if (in != null) {
+                                       KeyStore keyStore = 
KeyStore.getInstance(RANGER_KEYSTORE_FILE_TYPE_DEFAULT);
+
+                                       keyStore.load(in, 
keyStoreFilepwd.toCharArray());
+
+                                       KeyManagerFactory keyManagerFactory = 
KeyManagerFactory.getInstance(RANGER_SSL_KEYMANAGER_ALGO_TYPE);
+
+                                       keyManagerFactory.init(keyStore, 
keyStoreFilepwd.toCharArray());
+
+                                       kmList = 
keyManagerFactory.getKeyManagers();
+                               } else {
+                                       LOG.severe("Unable to obtain keystore 
from file [" + keyStoreFile + "]");
+                               }
+                       } catch (KeyStoreException e) {
+                               LOG.log(Level.SEVERE, "Unable to obtain from 
KeyStore :" + e.getMessage(), e);
+                       } catch (NoSuchAlgorithmException e) {
+                               LOG.log(Level.SEVERE, "SSL algorithm is NOT 
available in the environment", e);
+                       } catch (CertificateException e) {
+                               LOG.log(Level.SEVERE, "Unable to obtain the 
requested certification ", e);
+                       } catch (FileNotFoundException e) {
+                               LOG.log(Level.SEVERE, "Unable to find the 
necessary SSL Keystore Files", e);
+                       } catch (IOException e) {
+                               LOG.log(Level.SEVERE, "Unable to read the 
necessary SSL Keystore Files", e);
+                       } catch (UnrecoverableKeyException e) {
+                               LOG.log(Level.SEVERE, "Unable to recover the 
key from keystore", e);
+                       } finally {
+                               close(in, keyStoreFile);
+                       }
+               }
+               return kmList;
+       }
+
+       private TrustManager[] getTrustManagers() {
+               TrustManager[] tmList = null;
+               String truststoreFile = getConfig("ranger.truststore.file");
+               String truststoreAlias = getConfig("ranger.truststore.alias");
+               String credentialProviderPath = 
getConfig("ranger.credential.provider.path");
+               String trustStoreFilepwd = 
getCredential(credentialProviderPath, truststoreAlias);
+
+               if (StringUtils.isNotEmpty(truststoreFile) && 
StringUtils.isNotEmpty(trustStoreFilepwd)) {
+                       InputStream in = null;
+
+                       try {
+                               in = getFileInputStream(truststoreFile);
+
+                               if (in != null) {
+                                       KeyStore trustStore = 
KeyStore.getInstance(RANGER_TRUSTSTORE_FILE_TYPE_DEFAULT);
+
+                                       trustStore.load(in, 
trustStoreFilepwd.toCharArray());
+
+                                       TrustManagerFactory trustManagerFactory 
= TrustManagerFactory.getInstance(RANGER_SSL_TRUSTMANAGER_ALGO_TYPE);
+
+                                       trustManagerFactory.init(trustStore);
+
+                                       tmList = 
trustManagerFactory.getTrustManagers();
+                               } else {
+                                       LOG.log(Level.SEVERE, "Unable to obtain 
truststore from file [" + truststoreFile + "]");
+                               }
+                       } catch (KeyStoreException e) {
+                               LOG.log(Level.SEVERE, "Unable to obtain from 
KeyStore", e);
+                       } catch (NoSuchAlgorithmException e) {
+                               LOG.log(Level.SEVERE, "SSL algorithm is NOT 
available in the environment :" + e.getMessage(), e);
+                       } catch (CertificateException e) {
+                               LOG.log(Level.SEVERE, "Unable to obtain the 
requested certification :" + e.getMessage(), e);
+                       } catch (FileNotFoundException e) {
+                               LOG.log(Level.SEVERE, "Unable to find the 
necessary SSL TrustStore File:" + truststoreFile, e);
+                       } catch (IOException e) {
+                               LOG.log(Level.SEVERE, "Unable to read the 
necessary SSL TrustStore Files :" + truststoreFile, e);
+                       } finally {
+                               close(in, truststoreFile);
+                       }
+               }
+
+               return tmList;
+       }
+
+       private String getCredential(String url, String alias) {
+               return 
RangerCredentialProvider.getInstance().getCredentialString(url, alias);
+       }
+
+       private InputStream getFileInputStream(String fileName) throws 
IOException {
+               InputStream in = null;
+               if (StringUtils.isNotEmpty(fileName)) {
+                       File f = new File(fileName);
+                       if (f.exists()) {
+                               in = new FileInputStream(f);
+                       } else {
+                               in = 
ClassLoader.getSystemResourceAsStream(fileName);
+                       }
+               }
+               return in;
+       }
+
+       private void close(InputStream str, String filename) {
+               if (str != null) {
+                       try {
+                               str.close();
+                       } catch (IOException excp) {
+                               LOG.log(Level.SEVERE, "Error while closing 
file: [" + filename + "]", excp);
+                       }
+               }
+       }
+
 }

Reply via email to