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