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