Repository: airavata Updated Branches: refs/heads/master 7f8988096 -> c6fe0decd
http://git-wip-us.apache.org/repos/asf/airavata/blob/c6fe0dec/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/server/CredentialStoreServerHandler.java ---------------------------------------------------------------------- diff --git a/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/server/CredentialStoreServerHandler.java b/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/server/CredentialStoreServerHandler.java index ce54319..65ee48a 100644 --- a/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/server/CredentialStoreServerHandler.java +++ b/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/server/CredentialStoreServerHandler.java @@ -1,29 +1,35 @@ package org.apache.airavata.credential.store.server; import org.apache.airavata.common.exception.ApplicationSettingsException; -import org.apache.airavata.common.utils.ApplicationSettings; import org.apache.airavata.common.utils.DBUtil; -import org.apache.airavata.common.utils.DefaultKeyStorePasswordCallback; import org.apache.airavata.common.utils.ServerSettings; import org.apache.airavata.credential.store.cpi.CredentialStoreService; import org.apache.airavata.credential.store.cpi.cs_cpi_serviceConstants; +import org.apache.airavata.credential.store.credential.CommunityUser; +import org.apache.airavata.credential.store.credential.Credential; import org.apache.airavata.credential.store.datamodel.CertificateCredential; import org.apache.airavata.credential.store.datamodel.PasswordCredential; import org.apache.airavata.credential.store.datamodel.SSHCredential; import org.apache.airavata.credential.store.store.CredentialStoreException; -import org.apache.airavata.credential.store.store.impl.db.CredentialsDAO; +import org.apache.airavata.credential.store.store.impl.CertificateCredentialWriter; +import org.apache.airavata.credential.store.store.impl.CredentialReaderImpl; +import org.apache.airavata.credential.store.store.impl.SSHCredentialWriter; import org.apache.airavata.credential.store.util.TokenGenerator; +import org.apache.airavata.credential.store.util.Utility; import org.apache.thrift.TException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.sql.Connection; -import java.sql.SQLException; +import java.io.ByteArrayInputStream; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; public class CredentialStoreServerHandler implements CredentialStoreService.Iface { protected static Logger log = LoggerFactory.getLogger(CredentialStoreServerHandler.class); private DBUtil dbUtil; - private CredentialsDAO credentialsDAO; + private SSHCredentialWriter sshCredentialWriter; + private CertificateCredentialWriter certificateCredentialWriter; + private CredentialReaderImpl credentialReader; public CredentialStoreServerHandler() throws ApplicationSettingsException, IllegalAccessException, ClassNotFoundException, InstantiationException { String jdbcUrl = ServerSettings.getCredentialStoreDBURL(); @@ -33,8 +39,9 @@ public class CredentialStoreServerHandler implements CredentialStoreService.Ifac log.debug("Starting credential store, connecting to database - " + jdbcUrl + " DB user - " + userName + " driver name - " + driverName); dbUtil = new DBUtil(jdbcUrl, userName, password, driverName); - this.credentialsDAO = new CredentialsDAO(ApplicationSettings.getCredentialStoreKeyStorePath(), - ApplicationSettings.getCredentialStoreKeyAlias(), new DefaultKeyStorePasswordCallback()); + sshCredentialWriter = new SSHCredentialWriter(dbUtil); + certificateCredentialWriter = new CertificateCredentialWriter(dbUtil); + credentialReader = new CredentialReaderImpl(dbUtil); } @Override @@ -44,53 +51,58 @@ public class CredentialStoreServerHandler implements CredentialStoreService.Ifac @Override public String addSSHCredential(SSHCredential sshCredential) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException { - Connection connection = null; - org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential credential = new org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential(); - credential.setGateway(sshCredential.getGatewayId()); - credential.setPortalUserName(sshCredential.getUsername()); - // only username and gateway id will be sent by client. - String token = TokenGenerator.generateToken(sshCredential.getGatewayId(), null); - credential.setToken(token); - credential.setPassphrase(sshCredential.getPassphrase()); - if (sshCredential.getPrivateKey() != null){ - credential.setPrivateKey(sshCredential.getPrivateKey().getBytes()); - } - if (sshCredential.getPublicKey() != null){ - credential.setPublicKey(sshCredential.getPublicKey().getBytes()); - } try { - connection = dbUtil.getConnection(); - // First delete existing credentials - credentialsDAO.deleteCredentials(sshCredential.getGatewayId(), sshCredential.getToken(), connection); - // Add the new certificate - credentialsDAO.addCredentials(sshCredential.getGatewayId(), credential, connection); - - if (!connection.getAutoCommit()) { - connection.commit(); + org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential credential = new org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential(); + credential.setGateway(sshCredential.getGatewayId()); + credential.setPortalUserName(sshCredential.getUsername()); + // only username and gateway id will be sent by client. + String token = TokenGenerator.generateToken(sshCredential.getGatewayId(), null); + credential.setToken(token); + credential.setPassphrase(sshCredential.getPassphrase()); + if (sshCredential.getPrivateKey() != null) { + credential.setPrivateKey(sshCredential.getPrivateKey().getBytes()); } - return token; - - } catch (SQLException e) { - if (connection != null) { - try { - connection.rollback(); - } catch (SQLException e1) { - log.error("Unable to rollback transaction", e1); - } + if (sshCredential.getPublicKey() != null) { + credential.setPublicKey(sshCredential.getPublicKey().getBytes()); + } + if (sshCredential.getPublicKey() == null || sshCredential.getPrivateKey() == null) { + credential = Utility.generateKeyPair(sshCredential.getUsername(), sshCredential.getPassphrase()); } - log.error("Unable to retrieve database connection.", e); - throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Unable to retrieve database connection."); + sshCredentialWriter.writeCredentials(credential); + return token; } catch (CredentialStoreException e) { log.error("Error occurred while saving SSH Credentials.", e); throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while saving SSH Credentials."); - } finally { - DBUtil.cleanup(connection); + } catch (Exception e) { + log.error("Error occurred while generating key pair.", e); + throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while generating key pair.."); } } @Override public String addCertificateCredential(CertificateCredential certificateCredential) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException { - return null; + try { + org.apache.airavata.credential.store.credential.impl.certificate.CertificateCredential credential = new org.apache.airavata.credential.store.credential.impl.certificate.CertificateCredential(); + credential.setPortalUserName(certificateCredential.getCommunityUser().getUsername()); + credential.setCommunityUser(new CommunityUser(certificateCredential.getCommunityUser().getGatewayNmae(), + certificateCredential.getCommunityUser().getUsername(), certificateCredential.getCommunityUser().getUserEmail())); + String token = TokenGenerator.generateToken(certificateCredential.getCommunityUser().getGatewayNmae(), null); + credential.setToken(token); + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + ByteArrayInputStream stream = new ByteArrayInputStream(certificateCredential.getX509Cert().getBytes()); + X509Certificate certificate = (X509Certificate)cf.generateCertificate(stream); + X509Certificate[] certificates = new X509Certificate[1]; + certificates[0] = certificate; + credential.setCertificates(certificates); + certificateCredentialWriter.writeCredentials(credential); + return token; + } catch (CredentialStoreException e) { + log.error("Error occurred while saving SSH Credentials.", e); + throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while saving SSH Credentials."); + } catch (Exception e) { + log.error("Error occurred while generating key pair.", e); + throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while generating key pair.."); + } } @Override @@ -99,17 +111,66 @@ public class CredentialStoreServerHandler implements CredentialStoreService.Ifac } @Override - public SSHCredential getSSHCredential(String tokenId) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException { - return null; + public SSHCredential getSSHCredential(String tokenId, String gatewayId) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException { + try { + Credential credential = credentialReader.getCredential(gatewayId, tokenId); + if (credential instanceof org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential) { + org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential credential1 = (org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential) credential; + SSHCredential sshCredential = new SSHCredential(); + sshCredential.setUsername(credential1.getPortalUserName()); + sshCredential.setGatewayId(credential1.getGateway()); + sshCredential.setPublicKey(new String(credential1.getPublicKey())); + sshCredential.setPrivateKey(new String(credential1.getPrivateKey())); + sshCredential.setPassphrase(credential1.getPassphrase()); + sshCredential.setToken(credential1.getToken()); + sshCredential.setPersistedTime(credential1.getCertificateRequestedTime().getTime()); + return sshCredential; + } else { + log.info("Could not find SSH credentials for token - " + tokenId + " and " + + "gateway id - " + gatewayId); + return null; + } + } catch (CredentialStoreException e) { + log.error("Error occurred while retrieving SSH credentialfor token - " + tokenId + " and gateway id - " + gatewayId, e); + throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving SSH credential for token - " + tokenId + " and gateway id - " + gatewayId); + } } @Override - public CertificateCredential getCertificateCredential(String tokenId) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException { - return null; + public CertificateCredential getCertificateCredential(String tokenId, String gatewayId) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException { + try { + Credential credential = credentialReader.getCredential(gatewayId, tokenId); + if (credential instanceof org.apache.airavata.credential.store.credential.impl.certificate.CertificateCredential) { + org.apache.airavata.credential.store.credential.impl.certificate.CertificateCredential credential1 = (org.apache.airavata.credential.store.credential.impl.certificate.CertificateCredential) credential; + CertificateCredential certificateCredential = new CertificateCredential(); + org.apache.airavata.credential.store.datamodel.CommunityUser communityUser = new org.apache.airavata.credential.store.datamodel.CommunityUser(); + communityUser.setGatewayNmae(credential1.getCommunityUser().getGatewayName()); + communityUser.setUsername(credential1.getCommunityUser().getUserName()); + communityUser.setUserEmail(credential1.getCommunityUser().getUserEmail()); + certificateCredential.setCommunityUser(communityUser); + certificateCredential.setToken(credential1.getToken()); + certificateCredential.setLifeTime(credential1.getLifeTime()); + certificateCredential.setNotAfter(credential1.getNotAfter()); + certificateCredential.setNotBefore(credential1.getNotBefore()); + certificateCredential.setPersistedTime(credential1.getCertificateRequestedTime().getTime()); + if (credential1.getPrivateKey() != null){ + certificateCredential.setPrivateKey(credential1.getPrivateKey().toString()); + } + certificateCredential.setX509Cert(credential1.getCertificates()[0].toString()); + return certificateCredential; + } else { + log.info("Could not find Certificate credentials for token - " + tokenId + " and " + + "gateway id - " + gatewayId); + return null; + } + } catch (CredentialStoreException e) { + log.error("Error occurred while retrieving Certificate credential for token - " + tokenId + " and gateway id - " + gatewayId, e); + throw new org.apache.airavata.credential.store.exception.CredentialStoreException("Error occurred while retrieving Certificate credential for token - " + tokenId + " and gateway id - " + gatewayId); + } } @Override - public PasswordCredential getPasswordCredential(String tokenId) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException { + public PasswordCredential getPasswordCredential(String tokenId, String gatewayId) throws org.apache.airavata.credential.store.exception.CredentialStoreException, TException { return null; } http://git-wip-us.apache.org/repos/asf/airavata/blob/c6fe0dec/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/util/Utility.java ---------------------------------------------------------------------- diff --git a/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/util/Utility.java b/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/util/Utility.java index b4f7455..9f97ee9 100644 --- a/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/util/Utility.java +++ b/modules/credential-store-service/credential-store/src/main/java/org/apache/airavata/credential/store/util/Utility.java @@ -21,9 +21,15 @@ package org.apache.airavata.credential.store.util; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.KeyPair; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; import java.io.FileInputStream; import java.security.KeyStore; -import java.security.KeyStoreException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -34,6 +40,8 @@ import java.util.Date; */ public class Utility { + protected static Logger log = LoggerFactory.getLogger(Utility.class); + private static final String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss"; public static String convertDateToString(Date date) { @@ -75,4 +83,30 @@ public class Utility { return new char[0]; } + public static org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential generateKeyPair(String userName, String passphrase) throws Exception{ + JSch jsch=new JSch(); + try{ + KeyPair kpair=KeyPair.genKeyPair(jsch, KeyPair.RSA); + File file = File.createTempFile("id_rsa", ""); + String fileName = file.getAbsolutePath(); + + kpair.writePrivateKey(fileName,passphrase.getBytes()); + kpair.writePublicKey(fileName + ".pub" , ""); + kpair.dispose(); + byte[] priKey = FileUtils.readFileToByteArray(new File(fileName)); + + byte[] pubKey = FileUtils.readFileToByteArray(new File(fileName + ".pub")); + org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential sshCredential = new org.apache.airavata.credential.store.credential.impl.ssh.SSHCredential(); + sshCredential.setPrivateKey(priKey); + sshCredential.setPublicKey(pubKey); + sshCredential.setPortalUserName(userName); + sshCredential.setPassphrase(passphrase); + return sshCredential; + } + catch(Exception e){ + log.error("Error while creating key pair", e); + throw new Exception("Error while creating key pair", e); + } + } + } http://git-wip-us.apache.org/repos/asf/airavata/blob/c6fe0dec/modules/credential-store-service/cs-thrift-description/cs.cpi.service.thrift ---------------------------------------------------------------------- diff --git a/modules/credential-store-service/cs-thrift-description/cs.cpi.service.thrift b/modules/credential-store-service/cs-thrift-description/cs.cpi.service.thrift index 9191bd2..b4f078b 100644 --- a/modules/credential-store-service/cs-thrift-description/cs.cpi.service.thrift +++ b/modules/credential-store-service/cs-thrift-description/cs.cpi.service.thrift @@ -41,9 +41,9 @@ service CredentialStoreService { string addSSHCredential (1: required csDataModel.SSHCredential sshCredential) throws (1:credentialStoreErrors.CredentialStoreException csException) ; string addCertificateCredential (1: required csDataModel.CertificateCredential certificateCredential) throws (1:credentialStoreErrors.CredentialStoreException csException); string addPasswordCredential (1: required csDataModel.PasswordCredential passwordCredential) throws (1:credentialStoreErrors.CredentialStoreException csException); - csDataModel.SSHCredential getSSHCredential (1: required string tokenId) throws (1:credentialStoreErrors.CredentialStoreException csException); - csDataModel.CertificateCredential getCertificateCredential (1: required string tokenId) throws (1:credentialStoreErrors.CredentialStoreException csException); - csDataModel.PasswordCredential getPasswordCredential (1: required string tokenId) throws (1:credentialStoreErrors.CredentialStoreException csException); + csDataModel.SSHCredential getSSHCredential (1: required string tokenId, 2: required string gatewayId) throws (1:credentialStoreErrors.CredentialStoreException csException); + csDataModel.CertificateCredential getCertificateCredential (1: required string tokenId, 2: required string gatewayId) throws (1:credentialStoreErrors.CredentialStoreException csException); + csDataModel.PasswordCredential getPasswordCredential (1: required string tokenId, 2: required string gatewayId) throws (1:credentialStoreErrors.CredentialStoreException csException); http://git-wip-us.apache.org/repos/asf/airavata/blob/c6fe0dec/modules/credential-store-service/cs-thrift-description/csDataModel.thrift ---------------------------------------------------------------------- diff --git a/modules/credential-store-service/cs-thrift-description/csDataModel.thrift b/modules/credential-store-service/cs-thrift-description/csDataModel.thrift index 28dc977..efd3dd5 100644 --- a/modules/credential-store-service/cs-thrift-description/csDataModel.thrift +++ b/modules/credential-store-service/cs-thrift-description/csDataModel.thrift @@ -29,10 +29,10 @@ const string DEFAULT_ID = "DO_NOT_SET_AT_CLIENTS" struct SSHCredential { 1: required string gatewayId, 2: required string username, - 3: optional string passphrase, + 3: required string passphrase, 4: optional string publicKey, 5: optional string privateKey, - 6: optional i32 persistedTime, + 6: optional i64 persistedTime, 7: optional string token } @@ -44,18 +44,18 @@ struct CommunityUser { struct CertificateCredential { 1: required CommunityUser communityUser, - 2: optional string notAfter, - 3: optional string x509Cert, + 2: required string x509Cert, + 3: optional string notAfter, 4: optional string privateKey, - 5: optional i32 lifeTime, + 5: optional i64 lifeTime, 6: optional string notBefore - 7: optional i32 persistedTime, + 7: optional i64 persistedTime, 8: optional string token } struct PasswordCredential { 1: required string username, 2: required string password, - 3: optional i32 persistedTime, + 3: optional i64 persistedTime, 4: optional string token }
