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