Merge pull request #3 in MM/mpin-sdk-core from mony_otc to master

* commit '58fdca8739ae1ce6660d8ea249f5bf6a27085ae9':
  Adding support for registartion with OTC.
diff --git a/src/mpin_sdk.cpp b/src/mpin_sdk.cpp
index 9f42e9b..3652767 100644
--- a/src/mpin_sdk.cpp
+++ b/src/mpin_sdk.cpp
@@ -752,7 +752,7 @@
     return UserPtr(new User(id, deviceName));
 }
 
-Status MPinSDK::StartRegistration(UserPtr user, const String& userData)
+Status MPinSDK::StartRegistration(UserPtr user, const String& activateCode, const String& userData)
 {
     Status s = CheckIfBackendIsSet();
     if(s != Status::OK)
@@ -766,7 +766,7 @@
         return s;
     }
 
-    return RequestRegistration(user, userData);
+    return RequestRegistration(user, activateCode, userData);
 }
 
 Status MPinSDK::RestartRegistration(UserPtr user, const String& userData)
@@ -783,10 +783,10 @@
         return s;
     }
 
-    return RequestRegistration(user, userData);
+    return RequestRegistration(user, "", userData);
 }
 
-Status MPinSDK::RequestRegistration(UserPtr user, const String& userData)
+Status MPinSDK::RequestRegistration(UserPtr user, const String& activateCode, const String& userData)
 {
     // Make request to RPA to add M-Pin ID
     util::JsonObject data;
@@ -800,6 +800,10 @@
     {
         data["userData"] = json::String(userData);
     }
+	if(!activateCode.empty())
+	{
+		data["activateCode"] = json::String(activateCode);
+	}
 
     String url;
     if(user->GetState() == User::STARTED_REGISTRATION)
@@ -854,45 +858,6 @@
     return Status(Status::OK);
 }
 
-Status MPinSDK::VerifyUser(UserPtr user, const String& mpinId, const String &  activationKey)
-{
-    Status s = CheckIfBackendIsSet();
-    if(s != Status::OK)
-    {
-        return s;
-    }
-
-    s = CheckUserState(user, User::INVALID);
-    if(s != Status::OK)
-    {
-        return s;
-    }
-    
-    String url = m_clientSettings.GetStringParam("mobileVerifyURL");
-    
-    util::JsonObject body;
-    body["mpin_id"] = json::String(mpinId);
-    body["activate_key"] = json::String(activationKey);
-    
-    HttpResponse response = MakeRequest(url, IHttpRequest::POST, body);
-    
-    if(response.GetStatus() != HttpResponse::HTTP_OK)
-    {
-        Status s;
-        s.SetStatusCode(Status::IDENTITY_NOT_VERIFIED);
-        s.SetErrorMessage("Identity not verified");
-        return s;
-    }
-
-    String regOTT = response.GetJsonData().GetStringParam("regOTT");
-
-    user->SetStartedRegistration(mpinId, regOTT);
-    AddUser(user);
-    s = WriteUsersToStorage();
-    
-    return s;
-}
-
 Status MPinSDK::ConfirmRegistration(INOUT UserPtr user, const String& pushMessageIdentifier)
 {
     Status s = CheckIfBackendIsSet();
diff --git a/src/mpin_sdk.h b/src/mpin_sdk.h
index d7cf2e7..7644c83 100644
--- a/src/mpin_sdk.h
+++ b/src/mpin_sdk.h
@@ -232,9 +232,8 @@
     Status SetBackend(const String& server, const String& rpsPrefix = MPinSDK::DEFAULT_RPS_PREFIX);
     UserPtr MakeNewUser(const String& id, const String& deviceName = "") const;
 
-    Status StartRegistration(INOUT UserPtr user, const String& userData = "");
+    Status StartRegistration(INOUT UserPtr user, const String& activateCode = "", const String& userData = "");
     Status RestartRegistration(INOUT UserPtr user, const String& userData = "");
-    Status VerifyUser(INOUT UserPtr user, const String& mpinId, const String& activationKey);
     Status ConfirmRegistration(INOUT UserPtr user, const String& pushMessageIdentifier = "");
     Status FinishRegistration(INOUT UserPtr user, const String& pin);
 
@@ -339,7 +338,7 @@
     HttpResponse MakeGetRequest(const String& url, HttpResponse::DataType expectedResponseType = HttpResponse::JSON) const;
     Status RewriteRelativeUrls();
     Status GetClientSettings(const String& backend, const String& rpsPrefix, OUT util::JsonObject *clientSettings) const;
-    Status RequestRegistration(INOUT UserPtr user, const String& userData);
+    Status RequestRegistration(INOUT UserPtr user, const String& activateCode, const String& userData);
     Status FinishAuthenticationImpl(INOUT UserPtr user, const String& pin, const String& accessNumber, OUT String *otp, OUT util::JsonObject& authResultData);
     Status GetCertivoxTimePermitShare(INOUT UserPtr user, const util::JsonObject& cutomerTimePermitData, OUT String& resultTimePermit);
     bool ValidateAccessNumber(const String& accessNumber);
diff --git a/tests/linux/MPinClient/HttpRequest.cpp b/tests/linux/MPinClient/HttpRequest.cpp
index a267e9f..b80ef91 100644
--- a/tests/linux/MPinClient/HttpRequest.cpp
+++ b/tests/linux/MPinClient/HttpRequest.cpp
@@ -29,15 +29,11 @@
 
 void CHttpRequest::SetHeaders(const StringMap& headers)
 {
-	CMapHttpHeaders tmpHeaders;
-	
 	StringMap::const_iterator itr = headers.begin();
 	for ( ; itr != headers.end(); ++itr )
 	{
-		tmpHeaders[itr->first] = itr->second;
+		m_requestHeaders[itr->first] = itr->second;
 	}
-
-	m_request.SetHeaders( tmpHeaders );
 }
 
 void CHttpRequest::SetQueryParams(const StringMap& queryParams)
@@ -75,6 +71,13 @@
 		return false;
 	}
 	
+	if (m_requestHeaders.find("X-MIRACL-OS-Class") == m_requestHeaders.end())
+	{
+		m_requestHeaders["X-MIRACL-OS-Class"] = "linux";
+	}
+	
+	m_request.SetHeaders( m_requestHeaders );
+
 	String fullUrl = url;
 	
 	if ( !m_queryParams.empty() )
@@ -90,7 +93,7 @@
 		fullUrl.TrimRight("&");
 	}
 	
-//	printf( "--> %s %s [%s]\n", strMethod.c_str(), fullUrl.c_str(), m_requestData.c_str() );
+	printf( "--> %s %s [%s]\n", strMethod.c_str(), fullUrl.c_str(), m_requestData.c_str() );
 
 	m_request.SetMethod( cvHttpMethod );
 	m_request.SetUrl( fullUrl );
@@ -111,7 +114,7 @@
 
 	m_responseData = m_request.GetResponse();
 	
-//	printf( "<-- %ld [%s]\n", m_request.GetResponseCode(), m_responseData.c_str() );
+	printf( "<-- %ld [%s]\n", m_request.GetResponseCode(), m_responseData.c_str() );
 
 	return true;
 }
diff --git a/tests/linux/MPinClient/HttpRequest.h b/tests/linux/MPinClient/HttpRequest.h
index 2f41cd6..5a2d6d7 100644
--- a/tests/linux/MPinClient/HttpRequest.h
+++ b/tests/linux/MPinClient/HttpRequest.h
@@ -50,6 +50,7 @@
 	String			m_id;
 	
 	CvHttpRequest	m_request;
+	CMapHttpHeaders m_requestHeaders;
 	String			m_requestData;	//Used for debugging purposes only	
 	StringMap		m_queryParams;
 	Seconds			m_timeout;
diff --git a/tests/linux/MPinClient/MpinClient.cpp b/tests/linux/MPinClient/MpinClient.cpp
index bda5a34..c0e1f62 100644
--- a/tests/linux/MPinClient/MpinClient.cpp
+++ b/tests/linux/MPinClient/MpinClient.cpp
@@ -57,7 +57,7 @@
 	file << data;
 	file.close();
 	
-	LogMessage( enLogLevel_Debug1, "Writing data to [%s]:\n%s", m_fileName.c_str(), data.c_str() );
+	LogMessage( enLogLevel_Debug3, "Writing data to [%s]:\n%s", m_fileName.c_str(), data.c_str() );
 	
 	return true;
 }
@@ -71,7 +71,7 @@
 	
 	data = buffer.str();
 	
-	LogMessage( enLogLevel_Debug1, "Reading data from [%s]:\n%s", m_fileName.c_str(), data.c_str() );
+	LogMessage( enLogLevel_Debug3, "Reading data from [%s]:\n%s", m_fileName.c_str(), data.c_str() );
 	
 	return true;
 }
@@ -89,8 +89,8 @@
 	_Init(aBackendUrl);	
 }
 
-CMpinClient::CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId, const String& aPinGood, const String& aPinBad ) :
-	m_bInitialized(false), m_id(aClientId), m_userId(aUserId), m_pinGood(aPinGood), m_pinBad(aPinBad),
+CMpinClient::CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId, const String& aPinGood, const String& aPinBad, const String& aRegOTC ) :
+	m_bInitialized(false), m_id(aClientId), m_userId(aUserId), m_pinGood(aPinGood), m_pinBad(aPinBad), m_regOTC(aRegOTC),
 	m_storageSecure( String().Format("sec-%d", aClientId) ), m_storageNonSecure( String().Format("%d", aClientId) ),
 	m_context( String().Format("%d",aClientId), &m_storageSecure, &m_storageNonSecure ),
 	m_thread(aUserId), m_queue(aUserId.c_str()), m_bIdle(false), m_bStatsEnabled(true)
@@ -175,7 +175,7 @@
 	GetCurrentTime(now);
 	Millisecs startTime = now.ToMillisecs();
 
-	MPinSDK::Status status = m_sdk.StartRegistration( user, "{ \"data\": \"test\" }" );
+	MPinSDK::Status status = m_sdk.StartRegistration( user, m_regOTC, "{ \"data\": \"test\" }" );
 	
 	if ( status != MPinSDK::Status::OK )
 	{
diff --git a/tests/linux/MPinClient/MpinClient.h b/tests/linux/MPinClient/MpinClient.h
index c5f55ce..2c61108 100644
--- a/tests/linux/MPinClient/MpinClient.h
+++ b/tests/linux/MPinClient/MpinClient.h
@@ -35,7 +35,7 @@
 {
 public:
 
-	CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId, const String& aPinGood, const String& aPinBad );
+	CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId, const String& aPinGood, const String& aPinBad, const String& aRegOTC = "" );
 	CMpinClient( int aClientId, const String& aBackendUrl, const String& aUserId );
 
 	virtual ~CMpinClient();
@@ -126,6 +126,8 @@
 	String		m_pinGood;
 	String		m_pinBad;
 	
+	String		m_regOTC;
+	
 	enum enEvent_t
 	{
 		enEvent_Register,
diff --git a/tests/linux/MPinClient/main.cpp b/tests/linux/MPinClient/main.cpp
index 5c0c979..81cea31 100644
--- a/tests/linux/MPinClient/main.cpp
+++ b/tests/linux/MPinClient/main.cpp
@@ -40,7 +40,7 @@
 	{
 		printf("%s\n", aMessage);
 	}
-	printf("Usage: %s --reg --auth -n <num-of-clients> -r <requests-per-second> [-u <user-prefix> -t <timeout-sec> -c <count>] -b <backend-url>\n", aExeName);
+	printf("Usage: %s --reg --auth -n <num-of-clients> -r <requests-per-second> [-u <user-id> -t <timeout-sec> -c <count> -o <reg-otc>] -b <backend-url>\n", aExeName);
 	printf("\n");
 }
 
@@ -48,7 +48,7 @@
 {
 	sParams() :
 		bRegister(false), bAuthenticate(false), numOfClients(0), requestsPerSecond(0),
-		count(1), userPrefix("test"), timeout(30)
+		count(1), userId("test%d@dispostable.com"), timeout(30)
 	{}
 
 	bool		bRegister;
@@ -57,8 +57,9 @@
 	uint32_t	requestsPerSecond;
 	uint32_t	count;
 	::String	backendUrl;
-	::String	userPrefix;
+	::String	userId;
 	Seconds		timeout;
+	::String	regOTC;
 };
 
 bool doargs(int argc, char **argv, OUT sParams& aParams)
@@ -81,7 +82,7 @@
 	};
 	int option_index = 0;
 
-	while ((ch = getopt_long(argc, argv, "n:r:b:u:t:c:", long_options, &option_index)) > 0)
+	while ((ch = getopt_long(argc, argv, "n:r:b:u:t:c:o:", long_options, &option_index)) > 0)
 	{
 		switch (ch)
 		{
@@ -91,7 +92,7 @@
 				break;
 			case 'b': aParams.backendUrl = optarg;
 				break;
-			case 'u': aParams.userPrefix = optarg;
+			case 'u': aParams.userId = optarg;
 				break;
 			case 't': aParams.timeout = atoi(optarg);
 				break;
@@ -101,6 +102,8 @@
 				break;
 			case 2: aParams.bAuthenticate = true;
 				break;
+			case 'o': aParams.regOTC = optarg;
+				break;
 		}
 	}
 
@@ -158,7 +161,7 @@
 
 int main(int argc, char** argv)
 {
-	InitLogger(argv[0], enLogLevel_Info);
+	InitLogger(argv[0], enLogLevel_Debug1);
 	LogMessage(enLogLevel_Info, "========== Starting M-Pin Client Test ==========");
 
 	sParams params;
@@ -195,7 +198,15 @@
 	for (int i = 0; i < params.numOfClients; ++i)
 	{
 		::String userId;
-		userId.Format("%s%d@dispostable.com", params.userPrefix.c_str(), i + 1);
+		if ( params.userId.find("%d") != ::String::npos )
+		{
+			userId.Format( params.userId.c_str(), i + 1 );
+		}
+		else
+		{
+			userId = params.userId;
+		}
+	
 
 		CMpinClient* pClient = NULL;
 
@@ -209,7 +220,7 @@
 				pinBad.Format("%04d", rand() % 10000);
 			}
 
-			pClient = new CMpinClient(i + 1, params.backendUrl, userId, pinGood, pinBad);
+			pClient = new CMpinClient(i + 1, params.backendUrl, userId, pinGood, pinBad, params.regOTC);
 		}
 		else
 		{