1 /*
2 * Copyright (c) 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 "sub_managers_helper.h"
17
18 #include <dlfcn.h>
19
20 #include "hilog_tag_wrapper.h"
21 #include "hitrace_meter.h"
22 #include "scene_board_judgement.h"
23 #include "os_account_manager_wrapper.h"
24
25 namespace OHOS {
26 namespace AAFwk {
27 constexpr int32_t U0_USER_ID = 0;
28 constexpr int32_t INVALID_USER_ID = -1;
29
SubManagersHelper(std::shared_ptr<TaskHandlerWrap> taskHandler,std::shared_ptr<AbilityEventHandler> eventHandler)30 SubManagersHelper::SubManagersHelper(
31 std::shared_ptr<TaskHandlerWrap> taskHandler, std::shared_ptr<AbilityEventHandler> eventHandler)
32 : taskHandler_(taskHandler), eventHandler_(eventHandler) {}
33
~SubManagersHelper()34 SubManagersHelper::~SubManagersHelper()
35 {
36 if (missionLibHandle_ != nullptr) {
37 missionListWrap_ = nullptr;
38 dlclose(missionLibHandle_);
39 missionLibHandle_ = nullptr;
40 }
41 }
42
InitSubManagers(int userId,bool switchUser)43 void SubManagersHelper::InitSubManagers(int userId, bool switchUser)
44 {
45 InitConnectManager(userId, switchUser);
46 InitDataAbilityManager(userId, switchUser);
47 InitPendWantManager(userId, switchUser);
48 if (userId != U0_USER_ID) {
49 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
50 InitUIAbilityManager(userId, switchUser);
51 } else {
52 InitMissionListManager(userId, switchUser);
53 }
54 }
55 }
56
InitConnectManager(int32_t userId,bool switchUser)57 void SubManagersHelper::InitConnectManager(int32_t userId, bool switchUser)
58 {
59 std::lock_guard<ffrt::mutex> lock(managersMutex_);
60 auto it = connectManagers_.find(userId);
61 if (it != connectManagers_.end()) {
62 if (switchUser) {
63 currentConnectManager_ = it->second;
64 }
65 return;
66 }
67 auto manager = std::make_shared<AbilityConnectManager>(userId);
68 manager->SetTaskHandler(taskHandler_);
69 manager->SetEventHandler(eventHandler_);
70 connectManagers_.emplace(userId, manager);
71 if (switchUser) {
72 currentConnectManager_ = manager;
73 }
74 }
75
InitDataAbilityManager(int32_t userId,bool switchUser)76 void SubManagersHelper::InitDataAbilityManager(int32_t userId, bool switchUser)
77 {
78 std::lock_guard<ffrt::mutex> lock(managersMutex_);
79 auto it = dataAbilityManagers_.find(userId);
80 if (it != dataAbilityManagers_.end()) {
81 if (switchUser) {
82 currentDataAbilityManager_ = it->second;
83 }
84 return;
85 }
86 auto manager = std::make_shared<DataAbilityManager>();
87 dataAbilityManagers_.emplace(userId, manager);
88 if (switchUser) {
89 currentDataAbilityManager_ = manager;
90 }
91 }
92
InitPendWantManager(int32_t userId,bool switchUser)93 void SubManagersHelper::InitPendWantManager(int32_t userId, bool switchUser)
94 {
95 std::lock_guard<ffrt::mutex> lock(managersMutex_);
96 auto it = pendingWantManagers_.find(userId);
97 if (it != pendingWantManagers_.end()) {
98 if (switchUser) {
99 currentPendingWantManager_ = it->second;
100 }
101 return;
102 }
103 auto manager = std::make_shared<PendingWantManager>();
104 pendingWantManagers_.emplace(userId, manager);
105 if (switchUser) {
106 currentPendingWantManager_ = manager;
107 }
108 }
109
InitMissionListManager(int userId,bool switchUser)110 void SubManagersHelper::InitMissionListManager(int userId, bool switchUser)
111 {
112 std::lock_guard<ffrt::mutex> lock(managersMutex_);
113 auto it = missionListManagers_.find(userId);
114 if (it != missionListManagers_.end()) {
115 if (switchUser) {
116 auto missionListWrap = GetMissionListWrap();
117 if (missionListWrap) {
118 missionListWrap->InitMissionInfoMgr(userId);
119 }
120 currentMissionListManager_ = it->second;
121 }
122 return;
123 }
124 auto manager = CreateMissionListMgr(userId);
125 if (manager == nullptr) {
126 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed to create mission list manager");
127 return;
128 }
129 manager->Init();
130 missionListManagers_.emplace(userId, manager);
131 if (switchUser) {
132 currentMissionListManager_ = manager;
133 }
134 }
135
InitUIAbilityManager(int userId,bool switchUser)136 void SubManagersHelper::InitUIAbilityManager(int userId, bool switchUser)
137 {
138 std::lock_guard<ffrt::mutex> lock(managersMutex_);
139 auto it = uiAbilityManagers_.find(userId);
140 if (it != uiAbilityManagers_.end()) {
141 if (switchUser) {
142 currentUIAbilityManager_ = it->second;
143 }
144 return;
145 }
146 auto manager = std::make_shared<UIAbilityLifecycleManager>(userId);
147 uiAbilityManagers_.emplace(userId, manager);
148 if (switchUser) {
149 currentUIAbilityManager_ = manager;
150 }
151 }
152
ClearSubManagers(int userId)153 void SubManagersHelper::ClearSubManagers(int userId)
154 {
155 std::lock_guard<ffrt::mutex> lock(managersMutex_);
156 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
157 uiAbilityManagers_.erase(userId);
158 } else {
159 missionListManagers_.erase(userId);
160 }
161 connectManagers_.erase(userId);
162 dataAbilityManagers_.erase(userId);
163 pendingWantManagers_.erase(userId);
164 }
165
GetCurrentDataAbilityManager()166 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetCurrentDataAbilityManager()
167 {
168 std::lock_guard<ffrt::mutex> lock(managersMutex_);
169 return currentDataAbilityManager_;
170 }
171
GetDataAbilityManager(const sptr<IAbilityScheduler> & scheduler)172 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetDataAbilityManager(const sptr<IAbilityScheduler> &scheduler)
173 {
174 if (scheduler == nullptr) {
175 TAG_LOGE(AAFwkTag::ABILITYMGR, "the param ability scheduler is nullptr");
176 return nullptr;
177 }
178
179 std::lock_guard<ffrt::mutex> lock(managersMutex_);
180 for (auto& item: dataAbilityManagers_) {
181 if (item.second && item.second->ContainsDataAbility(scheduler)) {
182 return item.second;
183 }
184 }
185
186 return nullptr;
187 }
188
GetDataAbilityManagers()189 std::unordered_map<int, std::shared_ptr<DataAbilityManager>> SubManagersHelper::GetDataAbilityManagers()
190 {
191 std::lock_guard<ffrt::mutex> lock(managersMutex_);
192 return dataAbilityManagers_;
193 }
194
GetDataAbilityManagerByUserId(int32_t userId)195 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetDataAbilityManagerByUserId(int32_t userId)
196 {
197 std::lock_guard<ffrt::mutex> lock(managersMutex_);
198 auto it = dataAbilityManagers_.find(userId);
199 if (it != dataAbilityManagers_.end()) {
200 return it->second;
201 }
202 TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to get Manager. UserId = %{public}d", userId);
203 return nullptr;
204 }
205
GetDataAbilityManagerByToken(const sptr<IRemoteObject> & token)206 std::shared_ptr<DataAbilityManager> SubManagersHelper::GetDataAbilityManagerByToken(const sptr<IRemoteObject> &token)
207 {
208 std::lock_guard<ffrt::mutex> lock(managersMutex_);
209 for (auto& item: dataAbilityManagers_) {
210 if (item.second && item.second->GetAbilityRecordByToken(token)) {
211 return item.second;
212 }
213 }
214
215 return nullptr;
216 }
217
GetConnectManagers()218 std::unordered_map<int, std::shared_ptr<AbilityConnectManager>> SubManagersHelper::GetConnectManagers()
219 {
220 std::lock_guard<ffrt::mutex> lock(managersMutex_);
221 return connectManagers_;
222 }
223
GetCurrentConnectManager()224 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetCurrentConnectManager()
225 {
226 std::lock_guard<ffrt::mutex> lock(managersMutex_);
227 return currentConnectManager_;
228 }
229
GetConnectManagerByUserId(int32_t userId)230 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetConnectManagerByUserId(int32_t userId)
231 {
232 std::lock_guard<ffrt::mutex> lock(managersMutex_);
233 auto it = connectManagers_.find(userId);
234 if (it != connectManagers_.end()) {
235 return it->second;
236 }
237 TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to get Manager. UserId = %{public}d", userId);
238 return nullptr;
239 }
240
GetConnectManagerByToken(const sptr<IRemoteObject> & token)241 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetConnectManagerByToken(const sptr<IRemoteObject> &token)
242 {
243 std::lock_guard<ffrt::mutex> lock(managersMutex_);
244 for (auto& item: connectManagers_) {
245 if (item.second && item.second->GetExtensionByTokenFromServiceMap(token)) {
246 return item.second;
247 }
248 if (item.second && item.second->GetExtensionByTokenFromAbilityCache(token)) {
249 return item.second;
250 }
251 if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
252 return item.second;
253 }
254 }
255
256 return nullptr;
257 }
258
GetConnectManagerByAbilityRecordId(const int64_t & abilityRecordId)259 std::shared_ptr<AbilityConnectManager> SubManagersHelper::GetConnectManagerByAbilityRecordId(
260 const int64_t &abilityRecordId)
261 {
262 std::lock_guard<ffrt::mutex> lock(managersMutex_);
263 for (auto& item: connectManagers_) {
264 if (item.second == nullptr) {
265 continue;
266 }
267 if (item.second->GetExtensionByIdFromServiceMap(abilityRecordId)) {
268 return item.second;
269 }
270 if (item.second->GetExtensionByIdFromTerminatingMap(abilityRecordId)) {
271 return item.second;
272 }
273 }
274
275 return nullptr;
276 }
277
GetCurrentPendingWantManager()278 std::shared_ptr<PendingWantManager> SubManagersHelper::GetCurrentPendingWantManager()
279 {
280 std::lock_guard<ffrt::mutex> lock(managersMutex_);
281 return currentPendingWantManager_;
282 }
283
GetPendingWantManagerByUserId(int32_t userId)284 std::shared_ptr<PendingWantManager> SubManagersHelper::GetPendingWantManagerByUserId(int32_t userId)
285 {
286 std::lock_guard<ffrt::mutex> lock(managersMutex_);
287 auto it = pendingWantManagers_.find(userId);
288 if (it != pendingWantManagers_.end()) {
289 return it->second;
290 }
291 TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to get Manager. UserId = %{public}d", userId);
292 return nullptr;
293 }
294
GetMissionListManagers()295 std::unordered_map<int, std::shared_ptr<MissionListManagerInterface>> SubManagersHelper::GetMissionListManagers()
296 {
297 std::lock_guard<ffrt::mutex> lock(managersMutex_);
298 return missionListManagers_;
299 }
300
GetCurrentMissionListManager()301 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::GetCurrentMissionListManager()
302 {
303 std::lock_guard<ffrt::mutex> lock(managersMutex_);
304 return currentMissionListManager_;
305 }
306
GetMissionListManagerByUserId(int32_t userId)307 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::GetMissionListManagerByUserId(int32_t userId)
308 {
309 std::lock_guard<ffrt::mutex> lock(managersMutex_);
310 auto it = missionListManagers_.find(userId);
311 if (it != missionListManagers_.end()) {
312 return it->second;
313 }
314 TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to get Manager. UserId = %{public}d", userId);
315 return nullptr;
316 }
317
GetMissionListManagerByUid(int32_t uid)318 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::GetMissionListManagerByUid(int32_t uid)
319 {
320 int32_t userId = INVALID_USER_ID;
321 if (DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(
322 uid, userId) != 0) {
323 return nullptr;
324 }
325 if (userId == U0_USER_ID) {
326 std::lock_guard<ffrt::mutex> lock(managersMutex_);
327 return currentMissionListManager_;
328 }
329 return GetMissionListManagerByUserId(userId);
330 }
331
GetUIAbilityManagers()332 std::unordered_map<int, std::shared_ptr<UIAbilityLifecycleManager>> SubManagersHelper::GetUIAbilityManagers()
333 {
334 std::lock_guard<ffrt::mutex> lock(managersMutex_);
335 return uiAbilityManagers_;
336 }
337
GetCurrentUIAbilityManager()338 std::shared_ptr<UIAbilityLifecycleManager> SubManagersHelper::GetCurrentUIAbilityManager()
339 {
340 std::lock_guard<ffrt::mutex> lock(managersMutex_);
341 return currentUIAbilityManager_;
342 }
343
GetUIAbilityManagerByUserId(int32_t userId)344 std::shared_ptr<UIAbilityLifecycleManager> SubManagersHelper::GetUIAbilityManagerByUserId(int32_t userId)
345 {
346 std::lock_guard<ffrt::mutex> lock(managersMutex_);
347 auto it = uiAbilityManagers_.find(userId);
348 if (it != uiAbilityManagers_.end()) {
349 return it->second;
350 }
351 TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to get Manager. UserId = %{public}d", userId);
352 return nullptr;
353 }
354
GetUIAbilityManagerByUid(int32_t uid)355 std::shared_ptr<UIAbilityLifecycleManager> SubManagersHelper::GetUIAbilityManagerByUid(int32_t uid)
356 {
357 int32_t userId = INVALID_USER_ID;
358 if (DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(
359 uid, userId) != 0) {
360 return nullptr;
361 }
362 if (userId == U0_USER_ID) {
363 std::lock_guard<ffrt::mutex> lock(managersMutex_);
364 return currentUIAbilityManager_;
365 }
366 return GetUIAbilityManagerByUserId(userId);
367 }
368
UninstallApp(const std::string & bundleName,int32_t uid)369 void SubManagersHelper::UninstallApp(const std::string &bundleName, int32_t uid)
370 {
371 int32_t userId = INVALID_USER_ID;
372 if (DelayedSingleton<AppExecFwk::OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromUid(
373 uid, userId) != 0) {
374 return;
375 }
376 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
377 UninstallAppInUIAbilityManagers(userId, bundleName, uid);
378 } else {
379 UninstallAppInMissionListManagers(userId, bundleName, uid);
380 }
381
382 auto currentPendingWantManager = GetCurrentPendingWantManager();
383 if (currentPendingWantManager) {
384 currentPendingWantManager->ClearPendingWantRecord(bundleName, uid);
385 }
386 }
387
UninstallAppInUIAbilityManagers(int32_t userId,const std::string & bundleName,int32_t uid)388 void SubManagersHelper::UninstallAppInUIAbilityManagers(int32_t userId, const std::string &bundleName, int32_t uid)
389 {
390 if (userId == U0_USER_ID) {
391 auto uiAbilityManagers = GetUIAbilityManagers();
392 for (auto& item : uiAbilityManagers) {
393 if (item.second) {
394 item.second->UninstallApp(bundleName, uid);
395 }
396 }
397 } else {
398 auto manager = GetUIAbilityManagerByUserId(userId);
399 if (manager) {
400 manager->UninstallApp(bundleName, uid);
401 }
402 }
403 }
404
UninstallAppInMissionListManagers(int32_t userId,const std::string & bundleName,int32_t uid)405 void SubManagersHelper::UninstallAppInMissionListManagers(int32_t userId, const std::string &bundleName, int32_t uid)
406 {
407 if (userId == U0_USER_ID) {
408 auto missionListManagers = GetMissionListManagers();
409 for (auto& item : missionListManagers) {
410 if (item.second) {
411 item.second->UninstallApp(bundleName, uid);
412 }
413 }
414 } else {
415 auto listManager = GetMissionListManagerByUserId(userId);
416 if (listManager) {
417 listManager->UninstallApp(bundleName, uid);
418 }
419 }
420 }
421
VerificationAllTokenForConnectManagers(const sptr<IRemoteObject> & token)422 bool SubManagersHelper::VerificationAllTokenForConnectManagers(const sptr<IRemoteObject> &token)
423 {
424 auto connectManagers = GetConnectManagers();
425 for (auto& item: connectManagers) {
426 if (item.second && item.second->GetExtensionByTokenFromServiceMap(token)) {
427 return true;
428 }
429 if (item.second && item.second->GetExtensionByTokenFromAbilityCache(token)) {
430 return true;
431 }
432 if (item.second && item.second->GetExtensionByTokenFromTerminatingMap(token)) {
433 return true;
434 }
435 }
436 return false;
437 }
438
VerificationAllToken(const sptr<IRemoteObject> & token)439 bool SubManagersHelper::VerificationAllToken(const sptr<IRemoteObject> &token)
440 {
441 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
442 TAG_LOGD(AAFwkTag::ABILITYMGR, "VerificationAllToken.");
443 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
444 auto uiAbilityManagers = GetUIAbilityManagers();
445 for (auto& item: uiAbilityManagers) {
446 if (item.second && item.second->IsContainsAbility(token)) {
447 return true;
448 }
449 }
450 } else {
451 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchMissionListManagers");
452 auto missionListManagers = GetMissionListManagers();
453 for (auto& item: missionListManagers) {
454 if (item.second && item.second->GetAbilityRecordByToken(token)) {
455 return true;
456 }
457 if (item.second && item.second->GetAbilityFromTerminateList(token)) {
458 return true;
459 }
460 }
461 }
462 {
463 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchDataAbilityManagers_");
464 auto dataAbilityManagers = GetDataAbilityManagers();
465 for (auto& item: dataAbilityManagers) {
466 if (item.second && item.second->GetAbilityRecordByToken(token)) {
467 return true;
468 }
469 }
470 }
471 {
472 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "VerificationAllToken::SearchConnectManagers_");
473 if (VerificationAllTokenForConnectManagers(token)) {
474 return true;
475 }
476 }
477 TAG_LOGE(AAFwkTag::ABILITYMGR, "Failed to verify all token.");
478 return false;
479 }
480
GetMissionListWrap()481 std::shared_ptr<MissionListWrap> SubManagersHelper::GetMissionListWrap()
482 {
483 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
484 return nullptr;
485 }
486
487 std::lock_guard lock(missionListWrapMutex_);
488 if (missionListWrap_) {
489 return missionListWrap_;
490 }
491
492 if (missionLibHandle_ == nullptr) {
493 missionLibHandle_ = dlopen("libmission_list.z.so", RTLD_NOW | RTLD_GLOBAL);
494 if (missionLibHandle_ == nullptr) {
495 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed to open mission_list library");
496 return nullptr;
497 }
498 }
499
500 auto createMissionListWrapFunc = reinterpret_cast<CreateMissionListMgrFunc>(dlsym(missionLibHandle_,
501 "CreateMissionListWrap"));
502 if (createMissionListWrapFunc == nullptr) {
503 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed to get create func");
504 dlclose(missionLibHandle_);
505 missionLibHandle_ = nullptr;
506 return nullptr;
507 }
508
509 missionListWrap_ = std::shared_ptr<MissionListWrap>(createMissionListWrapFunc());
510 return missionListWrap_;
511 }
512
CreateMissionListMgr(int32_t userId)513 std::shared_ptr<MissionListManagerInterface> SubManagersHelper::CreateMissionListMgr(int32_t userId)
514 {
515 auto missionListWrap = GetMissionListWrap();
516 if (missionListWrap != nullptr) {
517 return missionListWrap->CreateMissionListManager(userId);
518 }
519
520 return nullptr;
521 }
522 } // namespace AAFwk
523 } // namespace OHOS