Skip to content

Commit

Permalink
Merge pull request #11 from project-sunbird/sms_provider_configuraton
Browse files Browse the repository at this point in the history
Sms provider configuraton
  • Loading branch information
kochhar authored Nov 8, 2017
2 parents d5d3a6e + 30c5796 commit cb4d646
Show file tree
Hide file tree
Showing 16 changed files with 744 additions and 13 deletions.
156 changes: 156 additions & 0 deletions keycloak/sms-provider/dependency-reduced-pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sunbird</groupId>
<artifactId>keycloak-email-phone-autthenticator</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>classworlds:classworlds</exclude>
<exclude>junit:junit</exclude>
<exclude>jmock:*</exclude>
<exclude>*:xml-apis</exclude>
<exclude>org.apache.maven:lib:tests</exclude>
</excludes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>3.2.0.Final</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>keycloak-common</artifactId>
<groupId>org.keycloak</groupId>
</exclusion>
<exclusion>
<artifactId>bcprov-jdk15on</artifactId>
<groupId>org.bouncycastle</groupId>
</exclusion>
<exclusion>
<artifactId>bcpkix-jdk15on</artifactId>
<groupId>org.bouncycastle</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-spi</artifactId>
<version>3.2.0.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-spi-private</artifactId>
<version>3.2.0.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.1.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-services</artifactId>
<version>3.2.0.Final</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>javax.mail-api</artifactId>
<groupId>javax.mail</groupId>
</exclusion>
<exclusion>
<artifactId>jboss-servlet-api_3.0_spec</artifactId>
<groupId>org.jboss.spec.javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>twitter4j-core</artifactId>
<groupId>org.twitter4j</groupId>
</exclusion>
<exclusion>
<artifactId>resteasy-jaxrs</artifactId>
<groupId>org.jboss.resteasy</groupId>
</exclusion>
<exclusion>
<artifactId>jboss-jaxrs-api_2.0_spec</artifactId>
<groupId>org.jboss.spec.javax.ws.rs</groupId>
</exclusion>
<exclusion>
<artifactId>jboss-transaction-api_1.2_spec</artifactId>
<groupId>org.jboss.spec.javax.transaction</groupId>
</exclusion>
<exclusion>
<artifactId>resteasy-multipart-provider</artifactId>
<groupId>org.jboss.resteasy</groupId>
</exclusion>
<exclusion>
<artifactId>javase</artifactId>
<groupId>com.google.zxing</groupId>
</exclusion>
<exclusion>
<artifactId>bcprov-jdk15on</artifactId>
<groupId>org.bouncycastle</groupId>
</exclusion>
<exclusion>
<artifactId>bcpkix-jdk15on</artifactId>
<groupId>org.bouncycastle</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>httpcore</artifactId>
<groupId>org.apache.httpcomponents</groupId>
</exclusion>
<exclusion>
<artifactId>commons-codec</artifactId>
<groupId>commons-codec</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>hamcrest-core</artifactId>
<groupId>org.hamcrest</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>

4 changes: 4 additions & 0 deletions keycloak/sms-provider/keycloak-email-phone-autthenticator.iml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
Expand Down Expand Up @@ -56,5 +57,8 @@
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.6.7" level="project" />
<orderEntry type="library" name="Maven: joda-time:joda-time:2.8.1" level="project" />
<orderEntry type="library" name="Maven: com.amazonaws:jmespath-java:1.11.173" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.3.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
</component>
</module>
5 changes: 5 additions & 0 deletions keycloak/sms-provider/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@
<artifactId>aws-java-sdk-sns</artifactId>
<version>1.11.173</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,7 @@ public class KeycloakSmsAuthenticatorConstants {
// User credentials (used to persist the sent sms code + expiration time cluster wide)
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 AMAZON_SNS_PROVIDER_CONFIGURATIONS_PATH = "sms-provider/awsSnsCreds.json";
public static final String MSG91_SMS_PROVIDER_CONFIGURATIONS_PATH = "sms-provider/Msg91Creds.json";
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package org.sunbird.keycloak;

import com.amazonaws.services.sns.model.PublishResult;
import com.amazonaws.util.StringUtils;
import org.jboss.logging.Logger;
import org.keycloak.models.AuthenticatorConfigModel;
import org.keycloak.models.UserModel;
import org.sunbird.aws.snsclient.SnsNotificationService;
import org.sunbird.sms.msg91.Msg91SmsProviderFactory;
import org.sunbird.sms.provider.ISmsProvider;
import org.sunbird.utils.JsonUtil;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
Expand Down Expand Up @@ -84,20 +88,32 @@ public static String setDefaultCountryCodeIfZero(String mobileNumber) {
}

static boolean sendSmsCode(String mobileNumber, String code, AuthenticatorConfigModel config) {
// Send an SMS
KeycloakSmsAuthenticatorUtil.logger.debug("Sending " + code + " to mobileNumber " + mobileNumber);
String smsText = createMessage(code, mobileNumber, config);
logger.debug("KeycloakSmsAuthenticatorUtil@sendSmsCode : smsText - " + smsText);

String smsUsr = getConfigString(config, KeycloakSmsAuthenticatorConstants.CONF_PRP_SMS_CLIENTTOKEN);
String smsPwd = getConfigString(config, KeycloakSmsAuthenticatorConstants.CONF_PRP_SMS_CLIENTSECRET);
Boolean msg91SmsProviderStatus = send(mobileNumber, smsText);
if (msg91SmsProviderStatus != null) return msg91SmsProviderStatus;

String smsText = createMessage(code, mobileNumber, config);
try {
PublishResult send_result = new SnsNotificationService().send(setDefaultCountryCodeIfZero(mobileNumber), smsText, smsUsr, smsPwd);
return true;
} catch (Exception e) {
//Just like pokemon
return false;
return false;
}

private static Boolean send(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<String, String> configurations = JsonUtil.readFromJson(filePath);
logger.debug("KeycloakSmsAuthenticatorUtil@sendSmsCode : configurations - " + configurations);

Msg91SmsProviderFactory msg91SmsProviderFactory = new Msg91SmsProviderFactory();

ISmsProvider msg91SmsProvider = msg91SmsProviderFactory.create(configurations);

if (msg91SmsProvider != null) {
return msg91SmsProvider.send(mobileNumber, code);
}
}
return null;
}

static String getSmsCode(long nrOfDigits) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.sunbird.sms;

import java.util.Map;

public class SMSConfigurationUtil {

public static String getConfigString(Map<String, String> config, String configName) {
return getConfigString(config, configName, null);
}

public static String getConfigString(Map<String, String> config, String configName, String defaultValue) {

String value = defaultValue;

if (config.containsKey(configName)) {
// Get value
value = config.get(configName);
}

return value;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.sunbird.sms;

public final class SmsConfigurationConstants {
public static final String CONF_SMS_TOKEN = "token";
public static final String CONF_SMS_SECRET = "secret";
public static final String CONF_SMS_BASE_URL = "sms_base_url";
public static final String CONF_SMS_GET_URL = "sms_get_url";
public static final String CONF_SMS_POST_URL = "sms_post_url";
public static final String CONF_SMS_METHOD_TYPE = "sms_method_type";
public static final String CONF_SMS_USERNAME = "sms_username";
public static final String CONF_SMS_PASSWORD = "sms_password";
public static final String CONF_SMS_AUTHTYPE = "sms_authtype";
public static final String CONF_SMS_CONTENT_TYPE = "sms_content_type";
public static final String CONF_SMS_PROXY_URL = "sms_proxy_url";
public static final String CONF_SMS_PROXY_USERNAME = "sms_proxy_username";
public static final String CONF_SMS_PROXY_PASSWORD = "sms_proxy_password";
public static final String CONF_AUTH_METHOD_BASIC = "basic_authentication";
public static final String CONF_AUTH_METHOD_INMESSAGE = "in_message_authentication";
public static final String CONF_AUTH_KEY = "auth_key";
public static final String CONF_SMS_SENDER = "sender";
public static final String CONF_SMS_COUNTRY = "country";
public static final String CONF_SMS_ROUTE = "route";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.sunbird.sms.amazonsns;


import org.sunbird.sms.provider.ISmsProvider;
import org.sunbird.sms.provider.ISmsProviderFactory;

import java.util.Map;

public class AmazonSnsFactory implements ISmsProviderFactory {
private static AmazonSnsProvider amazonSnsProvider = null;

@Override
public ISmsProvider create(Map<String, String> configurations) {
if (amazonSnsProvider == null) {
amazonSnsProvider = new AmazonSnsProvider();
amazonSnsProvider.configure(configurations);
}

return amazonSnsProvider;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package org.sunbird.sms.amazonsns;

import com.amazonaws.services.sns.model.MessageAttributeValue;
import com.amazonaws.services.sns.model.PublishRequest;
import org.jboss.logging.Logger;
import org.sunbird.aws.snsclient.SnsClientFactory;
import org.sunbird.sms.SMSConfigurationUtil;
import org.sunbird.sms.SmsConfigurationConstants;
import org.sunbird.sms.provider.ISmsProvider;

import java.util.HashMap;
import java.util.Map;

public class AmazonSnsProvider implements ISmsProvider {

private static Logger logger = Logger.getLogger(AmazonSnsProvider.class);

private Map<String, String> configurations;

@Override
public boolean send(String phoneNumber, String smsText) {
logger.debug("AmazonSnsProvider@send : phoneNumber - " + phoneNumber + " & Sms text - " + smsText);

Map<String, MessageAttributeValue> smsAttributes = new HashMap<String, MessageAttributeValue>();
smsAttributes.put("AWS.SNS.SMS.SenderID", new MessageAttributeValue()
.withStringValue("HomeOffice")
.withDataType("String"));

String clientToken = SMSConfigurationUtil.getConfigString(configurations, SmsConfigurationConstants.CONF_SMS_TOKEN);
String clientSecret = SMSConfigurationUtil.getConfigString(configurations, SmsConfigurationConstants.CONF_SMS_SECRET);

logger.debug("AmazonSnsProvider@send : clientToken - " + clientToken + " & clientSecret - " + clientSecret);


try {
SnsClientFactory.getSnsClient(clientToken, clientSecret).publish(new PublishRequest()
.withMessage(smsText)
.withPhoneNumber(phoneNumber)
.withMessageAttributes(smsAttributes));

return true;
} catch (Exception e) {
logger.debug("AmazonSnsProvider@Send : Exception Caught -" + e.getMessage());
return false;
}
}

@Override
public void configure(Map<String, String> configurations) {
this.configurations = configurations;
}
}
Loading

0 comments on commit cb4d646

Please sign in to comment.