From aca5987bc191ea024c44c7a86de5dc0d4cc29192 Mon Sep 17 00:00:00 2001 From: "manzarul.haque" Date: Mon, 30 Oct 2017 20:43:43 +0530 Subject: [PATCH 1/4] Issue #SB-0 feat: adding for announcement --- actors/src/main/resources/cassandra.cql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/actors/src/main/resources/cassandra.cql b/actors/src/main/resources/cassandra.cql index 4b8d6b00d..416958b1f 100644 --- a/actors/src/main/resources/cassandra.cql +++ b/actors/src/main/resources/cassandra.cql @@ -594,4 +594,8 @@ creation of id = one way hash of (userId##skillnametolowercase) */ CREATE TABLE IF NOT EXISTS sunbird.skills(id text,skills list, PRIMARY KEY (id)); +ALTER TABLE sunbird.user ADD profileVisibility map; +insert into sunbird.role_group (id,name) values ('ANNOUNCEMENT_SENDER','Announcement Sender'); +update sunbird.role_group set url_action_ids=['Announcement Sender'] where id='ANNOUNCEMENT_SENDER'; +insert into sunbird.role (id,name,rolegroupid,status) values ('ANNOUNCEMENT_SENDER','Announcement Sender',['ANNOUNCEMENT_SENDER'],1); \ No newline at end of file From cef34b51d9a1f7eafedf9ce3e2c0f77f240bca5b Mon Sep 17 00:00:00 2001 From: vijethas Date: Thu, 2 Nov 2017 11:36:46 +0530 Subject: [PATCH 2/4] Issue #SB-488 feat : Master key API changes --- .../learner/actors/RequestRouterActor.java | 7 + .../learner/actors/UserManagementActor.java | 4 +- .../assessment/AssessmentItemActor.java | 4 +- .../actors/client/ClientManagementActor.java | 173 ++++++++++++++++ .../java/org/sunbird/learner/util/Util.java | 2 +- actors/src/main/resources/application.conf | 10 + actors/src/main/resources/cassandra.cql | 4 + .../client/ClientManagementActorTest.java | 195 ++++++++++++++++++ 8 files changed, 394 insertions(+), 5 deletions(-) create mode 100644 actors/src/main/java/org/sunbird/learner/actors/client/ClientManagementActor.java create mode 100644 actors/src/test/java/org/sunbird/learner/actors/client/ClientManagementActorTest.java diff --git a/actors/src/main/java/org/sunbird/learner/actors/RequestRouterActor.java b/actors/src/main/java/org/sunbird/learner/actors/RequestRouterActor.java index ed9eec59e..f48d7c0d9 100644 --- a/actors/src/main/java/org/sunbird/learner/actors/RequestRouterActor.java +++ b/actors/src/main/java/org/sunbird/learner/actors/RequestRouterActor.java @@ -17,6 +17,7 @@ import org.sunbird.learner.actors.bulkupload.BulkUploadBackGroundJobActor; import org.sunbird.learner.actors.bulkupload.BulkUploadManagementActor; import org.sunbird.learner.actors.bulkupload.UserDataEncryptionDecryptionServiceActor; +import org.sunbird.learner.actors.client.ClientManagementActor; import org.sunbird.learner.actors.skill.SkillmanagementActor; import org.sunbird.learner.actors.fileuploadservice.FileUploadServiceActor; import org.sunbird.learner.actors.notificationservice.EmailServiceActor; @@ -80,6 +81,7 @@ public class RequestRouterActor extends UntypedAbstractActor { private ActorRef badgesActor; private ActorRef skillManagementActor; private ActorRef tenantPrefManagementActor; + private ActorRef clientManagementActor; private ExecutionContext ec; @@ -115,6 +117,7 @@ public class RequestRouterActor extends UntypedAbstractActor { "userDataEncryptionDecryptionServiceActor"; private static final String SKILL_MANAGEMENT_ACTOR = "skillManagementActor"; private static final String TENANT_PREFERENCE_MNGT_ACTOR = "tenantPreferenceManagementActor"; + private static final String CLIENT_MANAGEMENT_ACTOR = "clientManagementActor"; @@ -198,6 +201,7 @@ public RequestRouterActor() { auditLogManagementActor = getContext().actorOf(Props.create(ActorAuditLogServiceImpl.class), AUDIT_LOG_MGMT_ACTOR); skillManagementActor = getContext().actorOf(FromConfig.getInstance().props(Props.create(SkillmanagementActor.class)), SKILL_MANAGEMENT_ACTOR); tenantPrefManagementActor = getContext().actorOf(FromConfig.getInstance().props(Props.create(TenantPreferenceManagementActor.class)), TENANT_PREFERENCE_MNGT_ACTOR); + clientManagementActor = getContext().actorOf(FromConfig.getInstance().props(Props.create(ClientManagementActor.class)), CLIENT_MANAGEMENT_ACTOR); ec = getContext().dispatcher(); initializeRouterMap(); } @@ -340,6 +344,9 @@ private void initializeRouterMap() { routerMap.put(ActorOperations.UPDATE_TENANT_PREFERENCE.getValue(), tenantPrefManagementActor); routerMap.put(ActorOperations.GET_TENANT_PREFERENCE.getValue(), tenantPrefManagementActor); routerMap.put(ActorOperations.UPDATE_TC_STATUS_OF_USER.getValue(), tenantPrefManagementActor); + routerMap.put(ActorOperations.REGISTER_CLIENT.getValue(), clientManagementActor); + routerMap.put(ActorOperations.UPDATE_CLIENT_KEY.getValue(), clientManagementActor); + routerMap.put(ActorOperations.GET_CLIENT_KEY.getValue(), clientManagementActor); } diff --git a/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java b/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java index c27d1a4ff..5c77ffa0e 100644 --- a/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java +++ b/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java @@ -551,7 +551,7 @@ private void login(Request actorMessage) throws Exception{ userAuthMap.put(JsonKey.USER_ID, resultMap.get(JsonKey.ID)); userAuthMap.put(JsonKey.CREATED_DATE, ProjectUtil.getFormattedDate()); - String userAuth = ProjectUtil.createUserAuthToken((String) resultMap.get(JsonKey.ID), + String userAuth = ProjectUtil.createAuthToken((String) resultMap.get(JsonKey.ID), (String) reqMap.get(JsonKey.SOURCE)); userAuthMap.put(JsonKey.ID, userAuth); checkForDuplicateUserAuthToken(userAuthMap, resultMap, reqMap); @@ -1538,7 +1538,7 @@ private void checkForDuplicateUserAuthToken(Map userAuthMap, } else { cassandraOperation.deleteRecord(userAuthDbInfo.getKeySpace(), userAuthDbInfo.getTableName(), (String) (userAuthList.get(0)).get(JsonKey.ID)); - userAuth = ProjectUtil.createUserAuthToken((String) resultMap.get(JsonKey.ID), + userAuth = ProjectUtil.createAuthToken((String) resultMap.get(JsonKey.ID), (String) reqMap.get(JsonKey.SOURCE)); userAuthMap.put(JsonKey.ID, userAuth); userAuthMap.put(JsonKey.CREATED_DATE, ProjectUtil.getFormattedDate()); diff --git a/actors/src/main/java/org/sunbird/learner/actors/assessment/AssessmentItemActor.java b/actors/src/main/java/org/sunbird/learner/actors/assessment/AssessmentItemActor.java index d1e6d7a74..cbefb5a7c 100644 --- a/actors/src/main/java/org/sunbird/learner/actors/assessment/AssessmentItemActor.java +++ b/actors/src/main/java/org/sunbird/learner/actors/assessment/AssessmentItemActor.java @@ -74,8 +74,8 @@ private void saveAssessment(Request actorMessage) { try{ assmntResponse.put(JsonKey.RESPONSE, JsonKey.SUCCESS); for(Map assmtMap : assmtItemMapList){ - String uniqueId = ProjectUtil.createUserAuthToken((String)req.get(JsonKey.REQUESTED_BY),""); - assmtMap.put(JsonKey.ID, uniqueId); + String uniqueId = ProjectUtil.createAuthToken((String)req.get(JsonKey.REQUESTED_BY),""); + assmtMap.put(JsonKey.ID, uniqueId); if(assmtMap.containsKey(JsonKey.TIME_TAKEN)){ assmtMap.put(JsonKey.TIME_TAKEN, ((BigInteger)assmtMap.get(JsonKey.TIME_TAKEN)).intValue()); } diff --git a/actors/src/main/java/org/sunbird/learner/actors/client/ClientManagementActor.java b/actors/src/main/java/org/sunbird/learner/actors/client/ClientManagementActor.java new file mode 100644 index 000000000..ded9ebb8d --- /dev/null +++ b/actors/src/main/java/org/sunbird/learner/actors/client/ClientManagementActor.java @@ -0,0 +1,173 @@ +package org.sunbird.learner.actors.client; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.sunbird.cassandra.CassandraOperation; +import org.sunbird.common.exception.ProjectCommonException; +import org.sunbird.common.models.response.Response; +import org.sunbird.common.models.util.ActorOperations; +import org.sunbird.common.models.util.JsonKey; +import org.sunbird.common.models.util.LoggerEnum; +import org.sunbird.common.models.util.ProjectLogger; +import org.sunbird.common.models.util.ProjectUtil; +import org.sunbird.common.request.Request; +import org.sunbird.common.responsecode.ResponseCode; +import org.sunbird.helper.ServiceFactory; +import org.sunbird.learner.util.Util; + +import akka.actor.UntypedAbstractActor; + +public class ClientManagementActor extends UntypedAbstractActor { + + private Util.DbInfo clientDbInfo = Util.dbInfoMap.get(JsonKey.CLIENT_INFO_DB); + private CassandraOperation cassandraOperation = ServiceFactory.getInstance(); + + @Override + public void onReceive(Object message) throws Throwable { + if (message instanceof Request) { + try { + ProjectLogger.log("ClientManagementActor-onReceive called"); + Request actorMessage = (Request) message; + if (actorMessage.getOperation() + .equalsIgnoreCase(ActorOperations.REGISTER_CLIENT.getValue())) { + registerClient(actorMessage); + } else if (actorMessage.getOperation() + .equalsIgnoreCase(ActorOperations.UPDATE_CLIENT_KEY.getValue())) { + updateClientKey(actorMessage); + } else if (actorMessage.getOperation() + .equalsIgnoreCase(ActorOperations.GET_CLIENT_KEY.getValue())) { + getClientKey(actorMessage); + } else { + ProjectLogger.log("UNSUPPORTED OPERATION", LoggerEnum.INFO.name()); + ProjectCommonException exception = + new ProjectCommonException(ResponseCode.invalidOperationName.getErrorCode(), + ResponseCode.invalidOperationName.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + sender().tell(exception, self()); + } + } catch (Exception ex) { + ProjectLogger.log(ex.getMessage(), ex); + sender().tell(ex, self()); + } + } else { + // Throw exception as message body + ProjectLogger.log("UNSUPPORTED MESSAGE"); + ProjectCommonException exception = + new ProjectCommonException(ResponseCode.invalidRequestData.getErrorCode(), + ResponseCode.invalidRequestData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + sender().tell(exception, self()); + } + } + + /** + * Method to register client + * @param actorMessage + */ + @SuppressWarnings("unchecked") + private void registerClient(Request actorMessage) { + ProjectLogger.log("Register client method call start"); + String clientName = (String) actorMessage.getRequest().get(JsonKey.CLIENT_NAME); + Response data = getDataFromCassandra(JsonKey.CLIENT_NAME, clientName); + List> dataList = (List>) data.getResult().get(JsonKey.RESPONSE); + if(!dataList.isEmpty() && dataList.get(0).containsKey(JsonKey.ID)){ + throw new ProjectCommonException(ResponseCode.invalidClientName.getErrorCode(), + ResponseCode.invalidClientName.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + Map req = new HashMap<>(); + String uniqueId = ProjectUtil.getUniqueIdFromTimestamp(actorMessage.getEnv()); + req.put(JsonKey.CLIENT_NAME, StringUtils.remove(clientName.toLowerCase()," ")); + req.put(JsonKey.ID, uniqueId); + String masterKey = ProjectUtil.createAuthToken(clientName, uniqueId); + req.put(JsonKey.MASTER_KEY, masterKey); + req.put(JsonKey.CREATED_DATE, ProjectUtil.getFormattedDate()); + req.put(JsonKey.UPDATED_DATE, ProjectUtil.getFormattedDate()); + Response result = cassandraOperation.insertRecord(clientDbInfo.getKeySpace(), + clientDbInfo.getTableName(), req); + ProjectLogger.log("Client data saved into cassandra."); + result.getResult().put(JsonKey.CLIENT_ID, uniqueId); + result.getResult().put(JsonKey.MASTER_KEY, masterKey); + result.getResult().remove(JsonKey.RESPONSE); + sender().tell(result, self()); + } + + /** + * Method to update client's master key based on client id and master key + * @param actorMessage + */ + @SuppressWarnings("unchecked") + private void updateClientKey(Request actorMessage) { + ProjectLogger.log("Update client key method call start"); + String clientId = (String) actorMessage.getRequest().get(JsonKey.CLIENT_ID); + String masterKey = (String) actorMessage.getRequest().get(JsonKey.MASTER_KEY); + Response data = getDataFromCassandra(JsonKey.ID, clientId); + List> dataList = (List>) data.getResult().get(JsonKey.RESPONSE); + if( dataList.isEmpty() || !StringUtils.equalsIgnoreCase(masterKey,(String)dataList.get(0).get(JsonKey.MASTER_KEY))){ + throw new ProjectCommonException(ResponseCode.invalidRequestData.getErrorCode(), + ResponseCode.invalidRequestData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + Map req = new HashMap<>(); + req.put(JsonKey.CLIENT_ID, clientId); + String newMasterKey = ProjectUtil.createAuthToken((String)dataList.get(0).get(JsonKey.CLIENT_NAME), clientId); + req.put(JsonKey.MASTER_KEY, newMasterKey); + req.put(JsonKey.UPDATED_DATE, ProjectUtil.getFormattedDate()); + req.put(JsonKey.ID, clientId); + req.remove(JsonKey.CLIENT_ID); + Response result = cassandraOperation.updateRecord(clientDbInfo.getKeySpace(), + clientDbInfo.getTableName(), req); + ProjectLogger.log("Client data updated into cassandra."); + result.getResult().put(JsonKey.CLIENT_ID, clientId); + result.getResult().put(JsonKey.MASTER_KEY, newMasterKey); + result.getResult().remove(JsonKey.RESPONSE); + sender().tell(result, self()); + } + + /** + * Method to get Client details + * @param actorMessage + */ + @SuppressWarnings("unchecked") + private void getClientKey(Request actorMessage) { + ProjectLogger.log("Get client key method call start"); + String clientId = (String) actorMessage.getRequest().get(JsonKey.CLIENT_ID); + Response data = getDataFromCassandra(JsonKey.ID, clientId); + List> dataList = (List>) data.getResult().get(JsonKey.RESPONSE); + if(dataList.isEmpty()){ + throw new ProjectCommonException(ResponseCode.invalidRequestData.getErrorCode(), + ResponseCode.invalidRequestData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + sender().tell(data, self()); + } + + /** + * Method to get data from cassandra for Client_Info table + * @param propertyName + * @param propertyValue + * @return + */ + private Response getDataFromCassandra(String propertyName, String propertyValue){ + ProjectLogger.log("Get data from cassandra method call start"); + Response result = null; + if(StringUtils.equalsIgnoreCase(JsonKey.CLIENT_NAME, propertyName)){ + result = cassandraOperation.getRecordsByProperty(clientDbInfo.getKeySpace(), + clientDbInfo.getTableName(), JsonKey.CLIENT_NAME, propertyValue.toLowerCase()); + }else if(StringUtils.equalsIgnoreCase(JsonKey.ID, propertyName)){ + result = cassandraOperation.getRecordsByProperty(clientDbInfo.getKeySpace(), + clientDbInfo.getTableName(), JsonKey.ID, propertyValue); + } + if(null == result || result.getResult().isEmpty()){ + throw new ProjectCommonException(ResponseCode.invalidRequestData.getErrorCode(), + ResponseCode.invalidRequestData.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + return result; + } + + +} diff --git a/actors/src/main/java/org/sunbird/learner/util/Util.java b/actors/src/main/java/org/sunbird/learner/util/Util.java index e4908305a..21723b6de 100644 --- a/actors/src/main/java/org/sunbird/learner/util/Util.java +++ b/actors/src/main/java/org/sunbird/learner/util/Util.java @@ -154,7 +154,7 @@ private static void initializeDBProperty() { dbInfoMap.put(JsonKey.USER_SKILL_DB , getDbInfoObject(KEY_SPACE_NAME, "user_skills")); dbInfoMap.put(JsonKey.SKILLS_LIST_DB , getDbInfoObject(KEY_SPACE_NAME, "skills")); dbInfoMap.put(JsonKey.TENANT_PREFERENCE_DB , getDbInfoObject(KEY_SPACE_NAME, "tenant_preference")); - + dbInfoMap.put(JsonKey.CLIENT_INFO_DB, getDbInfoObject(KEY_SPACE_NAME, "client_info")); } diff --git a/actors/src/main/resources/application.conf b/actors/src/main/resources/application.conf index 628fac3d1..36827baee 100644 --- a/actors/src/main/resources/application.conf +++ b/actors/src/main/resources/application.conf @@ -148,6 +148,11 @@ LocaleMWConfig { router = round-robin-pool nr-of-instances = 5 } + /RequestRouterActor/clientManagementActor + { + router = round-robin-pool + nr-of-instances = 5 + } } @@ -306,6 +311,11 @@ RemoteMWConfig { router = round-robin-pool nr-of-instances = 5 } + /RequestRouterActor/clientManagementActor + { + router = round-robin-pool + nr-of-instances = 5 + } } } diff --git a/actors/src/main/resources/cassandra.cql b/actors/src/main/resources/cassandra.cql index 843d3d2e1..836f8bf69 100644 --- a/actors/src/main/resources/cassandra.cql +++ b/actors/src/main/resources/cassandra.cql @@ -620,3 +620,7 @@ CREATE TABLE sunbirdplugin.metrics (id text,userid text,announcementid text,acti CREATE TABLE sunbirdplugin.announcementtype (id text,rootorgid text,name text,status text,createddate text, PRIMARY KEY (id)); CREATE TABLE sunbirdplugin.announcementauth (id text,userid text,rootorgid text,permissions map,status text,createddate text, PRIMARY KEY (id)); +//CLIENT_INFO table for master key +CREATE TABLE IF NOT EXISTS sunbird.client_info(id text, clientname text, masterkey text, createddate text, updateddate text, PRIMARY KEY (id)); +CREATE INDEX inx_ci_clientname ON sunbird.client_info(clientname); + diff --git a/actors/src/test/java/org/sunbird/learner/actors/client/ClientManagementActorTest.java b/actors/src/test/java/org/sunbird/learner/actors/client/ClientManagementActorTest.java new file mode 100644 index 000000000..748a0956b --- /dev/null +++ b/actors/src/test/java/org/sunbird/learner/actors/client/ClientManagementActorTest.java @@ -0,0 +1,195 @@ +package org.sunbird.learner.actors.client; + +import static akka.testkit.JavaTestKit.duration; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; +import org.sunbird.cassandra.CassandraOperation; +import org.sunbird.common.exception.ProjectCommonException; +import org.sunbird.common.models.response.Response; +import org.sunbird.common.models.util.ActorOperations; +import org.sunbird.common.models.util.JsonKey; +import org.sunbird.common.models.util.ProjectUtil; +import org.sunbird.common.request.Request; +import org.sunbird.common.responsecode.ResponseMessage; +import org.sunbird.helper.ServiceFactory; +import org.sunbird.learner.actors.NotesManagementActor; +import org.sunbird.learner.util.Util; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.actor.Props; +import akka.testkit.TestActorRef; +import akka.testkit.javadsl.TestKit; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class ClientManagementActorTest { + + static ActorSystem system; + final static Props props = Props.create(ClientManagementActor.class); + static TestActorRef ref; + private static String masterKey = ""; + private static String clientId = ""; + + @BeforeClass + public static void setUp() { + system = ActorSystem.create("system"); + ref = TestActorRef.create(system, props, "testActor"); + Util.checkCassandraDbConnections(JsonKey.SUNBIRD); + } + + @SuppressWarnings("deprecation") + @Test + public void test1RegisterClientSuccess(){ + TestKit probe = new TestKit(system); + ActorRef subject = system.actorOf(props); + + Request actorMessage = new Request(); + Map request = new HashMap<>(); + request.put(JsonKey.CLIENT_NAME , "Test"); + actorMessage.setRequest(request); + actorMessage.setOperation(ActorOperations.REGISTER_CLIENT.getValue()); + + subject.tell(actorMessage, probe.getRef()); + Response res = probe.expectMsgClass(duration("10 second"),Response.class); + clientId = (String)res.getResult().get(JsonKey.CLIENT_ID); + masterKey = (String)res.getResult().get(JsonKey.MASTER_KEY); + Assert.assertTrue(!ProjectUtil.isStringNullOREmpty(clientId)); + Assert.assertTrue(!ProjectUtil.isStringNullOREmpty(masterKey)); + } + + @SuppressWarnings("deprecation") + @Test + public void test2RegisterClientException(){ + TestKit probe = new TestKit(system); + ActorRef subject = system.actorOf(props); + + Request actorMessage = new Request(); + Map request = new HashMap<>(); + request.put(JsonKey.CLIENT_NAME , "Test"); + actorMessage.setRequest(request); + actorMessage.setOperation(ActorOperations.REGISTER_CLIENT.getValue()); + + subject.tell(actorMessage, probe.getRef()); + ProjectCommonException res = probe.expectMsgClass(duration("10 second"),ProjectCommonException.class); + if(null != res){ + Assert.assertEquals(ResponseMessage.Message.INVALID_CLIENT_NAME, res.getMessage()); + } + } + + @SuppressWarnings({"deprecation", "unchecked"}) + @Test + public void test3GetClientKeySuccess(){ + TestKit probe = new TestKit(system); + ActorRef subject = system.actorOf(props); + + Request actorMessage = new Request(); + Map request = new HashMap<>(); + request.put(JsonKey.CLIENT_ID , clientId); + actorMessage.setRequest(request); + actorMessage.setOperation(ActorOperations.GET_CLIENT_KEY.getValue()); + + subject.tell(actorMessage, probe.getRef()); + Response res = probe.expectMsgClass(duration("20 second"),Response.class); + List> dataList = (List>) res.getResult().get(JsonKey.RESPONSE); + Assert.assertEquals(clientId, dataList.get(0).get(JsonKey.ID)); + Assert.assertEquals(masterKey, dataList.get(0).get(JsonKey.MASTER_KEY)); + Assert.assertEquals("test", dataList.get(0).get(JsonKey.CLIENT_NAME)); + Assert.assertTrue(!ProjectUtil.isStringNullOREmpty((String)dataList.get(0).get(JsonKey.CREATED_DATE))); + Assert.assertTrue(!ProjectUtil.isStringNullOREmpty((String)dataList.get(0).get(JsonKey.UPDATED_DATE))); + } + + @SuppressWarnings("deprecation") + @Test + public void test4GetClientKeyFailure(){ + TestKit probe = new TestKit(system); + ActorRef subject = system.actorOf(props); + + Request actorMessage = new Request(); + Map request = new HashMap<>(); + request.put(JsonKey.CLIENT_ID , "test123"); + actorMessage.setRequest(request); + actorMessage.setOperation(ActorOperations.GET_CLIENT_KEY.getValue()); + + subject.tell(actorMessage, probe.getRef()); + ProjectCommonException res = probe.expectMsgClass(duration("10 second"),ProjectCommonException.class); + if(null != res){ + Assert.assertEquals(ResponseMessage.Message.INVALID_REQUESTED_DATA, res.getMessage()); + } + } + + @SuppressWarnings("deprecation") + @Test + public void test5UpdateClientKeySuccess(){ + TestKit probe = new TestKit(system); + ActorRef subject = system.actorOf(props); + + Request actorMessage = new Request(); + Map request = new HashMap<>(); + request.put(JsonKey.CLIENT_ID , clientId); + request.put(JsonKey.MASTER_KEY, masterKey); + actorMessage.setRequest(request); + actorMessage.setOperation(ActorOperations.UPDATE_CLIENT_KEY.getValue()); + + subject.tell(actorMessage, probe.getRef()); + Response res = probe.expectMsgClass(duration("20 second"),Response.class); + Assert.assertEquals(clientId, res.getResult().get(JsonKey.CLIENT_ID)); + Assert.assertNotEquals(masterKey, res.getResult().get(JsonKey.MASTER_KEY)); + } + + @SuppressWarnings("deprecation") + @Test + public void test6UpdateClientKeyFailure(){ + TestKit probe = new TestKit(system); + ActorRef subject = system.actorOf(props); + + Request actorMessage = new Request(); + Map request = new HashMap<>(); + request.put(JsonKey.CLIENT_ID , "test"); + request.put(JsonKey.MASTER_KEY, masterKey); + actorMessage.setRequest(request); + actorMessage.setOperation(ActorOperations.UPDATE_CLIENT_KEY.getValue()); + + subject.tell(actorMessage, probe.getRef()); + ProjectCommonException res = probe.expectMsgClass(duration("10 second"),ProjectCommonException.class); + if(null != res){ + Assert.assertEquals(ResponseMessage.Message.INVALID_REQUESTED_DATA, res.getMessage()); + } + } + @SuppressWarnings("deprecation") + @Test + public void test7UpdateClientKeyFailureInvalidKey(){ + TestKit probe = new TestKit(system); + ActorRef subject = system.actorOf(props); + + Request actorMessage = new Request(); + Map request = new HashMap<>(); + request.put(JsonKey.CLIENT_ID , clientId); + request.put(JsonKey.MASTER_KEY, "test"); + actorMessage.setRequest(request); + actorMessage.setOperation(ActorOperations.UPDATE_CLIENT_KEY.getValue()); + + subject.tell(actorMessage, probe.getRef()); + ProjectCommonException res = probe.expectMsgClass(duration("10 second"),ProjectCommonException.class); + if(null != res){ + Assert.assertEquals(ResponseMessage.Message.INVALID_REQUESTED_DATA, res.getMessage()); + } + } + + @AfterClass + public static void destroy(){ + CassandraOperation operation = ServiceFactory.getInstance(); + Util.DbInfo clientInfoDB = Util.dbInfoMap.get(JsonKey.CLIENT_INFO_DB); + //Delete client data from cassandra + operation.deleteRecord(clientInfoDB.getKeySpace(), clientInfoDB.getTableName(), clientId); + } + +} \ No newline at end of file From c35a06e4b7eee8be8ba96d14b768a8bd0109ceae Mon Sep 17 00:00:00 2001 From: "manzarul.haque" Date: Thu, 2 Nov 2017 12:35:44 +0530 Subject: [PATCH 3/4] Issue #SB-379 feat : adding for profile visibility control --- .../learner/actors/UserManagementActor.java | 55 ++++++++++++++++++- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java b/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java index 2bac83665..86c56bc24 100644 --- a/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java +++ b/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java @@ -3,7 +3,6 @@ import static org.sunbird.learner.util.Util.isNotNull; import static org.sunbird.learner.util.Util.isNull; -import akka.actor.UntypedAbstractActor; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; @@ -45,6 +44,8 @@ import org.sunbird.services.sso.SSOManager; import org.sunbird.services.sso.SSOServiceFactory; +import akka.actor.UntypedAbstractActor; + /** * This actor will handle course enrollment operation . * @@ -258,15 +259,63 @@ private void handlePublicVisibility (String userId, List publicFieldList private Map createPrivateFiledMap(Map map, List fields) { Map privateMap = new HashMap<>(); + Map> tempMap = new HashMap<>(); if(fields != null && fields.size()>0) { for (String field : fields) { - privateMap.put(field, map.get(field)); - map.remove(field); + // now if field contains {address.someField,education.someField,jobprofile.someField} + //then we need to remove those filed + if (field.contains(JsonKey.ADDRESS+".")){ + tempMap = addPrivateField(JsonKey.ADDRESS, tempMap, field); + } else if (field.contains(JsonKey.EDUCATION+".")) { + tempMap = addPrivateField(JsonKey.EDUCATION, tempMap, field); + }else if (field.contains(JsonKey.JOB_PROFILE+".")) { + tempMap = addPrivateField(JsonKey.EDUCATION, tempMap, field); + }else { + privateMap.put(field, map.get(field)); + map.remove(field); + } } } return privateMap; } + + private Map> addPrivateField(String key, + Map> map, String privateField) { + if (map.containsKey(key)) { + List list = (List) map.get(key); + list.add(privateField); + } else { + List list = new ArrayList<>(); + list.add(privateField); + map.put(key, list); + } + return map; + } + + @SuppressWarnings("unchecked") + private void updatePrivateKey(List keys, Map data, + Map privateMap, String attribute) { + if (keys == null || keys.size() == 0) + return; + List> reqData = + (List>) data.get(attribute); + List> privateList = new ArrayList<>(); + if (reqData != null && reqData.size() > 0) { + for (Map map : reqData) { + Map innerPrivateMap = new HashMap<>(); + for (String key : keys) { + innerPrivateMap.put(key, map.get(key)); + map.remove(key); + } + privateList.add(innerPrivateMap); + } + privateMap.put(attribute, privateList); + } + } + + + /** * THis methods will update user private field under cassandra. * @param userId Stirng From 2be36cc2a24acf822ccd0a15512d3f178263524f Mon Sep 17 00:00:00 2001 From: AMIT KUMAR Date: Thu, 2 Nov 2017 14:25:21 +0530 Subject: [PATCH 4/4] Issue #509 feat:allowing user to login with phone --- .../learner/actors/UserManagementActor.java | 54 ++++++++++++++++++- .../learner/util/DataCacheHandler.java | 1 - actors/src/test/resources/dbconfig.properties | 2 +- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java b/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java index c27d1a4ff..de44cb9b6 100644 --- a/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java +++ b/actors/src/main/java/org/sunbird/learner/actors/UserManagementActor.java @@ -674,6 +674,7 @@ private void updateUser(Request actorMessage) { } else { userMap.put(JsonKey.USER_ID, userMap.get(JsonKey.ID)); } + checkPhoneUniqueness(userMap,JsonKey.UPDATE); if (null != userMap.get(JsonKey.EMAIL)) { checkForEmailAndUserNameUniqueness(userMap, usrDbInfo); } @@ -697,7 +698,7 @@ private void updateUser(Request actorMessage) { userMap.remove(JsonKey.LOGIN_ID); if (isSSOEnabled) { - UpdateKeyCloakUserBase(userMap); + updateKeyCloakUserBase(userMap); } userMap.put(JsonKey.UPDATED_DATE, ProjectUtil.getFormattedDate()); userMap.put(JsonKey.UPDATED_BY, req.get(JsonKey.REQUESTED_BY)); @@ -992,9 +993,17 @@ private void checkForEmailAndUserNameUniqueness(Map userMap, DbI } } - private void UpdateKeyCloakUserBase(Map userMap) { + private void updateKeyCloakUserBase(Map userMap) { try { String userId = ssoManager.updateUser(userMap); + + if(!ProjectUtil.isStringNullOREmpty(userId) && null != userMap.get(JsonKey.PHONE)){ + boolean bool = ssoManager.addAttributesToKeyCloak(JsonKey.MOBILE, (String) userMap.get(JsonKey.PHONE), userId); + if(!bool){ + ProjectLogger.log("phone not saved for userId "+userId); + } + } + if (!(!ProjectUtil.isStringNullOREmpty(userId) && userId.equalsIgnoreCase(JsonKey.SUCCESS))) { throw new ProjectCommonException(ResponseCode.userUpdationUnSuccessfull.getErrorCode(), ResponseCode.userUpdationUnSuccessfull.getErrorMessage(), @@ -1027,6 +1036,7 @@ private void createUser(Request actorMessage) { Map req = actorMessage.getRequest(); Map requestMap = null; Map userMap = (Map) req.get(JsonKey.USER); + checkPhoneUniqueness(userMap,JsonKey.CREATE); Map emailTemplateMap = new HashMap<>(userMap); if (userMap.containsKey(JsonKey.WEB_PAGES)) { SocialMediaType @@ -1166,6 +1176,12 @@ && isNotNull(esResult.get(JsonKey.CONTENT)) userId = responseMap.get(JsonKey.USER_ID); accessToken = responseMap.get(JsonKey.ACCESSTOKEN); if (!ProjectUtil.isStringNullOREmpty(userId)) { + if(null != userMap.get(JsonKey.PHONE)){ + boolean bool = ssoManager.addAttributesToKeyCloak(JsonKey.MOBILE, (String) userMap.get(JsonKey.PHONE), userId); + if(!bool){ + ProjectLogger.log("phone not saved for userId "+userId); + } + } userMap.put(JsonKey.USER_ID, userId); userMap.put(JsonKey.ID, userId); } else { @@ -1314,6 +1330,40 @@ && isNotNull(esResult.get(JsonKey.CONTENT)) } + private void checkPhoneUniqueness(Map userMap,String opType) { + String phone = (String) userMap.get(JsonKey.PHONE); + if(!ProjectUtil.isStringNullOREmpty(phone)){ + try{ + phone = encryptionService.encryptData(phone); + }catch(Exception e){ + ProjectLogger.log("Exception occured while encrypting phone number ", e); + } + Map filters = new HashMap<>(); + filters.put(JsonKey.ENC_PHONE, phone); + Map map = new HashMap<>(); + map.put(JsonKey.FILTERS, filters); + SearchDTO searchDto = Util.createSearchDto(map); + Map result = ElasticSearchUtil.complexSearch(searchDto, + ProjectUtil.EsIndex.sunbird.getIndexName(), ProjectUtil.EsType.user.getTypeName()); + List> userMapList = + (List>) result.get(JsonKey.CONTENT); + if(!userMapList.isEmpty()){ + if(opType.equalsIgnoreCase(JsonKey.CREATE)){ + throw new ProjectCommonException(ResponseCode.PhoneNumberInUse.getErrorCode(), + ResponseCode.PhoneNumberInUse.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + }else{ + Map user = userMapList.get(0); + if(!(((String)user.get(JsonKey.ID)).equalsIgnoreCase((String)userMap.get(JsonKey.ID)))){ + throw new ProjectCommonException(ResponseCode.PhoneNumberInUse.getErrorCode(), + ResponseCode.PhoneNumberInUse.getErrorMessage(), + ResponseCode.CLIENT_ERROR.getResponseCode()); + } + } + } + } + } + private void insertOrganisationDetails(Map userMap, DbInfo usrOrgDb) { Map reqMap = new HashMap<>(); diff --git a/actors/src/main/java/org/sunbird/learner/util/DataCacheHandler.java b/actors/src/main/java/org/sunbird/learner/util/DataCacheHandler.java index 89ab1d180..1b73adb0a 100644 --- a/actors/src/main/java/org/sunbird/learner/util/DataCacheHandler.java +++ b/actors/src/main/java/org/sunbird/learner/util/DataCacheHandler.java @@ -10,7 +10,6 @@ import org.sunbird.common.models.response.Response; import org.sunbird.common.models.util.JsonKey; import org.sunbird.common.models.util.ProjectLogger; -import org.sunbird.common.models.util.ProjectUtil; import org.sunbird.helper.ServiceFactory; /** diff --git a/actors/src/test/resources/dbconfig.properties b/actors/src/test/resources/dbconfig.properties index b46c8d489..e99896368 100644 --- a/actors/src/test/resources/dbconfig.properties +++ b/actors/src/test/resources/dbconfig.properties @@ -2,4 +2,4 @@ db.ip=127.0.0.1 db.port=9042 db.username=cassandra db.password=password -db.keyspace=sunbird,sunbirdplugin +db.keyspace=sunbird