diff --git a/src/iam/app/app.cpp b/src/iam/app/app.cpp index ced07a9ff..1c074cb8e 100644 --- a/src/iam/app/app.cpp +++ b/src/iam/app/app.cpp @@ -241,10 +241,6 @@ void App::Init() err = InitIdentifierModule(config.mValue.mIdentifier); AOS_ERROR_CHECK_AND_THROW(err, "can't initialize identifier module"); - if (config.mValue.mEnablePermissionsHandler) { - mPermHandler = std::make_unique(); - } - err = mCryptoProvider.Init(); AOS_ERROR_CHECK_AND_THROW(err, "can't initialize crypto provider"); @@ -254,6 +250,13 @@ void App::Init() err = InitCertModules(config.mValue); AOS_ERROR_CHECK_AND_THROW(err, "can't initialize cert modules"); + if (config.mValue.mEnablePermissionsHandler) { + mPermHandler = std::make_unique(); + + err = mPermHandler->Init(mCryptoProvider); + AOS_ERROR_CHECK_AND_THROW(err, "can't initialize permissions handler"); + } + err = mNodeManager.Init(mDatabase); AOS_ERROR_CHECK_AND_THROW(err, "can't initialize node manager"); @@ -459,7 +462,7 @@ Error App::InitIdentifierModule(const config::IdentifierConfig& config) } else if (config.mPlugin == "visidentifier") { auto visIdentifier = std::make_unique(); - if (auto err = visIdentifier->Init(config, mIAMServer); !err.IsNone()) { + if (auto err = visIdentifier->Init(config, mIAMServer, mCryptoProvider); !err.IsNone()) { return err; } diff --git a/src/iam/identhandler/visidentifier/pocowsclient.cpp b/src/iam/identhandler/visidentifier/pocowsclient.cpp index be2a77127..ffae3edde 100644 --- a/src/iam/identhandler/visidentifier/pocowsclient.cpp +++ b/src/iam/identhandler/visidentifier/pocowsclient.cpp @@ -39,8 +39,10 @@ auto OnScopeExit(F&& f) * Public **********************************************************************************************************************/ -PocoWSClient::PocoWSClient(const aos::iam::config::VISIdentifierModuleParams& config, MessageHandlerFunc handler) +PocoWSClient::PocoWSClient(const aos::iam::config::VISIdentifierModuleParams& config, crypto::UUIDItf& uuidProvider, + MessageHandlerFunc handler) : mConfig(config) + , mUUIDProvider(&uuidProvider) , mHandleSubscription(std::move(handler)) { mHttpRequest.setMethod(Poco::Net::HTTPRequest::HTTP_GET); @@ -122,7 +124,11 @@ void PocoWSClient::Disconnect() std::string PocoWSClient::GenerateRequestID() { - const auto uuid = aos::uuid::CreateUUID(); + auto [uuid, err] = mUUIDProvider->CreateUUIDv4(); + if (!err.IsNone()) { + throw WSException("Failed to generate UUID", AOS_ERROR_WRAP(ErrorEnum::eFailed)); + } + const auto uuidStr = aos::uuid::UUIDToString(uuid); return {uuidStr.begin(), uuidStr.end()}; diff --git a/src/iam/identhandler/visidentifier/pocowsclient.hpp b/src/iam/identhandler/visidentifier/pocowsclient.hpp index 692e89807..d14686b6d 100644 --- a/src/iam/identhandler/visidentifier/pocowsclient.hpp +++ b/src/iam/identhandler/visidentifier/pocowsclient.hpp @@ -20,6 +20,8 @@ #include #include +#include + #include #include @@ -37,9 +39,11 @@ class PocoWSClient : public WSClientItf { * Creates Web socket client instance. * * @param config VIS config. + * @param uuidProvider UUID provider. * @param handler handler functor. */ - PocoWSClient(const aos::iam::config::VISIdentifierModuleParams& config, MessageHandlerFunc handler); + PocoWSClient(const aos::iam::config::VISIdentifierModuleParams& config, crypto::UUIDItf& uuidProvider, + MessageHandlerFunc handler); /** * Connects to Web Socket server. @@ -100,7 +104,8 @@ class PocoWSClient : public WSClientItf { void StopReceiveFramesThread(); Duration GetWebSocketTimeout(); - aos::iam::config::VISIdentifierModuleParams mConfig; + config::VISIdentifierModuleParams mConfig; + crypto::UUIDItf* mUUIDProvider {}; std::recursive_mutex mMutex; std::thread mReceivedFramesThread; std::unique_ptr mClientSession; diff --git a/src/iam/identhandler/visidentifier/tests/pocowsclient.cpp b/src/iam/identhandler/visidentifier/tests/pocowsclient.cpp index 33b29d278..3e5386eb7 100644 --- a/src/iam/identhandler/visidentifier/tests/pocowsclient.cpp +++ b/src/iam/identhandler/visidentifier/tests/pocowsclient.cpp @@ -9,6 +9,7 @@ #include +#include #include #include @@ -59,7 +60,11 @@ class PocoWSClientTests : public Test { void SetUp() override { - ASSERT_NO_THROW(mWsClientPtr = std::make_shared(cConfig, WSClientItf::MessageHandlerFunc())); + mCryptoProvider = std::make_unique(); + ASSERT_TRUE(mCryptoProvider->Init().IsNone()) << "Failed to initialize crypto provider"; + + ASSERT_NO_THROW(mWsClientPtr + = std::make_shared(cConfig, *mCryptoProvider, WSClientItf::MessageHandlerFunc())); } // This method is called before any test cases in the test suite @@ -85,7 +90,8 @@ class PocoWSClientTests : public Test { Poco::Net::uninitializeSSL(); } - std::shared_ptr mWsClientPtr; + std::unique_ptr mCryptoProvider; + std::shared_ptr mWsClientPtr; }; const config::VISIdentifierModuleParams PocoWSClientTests::cConfig {cWebSocketURI, cClientCertPath, 5 * Time::cSeconds}; @@ -170,7 +176,7 @@ TEST_F(PocoWSClientTests, VisidentifierGetSystemID) iam::identhandler::SubjectsObserverMock observer; - ASSERT_TRUE(visIdentifier.Init(config, observer).IsNone()); + ASSERT_TRUE(visIdentifier.Init(config, observer, *mCryptoProvider).IsNone()); ASSERT_TRUE(visIdentifier.Start().IsNone()); const std::string expectedSystemId {"test-system-id"}; @@ -191,7 +197,7 @@ TEST_F(PocoWSClientTests, VisidentifierGetUnitModel) iam::identhandler::SubjectsObserverMock observer; - ASSERT_TRUE(visIdentifier.Init(config, observer).IsNone()); + ASSERT_TRUE(visIdentifier.Init(config, observer, *mCryptoProvider).IsNone()); ASSERT_TRUE(visIdentifier.Start().IsNone()); const std::string expectedUnitModel {"test-unit-model"}; @@ -212,7 +218,7 @@ TEST_F(PocoWSClientTests, VisidentifierGetSubjects) iam::identhandler::SubjectsObserverMock observer; - ASSERT_TRUE(visIdentifier.Init(config, observer).IsNone()); + ASSERT_TRUE(visIdentifier.Init(config, observer, *mCryptoProvider).IsNone()); ASSERT_TRUE(visIdentifier.Start().IsNone()); const std::vector testSubjects {"1", "2", "3"}; diff --git a/src/iam/identhandler/visidentifier/tests/visidentifier.cpp b/src/iam/identhandler/visidentifier/tests/visidentifier.cpp index a110f2f8f..79dab6c47 100644 --- a/src/iam/identhandler/visidentifier/tests/visidentifier.cpp +++ b/src/iam/identhandler/visidentifier/tests/visidentifier.cpp @@ -7,6 +7,7 @@ #include +#include #include #include @@ -49,11 +50,12 @@ class VisidentifierTest : public testing::Test { const std::string cTestSubscriptionId {"1234-4321"}; const config::VISIdentifierModuleParams cVISConfig {"vis-service", "ca-path", 1}; - WSClientEvent mWSClientEvent; - iam::identhandler::SubjectsObserverMock mVISSubjectsObserverMock; - WSClientMockPtr mWSClientItfMockPtr {std::make_shared>()}; - TestVISIdentifier mVisIdentifier; - config::IdentifierConfig mConfig; + WSClientEvent mWSClientEvent; + iam::identhandler::SubjectsObserverMock mVISSubjectsObserverMock; + std::unique_ptr mCryptoProvider; + WSClientMockPtr mWSClientItfMockPtr {std::make_shared>()}; + TestVISIdentifier mVisIdentifier; + config::IdentifierConfig mConfig; // This method is called before any test cases in the test suite static void SetUpTestSuite() @@ -76,6 +78,9 @@ class VisidentifierTest : public testing::Test { mConfig.mParams = object; mVisIdentifier.SetWSClient(mWSClientItfMockPtr); + + mCryptoProvider = std::make_unique(); + ASSERT_TRUE(mCryptoProvider->Init().IsNone()) << "Failed to initialize crypto provider"; } void ExpectStopSucceeded() @@ -127,7 +132,7 @@ class VisidentifierTest : public testing::Test { EXPECT_CALL(mVisIdentifier, InitWSClient).WillOnce(Return(ErrorEnum::eNone)); EXPECT_CALL(*mWSClientItfMockPtr, WaitForEvent).WillOnce(Invoke([this]() { return mWSClientEvent.Wait(); })); - ASSERT_TRUE(mVisIdentifier.Init(mConfig, mVISSubjectsObserverMock).IsNone()); + ASSERT_TRUE(mVisIdentifier.Init(mConfig, mVISSubjectsObserverMock, *mCryptoProvider).IsNone()); ASSERT_TRUE(mVisIdentifier.Start().IsNone()); @@ -158,7 +163,7 @@ class VisidentifierTest : public testing::Test { TEST_F(VisidentifierTest, InitFailsOnEmptyConfig) { VISIdentifier identifier; - ASSERT_TRUE(identifier.Init(config::IdentifierConfig {}, mVISSubjectsObserverMock).IsNone()); + ASSERT_TRUE(identifier.Init(config::IdentifierConfig {}, mVISSubjectsObserverMock, *mCryptoProvider).IsNone()); EXPECT_FALSE(identifier.Start().IsNone()); } @@ -294,7 +299,7 @@ TEST_F(VisidentifierTest, ReconnectOnFailSendFrame) return {str.cbegin(), str.cend()}; })); - EXPECT_TRUE(mVisIdentifier.Init(mConfig, mVISSubjectsObserverMock).IsNone()); + EXPECT_TRUE(mVisIdentifier.Init(mConfig, mVISSubjectsObserverMock, *mCryptoProvider).IsNone()); EXPECT_TRUE(mVisIdentifier.Start().IsNone()); mVisIdentifier.WaitUntilConnected(); diff --git a/src/iam/identhandler/visidentifier/visidentifier.cpp b/src/iam/identhandler/visidentifier/visidentifier.cpp index 5b544a052..580ee8197 100644 --- a/src/iam/identhandler/visidentifier/visidentifier.cpp +++ b/src/iam/identhandler/visidentifier/visidentifier.cpp @@ -63,12 +63,14 @@ VISIdentifier::VISIdentifier() { } -Error VISIdentifier::Init( - const config::IdentifierConfig& config, aos::iam::identhandler::SubjectsObserverItf& subjectsObserver) +Error VISIdentifier::Init(const config::IdentifierConfig& config, identhandler::SubjectsObserverItf& subjectsObserver, + crypto::UUIDItf& uuidProvider) { + LOG_DBG() << "Initializing VIS identifier"; - mSubjectsObserver = &subjectsObserver; mConfig = config; + mSubjectsObserver = &subjectsObserver; + mUUIDProvider = &uuidProvider; return ErrorEnum::eNone; } @@ -213,7 +215,7 @@ Error VISIdentifier::InitWSClient(const config::IdentifierConfig& config) } mWsClientPtr = std::make_shared( - visParams, std::bind(&VISIdentifier::HandleSubscription, this, std::placeholders::_1)); + visParams, *mUUIDProvider, std::bind(&VISIdentifier::HandleSubscription, this, std::placeholders::_1)); } catch (const std::exception& e) { LOG_ERR() << "Failed to create WS client: error = " << e.what(); diff --git a/src/iam/identhandler/visidentifier/visidentifier.hpp b/src/iam/identhandler/visidentifier/visidentifier.hpp index 43b7203c7..db9ad730b 100644 --- a/src/iam/identhandler/visidentifier/visidentifier.hpp +++ b/src/iam/identhandler/visidentifier/visidentifier.hpp @@ -69,9 +69,11 @@ class VISIdentifier : public iam::identhandler::IdentHandlerItf { * * @param config identifier config. * @param subjectsObserver subject observer. + * @param uuidProvider UUID provider. * @return Error. */ - Error Init(const config::IdentifierConfig& config, iam::identhandler::SubjectsObserverItf& subjectsObserver); + Error Init(const config::IdentifierConfig& config, identhandler::SubjectsObserverItf& subjectsObserver, + crypto::UUIDItf& uuidProvider); /** * Starts vis identifier. @@ -132,7 +134,8 @@ class VISIdentifier : public iam::identhandler::IdentHandlerItf { std::vector GetValueArrayByPath(Poco::Dynamic::Var object, const std::string& valueChildTagName); std::shared_ptr mWsClientPtr; - iam::identhandler::SubjectsObserverItf* mSubjectsObserver = nullptr; + identhandler::SubjectsObserverItf* mSubjectsObserver = nullptr; + crypto::UUIDItf* mUUIDProvider = nullptr; VISSubscriptions mSubscriptions; StaticString mSystemId; StaticString mUnitModel; diff --git a/src/sm/app/aoscore.cpp b/src/sm/app/aoscore.cpp index 3f5126a6f..af5f250a3 100644 --- a/src/sm/app/aoscore.cpp +++ b/src/sm/app/aoscore.cpp @@ -142,7 +142,7 @@ void AosCore::Init(const std::string& configFile) err = mLauncher.Init(mConfig.mLauncherConfig, mIAMClientPublic, mServiceManager, mLayerManager, mResourceManager, mNetworkManager, mIAMClientPermissions, mRunner, mRuntime, mResourceMonitor, mOCISpec, mSMClient, mSMClient, - mDatabase); + mDatabase, mCryptoProvider); AOS_ERROR_CHECK_AND_THROW(err, "can't initialize launcher"); // Initialize SM client