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