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