• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "pending_want_manager.h"
17 
18 #include "ability_manager_service.h"
19 #include "ability_util.h"
20 #include "distributed_client.h"
21 #include "hitrace_meter.h"
22 #include "permission_constants.h"
23 #include "session_manager_lite.h"
24 #include "utils/app_mgr_util.h"
25 #include "wm_common.h"
26 
27 namespace OHOS {
28 namespace AAFwk {
29 using namespace OHOS::EventFwk;
30 using namespace std::chrono;
31 using namespace std::placeholders;
32 constexpr const char* PENDING_WANT_MANAGER = "PendingWantManager";
33 
PendingWantManager()34 PendingWantManager::PendingWantManager()
35 {
36     taskHandler_ = TaskHandlerWrap::CreateQueueHandler(PENDING_WANT_MANAGER);
37 }
38 
~PendingWantManager()39 PendingWantManager::~PendingWantManager()
40 {
41 }
42 
GetWantSender(int32_t callingUid,int32_t uid,const bool isSystemApp,const WantSenderInfo & wantSenderInfo,const sptr<IRemoteObject> & callerToken,int32_t appIndex)43 sptr<IWantSender> PendingWantManager::GetWantSender(int32_t callingUid, int32_t uid, const bool isSystemApp,
44     const WantSenderInfo &wantSenderInfo, const sptr<IRemoteObject> &callerToken, int32_t appIndex)
45 {
46     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
47     if (wantSenderInfo.type != static_cast<int32_t>(OperationType::SEND_COMMON_EVENT)) {
48         if (callingUid != uid &&
49             !isSystemApp &&
50             !AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
51             TAG_LOGE(AAFwkTag::WANTAGENT, "cannot send");
52             return nullptr;
53         }
54     }
55 
56     if (wantSenderInfo.type == static_cast<int32_t>(OperationType::START_SERVICE_EXTENSION) && !isSystemApp &&
57         !AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
58         TAG_LOGE(AAFwkTag::WANTAGENT, "non-system app called");
59         return nullptr;
60     }
61 
62     WantSenderInfo info = wantSenderInfo;
63 
64     if (wantSenderInfo.type != static_cast<int32_t>(OperationType::SEND_COMMON_EVENT) &&
65         !isSystemApp && !AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
66         for (auto it = info.allWants.begin(); it != info.allWants.end(); ++it) {
67             if (info.bundleName != it->want.GetBundle()) {
68                 info.allWants.erase(it);
69             } else {
70                 it->want.RemoveParam("ohos.extra.param.key.appCloneIndex");
71             }
72         }
73     }
74 
75     return GetWantSenderLocked(callingUid, uid, wantSenderInfo.userId, info, callerToken, appIndex);
76 }
77 
GetWantSenderLocked(const int32_t callingUid,const int32_t uid,const int32_t userId,WantSenderInfo & wantSenderInfo,const sptr<IRemoteObject> & callerToken,int32_t appIndex)78 sptr<IWantSender> PendingWantManager::GetWantSenderLocked(const int32_t callingUid, const int32_t uid,
79     const int32_t userId, WantSenderInfo &wantSenderInfo, const sptr<IRemoteObject> &callerToken, int32_t appIndex)
80 {
81     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
82     TAG_LOGI(AAFwkTag::WANTAGENT, "begin");
83 
84     bool needCreate = (static_cast<uint32_t>(wantSenderInfo.flags) &
85         static_cast<uint32_t>(Flags::NO_BUILD_FLAG)) == 0;
86     bool needCancel = (static_cast<uint32_t>(wantSenderInfo.flags) &
87         static_cast<uint32_t>(Flags::CANCEL_PRESENT_FLAG)) != 0;
88     bool needUpdate = (static_cast<uint32_t>(wantSenderInfo.flags) &
89         static_cast<uint32_t>(Flags::UPDATE_PRESENT_FLAG)) != 0;
90 
91     std::shared_ptr<PendingWantKey> pendingKey = std::make_shared<PendingWantKey>();
92     pendingKey->SetBundleName(wantSenderInfo.bundleName);
93     pendingKey->SetRequestWho(wantSenderInfo.resultWho);
94     pendingKey->SetRequestCode(wantSenderInfo.requestCode);
95     pendingKey->SetFlags(wantSenderInfo.flags);
96     pendingKey->SetUserId(wantSenderInfo.userId);
97     pendingKey->SetType(wantSenderInfo.type);
98     pendingKey->SetAppIndex(appIndex);
99     if (wantSenderInfo.allWants.size() > 0) {
100         pendingKey->SetRequestWant(wantSenderInfo.allWants.back().want);
101         pendingKey->SetRequestResolvedType(wantSenderInfo.allWants.back().resolvedTypes);
102         pendingKey->SetAllWantsInfos(wantSenderInfo.allWants);
103     }
104     std::lock_guard<ffrt::mutex> locker(mutex_);
105     auto ref = GetPendingWantRecordByKey(pendingKey);
106     if (ref != nullptr) {
107         if (!needCancel) {
108             if (needUpdate && wantSenderInfo.allWants.size() > 0) {
109                 ref->GetKey()->SetRequestWant(wantSenderInfo.allWants.back().want);
110                 ref->GetKey()->SetRequestResolvedType(wantSenderInfo.allWants.back().resolvedTypes);
111                 wantSenderInfo.allWants.back().want = ref->GetKey()->GetRequestWant();
112                 wantSenderInfo.allWants.back().resolvedTypes = ref->GetKey()->GetRequestResolvedType();
113                 ref->GetKey()->SetAllWantsInfos(wantSenderInfo.allWants);
114                 ref->SetCallerUid(callingUid);
115             }
116             return ref;
117         }
118         MakeWantSenderCanceledLocked(*ref);
119         wantRecords_.erase(ref->GetKey());
120     }
121 
122     if (!needCreate) {
123         return (ref != nullptr) ? ref : nullptr;
124     }
125 
126     sptr<PendingWantRecord> rec =
127         new (std::nothrow) PendingWantRecord(shared_from_this(), uid, IPCSkeleton::GetCallingTokenID(),
128         callerToken, pendingKey);
129     if (rec != nullptr) {
130         rec->SetCallerUid(callingUid);
131         pendingKey->SetCode(PendingRecordIdCreate());
132         wantRecords_.insert(std::make_pair(pendingKey, rec));
133         TAG_LOGI(AAFwkTag::WANTAGENT,
134             "wantRecords_ size %{public}zu, bundleName=%{public}s, flags=%{public}d, type=%{public}d, code=%{public}d",
135             wantRecords_.size(), pendingKey->GetBundleName().c_str(), pendingKey->GetFlags(), pendingKey->GetType(),
136             pendingKey->GetCode());
137         return rec;
138     }
139     return nullptr;
140 }
141 
MakeWantSenderCanceledLocked(PendingWantRecord & record)142 void PendingWantManager::MakeWantSenderCanceledLocked(PendingWantRecord &record)
143 {
144     TAG_LOGI(AAFwkTag::WANTAGENT, "cancel");
145 
146     record.SetCanceled();
147     for (auto &callback : record.GetCancelCallbacks()) {
148         callback->Send(record.GetKey()->GetRequestCode());
149     }
150 }
151 
GetPendingWantRecordByKey(const std::shared_ptr<PendingWantKey> & key)152 sptr<PendingWantRecord> PendingWantManager::GetPendingWantRecordByKey(const std::shared_ptr<PendingWantKey> &key)
153 {
154     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
155     TAG_LOGI(AAFwkTag::WANTAGENT, "begin");
156     for (const auto &item : wantRecords_) {
157         const auto pendingKey = item.first;
158         const auto pendingRecord = item.second;
159         if ((pendingRecord != nullptr) && CheckPendingWantRecordByKey(pendingKey, key)) {
160             return pendingRecord;
161         }
162     }
163     return nullptr;
164 }
165 
CheckPendingWantRecordByKey(const std::shared_ptr<PendingWantKey> & inputKey,const std::shared_ptr<PendingWantKey> & key)166 bool PendingWantManager::CheckPendingWantRecordByKey(
167     const std::shared_ptr<PendingWantKey> &inputKey, const std::shared_ptr<PendingWantKey> &key)
168 {
169     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
170     if (!inputKey || !key) {
171         TAG_LOGW(AAFwkTag::WANTAGENT, "inputKey or key null");
172         return false;
173     }
174     if (inputKey->GetAppIndex() != key->GetAppIndex()) {
175         return false;
176     }
177     if (inputKey->GetBundleName().compare(key->GetBundleName()) != 0) {
178         return false;
179     }
180     if (inputKey->GetType() != key->GetType()) {
181         return false;
182     }
183     if (inputKey->GetRequestWho().compare(key->GetRequestWho()) != 0) {
184         return false;
185     }
186     if (inputKey->GetRequestCode() != key->GetRequestCode()) {
187         return false;
188     }
189 
190     if (inputKey->GetRequestResolvedType().compare(key->GetRequestResolvedType()) != 0) {
191         return false;
192     }
193     if (inputKey->GetUserId() != key->GetUserId()) {
194         return false;
195     }
196 
197     if (!inputKey->IsEqualsRequestWant(key->GetRequestWantRef())) {
198         return false;
199     }
200 
201     return true;
202 }
203 
SendWantSender(sptr<IWantSender> target,const SenderInfo & senderInfo)204 int32_t PendingWantManager::SendWantSender(sptr<IWantSender> target, const SenderInfo &senderInfo)
205 {
206     SenderInfo info = senderInfo;
207 
208     if (target == nullptr) {
209         if (senderInfo.finishedReceiver != nullptr) {
210             Want want;
211             WantParams wantParams = {};
212             senderInfo.finishedReceiver->PerformReceive(want, senderInfo.code, "canceled", wantParams, false, false, 0);
213         }
214         TAG_LOGE(AAFwkTag::WANTAGENT, "null sender");
215         return ERR_INVALID_VALUE;
216     }
217     sptr<IRemoteObject> obj = target->AsObject();
218     if (obj == nullptr || obj->IsProxyObject()) {
219         if (senderInfo.finishedReceiver != nullptr) {
220             Want want;
221             WantParams wantParams = {};
222             senderInfo.finishedReceiver->PerformReceive(want, senderInfo.code, "canceled", wantParams, false, false, 0);
223         }
224         TAG_LOGE(AAFwkTag::WANTAGENT, "target object null or a proxy");
225         return ERR_INVALID_VALUE;
226     }
227     sptr<PendingWantRecord> record = iface_cast<PendingWantRecord>(obj);
228     if (!CheckPermission(record)) {
229         if (senderInfo.finishedReceiver != nullptr) {
230             Want want;
231             record->BuildSendWant(info, want);
232             WantParams wantParams = {};
233             senderInfo.finishedReceiver->PerformReceive(want, senderInfo.code, "", wantParams, false, false, 0);
234         }
235         return ERR_INVALID_VALUE;
236     }
237     return record->SenderInner(info);
238 }
239 
CancelWantSender(const bool isSystemAppCall,const sptr<IWantSender> & sender)240 void PendingWantManager::CancelWantSender(const bool isSystemAppCall, const sptr<IWantSender> &sender)
241 {
242     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
243 
244     if (sender == nullptr) {
245         TAG_LOGE(AAFwkTag::WANTAGENT, "null sender");
246         return;
247     }
248 
249     auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
250     if (!isSaCall && !isSystemAppCall) {
251         TAG_LOGE(AAFwkTag::WANTAGENT, "cannot send");
252         return;
253     }
254 
255     sptr<IRemoteObject> obj = sender->AsObject();
256     if (obj == nullptr || obj->IsProxyObject()) {
257         TAG_LOGE(AAFwkTag::WANTAGENT, "target object null or a proxy");
258         return;
259     }
260     sptr<PendingWantRecord> record = iface_cast<PendingWantRecord>(obj);
261     CancelWantSenderLocked(*record, true);
262 }
263 
CancelWantSenderLocked(PendingWantRecord & record,bool cleanAbility)264 void PendingWantManager::CancelWantSenderLocked(PendingWantRecord &record, bool cleanAbility)
265 {
266     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
267     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
268     std::lock_guard<ffrt::mutex> locker(mutex_);
269     MakeWantSenderCanceledLocked(record);
270     if (cleanAbility) {
271         wantRecords_.erase(record.GetKey());
272     }
273 }
274 
DeviceIdDetermine(const Want & want,const sptr<StartOptions> & startOptions,const sptr<IRemoteObject> & callerToken,int32_t requestCode,const int32_t callerUid,int32_t callerTokenId)275 int32_t PendingWantManager::DeviceIdDetermine(const Want &want, const sptr<StartOptions> &startOptions,
276     const sptr<IRemoteObject> &callerToken, int32_t requestCode, const int32_t callerUid, int32_t callerTokenId)
277 {
278     int32_t result = ERR_OK;
279     std::string localDeviceId;
280     DelayedSingleton<AbilityManagerService>::GetInstance()->GetLocalDeviceId(localDeviceId);
281     if (want.GetElement().GetDeviceID() == "" || want.GetElement().GetDeviceID() == localDeviceId) {
282         if (!startOptions) {
283             result = DelayedSingleton<AbilityManagerService>::GetInstance()->StartAbilityWithSpecifyTokenIdInner(
284                 want, callerToken, callerTokenId, true, requestCode, callerUid);
285         } else {
286             TAG_LOGD(AAFwkTag::WANTAGENT, "StartOptions windowMode:%{public}d displayId:%{public}d \
287                 withAnimation:%{public}d windowLeft:%{public}d windowTop:%{public}d windowWidth:%{public}d \
288                 windowHeight:%{public}d",
289                 startOptions->GetWindowMode(), startOptions->GetDisplayID(), startOptions->GetWithAnimation(),
290                 startOptions->GetWindowLeft(), startOptions->GetWindowTop(), startOptions->GetWindowWidth(),
291                 startOptions->GetWindowHeight());
292             result = DelayedSingleton<AbilityManagerService>::GetInstance()->StartAbilityWithSpecifyTokenIdInner(
293                 want, *startOptions, callerToken, true, requestCode, callerUid, callerTokenId);
294         }
295 
296         if (result != ERR_OK && result != START_ABILITY_WAITING) {
297             TAG_LOGE(AAFwkTag::WANTAGENT, "startAbility failed");
298         }
299         return result;
300     }
301 
302     sptr<IRemoteObject> remoteObject =
303         OHOS::DelayedSingleton<SaMgrClient>::GetInstance()->GetSystemAbility(DISTRIBUTED_SCHED_SA_ID);
304     if (remoteObject == nullptr) {
305         TAG_LOGE(AAFwkTag::WANTAGENT, "GetSystemAbility failed");
306         result = ERR_INVALID_VALUE;
307         return result;
308     }
309     DistributedClient dmsClient;
310     uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
311     int32_t callingUid = IPCSkeleton::GetCallingUid();
312     result = dmsClient.StartRemoteAbility(want, callingUid, requestCode, accessToken);
313     if (result != ERR_OK) {
314         TAG_LOGE(AAFwkTag::WANTAGENT, "StartRemoteAbility failed result = %{public}d", result);
315     }
316 
317     return result;
318 }
319 
PendingWantStartAbility(const Want & want,const sptr<StartOptions> & startOptions,const sptr<IRemoteObject> & callerToken,int32_t requestCode,const int32_t callerUid,int32_t callerTokenId)320 int32_t PendingWantManager::PendingWantStartAbility(const Want &want, const sptr<StartOptions> &startOptions,
321     const sptr<IRemoteObject> &callerToken, int32_t requestCode, const int32_t callerUid, int32_t callerTokenId)
322 {
323     TAG_LOGI(AAFwkTag::WANTAGENT, "begin");
324     int32_t result = DeviceIdDetermine(want, startOptions, callerToken, requestCode, callerUid, callerTokenId);
325     return result;
326 }
327 
PendingWantStartServiceExtension(Want & want,const sptr<IRemoteObject> & callerToken)328 int32_t PendingWantManager::PendingWantStartServiceExtension(Want &want, const sptr<IRemoteObject> &callerToken)
329 {
330     TAG_LOGI(AAFwkTag::WANTAGENT, "called");
331     if (!PermissionVerification::GetInstance()->IsSystemAppCall()
332         && !PermissionVerification::GetInstance()->IsSACall()) {
333         TAG_LOGE(AAFwkTag::WANTAGENT, "non-system app called");
334         return ERR_INVALID_VALUE;
335     }
336     //reset flags
337     want.SetFlags(0);
338     return DelayedSingleton<AbilityManagerService>::GetInstance()->StartExtensionAbility(want, callerToken);
339 }
340 
PendingWantStartAbilitys(const std::vector<WantsInfo> & wantsInfo,const sptr<StartOptions> & startOptions,const sptr<IRemoteObject> & callerToken,int32_t requestCode,const int32_t callerUid,int32_t callerTokenId)341 int32_t PendingWantManager::PendingWantStartAbilitys(const std::vector<WantsInfo> &wantsInfo,
342     const sptr<StartOptions> &startOptions, const sptr<IRemoteObject> &callerToken, int32_t requestCode,
343     const int32_t callerUid, int32_t callerTokenId)
344 {
345     TAG_LOGI(AAFwkTag::WANTAGENT, "begin");
346     int32_t result = ERR_OK;
347     for (const auto &item : wantsInfo) {
348         auto res = DeviceIdDetermine(item.want, startOptions, callerToken, requestCode, callerUid, callerTokenId);
349         if (res != ERR_OK && res != START_ABILITY_WAITING) {
350             result = res;
351         }
352     }
353     return result;
354 }
355 
PendingWantPublishCommonEvent(const Want & want,const SenderInfo & senderInfo,int32_t callerUid,int32_t callerTokenId)356 int32_t PendingWantManager::PendingWantPublishCommonEvent(
357     const Want &want, const SenderInfo &senderInfo, int32_t callerUid, int32_t callerTokenId)
358 {
359     TAG_LOGI(AAFwkTag::WANTAGENT, "begin");
360 
361     CommonEventData eventData;
362     eventData.SetWant(want);
363     eventData.SetCode(senderInfo.code);
364 
365     CommonEventPublishInfo eventPublishData;
366 
367     if (!want.GetBundle().empty()) {
368         TAG_LOGI(AAFwkTag::WANTAGENT, "eventPublishData set bundleName: %{public}s", want.GetBundle().c_str());
369         eventPublishData.SetBundleName(want.GetBundle());
370     }
371 
372     if (!senderInfo.requiredPermission.empty()) {
373         std::vector<std::string> permissions;
374         permissions.emplace_back(senderInfo.requiredPermission);
375         eventPublishData.SetSubscriberPermissions(permissions);
376     }
377 
378     bool result = IN_PROCESS_CALL(DelayedSingleton<EventFwk::CommonEvent>::GetInstance()->PublishCommonEvent(
379         eventData, eventPublishData, nullptr, callerUid, callerTokenId));
380     return ((result == true) ? ERR_OK : (-1));
381 }
382 
PendingRecordIdCreate()383 int32_t PendingWantManager::PendingRecordIdCreate()
384 {
385     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
386 
387     static std::atomic_int id(0);
388     return ++id;
389 }
390 
GetPendingWantRecordByCode(int32_t code)391 sptr<PendingWantRecord> PendingWantManager::GetPendingWantRecordByCode(int32_t code)
392 {
393     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
394     TAG_LOGI(AAFwkTag::WANTAGENT, "resuest code:%{public}d", code);
395 
396     std::lock_guard<ffrt::mutex> locker(mutex_);
397     auto iter = std::find_if(wantRecords_.begin(), wantRecords_.end(), [&code](const auto &pair) {
398         return pair.second->GetKey()->GetCode() == code;
399     });
400     return ((iter == wantRecords_.end()) ? nullptr : iter->second);
401 }
402 
GetPendingWantUid(const sptr<IWantSender> & target)403 int32_t PendingWantManager::GetPendingWantUid(const sptr<IWantSender> &target)
404 {
405     if (target == nullptr) {
406         TAG_LOGE(AAFwkTag::WANTAGENT, "null target");
407         return -1;
408     }
409     sptr<IRemoteObject> obj = target->AsObject();
410     if (obj == nullptr || obj->IsProxyObject()) {
411         TAG_LOGE(AAFwkTag::WANTAGENT, "target obj null or a proxy object");
412         return -1;
413     }
414 
415     sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(obj);
416     auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
417     return ((record != nullptr) ? (record->GetUid()) : (-1));
418 }
419 
GetPendingWantUserId(const sptr<IWantSender> & target)420 int32_t PendingWantManager::GetPendingWantUserId(const sptr<IWantSender> &target)
421 {
422     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
423 
424     if (target == nullptr) {
425         TAG_LOGE(AAFwkTag::WANTAGENT, "null target");
426         return -1;
427     }
428     sptr<IRemoteObject> obj = target->AsObject();
429     if (obj == nullptr || obj->IsProxyObject()) {
430         TAG_LOGE(AAFwkTag::WANTAGENT, "target obj null or a proxy object");
431         return -1;
432     }
433     sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(obj);
434     auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
435     return ((record != nullptr) ? (record->GetKey()->GetUserId()) : (-1));
436 }
437 
GetPendingWantBundleName(const sptr<IWantSender> & target)438 std::string PendingWantManager::GetPendingWantBundleName(const sptr<IWantSender> &target)
439 {
440     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
441 
442     if (target == nullptr) {
443         TAG_LOGE(AAFwkTag::WANTAGENT, "null target");
444         return "";
445     }
446     sptr<IRemoteObject> obj = target->AsObject();
447     if (obj == nullptr || obj->IsProxyObject()) {
448         TAG_LOGE(AAFwkTag::WANTAGENT, "target obj null or a proxy object");
449         return "";
450     }
451 
452     sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(obj);
453     auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
454     if (record != nullptr) {
455         return record->GetKey()->GetBundleName();
456     }
457     return "";
458 }
459 
GetPendingWantCode(const sptr<IWantSender> & target)460 int32_t PendingWantManager::GetPendingWantCode(const sptr<IWantSender> &target)
461 {
462     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
463 
464     if (target == nullptr) {
465         TAG_LOGE(AAFwkTag::WANTAGENT, "null target");
466         return -1;
467     }
468     sptr<IRemoteObject> obj = target->AsObject();
469     if (obj == nullptr || obj->IsProxyObject()) {
470         TAG_LOGE(AAFwkTag::WANTAGENT, "target obj null or a proxy object");
471         return -1;
472     }
473 
474     sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(obj);
475     auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
476     return ((record != nullptr) ? (record->GetKey()->GetCode()) : (-1));
477 }
478 
GetPendingWantType(const sptr<IWantSender> & target)479 int32_t PendingWantManager::GetPendingWantType(const sptr<IWantSender> &target)
480 {
481     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
482 
483     if (target == nullptr) {
484         TAG_LOGE(AAFwkTag::WANTAGENT, "null target");
485         return -1;
486     }
487     sptr<IRemoteObject> obj = target->AsObject();
488     if (obj == nullptr || obj->IsProxyObject()) {
489         TAG_LOGE(AAFwkTag::WANTAGENT, "target obj null or a proxy object");
490         return -1;
491     }
492 
493     sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(obj);
494     auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
495     return ((record != nullptr) ? (record->GetKey()->GetType()) : (-1));
496 }
497 
RegisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & recevier)498 void PendingWantManager::RegisterCancelListener(const sptr<IWantSender> &sender, const sptr<IWantReceiver> &recevier)
499 {
500     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
501     TAG_LOGI(AAFwkTag::WANTAGENT, "begin");
502 
503     if ((sender == nullptr) || (recevier == nullptr)) {
504         TAG_LOGE(AAFwkTag::WANTAGENT, "sender or recevier null");
505         return;
506     }
507     sptr<IRemoteObject> obj = sender->AsObject();
508     if (obj == nullptr || obj->IsProxyObject()) {
509         TAG_LOGE(AAFwkTag::WANTAGENT, "target obj null or a proxy object");
510         return;
511     }
512 
513     sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(obj);
514     auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
515     if (record == nullptr) {
516         TAG_LOGE(AAFwkTag::WANTAGENT, "null record. code = %{public}d",
517             targetRecord->GetKey()->GetCode());
518         return;
519     }
520     bool cancel = record->GetCanceled();
521     std::lock_guard<ffrt::mutex> locker(mutex_);
522     if (!cancel) {
523         record->RegisterCancelListener(recevier);
524     }
525 }
526 
UnregisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & recevier)527 void PendingWantManager::UnregisterCancelListener(const sptr<IWantSender> &sender, const sptr<IWantReceiver> &recevier)
528 {
529     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
530     if (sender == nullptr || recevier == nullptr) {
531         TAG_LOGE(AAFwkTag::WANTAGENT, "sender or recevier null");
532         return;
533     }
534     sptr<IRemoteObject> obj = sender->AsObject();
535     if (obj == nullptr || obj->IsProxyObject()) {
536         TAG_LOGE(AAFwkTag::WANTAGENT, "target obj null or a proxy object");
537         return;
538     }
539 
540     sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(obj);
541     auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
542     if (record == nullptr) {
543         TAG_LOGE(AAFwkTag::WANTAGENT, "null record");
544         return;
545     }
546     std::lock_guard<ffrt::mutex> locker(mutex_);
547     record->UnregisterCancelListener(recevier);
548 }
549 
GetPendingRequestWant(const sptr<IWantSender> & target,std::shared_ptr<Want> & want)550 int32_t PendingWantManager::GetPendingRequestWant(const sptr<IWantSender> &target, std::shared_ptr<Want> &want)
551 {
552     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
553     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
554     if (target == nullptr) {
555         TAG_LOGE(AAFwkTag::WANTAGENT, "null target");
556         return ERR_INVALID_VALUE;
557     }
558     sptr<IRemoteObject> obj = target->AsObject();
559     if (obj == nullptr || obj->IsProxyObject()) {
560         TAG_LOGE(AAFwkTag::WANTAGENT, "target obj null or a proxy object");
561         return ERR_INVALID_VALUE;
562     }
563 
564     if (want == nullptr) {
565         TAG_LOGE(AAFwkTag::WANTAGENT, "null want");
566         return ERR_INVALID_VALUE;
567     }
568     sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(obj);
569 
570     if (targetRecord == nullptr) {
571         TAG_LOGE(AAFwkTag::WANTAGENT, "null targetRecord");
572         return ERR_INVALID_VALUE;
573     }
574 
575     auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
576     if (record == nullptr) {
577         TAG_LOGE(AAFwkTag::WANTAGENT, "null record, request code=%{public}d", targetRecord->GetKey()->GetCode());
578         return ERR_INVALID_VALUE;
579     }
580     want.reset(new (std::nothrow) Want(record->GetKey()->GetRequestWant()));
581     return NO_ERROR;
582 }
583 
GetWantSenderInfo(const sptr<IWantSender> & target,std::shared_ptr<WantSenderInfo> & info)584 int32_t PendingWantManager::GetWantSenderInfo(const sptr<IWantSender> &target, std::shared_ptr<WantSenderInfo> &info)
585 {
586     TAG_LOGD(AAFwkTag::WANTAGENT, "begin");
587     if (target == nullptr) {
588         TAG_LOGE(AAFwkTag::WANTAGENT, "null target");
589         return ERR_INVALID_VALUE;
590     }
591     sptr<IRemoteObject> obj = target->AsObject();
592     if (obj == nullptr || obj->IsProxyObject()) {
593         TAG_LOGE(AAFwkTag::WANTAGENT, "target obj null or a proxy object");
594         return ERR_INVALID_VALUE;
595     }
596     if (info == nullptr) {
597         TAG_LOGE(AAFwkTag::WANTAGENT, "null info");
598         return ERR_INVALID_VALUE;
599     }
600     sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(obj);
601     auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
602     if (record == nullptr) {
603         TAG_LOGE(AAFwkTag::WANTAGENT, "null record");
604         return ERR_INVALID_VALUE;
605     }
606     WantSenderInfo wantSenderInfo;
607     wantSenderInfo.requestCode = record->GetKey()->GetRequestCode();
608     wantSenderInfo.type = record->GetKey()->GetType();
609     wantSenderInfo.flags = (uint32_t)(record->GetKey()->GetFlags());
610     wantSenderInfo.allWants = record->GetKey()->GetAllWantsInfos();
611     info.reset(new (std::nothrow) WantSenderInfo(wantSenderInfo));
612     return NO_ERROR;
613 }
614 
ClearPendingWantRecord(const std::string & bundleName,int32_t uid)615 void PendingWantManager::ClearPendingWantRecord(const std::string &bundleName, int32_t uid)
616 {
617     CHECK_POINTER(taskHandler_);
618     TAG_LOGI(AAFwkTag::WANTAGENT, "begin");
619     auto task = [bundleName, uid, self = shared_from_this()]() { self->ClearPendingWantRecordTask(bundleName, uid); };
620     taskHandler_->SubmitTask(task);
621 }
622 
ClearPendingWantRecordTask(const std::string & bundleName,int32_t uid)623 void PendingWantManager::ClearPendingWantRecordTask(const std::string &bundleName, int32_t uid)
624 {
625     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
626     TAG_LOGI(AAFwkTag::WANTAGENT, "begin");
627     std::lock_guard<ffrt::mutex> locker(mutex_);
628     auto iter = wantRecords_.begin();
629     while (iter != wantRecords_.end()) {
630         bool hasBundle = false;
631         const auto &pendingRecord = iter->second;
632         if ((pendingRecord != nullptr)) {
633             std::vector<std::string> bundleNameVec;
634             pendingRecord->GetKey()->GetAllBundleNames(bundleNameVec);
635             for (const auto &bundleItem: bundleNameVec) {
636                 if (bundleItem == bundleName && uid == pendingRecord->GetUid()) {
637                     hasBundle = true;
638                     break;
639                 }
640             }
641             if (hasBundle) {
642                 iter = wantRecords_.erase(iter);
643                 TAG_LOGI(AAFwkTag::WANTAGENT, "wantRecords_ size %{public}zu", wantRecords_.size());
644             } else {
645                 ++iter;
646             }
647         } else {
648             ++iter;
649         }
650     }
651 }
652 
CheckPermission(sptr<PendingWantRecord> record)653 bool PendingWantManager::CheckPermission(sptr<PendingWantRecord> record)
654 {
655     if (record == nullptr) {
656         TAG_LOGE(AAFwkTag::WANTAGENT, "record is nullptr");
657         return false;
658     }
659     int32_t type = static_cast<int32_t>(OperationType::UNKNOWN_TYPE);
660     if (record->GetCanceled() != true) {
661         type = record->GetKey()->GetType();
662     }
663 
664     if (type == static_cast<int32_t>(OperationType::START_ABILITY) ||
665         type == static_cast<int32_t>(OperationType::START_ABILITIES) ||
666         type == static_cast<int32_t>(OperationType::START_SERVICE) ||
667         type == static_cast<int32_t>(OperationType::START_FOREGROUND_SERVICE)) {
668         return CheckCallerPermission();
669     }
670     return true;
671 }
672 
CheckCallerPermission()673 bool PendingWantManager::CheckCallerPermission()
674 {
675     auto callerPid = IPCSkeleton::GetCallingPid();
676     AppExecFwk::RunningProcessInfo processInfo;
677     DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByPid(callerPid, processInfo);
678     auto permission = DelayedSingleton<PermissionVerification>::GetInstance();
679     if (permission == nullptr) {
680         TAG_LOGE(AAFwkTag::WANTAGENT, "null permission");
681         return false;
682     }
683     if ((!processInfo.isFocused && !processInfo.isAbilityForegrounding) ||
684         (!permission->IsSystemAppCall() && !CheckWindowState(callerPid))) {
685         TAG_LOGW(AAFwkTag::WANTAGENT, "caller unfocused");
686         if (!permission->VerifyCallingPermission(PermissionConstants::PERMISSION_START_ABILITIES_FROM_BACKGROUND) &&
687             !permission->VerifyCallingPermission(PermissionConstants::PERMISSION_START_ABILIIES_FROM_BACKGROUND) &&
688             !permission->IsSACall()) {
689             TAG_LOGW(AAFwkTag::WANTAGENT, "caller PERMISSION_DENIED");
690             return false;
691         }
692     }
693     return true;
694 }
695 
CheckWindowState(int32_t pid)696 bool PendingWantManager::CheckWindowState(int32_t pid)
697 {
698     auto sceneSessionManager = Rosen::SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy();
699     if (sceneSessionManager == nullptr) {
700         TAG_LOGE(AAFwkTag::WANTAGENT, "null manager");
701         return false;
702     }
703     std::vector<Rosen::MainWindowState> windowStates;
704     Rosen::WSError ret = sceneSessionManager->GetMainWindowStatesByPid(pid, windowStates);
705     if (ret != Rosen::WSError::WS_OK) {
706         TAG_LOGE(AAFwkTag::WANTAGENT, "fail GetWindow");
707         return false;
708     }
709     for (auto &windowState : windowStates) {
710         if (!windowState.isPcOrPadEnableActivation_ && !windowState.isForegroundInteractive_) {
711             TAG_LOGI(AAFwkTag::WANTAGENT, "window interactive");
712             return false;
713         }
714     }
715     return true;
716 }
717 
Dump(std::vector<std::string> & info)718 void PendingWantManager::Dump(std::vector<std::string> &info)
719 {
720     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
721     TAG_LOGD(AAFwkTag::WANTAGENT, "dump begin");
722     std::string dumpInfo = "    PendingWantRecords:";
723     info.push_back(dumpInfo);
724 
725     std::lock_guard<ffrt::mutex> locker(mutex_);
726     for (const auto &item : wantRecords_) {
727         const auto &pendingKey = item.first;
728         dumpInfo = "        PendWantRecord ID #" + std::to_string(pendingKey->GetCode()) +
729             "  type #" + std::to_string(pendingKey->GetType());
730         info.push_back(dumpInfo);
731         dumpInfo = "        bundle name [" + pendingKey->GetBundleName() + "]";
732         info.push_back(dumpInfo);
733         dumpInfo = "        result who [" + pendingKey->GetRequestWho() + "]";
734         info.push_back(dumpInfo);
735         dumpInfo = "        request code #" + std::to_string(pendingKey->GetRequestCode()) +
736             "  flags #" + std::to_string(pendingKey->GetFlags());
737         info.push_back(dumpInfo);
738         dumpInfo = "        resolved type [" + pendingKey->GetRequestResolvedType() + "]";
739         info.push_back(dumpInfo);
740         dumpInfo = "        Wants:";
741         info.push_back(dumpInfo);
742         auto Wants = pendingKey->GetAllWantsInfos();
743         for (const auto &Want : Wants) {
744             dumpInfo = "          uri [" + Want.want.GetElement().GetDeviceID() + "//" +
745                 Want.want.GetElement().GetBundleName() + "/" + Want.want.GetElement().GetAbilityName() + "]";
746             info.push_back(dumpInfo);
747             dumpInfo = "          resolved types [" + Want.resolvedTypes + "]";
748             info.push_back(dumpInfo);
749         }
750     }
751 }
DumpByRecordId(std::vector<std::string> & info,const std::string & args)752 void PendingWantManager::DumpByRecordId(std::vector<std::string> &info, const std::string &args)
753 {
754     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
755     TAG_LOGD(AAFwkTag::WANTAGENT, "dump by id begin");
756     std::string dumpInfo = "    PendingWantRecords:";
757     info.push_back(dumpInfo);
758 
759     std::lock_guard<ffrt::mutex> locker(mutex_);
760     for (const auto &item : wantRecords_) {
761         const auto &pendingKey = item.first;
762         if (args == std::to_string(pendingKey->GetCode())) {
763             dumpInfo = "        PendWantRecord ID #" + std::to_string(pendingKey->GetCode()) +
764                 "  type #" + std::to_string(pendingKey->GetType());
765                 info.push_back(dumpInfo);
766                 dumpInfo = "        bundle name [" + pendingKey->GetBundleName() + "]";
767                 info.push_back(dumpInfo);
768                 dumpInfo = "        result who [" + pendingKey->GetRequestWho() + "]";
769                 info.push_back(dumpInfo);
770                 dumpInfo = "        request code #" + std::to_string(pendingKey->GetRequestCode()) +
771                 "  flags #" + std::to_string(pendingKey->GetFlags());
772                 info.push_back(dumpInfo);
773             dumpInfo = "        resolved type [" + pendingKey->GetRequestResolvedType() + "]";
774             info.push_back(dumpInfo);
775             dumpInfo = "        Wants:";
776             info.push_back(dumpInfo);
777             auto Wants = pendingKey->GetAllWantsInfos();
778             for (const auto& Want : Wants) {
779                 dumpInfo = "          uri [" + Want.want.GetElement().GetDeviceID() + "//" +
780                     Want.want.GetElement().GetBundleName() + "/" + Want.want.GetElement().GetAbilityName() + "]";
781                 info.push_back(dumpInfo);
782                 dumpInfo = "          resolved types [" + Want.resolvedTypes + "]";
783                 info.push_back(dumpInfo);
784             }
785         }
786     }
787 }
788 
GetAllRunningInstanceKeysByBundleName(const std::string & bundleName,std::vector<std::string> & appKeyVec)789 int32_t PendingWantManager::GetAllRunningInstanceKeysByBundleName(
790     const std::string &bundleName, std::vector<std::string> &appKeyVec)
791 {
792     if (bundleName.empty()) {
793         TAG_LOGE(AAFwkTag::WANTAGENT, "bundle name is empty");
794         return ERR_INVALID_VALUE;
795     }
796 
797     auto appMgr = AppMgrUtil::GetAppMgr();
798     if (appMgr == nullptr) {
799         TAG_LOGE(AAFwkTag::WANTAGENT, "app mgr is null");
800         return OBJECT_NULL;
801     }
802 
803     return IN_PROCESS_CALL(appMgr->GetAllRunningInstanceKeysByBundleName(bundleName, appKeyVec));
804 }
805 }  // namespace AAFwk
806 }  // namespace OHOS
807