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