From 11ba925c70acb509872fa163ce006b15cce6bf26 Mon Sep 17 00:00:00 2001 From: Dave Pollastrini Date: Mon, 10 Oct 2016 14:02:42 -0700 Subject: [PATCH 1/2] Add ability to load API key file from classpath via URI. --- .../com/cybersource/ws/client/MerchantConfig.java | 7 +++++++ .../client/SignedAndEncryptedMessageHandler.java | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/java/src/main/java/com/cybersource/ws/client/MerchantConfig.java b/java/src/main/java/com/cybersource/ws/client/MerchantConfig.java index a1b5bc73..cbda8d47 100644 --- a/java/src/main/java/com/cybersource/ws/client/MerchantConfig.java +++ b/java/src/main/java/com/cybersource/ws/client/MerchantConfig.java @@ -19,6 +19,7 @@ package com.cybersource.ws.client; import java.io.File; +import java.net.URI; import java.text.MessageFormat; import java.util.Properties; @@ -38,6 +39,7 @@ public class MerchantConfig { private final Properties props; private final String merchantID; + private URI keyUri; private String keysDirectory; private String keyAlias; private String keyPassword; @@ -73,6 +75,10 @@ public String getMerchantID() { return merchantID; } + public URI getKeyUri() { + return keyUri; + } + public String getKeysDirectory() { return keysDirectory; } @@ -231,6 +237,7 @@ public MerchantConfig(Properties _props, String _merchantID) sendToProduction = getBooleanProperty(merchantID, "sendToProduction", false); sendToAkamai = getBooleanProperty(merchantID, "sendToAkamai", false); targetAPIVersion = getProperty(merchantID, "targetAPIVersion"); + keyUri = (URI) props.getOrDefault("keyFileUri", null); keyFilename = getProperty(merchantID, "keyFilename"); serverURL = getProperty(merchantID, "serverURL"); namespaceURI = getProperty(merchantID, "namespaceURI"); diff --git a/java/src/main/java/com/cybersource/ws/client/SignedAndEncryptedMessageHandler.java b/java/src/main/java/com/cybersource/ws/client/SignedAndEncryptedMessageHandler.java index c7b1ed14..453ecd77 100644 --- a/java/src/main/java/com/cybersource/ws/client/SignedAndEncryptedMessageHandler.java +++ b/java/src/main/java/com/cybersource/ws/client/SignedAndEncryptedMessageHandler.java @@ -11,6 +11,7 @@ import java.io.FileInputStream; import java.io.IOException; +import java.net.URI; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -96,7 +97,19 @@ private static void readAndStoreCertificateAndPrivateKey( } try { - merchantKeyStore.load(new FileInputStream(merchantConfig.getKeyFile()), merchantConfig.getKeyPassword().toCharArray()); + URI keyUri = merchantConfig.getKeyUri(); + if (keyUri != null) { + if ("classpath".equalsIgnoreCase(keyUri.getScheme())) { + merchantKeyStore.load( + SignedAndEncryptedMessageHandler.class.getResourceAsStream(keyUri.getPath()), + merchantConfig.getKeyPassword().toCharArray() + ); + } else { + throw new IllegalArgumentException("Unsupported URI scheme for key file."); + } + } else { + merchantKeyStore.load(new FileInputStream(merchantConfig.getKeyFile()), merchantConfig.getKeyPassword().toCharArray()); + } } catch (IOException e) { logger.log(Logger.LT_EXCEPTION, "Exception while loading KeyStore, '" + merchantConfig.getKeyFilename() + "'"); throw new SignException(e); From 128210e7e5b2dd939994004bc85557e76d37c7ee Mon Sep 17 00:00:00 2001 From: Dave Pollastrini Date: Mon, 10 Oct 2016 14:59:03 -0700 Subject: [PATCH 2/2] Fix CI error. Use method not support by target java sdk. --- .../main/java/com/cybersource/ws/client/MerchantConfig.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/src/main/java/com/cybersource/ws/client/MerchantConfig.java b/java/src/main/java/com/cybersource/ws/client/MerchantConfig.java index cbda8d47..ba2ae18a 100644 --- a/java/src/main/java/com/cybersource/ws/client/MerchantConfig.java +++ b/java/src/main/java/com/cybersource/ws/client/MerchantConfig.java @@ -237,7 +237,9 @@ public MerchantConfig(Properties _props, String _merchantID) sendToProduction = getBooleanProperty(merchantID, "sendToProduction", false); sendToAkamai = getBooleanProperty(merchantID, "sendToAkamai", false); targetAPIVersion = getProperty(merchantID, "targetAPIVersion"); - keyUri = (URI) props.getOrDefault("keyFileUri", null); + if (props.containsKey("keyFileUri")) { + keyUri = (URI) props.get("keyFileUri"); + } keyFilename = getProperty(merchantID, "keyFilename"); serverURL = getProperty(merchantID, "serverURL"); namespaceURI = getProperty(merchantID, "namespaceURI");