diff --git a/services/abilitymgr/include/pending_want_manager.h b/services/abilitymgr/include/pending_want_manager.h index faa312c2cc..2401c66db7 100644 --- a/services/abilitymgr/include/pending_want_manager.h +++ b/services/abilitymgr/include/pending_want_manager.h @@ -152,7 +152,8 @@ public: public: sptr GetWantSender(int32_t callingUid, int32_t uid, const bool isSystemApp, - const WantSenderInfo &wantSenderInfo, const sptr &callerToken, int32_t appIndex = 0); + const WantSenderInfo &wantSenderInfo, const sptr &callerToken, int32_t appIndex = 0, + int32_t publisherUid = 0); int32_t SendWantSender(sptr target, SenderInfo &senderInfo); int32_t SendLocalWantSender(const SenderInfo &senderInfo); void CancelWantSender(const bool isSystemAppCall, const sptr &sender); @@ -179,7 +180,7 @@ public: int32_t DeviceIdDetermine(const Want &want, const sptr &startOptions, const sptr &callerToken, int32_t requestCode, const int32_t callerUid, int32_t callerTokenId, int32_t userId); - int32_t PendingWantPublishCommonEvent(const Want &want, const SenderInfo &senderInfo, int32_t callerUid, + int32_t PendingWantPublishCommonEvent(const Want &want, const SenderInfo &senderInfo, int32_t publisherUid, int32_t callerTokenId); void ClearPendingWantRecord(const std::string &bundleName, int32_t uid); @@ -189,7 +190,8 @@ public: private: sptr GetWantSenderLocked(const int32_t callingUid, const int32_t uid, const int32_t userId, - WantSenderInfo &wantSenderInfo, const sptr &callerToken, int32_t appIndex = 0); + WantSenderInfo &wantSenderInfo, const sptr &callerToken, int32_t appIndex = 0, + int32_t publisherUid = 0); void MakeWantSenderCanceledLocked(PendingWantRecord &record); void HandleAddWantAgentNumber(std::shared_ptr pendingKey); diff --git a/services/abilitymgr/include/pending_want_record.h b/services/abilitymgr/include/pending_want_record.h index f59070a091..aacc16584b 100644 --- a/services/abilitymgr/include/pending_want_record.h +++ b/services/abilitymgr/include/pending_want_record.h @@ -47,6 +47,8 @@ public: std::shared_ptr GetKey(); int32_t GetUid() const; void SetCallerUid(const int32_t callerUid); + void SetPublisherUid(int32_t publisherUid); + int32_t GetPublisherUid() const; void SetCanceled(); bool GetCanceled(); std::list> GetCancelCallbacks(); @@ -67,6 +69,7 @@ private: std::shared_ptr key_ = {}; std::list> mCancelCallbacks_ = {}; int32_t callerUid_ = 0; + int32_t publisherUid_ = 0; bool canceled_ = false; ffrt::mutex lock_ = {}; std::mutex mCancelCallbacksMutex_; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 0d9257dee9..8fbd3d10ab 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -6643,13 +6643,10 @@ sptr AbilityManagerService::GetWantSenderByUserId(const WantSenderI const sptr &callerToken, int32_t uid, int32_t callerUid, int32_t callerUserId) { bool isSpecifyUserId = wantSenderInfo.userId >= 0; - std::string bundleName = ""; - if (!wantSenderInfo.allWants.empty()) { - bundleName = wantSenderInfo.allWants.back().want.GetBundle(); - } + std::string bundleName = wantSenderInfo.allWants.empty() ? "" : + wantSenderInfo.allWants.back().want.GetBundle(); bool isSACall = AAFwk::PermissionVerification::GetInstance()->IsSACall(); bool isSystemApp = AAFwk::PermissionVerification::GetInstance()->IsSystemAppCall(); - int32_t userId = -1; int32_t appUid = -1; int32_t appIndex = 0; @@ -6684,10 +6681,11 @@ sptr AbilityManagerService::GetWantSenderByUserId(const WantSenderI } const_cast(wantSenderInfo).userId = userId; TAG_LOGI(AAFwkTag::WANTAGENT, "bundleName: %{public}s, appIndex: %{public}d, isSystemApp: %{public}d, " - "isSACall: %{public}d, userId: %{public}d, appUid: %{public}d", bundleName.c_str(), appIndex, isSystemApp, - isSACall, userId, appUid); - - return pendingWantManager->GetWantSender(callerUid, appUid, isSystemApp, wantSenderInfo, callerToken, appIndex); + "isSACall: %{public}d, userId: %{public}d, appUid: %{public}d", bundleName.c_str(), appIndex, + isSystemApp, isSACall, userId, appUid); + int32_t publisherUid = (uid >= 0 && appUid >= 0) ? appUid : callerUid; + return pendingWantManager->GetWantSender( + callerUid, appUid, isSystemApp, wantSenderInfo, callerToken, appIndex, publisherUid); } sptr AbilityManagerService::GetWantSender( @@ -6750,7 +6748,9 @@ sptr AbilityManagerService::GetWantSender( TAG_LOGI(AAFwkTag::WANTAGENT, "%{public}s#%{public}d, isSystemApp: %{public}d, " "userId: %{public}d", wantSenderInfo.bundleName.c_str(), appIndex, isSystemApp, userId); - return pendingWantManager->GetWantSender(callerUid, appUid, isSystemApp, wantSenderInfo, callerToken, appIndex); + int32_t publisherUid = (uid >= 0 && appUid >= 0) ? appUid : callerUid; + return pendingWantManager->GetWantSender( + callerUid, appUid, isSystemApp, wantSenderInfo, callerToken, appIndex, publisherUid); } int AbilityManagerService::SendWantSender(sptr target, SenderInfo &senderInfo) diff --git a/services/abilitymgr/src/pending_want_manager.cpp b/services/abilitymgr/src/pending_want_manager.cpp index c418b972b8..f7654c0320 100644 --- a/services/abilitymgr/src/pending_want_manager.cpp +++ b/services/abilitymgr/src/pending_want_manager.cpp @@ -41,7 +41,8 @@ PendingWantManager::~PendingWantManager() } sptr PendingWantManager::GetWantSender(int32_t callingUid, int32_t uid, const bool isSystemApp, - const WantSenderInfo &wantSenderInfo, const sptr &callerToken, int32_t appIndex) + const WantSenderInfo &wantSenderInfo, const sptr &callerToken, int32_t appIndex, + int32_t publisherUid) { TAG_LOGD(AAFwkTag::WANTAGENT, "begin"); if (wantSenderInfo.type != static_cast(OperationType::SEND_COMMON_EVENT)) { @@ -73,7 +74,7 @@ sptr PendingWantManager::GetWantSender(int32_t callingUid, int32_t } } - return GetWantSenderLocked(callingUid, uid, wantSenderInfo.userId, info, callerToken, appIndex); + return GetWantSenderLocked(callingUid, uid, wantSenderInfo.userId, info, callerToken, appIndex, publisherUid); } void SendWantAgentNumberEvent(std::shared_ptr pendingKey, int32_t wantAgentNumber) @@ -164,7 +165,8 @@ void PendingWantManager::ReduceWantAgentNumber(std::shared_ptr p } sptr PendingWantManager::GetWantSenderLocked(const int32_t callingUid, const int32_t uid, - const int32_t userId, WantSenderInfo &wantSenderInfo, const sptr &callerToken, int32_t appIndex) + const int32_t userId, WantSenderInfo &wantSenderInfo, const sptr &callerToken, int32_t appIndex, + int32_t publisherUid) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGI(AAFwkTag::WANTAGENT, "begin"); @@ -200,6 +202,7 @@ sptr PendingWantManager::GetWantSenderLocked(const int32_t callingU wantSenderInfo.allWants.back().resolvedTypes = ref->GetKey()->GetRequestResolvedType(); ref->GetKey()->SetAllWantsInfos(wantSenderInfo.allWants); ref->SetCallerUid(callingUid); + ref->SetPublisherUid(publisherUid); } return ref; } @@ -217,6 +220,7 @@ sptr PendingWantManager::GetWantSenderLocked(const int32_t callingU callerToken, pendingKey); if (rec != nullptr) { rec->SetCallerUid(callingUid); + rec->SetPublisherUid(publisherUid); pendingKey->SetCode(PendingRecordIdCreate()); AddWantAgentNumber(pendingKey); wantRecords_.insert(std::make_pair(pendingKey, rec)); @@ -477,7 +481,7 @@ int32_t PendingWantManager::PendingWantStartAbilitys(const std::vector::GetInstance()->PublishCommonEvent( - eventData, eventPublishData, nullptr, callerUid, callerTokenId)); + eventData, eventPublishData, nullptr, publisherUid, callerTokenId)); return ((result == true) ? ERR_OK : (-1)); } diff --git a/services/abilitymgr/src/pending_want_record.cpp b/services/abilitymgr/src/pending_want_record.cpp index bef1b2c54c..cf09ef73a7 100644 --- a/services/abilitymgr/src/pending_want_record.cpp +++ b/services/abilitymgr/src/pending_want_record.cpp @@ -200,9 +200,11 @@ int32_t PendingWantRecord::ExecuteOperation( SendTriggerFailedEvent(want, key_->GetAppIndex(), callerUid_, res, "Trigger Failed"); } break; - case static_cast(OperationType::SEND_COMMON_EVENT): - res = pendingWantManager->PendingWantPublishCommonEvent(want, senderInfo, callerUid_, callerTokenId_); + case static_cast(OperationType::SEND_COMMON_EVENT): { + res = pendingWantManager->PendingWantPublishCommonEvent(want, senderInfo, publisherUid_, + callerTokenId_); break; + } case static_cast(OperationType::START_SERVICE_EXTENSION): res = pendingWantManager->PendingWantStartServiceExtension(want, senderInfo.callerToken); break; @@ -295,6 +297,16 @@ void PendingWantRecord::SetCallerUid(const int32_t callerUid) callerUid_ = callerUid; } +void PendingWantRecord::SetPublisherUid(int32_t publisherUid) +{ + publisherUid_ = publisherUid; +} + +int32_t PendingWantRecord::GetPublisherUid() const +{ + return publisherUid_; +} + std::list> PendingWantRecord::GetCancelCallbacks() { std::lock_guard guard(mCancelCallbacksMutex_); diff --git a/test/unittest/pending_want_record_test/pending_want_record_test.cpp b/test/unittest/pending_want_record_test/pending_want_record_test.cpp index 66e41ed15c..2e466d24f6 100644 --- a/test/unittest/pending_want_record_test/pending_want_record_test.cpp +++ b/test/unittest/pending_want_record_test/pending_want_record_test.cpp @@ -1355,5 +1355,34 @@ HWTEST_F(PendingWantRecordTest, ExecuteOperation_EmptyAllWantsInfos_START_ABILIT TAG_LOGI(AAFwkTag::TEST, "ExecuteOperation_EmptyAllWantsInfos_START_ABILITIES_0100 end"); } +/* + * @tc.number : SetPublisherUid_GetPublisherUid_0100 + * @tc.name : SetPublisherUid/GetPublisherUid + * @tc.desc : 1.Default publisherUid_ is 0, set to specific uid values + */ +HWTEST_F(PendingWantRecordTest, SetPublisherUid_GetPublisherUid_0100, TestSize.Level1) +{ + TAG_LOGI(AAFwkTag::TEST, "SetPublisherUid_GetPublisherUid_0100 start"); + + Want want; + ElementName element("device", "com.ix.hiMusic", "MusicSAbility"); + want.SetElement(element); + WantSenderInfo wantSenderInfo = MakeWantSenderInfo(want, 0, 0); + pendingManager_ = std::make_shared(); + EXPECT_NE(pendingManager_, nullptr); + std::shared_ptr key = MakeWantKey(wantSenderInfo); + std::shared_ptr pendingWantRecord = + std::make_shared(pendingManager_, 1, 0, nullptr, key); + EXPECT_NE(pendingWantRecord, nullptr); + + EXPECT_EQ(pendingWantRecord->GetPublisherUid(), 0); + pendingWantRecord->SetPublisherUid(100); + EXPECT_EQ(pendingWantRecord->GetPublisherUid(), 100); + pendingWantRecord->SetPublisherUid(200); + EXPECT_EQ(pendingWantRecord->GetPublisherUid(), 200); + + TAG_LOGI(AAFwkTag::TEST, "SetPublisherUid_GetPublisherUid_0100 end"); +} + } // namespace AAFwk } // namespace OHOS