From 413971f8770d994a2c829bb2425de9ce238e7eee Mon Sep 17 00:00:00 2001 From: wangzhen Date: Wed, 8 May 2024 11:20:48 +0800 Subject: [PATCH] ConnectWithAccount got unexpected behavior Signed-off-by: wangzhen Change-Id: I1df7233aed9cdc578efe0f8b32f21c820c1c2f04 --- .../ability_runtime/ability_context_impl.cpp | 4 ++-- .../ability_runtime/connection_manager.cpp | 16 ++++++++++------ .../ability_runtime/js_ability_context.cpp | 11 +++++++---- .../native/js_service_extension_context.cpp | 16 ++++++++++------ .../service_extension_context.cpp | 6 +++--- .../ability/ability_runtime/ability_context.h | 3 ++- .../ability_runtime/ability_context_impl.h | 4 ++-- .../ability/ability_runtime/connection_manager.h | 15 ++++++++++----- .../native/ability_runtime/js_ability_context.h | 1 + .../native/js_service_extension_context.h | 1 + .../ability_runtime/service_extension_context.h | 6 +++--- 11 files changed, 51 insertions(+), 32 deletions(-) diff --git a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp index fcb160aa55..f3dc01abfd 100644 --- a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp +++ b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp @@ -395,13 +395,13 @@ ErrCode AbilityContextImpl::ConnectAbilityWithAccount(const AAFwk::Want& want, i } void AbilityContextImpl::DisconnectAbility(const AAFwk::Want& want, - const sptr& connectCallback) + const sptr& connectCallback, int32_t accountId) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGD(AAFwkTag::CONTEXT, "DisconnectAbility begin, caller:%{public}s.", abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str()); ErrCode ret = - ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback); + ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback, accountId); if (ret != ERR_OK) { TAG_LOGE(AAFwkTag::CONTEXT, "error, ret=%{public}d", ret); } diff --git a/frameworks/native/ability/ability_runtime/connection_manager.cpp b/frameworks/native/ability/ability_runtime/connection_manager.cpp index c7daa98762..72e3be8d82 100644 --- a/frameworks/native/ability/ability_runtime/connection_manager.cpp +++ b/frameworks/native/ability/ability_runtime/connection_manager.cpp @@ -61,7 +61,7 @@ ErrCode ConnectionManager::ConnectAbilityInner(const sptr& connec std::lock_guard lock(connectionsLock_); auto connectionIter = abilityConnections_.begin(); for (; connectionIter != abilityConnections_.end(); ++connectionIter) { - if (MatchConnection(connectCaller, want, *connectionIter)) { + if (MatchConnection(connectCaller, want, accountId, *connectionIter)) { break; } } @@ -89,9 +89,12 @@ ErrCode ConnectionManager::ConnectAbilityInner(const sptr& connec } bool ConnectionManager::MatchConnection( - const sptr& connectCaller, const AAFwk::Want& connectReceiver, + const sptr& connectCaller, const AAFwk::Want& connectReceiver, int32_t accountId, const std::map>>::value_type& connection) { + if (accountId != connection.first.userid) { + return false; + } if (!connectReceiver.GetElement().GetAbilityName().empty()) { return connectCaller == connection.first.connectCaller && connectReceiver.GetElement().GetBundleName() == connection.first.connectReceiver.GetBundleName() && @@ -120,7 +123,7 @@ ErrCode ConnectionManager::CreateConnection(const sptr& connectCa want, abilityConnection, connectCaller, accountId); std::lock_guard lock(connectionsLock_); if (ret == ERR_OK) { - ConnectionInfo connectionInfo(connectCaller, want.GetOperation(), abilityConnection); + ConnectionInfo connectionInfo(connectCaller, want.GetOperation(), abilityConnection, accountId); std::vector> callbacks; callbacks.push_back(connectCallback); abilityConnections_[connectionInfo] = callbacks; @@ -139,7 +142,8 @@ ErrCode ConnectionManager::DisconnectAbility(const sptr& connectC } ErrCode ConnectionManager::DisconnectAbility(const sptr& connectCaller, - const AAFwk::Want& connectReceiver, const sptr& connectCallback) + const AAFwk::Want& connectReceiver, const sptr& connectCallback, + int32_t accountId) { if (connectCaller == nullptr || connectCallback == nullptr) { TAG_LOGE(AAFwkTag::CONNECTION, "connectCaller or connectCallback is nullptr."); @@ -151,8 +155,8 @@ ErrCode ConnectionManager::DisconnectAbility(const sptr& connectC (element.GetBundleName() + ":" + element.GetAbilityName()).c_str()); std::lock_guard lock(connectionsLock_); auto item = std::find_if(abilityConnections_.begin(), abilityConnections_.end(), - [&connectCaller, &connectReceiver, this](const auto& obj) { - return MatchConnection(connectCaller, connectReceiver, obj); + [&connectCaller, &connectReceiver, this, accountId](const auto& obj) { + return MatchConnection(connectCaller, connectReceiver, accountId, obj); }); if (item != abilityConnections_.end()) { TAG_LOGD(AAFwkTag::CONNECTION, "remove callback, Size:%{public}zu.", item->second.size()); diff --git a/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp b/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp index 8290d2ea35..b2f4c3ac1b 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp @@ -86,7 +86,7 @@ void RemoveConnection(int64_t connectId) } } -int64_t InsertConnection(sptr connection, const AAFwk::Want &want) +int64_t InsertConnection(sptr connection, const AAFwk::Want &want, int32_t accountId = -1) { std::lock_guard lock(gConnectsLock_); if (connection == nullptr) { @@ -97,6 +97,7 @@ int64_t InsertConnection(sptr connection, const AAFwk::Want ConnectionKey key; key.id = g_serialNumber; key.want = want; + key.accountId = accountId; connection->SetConnectionId(key.id); g_connects.emplace(key, connection); if (g_serialNumber < INT32_MAX) { @@ -1236,7 +1237,7 @@ napi_value JsAbilityContext::OnConnectAbilityWithAccount(napi_env env, NapiCallb // unwarp connection sptr connection = new JSAbilityConnection(env); connection->SetJsConnectionObject(info.argv[INDEX_TWO]); - int64_t connectId = InsertConnection(connection, want); + int64_t connectId = InsertConnection(connection, want, accountId); NapiAsyncTask::CompleteCallback complete = [weak = context_, want, accountId, connection, connectId]( napi_env env, NapiAsyncTask& task, int32_t status) { @@ -1277,6 +1278,7 @@ napi_value JsAbilityContext::OnDisconnectAbility(napi_env env, NapiCallbackInfo& // unwrap connectId int64_t connectId = -1; sptr connection = nullptr; + int32_t accountId = -1; napi_get_value_int64(env, info.argv[INDEX_ZERO], &connectId); TAG_LOGI(AAFwkTag::CONTEXT, "DisconnectAbility, connection:%{public}d.", static_cast(connectId)); auto item = std::find_if(g_connects.begin(), @@ -1288,12 +1290,13 @@ napi_value JsAbilityContext::OnDisconnectAbility(napi_env env, NapiCallbackInfo& // match id want = item->first.want; connection = item->second; + accountId = item->first.accountId; } else { TAG_LOGI(AAFwkTag::CONTEXT, "not find conn exist."); } // begin disconnect NapiAsyncTask::CompleteCallback complete = - [weak = context_, want, connection]( + [weak = context_, want, connection, accountId]( napi_env env, NapiAsyncTask& task, int32_t status) { auto context = weak.lock(); if (!context) { @@ -1307,7 +1310,7 @@ napi_value JsAbilityContext::OnDisconnectAbility(napi_env env, NapiCallbackInfo& return; } TAG_LOGD(AAFwkTag::CONTEXT, "context->DisconnectAbility"); - context->DisconnectAbility(want, connection); + context->DisconnectAbility(want, connection, accountId); task.Resolve(env, CreateJsUndefined(env)); }; diff --git a/frameworks/native/ability/native/js_service_extension_context.cpp b/frameworks/native/ability/native/js_service_extension_context.cpp index 42cf3daa7e..8a8bbdb1fa 100644 --- a/frameworks/native/ability/native/js_service_extension_context.cpp +++ b/frameworks/native/ability/native/js_service_extension_context.cpp @@ -723,7 +723,7 @@ private: if (!CheckStartAbilityWithAccountInputParam(env, info, want, accountId, unwrapArgc)) { return CreateJsUndefined(env); } - if (!CheckConnectionParam(env, info.argv[INDEX_TWO], connection, want)) { + if (!CheckConnectionParam(env, info.argv[INDEX_TWO], connection, want, accountId)) { ThrowInvalidParamError(env, "Parse param options failed, must be a ConnectOptions"); return CreateJsUndefined(env); } @@ -755,7 +755,7 @@ private: } bool CheckConnectionParam(napi_env env, napi_value value, - sptr& connection, AAFwk::Want& want) const + sptr& connection, AAFwk::Want& want, int32_t accountId = -1) const { if (!CheckTypeForNapiValue(env, value, napi_object)) { TAG_LOGE(AAFwkTag::SERVICE_EXT, "Failed to get connection object"); @@ -767,6 +767,7 @@ private: std::lock_guard guard(g_connectsMutex); key.id = g_serialNumber; key.want = want; + key.accountId = accountId; connection->SetConnectionId(key.id); g_connects.emplace(key, connection); if (g_serialNumber < INT32_MAX) { @@ -795,10 +796,11 @@ private: AAFwk::Want want; sptr connection = nullptr; - FindConnection(want, connection, connectId); + int32_t accountId = -1; + FindConnection(want, connection, connectId, accountId); // begin disconnect NapiAsyncTask::CompleteCallback complete = - [weak = context_, want, connection]( + [weak = context_, want, connection, accountId]( napi_env env, NapiAsyncTask& task, int32_t status) { auto context = weak.lock(); if (!context) { @@ -812,7 +814,7 @@ private: return; } TAG_LOGD(AAFwkTag::SERVICE_EXT, "context->DisconnectAbility"); - auto innerErrorCode = context->DisconnectAbility(want, connection); + auto innerErrorCode = context->DisconnectAbility(want, connection, accountId); if (innerErrorCode == 0) { task.Resolve(env, CreateJsUndefined(env)); } else { @@ -827,7 +829,8 @@ private: return result; } - void FindConnection(AAFwk::Want& want, sptr& connection, int64_t& connectId) const + void FindConnection(AAFwk::Want& want, sptr& connection, int64_t& connectId, + int32_t &accountId) const { TAG_LOGI(AAFwkTag::SERVICE_EXT, "Disconnect ability begin, connection:%{public}d.", static_cast(connectId)); @@ -841,6 +844,7 @@ private: // match id want = item->first.want; connection = item->second; + accountId = item->first.accountId; TAG_LOGD(AAFwkTag::SERVICE_EXT, "find conn ability exist"); } return; diff --git a/frameworks/native/appkit/ability_runtime/service_extension_context.cpp b/frameworks/native/appkit/ability_runtime/service_extension_context.cpp index 93c61eb923..7f4d2de6ee 100644 --- a/frameworks/native/appkit/ability_runtime/service_extension_context.cpp +++ b/frameworks/native/appkit/ability_runtime/service_extension_context.cpp @@ -183,12 +183,12 @@ ErrCode ServiceExtensionContext::ConnectAbilityWithAccount( return ret; } -ErrCode ServiceExtensionContext::DisconnectAbility( - const AAFwk::Want &want, const sptr &connectCallback) const +ErrCode ServiceExtensionContext::DisconnectAbility(const AAFwk::Want &want, + const sptr &connectCallback, int32_t accountId) const { TAG_LOGD(AAFwkTag::APPKIT, "begin."); ErrCode ret = - ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback); + ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback, accountId); if (ret != ERR_OK) { TAG_LOGE(AAFwkTag::APPKIT, "%{public}s end DisconnectAbility error, ret=%{public}d", __func__, ret); } diff --git a/interfaces/kits/native/ability/ability_runtime/ability_context.h b/interfaces/kits/native/ability/ability_runtime/ability_context.h index ebca91623a..11a477b10f 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_context.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_context.h @@ -198,7 +198,8 @@ public: * @param connectCallback Indicates the callback object when the target ability is connected. * is set up. The IAbilityConnection object uniquely identifies a connection between two abilities. */ - virtual void DisconnectAbility(const AAFwk::Want &want, const sptr &connectCallback) = 0; + virtual void DisconnectAbility(const AAFwk::Want &want, const sptr &connectCallback, + int32_t accountId = -1) = 0; /** * @brief get ability info of the current ability diff --git a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h index aaa8ce6a19..6b906d32bf 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h @@ -84,8 +84,8 @@ public: const sptr &connectCallback) override; ErrCode ConnectAbilityWithAccount(const AAFwk::Want &want, int accountId, const sptr &connectCallback) override; - void DisconnectAbility(const AAFwk::Want &want, - const sptr &connectCallback) override; + void DisconnectAbility(const AAFwk::Want &want, const sptr &connectCallback, + int32_t accountId = -1) override; std::shared_ptr GetHapModuleInfo() const override; std::shared_ptr GetAbilityInfo() const override; void MinimizeAbility(bool fromUser = false) override; diff --git a/interfaces/kits/native/ability/ability_runtime/connection_manager.h b/interfaces/kits/native/ability/ability_runtime/connection_manager.h index 1847e7fa1e..528cf0162b 100644 --- a/interfaces/kits/native/ability/ability_runtime/connection_manager.h +++ b/interfaces/kits/native/ability/ability_runtime/connection_manager.h @@ -35,14 +35,19 @@ struct ConnectionInfo { // connection sptr abilityConnection; + int32_t userid; + ConnectionInfo(const sptr &connectCaller, const AAFwk::Operation &connectReceiver, - const sptr &abilityConnection) : connectCaller(connectCaller), - connectReceiver(connectReceiver), abilityConnection(abilityConnection) + const sptr &abilityConnection, int32_t accountId = -1) : connectCaller(connectCaller), + connectReceiver(connectReceiver), abilityConnection(abilityConnection), userid(accountId) { } inline bool operator < (const ConnectionInfo &that) const { + if (userid < that.userid) { + return true; + } if (connectCaller < that.connectCaller) { return true; } @@ -128,8 +133,8 @@ public: * @param connectCallback The connection callback. * @return Returns the result of disconnecting ability connection. */ - ErrCode DisconnectAbility(const sptr &connectCaller, - const AAFwk::Want &connectReceiver, const sptr &connectCallback); + ErrCode DisconnectAbility(const sptr &connectCaller, const AAFwk::Want &connectReceiver, + const sptr &connectCallback, int32_t accountId = -1); /** * @brief check the ability connection of caller is disconnect. @@ -163,7 +168,7 @@ private: bool IsConnectReceiverEqual(AAFwk::Operation &connectReceiver, const AppExecFwk::ElementName &connectReceiverOther); bool MatchConnection( - const sptr& connectCaller, const AAFwk::Want& connectReceiver, + const sptr& connectCaller, const AAFwk::Want& connectReceiver, int32_t accountId, const std::map>>::value_type& connection); std::recursive_mutex connectionsLock_; std::map>> abilityConnections_; diff --git a/interfaces/kits/native/ability/native/ability_runtime/js_ability_context.h b/interfaces/kits/native/ability/native/ability_runtime/js_ability_context.h index c3fdaa74a7..df4f41f53e 100644 --- a/interfaces/kits/native/ability/native/ability_runtime/js_ability_context.h +++ b/interfaces/kits/native/ability/native/ability_runtime/js_ability_context.h @@ -170,6 +170,7 @@ private: struct ConnectionKey { AAFwk::Want want; int64_t id; + int32_t accountId; }; struct KeyCompare { diff --git a/interfaces/kits/native/ability/native/js_service_extension_context.h b/interfaces/kits/native/ability/native/js_service_extension_context.h index a51a37c276..8b0c3d793c 100644 --- a/interfaces/kits/native/ability/native/js_service_extension_context.h +++ b/interfaces/kits/native/ability/native/js_service_extension_context.h @@ -52,6 +52,7 @@ private: struct ConnectionKey { AAFwk::Want want; int64_t id; + int32_t accountId; }; struct key_compare { diff --git a/interfaces/kits/native/appkit/ability_runtime/service_extension_context.h b/interfaces/kits/native/appkit/ability_runtime/service_extension_context.h index 7e3d2bd253..e50ebbdc46 100644 --- a/interfaces/kits/native/appkit/ability_runtime/service_extension_context.h +++ b/interfaces/kits/native/appkit/ability_runtime/service_extension_context.h @@ -146,8 +146,8 @@ public: * * @return errCode ERR_OK on success, others on failure. */ - ErrCode DisconnectAbility( - const AAFwk::Want &want, const sptr &connectCallback) const; + ErrCode DisconnectAbility(const AAFwk::Want &want, const sptr &connectCallback, + int32_t accountId = -1) const; /** * @brief Destroys the current ability. @@ -155,7 +155,7 @@ public: * @return errCode ERR_OK on success, others on failure. */ ErrCode TerminateAbility(); - + ErrCode RequestModalUIExtension(const Want &want); using SelfType = ServiceExtensionContext;