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