Add DeleteUser function for specific backend. Implemented DeleteUser(user, backend) function. Fixed bug in shared_ptr class. Added test for the DeleteUser(user, backend) function.
Closes: MAASMOB-59 Project: http://git-wip-us.apache.org/repos/asf/incubator-milagro-mfa-sdk-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-milagro-mfa-sdk-core/commit/5c5a025f Tree: http://git-wip-us.apache.org/repos/asf/incubator-milagro-mfa-sdk-core/tree/5c5a025f Diff: http://git-wip-us.apache.org/repos/asf/incubator-milagro-mfa-sdk-core/diff/5c5a025f Branch: refs/heads/master Commit: 5c5a025f04a43113e546adadbdf78a3ad7963102 Parents: e79c120 Author: slav.klenov <[email protected]> Authored: Mon Apr 25 17:45:09 2016 +0300 Committer: slav.klenov <[email protected]> Committed: Mon Apr 25 17:45:09 2016 +0300 ---------------------------------------------------------------------- src/cv_shared_ptr.h | 24 ++++++++++++-------- src/mpin_sdk.cpp | 57 ++++++++++++++++++++++++++++++++++++----------- src/mpin_sdk.h | 6 ++++- tests/unit_tests.cpp | 5 ++++- 4 files changed, 68 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-milagro-mfa-sdk-core/blob/5c5a025f/src/cv_shared_ptr.h ---------------------------------------------------------------------- diff --git a/src/cv_shared_ptr.h b/src/cv_shared_ptr.h index 6f803c6..8201e18 100644 --- a/src/cv_shared_ptr.h +++ b/src/cv_shared_ptr.h @@ -185,15 +185,6 @@ public: return *operator->(); } - operator bool() const - { - if (!holder) - { - return false; - } - return holder->target != NULL; - } - element_type* get() const { return operator->(); @@ -203,6 +194,21 @@ private: Holder* holder; }; +template <typename T, typename U> bool operator==(const shared_ptr<T>& lhs, const shared_ptr<U>& rhs) +{ + return lhs.get() == rhs.get(); +} + +template <typename T, typename U> bool operator!=(const shared_ptr<T>& lhs, const shared_ptr<U>& rhs) +{ + return !(lhs == rhs); +} + +template <typename T> bool operator<(const shared_ptr<T>& lhs, const shared_ptr<T>& rhs) +{ + return lhs.get() < rhs.get(); +} + template<typename T> shared_ptr<T> make_shared() { return shared_ptr<T>(new T()); } template<typename T, typename Arg1> shared_ptr<T> make_shared(const Arg1& arg1) { return shared_ptr<T>(new T(arg1)); } template<typename T, typename Arg1, typename Arg2> shared_ptr<T> make_shared(const Arg1& arg1, const Arg2& arg2) { return shared_ptr<T>(new T(arg1, arg2)); } http://git-wip-us.apache.org/repos/asf/incubator-milagro-mfa-sdk-core/blob/5c5a025f/src/mpin_sdk.cpp ---------------------------------------------------------------------- diff --git a/src/mpin_sdk.cpp b/src/mpin_sdk.cpp index dcaecbe..ad86a75 100644 --- a/src/mpin_sdk.cpp +++ b/src/mpin_sdk.cpp @@ -1361,8 +1361,29 @@ String MPinSDK::GetPrerollUserId(const String& accessCode) void MPinSDK::DeleteUser(UserPtr user) { - UsersMap::iterator i = m_users.find(user->GetId()); - if(i == m_users.end() || user != i->second) + DeleteUser(user, m_RPAServer); +} + +void MPinSDK::DeleteUser(INOUT UserPtr user, const String& backend) +{ + if(MakeBackendKey(backend) == MakeBackendKey(m_RPAServer)) + { + DeleteUser(user, m_RPAServer, m_users); + } + else + { + UsersMap usersMap; + LoadUsersFromStorage(backend, usersMap); + DeleteUser(user, backend, usersMap); + } +} + +void MPinSDK::DeleteUser(INOUT UserPtr user, const String& backend, UsersMap& usersMap) +{ + UsersMap::iterator i = usersMap.find(user->GetId()); + //if(i == m_users.end() || user != i->second) + // TODO: Get back to the full user check after the SDK is refactored to store full user list (for all backends) + if(i == m_users.end()) { return; } @@ -1370,9 +1391,9 @@ void MPinSDK::DeleteUser(UserPtr user) m_crypto->DeleteRegOTT(i->second->GetMPinId()); m_crypto->DeleteToken(i->second->GetMPinId()); i->second->Invalidate(); - m_users.erase(i); - WriteUsersToStorage(); - m_logoutData.erase(user); + m_logoutData.erase(i->second); + usersMap.erase(i); + WriteUsersToStorage(backend, usersMap); } Status MPinSDK::ListUsers(std::vector<UserPtr>& users) const @@ -1459,7 +1480,21 @@ Status MPinSDK::CheckUserState(UserPtr user, User::State expectedState) return Status(Status::OK); } -Status MPinSDK::WriteUsersToStorage() +String MPinSDK::MakeBackendKey(const String& backendServer) const +{ + String backend = backendServer; + backend.ReplaceAll("https://", ""); + backend.ReplaceAll("http://", ""); + backend.TrimRight("/"); + return backend; +} + +Status MPinSDK::WriteUsersToStorage() const +{ + return WriteUsersToStorage(m_RPAServer, m_users); +} + +Status MPinSDK::WriteUsersToStorage(const String& backendServer, const UsersMap& usersMap) const { IStorage* storage = m_context->GetStorage(IStorage::NONSECURE); String data; @@ -1475,14 +1510,12 @@ Status MPinSDK::WriteUsersToStorage() json::Reader::Read(allBackendsObject, strIn); } - String backend = m_RPAServer; - backend.ReplaceAll("https://", ""); - backend.ReplaceAll("http://", ""); + String backend = MakeBackendKey(backendServer); json::Object& rootObject = (json::Object&) allBackendsObject[backend]; rootObject.Clear(); - for (UsersMap::iterator i = m_users.begin(); i != m_users.end(); ++i) + for (UsersMap::const_iterator i = usersMap.begin(); i != usersMap.end(); ++i) { UserPtr user = i->second; @@ -1557,9 +1590,7 @@ Status MPinSDK::LoadUsersFromStorage(const String& backendServer, UsersMap& user std::istringstream str(data); json::Reader::Read(allBackendsObject, str); - String backend = backendServer; - backend.ReplaceAll("https://", ""); - backend.ReplaceAll("http://", ""); + String backend = MakeBackendKey(backendServer); json::Object::const_iterator i = allBackendsObject.Find(backend); if(i == allBackendsObject.End()) http://git-wip-us.apache.org/repos/asf/incubator-milagro-mfa-sdk-core/blob/5c5a025f/src/mpin_sdk.h ---------------------------------------------------------------------- diff --git a/src/mpin_sdk.h b/src/mpin_sdk.h index ec69d58..f5f77b6 100644 --- a/src/mpin_sdk.h +++ b/src/mpin_sdk.h @@ -246,6 +246,7 @@ public: String GetPrerollUserId(const String& accessCode); void DeleteUser(INOUT UserPtr user); + void DeleteUser(INOUT UserPtr user, const String& backend); Status ListUsers(OUT std::vector<UserPtr>& users) const; Status ListUsers(OUT std::vector<UserPtr>& users, const String& backend) const; Status ListBackends(OUT std::vector<String>& backends) const; @@ -351,7 +352,10 @@ private: bool ValidateAccessNumberChecksum(const String& accessNumber); void AddUser(IN UserPtr user); Status CheckUserState(IN UserPtr user, User::State expectedState); - Status WriteUsersToStorage(); + void DeleteUser(INOUT UserPtr user, const String& backend, UsersMap& usersMap); + String MakeBackendKey(const String& backendServer) const; + Status WriteUsersToStorage() const; + Status WriteUsersToStorage(const String& backendServer, const UsersMap& usersMap) const; Status LoadUsersFromStorage(); Status LoadUsersFromStorage(const String& backendServer, UsersMap& usersMap) const; void ListUsers(OUT std::vector<UserPtr>& users, const UsersMap& usersMap) const; http://git-wip-us.apache.org/repos/asf/incubator-milagro-mfa-sdk-core/blob/5c5a025f/tests/unit_tests.cpp ---------------------------------------------------------------------- diff --git a/tests/unit_tests.cpp b/tests/unit_tests.cpp index 6892270..055d7ee 100644 --- a/tests/unit_tests.cpp +++ b/tests/unit_tests.cpp @@ -194,7 +194,10 @@ BOOST_AUTO_TEST_CASE(testUsers2) sdk.ListUsers(users, backend); BOOST_CHECK_EQUAL(users.size(), 1); - sdk.DeleteUser(user); + sdk.DeleteUser(users[0], backend); + users.clear(); + sdk.ListUsers(users, backend); + BOOST_CHECK(users.empty()); BOOST_MESSAGE(" testUsers2 finished"); }
