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