From 502264bf0a5a218b9b0a62d5709d02057c6b24fc Mon Sep 17 00:00:00 2001 From: shriharsh Date: Fri, 3 Nov 2017 12:51:12 +0530 Subject: [PATCH] Issue #10 feat: Capturing configuration for SMS providers --- keycloak/sms-provider/Msg91Creds.json | 8 +- .../sms-provider/dependency-reduced-pom.xml | 156 ++++++++++++++++++ .../keycloak-email-phone-autthenticator.iml | 3 + .../KeycloakSmsAuthenticatorConstants.java | 5 +- .../KeycloakSmsAuthenticatorUtil.java | 32 +++- .../sunbird/sms/MessageProviderFactory.java | 1 + .../org/sunbird/sms/SmsConfigurationType.java | 4 + .../sms/amazonsns/AmazonSnsFactory.java | 1 + .../sunbird/sms/msg91/Msg91SmsProvider.java | 87 +++++++++- .../sunbird/sms/provider/ISmsProvider.java | 2 +- .../main/java/org/sunbird/utils/JsonUtil.java | 10 -- 11 files changed, 287 insertions(+), 22 deletions(-) create mode 100644 keycloak/sms-provider/dependency-reduced-pom.xml diff --git a/keycloak/sms-provider/Msg91Creds.json b/keycloak/sms-provider/Msg91Creds.json index 4887665e..f674f555 100644 --- a/keycloak/sms-provider/Msg91Creds.json +++ b/keycloak/sms-provider/Msg91Creds.json @@ -1,4 +1,8 @@ { - "token": "AKIAI4XIRSGGFIW5VOKQ", - "secret": "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" + "auth_key": "181585AvzynW0NSmU59f84bd6", + "sender": "TestSunbird", + "country": "91", + "route": "4", + "sms_method_type": "GET", + "sms_url": "http://api.msg91.com/api/sendhttp.php?" } \ No newline at end of file diff --git a/keycloak/sms-provider/dependency-reduced-pom.xml b/keycloak/sms-provider/dependency-reduced-pom.xml new file mode 100644 index 00000000..d7f9ecd5 --- /dev/null +++ b/keycloak/sms-provider/dependency-reduced-pom.xml @@ -0,0 +1,156 @@ + + + 4.0.0 + org.sunbird + keycloak-email-phone-autthenticator + 1.0-SNAPSHOT + + + + maven-shade-plugin + 3.0.0 + + + package + + shade + + + + + classworlds:classworlds + junit:junit + jmock:* + *:xml-apis + org.apache.maven:lib:tests + + + + + + + + + + + org.keycloak + keycloak-core + 3.2.0.Final + provided + + + keycloak-common + org.keycloak + + + bcprov-jdk15on + org.bouncycastle + + + bcpkix-jdk15on + org.bouncycastle + + + + + org.keycloak + keycloak-server-spi + 3.2.0.Final + provided + + + org.keycloak + keycloak-server-spi-private + 3.2.0.Final + provided + + + org.jboss.logging + jboss-logging + 3.3.1.Final + provided + + + org.keycloak + keycloak-services + 3.2.0.Final + provided + + + javax.mail-api + javax.mail + + + jboss-servlet-api_3.0_spec + org.jboss.spec.javax.servlet + + + twitter4j-core + org.twitter4j + + + resteasy-jaxrs + org.jboss.resteasy + + + jboss-jaxrs-api_2.0_spec + org.jboss.spec.javax.ws.rs + + + jboss-transaction-api_1.2_spec + org.jboss.spec.javax.transaction + + + resteasy-multipart-provider + org.jboss.resteasy + + + javase + com.google.zxing + + + bcprov-jdk15on + org.bouncycastle + + + bcpkix-jdk15on + org.bouncycastle + + + + + org.apache.httpcomponents + httpclient + 4.5 + provided + + + httpcore + org.apache.httpcomponents + + + commons-codec + commons-codec + + + + + junit + junit + 4.12 + test + + + hamcrest-core + org.hamcrest + + + + + + UTF-8 + 1.8 + 1.8 + + + diff --git a/keycloak/sms-provider/keycloak-email-phone-autthenticator.iml b/keycloak/sms-provider/keycloak-email-phone-autthenticator.iml index 8c11a5d4..499d7e3f 100644 --- a/keycloak/sms-provider/keycloak-email-phone-autthenticator.iml +++ b/keycloak/sms-provider/keycloak-email-phone-autthenticator.iml @@ -6,6 +6,7 @@ + @@ -56,5 +57,7 @@ + + \ No newline at end of file diff --git a/keycloak/sms-provider/src/main/java/org/sunbird/keycloak/KeycloakSmsAuthenticatorConstants.java b/keycloak/sms-provider/src/main/java/org/sunbird/keycloak/KeycloakSmsAuthenticatorConstants.java index 77837852..90e6b458 100644 --- a/keycloak/sms-provider/src/main/java/org/sunbird/keycloak/KeycloakSmsAuthenticatorConstants.java +++ b/keycloak/sms-provider/src/main/java/org/sunbird/keycloak/KeycloakSmsAuthenticatorConstants.java @@ -22,7 +22,6 @@ public class KeycloakSmsAuthenticatorConstants { public static final String USR_CRED_MDL_SMS_CODE = "sms-auth.code"; public static final String USR_CRED_MDL_SMS_EXP_TIME = "sms-auth.exp-time"; - public static final String SMS_PROVIDER_CONFIGURATIONS_PATH = "sms-provider/awsSnsCreds.json"; - - + public static final String AMAZON_SNS_PROVIDER_CONFIGURATIONS_PATH = "sms-provider/awsSnsCreds.json"; + public static final String MSG91_SMS_PROVIDER_CONFIGURATIONS_PATH = "sms-provider/Msg91Creds.json"; } diff --git a/keycloak/sms-provider/src/main/java/org/sunbird/keycloak/KeycloakSmsAuthenticatorUtil.java b/keycloak/sms-provider/src/main/java/org/sunbird/keycloak/KeycloakSmsAuthenticatorUtil.java index fec8b5b2..d5c11548 100644 --- a/keycloak/sms-provider/src/main/java/org/sunbird/keycloak/KeycloakSmsAuthenticatorUtil.java +++ b/keycloak/sms-provider/src/main/java/org/sunbird/keycloak/KeycloakSmsAuthenticatorUtil.java @@ -88,12 +88,20 @@ public static String setDefaultCountryCodeIfZero(String mobileNumber) { } static boolean sendSmsCode(String mobileNumber, String code, AuthenticatorConfigModel config) { - // Send an SMS - String smsText = createMessage(code, mobileNumber, config); logger.debug("KeycloakSmsAuthenticatorUtil@sendSmsCode : smsText - " + smsText); - String filePath = new File(KeycloakSmsAuthenticatorConstants.SMS_PROVIDER_CONFIGURATIONS_PATH).getAbsolutePath(); + Boolean amazonSmsProviderStatus = msgViaAmazonSns(mobileNumber, smsText); + if (amazonSmsProviderStatus != null) return amazonSmsProviderStatus; + + Boolean msg91SmsProviderStatus = sendViaMsg91(mobileNumber, code); + if (msg91SmsProviderStatus != null) return msg91SmsProviderStatus; + + return false; + } + + private static Boolean msgViaAmazonSns(String mobileNumber, String smsText) { + String filePath = new File(KeycloakSmsAuthenticatorConstants.AMAZON_SNS_PROVIDER_CONFIGURATIONS_PATH).getAbsolutePath(); logger.debug("KeycloakSmsAuthenticatorUtil@sendSmsCode : filePath - " + filePath); if (!StringUtils.isNullOrEmpty(filePath)) { @@ -106,8 +114,24 @@ static boolean sendSmsCode(String mobileNumber, String code, AuthenticatorConfig return amazonSmsProvider.send(setDefaultCountryCodeIfZero(mobileNumber), smsText); } } + return null; + } - return false; + private static Boolean sendViaMsg91(String mobileNumber, String code) { + String filePath = new File(KeycloakSmsAuthenticatorConstants.MSG91_SMS_PROVIDER_CONFIGURATIONS_PATH).getAbsolutePath(); + logger.debug("KeycloakSmsAuthenticatorUtil@sendSmsCode : filePath - " + filePath); + + if (!StringUtils.isNullOrEmpty(filePath)) { + Map configurations = JsonUtil.readFromJson(filePath); + logger.debug("KeycloakSmsAuthenticatorUtil@sendSmsCode : configurations - " + configurations); + + ISmsProvider msg91SmsProvider = MessageProviderFactory.getMsg91SmsProvider(configurations); + + if (msg91SmsProvider != null) { + return msg91SmsProvider.send(setDefaultCountryCodeIfZero(mobileNumber), code); + } + } + return null; } static String getSmsCode(long nrOfDigits) { diff --git a/keycloak/sms-provider/src/main/java/org/sunbird/sms/MessageProviderFactory.java b/keycloak/sms-provider/src/main/java/org/sunbird/sms/MessageProviderFactory.java index 97399766..406dc4fb 100644 --- a/keycloak/sms-provider/src/main/java/org/sunbird/sms/MessageProviderFactory.java +++ b/keycloak/sms-provider/src/main/java/org/sunbird/sms/MessageProviderFactory.java @@ -1,5 +1,6 @@ package org.sunbird.sms; + import org.sunbird.sms.amazonsns.AmazonSnsFactory; import org.sunbird.sms.msg91.Msg91SmsProviderFactory; import org.sunbird.sms.provider.ISmsProvider; diff --git a/keycloak/sms-provider/src/main/java/org/sunbird/sms/SmsConfigurationType.java b/keycloak/sms-provider/src/main/java/org/sunbird/sms/SmsConfigurationType.java index 4ed62d51..0ca7cac4 100644 --- a/keycloak/sms-provider/src/main/java/org/sunbird/sms/SmsConfigurationType.java +++ b/keycloak/sms-provider/src/main/java/org/sunbird/sms/SmsConfigurationType.java @@ -14,4 +14,8 @@ public interface SmsConfigurationType { String CONF_SMS_PROXY_PASSWORD = "sms_proxy_password"; String CONF_AUTH_METHOD_BASIC = "basic_authentication"; String CONF_AUTH_METHOD_INMESSAGE = "in_message_authentication"; + String CONF_AUTH_KEY = "auth_key"; + String CONF_SMS_SENDER = "sender"; + String CONF_SMS_COUNTRY = "country"; + String CONF_SMS_ROUTE = "route"; } diff --git a/keycloak/sms-provider/src/main/java/org/sunbird/sms/amazonsns/AmazonSnsFactory.java b/keycloak/sms-provider/src/main/java/org/sunbird/sms/amazonsns/AmazonSnsFactory.java index 90b51e46..a7e0fc08 100644 --- a/keycloak/sms-provider/src/main/java/org/sunbird/sms/amazonsns/AmazonSnsFactory.java +++ b/keycloak/sms-provider/src/main/java/org/sunbird/sms/amazonsns/AmazonSnsFactory.java @@ -1,5 +1,6 @@ package org.sunbird.sms.amazonsns; + import org.sunbird.sms.provider.ISmsProvider; import org.sunbird.sms.provider.ISmsProviderFactory; diff --git a/keycloak/sms-provider/src/main/java/org/sunbird/sms/msg91/Msg91SmsProvider.java b/keycloak/sms-provider/src/main/java/org/sunbird/sms/msg91/Msg91SmsProvider.java index acf610f1..c099c790 100644 --- a/keycloak/sms-provider/src/main/java/org/sunbird/sms/msg91/Msg91SmsProvider.java +++ b/keycloak/sms-provider/src/main/java/org/sunbird/sms/msg91/Msg91SmsProvider.java @@ -1,5 +1,6 @@ package org.sunbird.sms.msg91; +import com.amazonaws.util.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.StatusLine; @@ -39,9 +40,91 @@ public void configure(Map configurations) { @Override public boolean send(String phoneNumber, String smsText) { - return sendSmsCode(phoneNumber, smsText); + return sendSms(phoneNumber, smsText); } + private boolean sendSms(String mobileNumber, String smsText) { + // Send an SMS + logger.debug("Msg91SmsProvider@Sending " + smsText + " to mobileNumber " + mobileNumber); + + String gateWayUrl = SMSAuthenticatorUtil.getConfigString(configurations, SmsConfigurationType.CONF_SMS_URL); + String authKey = SMSAuthenticatorUtil.getConfigString(configurations, SmsConfigurationType.CONF_AUTH_KEY); + String sender = SMSAuthenticatorUtil.getConfigString(configurations, SmsConfigurationType.CONF_SMS_SENDER); + String country = SMSAuthenticatorUtil.getConfigString(configurations, SmsConfigurationType.CONF_SMS_COUNTRY); + String smsMethodType = SMSAuthenticatorUtil.getConfigString(configurations, SmsConfigurationType.CONF_SMS_METHOD_TYPE); + String smsRoute = SMSAuthenticatorUtil.getConfigString(configurations, SmsConfigurationType.CONF_SMS_ROUTE); + + logger.debug("Msg91SmsProvider@SMS Provider parameters \n" + + "Gateway - " + gateWayUrl + "\n" + + "authKey - " + authKey + "\n" + + "sender - " + sender + "\n" + + "country - " + country + "\n" + + "smsMethodType - " + smsMethodType + "\n" + + "smsRoute - " + smsRoute + "\n" + ); + + + CloseableHttpClient httpClient = null; + try { + URL smsURL = (gateWayUrl != null && gateWayUrl.length() > 0) ? new URL(gateWayUrl) : null; + + if (smsURL == null) { + logger.error("Msg91SmsProvider@ SMS gateway URL is not configured."); + return false; + } + + httpClient = HttpClients.createDefault(); + + String path = null; + + if (!StringUtils.isNullOrEmpty(gateWayUrl) && !StringUtils.isNullOrEmpty(sender) && !StringUtils.isNullOrEmpty(smsRoute) + && !StringUtils.isNullOrEmpty(mobileNumber) && !StringUtils.isNullOrEmpty(authKey) && !StringUtils.isNullOrEmpty(country) + && !StringUtils.isNullOrEmpty(smsText)) { + path = getCompletePath(gateWayUrl, sender, smsRoute, mobileNumber, authKey, country, smsText); + + logger.debug("Msg91SmsProvider -Executing request - " + path); + + HttpGet httpGet = new HttpGet(path); + + CloseableHttpResponse response = httpClient.execute(httpGet); + StatusLine sl = response.getStatusLine(); + response.close(); + if (sl.getStatusCode() != 200) { + logger.error("SMS code for " + mobileNumber + " could not be sent: " + sl.getStatusCode() + " - " + sl.getReasonPhrase()); + } + return sl.getStatusCode() == 200; + + } else { + logger.debug("Msg91SmsProvider - Some mandatory parameters are empty!"); + return false; + } + } catch (IOException e) { + logger.error(e); + return false; + } finally { + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException ignore) { + // Ignore ... + } + } + } + + } + + private String getCompletePath(String gateWayUrl, String sender, String smsRoute, String mobileNumber, String authKey, String country, String smsText) { + String completeUrl = gateWayUrl + + "sender=" + sender + + "&route=" + smsRoute + + "&mobiles=" + mobileNumber + + "&authkey=" + authKey + + "&country=" + country + + "&message=" + smsText; + return completeUrl; + } + + private boolean sendSmsCode(String mobileNumber, String smsText) { // Send an SMS logger.debug("Sending " + smsText + " to mobileNumber " + mobileNumber); @@ -166,7 +249,7 @@ private CredentialsProvider getCredentialsProvider(String smsUsr, String smsPwd, private String getPath(String mobileNumber, URL smsURL, String smsText) throws UnsupportedEncodingException { String path = smsURL.getPath(); - if(smsURL.getQuery() != null && smsURL.getQuery().length() > 0) { + if (smsURL.getQuery() != null && smsURL.getQuery().length() > 0) { path += smsURL.getQuery(); } path = path.replaceFirst("\\{message\\}", URLEncoder.encode(smsText, "UTF-8")); diff --git a/keycloak/sms-provider/src/main/java/org/sunbird/sms/provider/ISmsProvider.java b/keycloak/sms-provider/src/main/java/org/sunbird/sms/provider/ISmsProvider.java index b6e41e70..91dda602 100644 --- a/keycloak/sms-provider/src/main/java/org/sunbird/sms/provider/ISmsProvider.java +++ b/keycloak/sms-provider/src/main/java/org/sunbird/sms/provider/ISmsProvider.java @@ -2,5 +2,5 @@ public interface ISmsProvider extends ISmsProviderConfigurations { - boolean send(String phoneNumber,String smsText); + boolean send(String phoneNumber, String smsText); } diff --git a/keycloak/sms-provider/src/main/java/org/sunbird/utils/JsonUtil.java b/keycloak/sms-provider/src/main/java/org/sunbird/utils/JsonUtil.java index 98a68c51..e955b40d 100644 --- a/keycloak/sms-provider/src/main/java/org/sunbird/utils/JsonUtil.java +++ b/keycloak/sms-provider/src/main/java/org/sunbird/utils/JsonUtil.java @@ -24,16 +24,6 @@ public static Map readFromJson(String jsonFile) { e.printStackTrace(); } -// String json = null; -// try { -// JSONParser parser = new JSONParser(); -// //Use JSONObject for simple JSON and JSONArray for array of JSON. -// JSONObject data = (JSONObject) parser.parse(new FileReader(jsonFile));//path to the JSON file. -// json = data.toString(); -// } catch (IOException | ParseException e) { -// e.printStackTrace(); -// } - return map; }