1 /*
2  * Copyright (c) 2022 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 "admin_manager.h"
17 
18 #include <algorithm>
19 #include <ctime>
20 #include <fstream>
21 #include <iostream>
22 
23 #include "directory_ex.h"
24 #include "edm_constants.h"
25 #include "edm_log.h"
26 #include "permission_manager.h"
27 #include "super_admin.h"
28 
29 namespace OHOS {
30 namespace EDM {
31 std::shared_ptr<AdminManager> AdminManager::instance_;
32 std::mutex AdminManager::mutexLock_;
33 
GetInstance()34 std::shared_ptr<AdminManager> AdminManager::GetInstance()
35 {
36     if (instance_ == nullptr) {
37         std::lock_guard<std::mutex> autoLock(mutexLock_);
38         if (instance_ == nullptr) {
39             instance_.reset(new (std::nothrow) AdminManager());
40         }
41     }
42     return instance_;
43 }
44 
AdminManager()45 AdminManager::AdminManager()
46 {
47     EDMLOGI("AdminManager::AdminManager");
48 }
49 
~AdminManager()50 AdminManager::~AdminManager()
51 {
52     EDMLOGI("AdminManager::~AdminManager");
53     admins_.clear();
54 }
55 
GetReqPermission(const std::vector<std::string> &permissions, std::vector<EdmPermission> &reqPermissions)56 ErrCode AdminManager::GetReqPermission(const std::vector<std::string> &permissions,
57     std::vector<EdmPermission> &reqPermissions)
58 {
59     EDMLOGD("AdminManager::GetReqPermission");
60     PermissionManager::GetInstance()->GetReqPermission(permissions, reqPermissions);
61     return reqPermissions.empty() ? ERR_EDM_EMPTY_PERMISSIONS : ERR_OK;
62 }
63 
GetAdminByUserId(int32_t userId, std::vector<std::shared_ptr<Admin>> &userAdmin)64 bool AdminManager::GetAdminByUserId(int32_t userId, std::vector<std::shared_ptr<Admin>> &userAdmin)
65 {
66     userAdmin.clear();
67     auto iter = admins_.find(userId);
68     if (iter == admins_.end()) {
69         EDMLOGW("GetAdminByUserId::get userId Admin failed. userId = %{public}d", userId);
70         return false;
71     }
72     userAdmin = iter->second;
73     return true;
74 }
75 
GetAdminBySubscribeEvent(ManagedEvent event, std::unordered_map<int32_t, std::vector<std::shared_ptr<Admin>>> &subscribeAdmins)76 void AdminManager::GetAdminBySubscribeEvent(ManagedEvent event,
77     std::unordered_map<int32_t, std::vector<std::shared_ptr<Admin>>> &subscribeAdmins)
78 {
79     for (const auto &adminItem : admins_) {
80         std::vector<std::shared_ptr<Admin>> subAdmin;
81         for (const auto &it : adminItem.second) {
82             std::vector<ManagedEvent> events = it->adminInfo_.managedEvents_;
83             if (std::find(events.begin(), events.end(), event) != events.end()) {
84                 subAdmin.push_back(it);
85             }
86         }
87         if (!subAdmin.empty()) {
88             subscribeAdmins[adminItem.first] = subAdmin;
89         }
90     }
91 }
92 
SetAdminValue(int32_t userId, Admin &adminItem)93 ErrCode AdminManager::SetAdminValue(int32_t userId, Admin &adminItem)
94 {
95     auto adminPoliciesStorageRdb = AdminPoliciesStorageRdb::GetInstance();
96     if (adminPoliciesStorageRdb == nullptr) {
97         EDMLOGE("AdminManager::SetAdminValue get adminPoliciesStorageRdb failed.");
98         return ERR_GET_STORAGE_RDB_FAILED;
99     }
100     std::vector<AdminPermission> reqPermission;
101     std::vector<std::string> permissionNames;
102     PermissionManager::GetInstance()->GetReqPermission(adminItem.adminInfo_.permission_, reqPermission);
103     if (reqPermission.empty()) {
104         EDMLOGW("SetAdminValue::the application is requesting useless permissions");
105     }
106     for (const auto &it : reqPermission) {
107         if (adminItem.adminInfo_.adminType_ == AdminType::NORMAL && it.adminType == AdminType::ENT) {
108             return ERR_EDM_DENY_PERMISSION;
109         }
110         permissionNames.push_back(it.permissionName);
111     }
112     std::shared_ptr<Admin> getAdmin = GetAdminByPkgName(adminItem.adminInfo_.packageName_, userId);
113     if (getAdmin != nullptr) {
114         if (!adminPoliciesStorageRdb->UpdateAdmin(userId, adminItem)) {
115             EDMLOGE("AdminManager::SetAdminValue update failed.");
116             return ERR_EDM_ADD_ADMIN_FAILED;
117         }
118         getAdmin->adminInfo_.adminType_ = adminItem.adminInfo_.adminType_;
119         getAdmin->adminInfo_.entInfo_ = adminItem.adminInfo_.entInfo_;
120         getAdmin->adminInfo_.permission_ = permissionNames;
121         return ERR_OK;
122     }
123     if (!adminPoliciesStorageRdb->InsertAdmin(userId, adminItem)) {
124         EDMLOGE("AdminManager::SetAdminValue insert failed.");
125         return ERR_EDM_ADD_ADMIN_FAILED;
126     }
127     std::vector<std::shared_ptr<Admin>> admins;
128     GetAdminByUserId(userId, admins);
129     adminItem.adminInfo_.permission_ = permissionNames;
130     std::shared_ptr<Admin> admin = std::make_shared<Admin>(adminItem);
131     admins.emplace_back(admin);
132     admins_[userId] = admins;
133     return ERR_OK;
134 }
135 
GetAdminByPkgName(const std::string &packageName, int32_t userId)136 std::shared_ptr<Admin> AdminManager::GetAdminByPkgName(const std::string &packageName, int32_t userId)
137 {
138     std::shared_ptr<Admin> subOrSuperAdmin;
139     if (SUCCEEDED(GetSubOrSuperAdminByPkgName(packageName, subOrSuperAdmin))) {
140         EDMLOGD("GetAdminByPkgName::get sub-super or super admin: %{public}s", packageName.c_str());
141         return subOrSuperAdmin;
142     }
143     std::vector<std::shared_ptr<Admin>> userAdmin;
144     if (!GetAdminByUserId(userId, userAdmin)) {
145         EDMLOGW("GetAdminByPkgName::get userId Admin failed. userId = %{public}d", userId);
146         return nullptr;
147     }
148     for (const auto &item : userAdmin) {
149         if (item->adminInfo_.packageName_ == packageName) {
150             return item;
151         }
152     }
153     EDMLOGD("GetAdminByPkgName::get admin failed. admin size = %{public}u, packageName = %{public}s",
154         (uint32_t)userAdmin.size(), packageName.c_str());
155     return nullptr;
156 }
157 
DeleteAdmin(const std::string &packageName, int32_t userId)158 ErrCode AdminManager::DeleteAdmin(const std::string &packageName, int32_t userId)
159 {
160     auto iterMap = admins_.find(userId);
161     if (iterMap == admins_.end()) {
162         EDMLOGW("DeleteAdmin::get userId Admin failed. userId = %{public}d", userId);
163         return ERR_EDM_UNKNOWN_ADMIN;
164     }
165     auto adminPoliciesStorageRdb = AdminPoliciesStorageRdb::GetInstance();
166     if (adminPoliciesStorageRdb == nullptr) {
167         EDMLOGE("AdminManager::DeleteAdmin get adminPoliciesStorageRdb failed.");
168         return ERR_GET_STORAGE_RDB_FAILED;
169     }
170     if (!adminPoliciesStorageRdb->DeleteAdmin(userId, packageName)) {
171         EDMLOGW("delete admin (%{public}s) failed!", packageName.c_str());
172         return ERR_EDM_DEL_ADMIN_FAILED;
173     }
174     auto iter = std::remove_if(iterMap->second.begin(), iterMap->second.end(),
175         [&](std::shared_ptr<Admin> admin) { return admin->adminInfo_.packageName_ == packageName; });
176     iterMap->second.erase(iter, iterMap->second.end());
177     if (iterMap->second.empty()) {
178         admins_.erase(iterMap);
179     }
180     return ERR_OK;
181 }
182 
GetGrantedPermission(std::vector<std::string> &permissions, AdminType type)183 ErrCode AdminManager::GetGrantedPermission(std::vector<std::string> &permissions, AdminType type)
184 {
185     if (permissions.empty()) {
186         EDMLOGW("GetGrantedPermission::permissions is empty");
187         return ERR_OK;
188     }
189     // filtering out non-edm permissions
190     std::vector<AdminPermission> reqPermission;
191     PermissionManager::GetInstance()->GetReqPermission(permissions, reqPermission);
192     if (reqPermission.empty()) {
193         EDMLOGW("GetGrantedPermission::edm permission is empty");
194         return ERR_OK;
195     }
196 
197     // filter out super permissions if admin is NORMAL
198     std::vector<std::string> permissionNameList;
199     for (const auto &it : reqPermission) {
200         if ((type == AdminType::NORMAL) && (it.adminType == AdminType::ENT)) {
201             continue;
202         }
203         permissionNameList.push_back(it.permissionName);
204     }
205     permissions.assign(permissionNameList.begin(), permissionNameList.end());
206     return ERR_OK;
207 }
208 
UpdateAdmin(AppExecFwk::ExtensionAbilityInfo &abilityInfo, const std::vector<std::string> &permissions, int32_t userId)209 ErrCode AdminManager::UpdateAdmin(AppExecFwk::ExtensionAbilityInfo &abilityInfo,
210     const std::vector<std::string> &permissions, int32_t userId)
211 {
212     auto adminItem = GetAdminByPkgName(abilityInfo.bundleName, userId);
213     if (adminItem == nullptr) {
214         EDMLOGW("UpdateAdmin::get null admin, never get here");
215         return ERR_EDM_UNKNOWN_ADMIN;
216     }
217     auto adminPoliciesStorageRdb = AdminPoliciesStorageRdb::GetInstance();
218     if (adminPoliciesStorageRdb == nullptr) {
219         EDMLOGE("AdminManager::UpdateAdmin get adminPoliciesStorageRdb failed.");
220         return ERR_GET_STORAGE_RDB_FAILED;
221     }
222 
223     std::vector<std::string> combinePermission = permissions;
224     ErrCode ret = GetGrantedPermission(combinePermission, adminItem->adminInfo_.adminType_);
225     if (ret != ERR_OK) {
226         EDMLOGW("UpdateAdmin::GetGrantedPermission failed");
227         return ret;
228     }
229 
230     if (!adminPoliciesStorageRdb->UpdateAdmin(userId, abilityInfo.bundleName, abilityInfo.name, combinePermission)) {
231         EDMLOGW("UpdateAdmin::update admin failed.");
232         return ERR_EDM_UNKNOWN_ADMIN;
233     }
234     adminItem->adminInfo_.permission_ = combinePermission;
235     adminItem->adminInfo_.packageName_ = abilityInfo.bundleName;
236     adminItem->adminInfo_.className_ = abilityInfo.name;
237     return ERR_OK;
238 }
239 
240 // success is returned as long as there is a super administrator
IsSuperAdminExist()241 bool AdminManager::IsSuperAdminExist()
242 {
243     std::vector<std::shared_ptr<Admin>> userAdmin;
244     bool ret = GetAdminByUserId(DEFAULT_USER_ID, userAdmin);
245     if (!ret) {
246         EDMLOGD("IsSuperAdminExist::not find super Admin");
247         return false;
248     }
249     return std::any_of(userAdmin.begin(), userAdmin.end(),
250         [](const std::shared_ptr<Admin> &admin) { return admin->adminInfo_.adminType_ == AdminType::ENT; });
251 }
252 
IsSuperAdmin(const std::string &bundleName)253 bool AdminManager::IsSuperAdmin(const std::string &bundleName)
254 {
255     std::shared_ptr<Admin> admin = GetAdminByPkgName(bundleName, DEFAULT_USER_ID);
256     if (admin == nullptr) {
257         EDMLOGW("IsSuperAdmin: admin == nullptr.");
258         return false;
259     }
260     if (admin->adminInfo_.adminType_ == AdminType::ENT) {
261         EDMLOGW("IsSuperAdmin: admin->adminInfo_.adminType_ == AdminType::ENT.");
262         return true;
263     }
264     return false;
265 }
266 
IsAdminExist()267 bool AdminManager::IsAdminExist()
268 {
269     return !admins_.empty();
270 }
271 
IsSuperOrSubSuperAdmin(const std::string &bundleName)272 bool AdminManager::IsSuperOrSubSuperAdmin(const std::string &bundleName)
273 {
274     std::shared_ptr<Admin> superAdmin;
275     superAdmin = GetAdminByPkgName(bundleName, DEFAULT_USER_ID);
276     if (superAdmin == nullptr) {
277         return false;
278     }
279     return superAdmin->adminInfo_.adminType_ == AdminType::ENT ||
280         superAdmin->adminInfo_.adminType_ == AdminType::SUB_SUPER_ADMIN;
281 }
282 
283 /*
284  * There are different administrator types according to the input parameters.
285  * Returns a list of package names
286  */
GetEnabledAdmin(AdminType role, std::vector<std::string> &packageNameList, int32_t userId)287 void AdminManager::GetEnabledAdmin(AdminType role, std::vector<std::string> &packageNameList, int32_t userId)
288 {
289     packageNameList.clear();
290     std::vector<std::shared_ptr<Admin>> userAdmin;
291     bool ret = GetAdminByUserId(userId, userAdmin);
292     if (!ret) {
293         EDMLOGW("GetEnabledAdmin::not find enabled Admin. userId = %{public}d", userId);
294         return;
295     }
296     EDMLOGD("AdminManager:GetEnabledAdmin adminType: %{public}d , admin size: %{public}zu", role, userAdmin.size());
297     if (static_cast<int32_t>(role) >= static_cast<int32_t>(AdminType::UNKNOWN) ||
298         static_cast<int32_t>(role) < static_cast<int32_t>(AdminType::NORMAL)) {
299         EDMLOGD("there is no admin(%{public}u) device manager package name list!", role);
300         return;
301     }
302 
303     for (const auto &item : userAdmin) {
304         if (item->adminInfo_.adminType_ == role) {
305             std::string adminName = item->adminInfo_.packageName_ + "/" + item->adminInfo_.className_;
306             packageNameList.push_back(adminName);
307         }
308     }
309 }
310 
GetSubOrSuperAdminByPkgName(const std::string &subAdminName, std::shared_ptr<Admin> &subOrSuperAdmin)311 ErrCode AdminManager::GetSubOrSuperAdminByPkgName(const std::string &subAdminName,
312     std::shared_ptr<Admin> &subOrSuperAdmin)
313 {
314     std::vector<std::shared_ptr<Admin>> userAdmin;
315     if (!GetAdminByUserId(DEFAULT_USER_ID, userAdmin)) {
316         EDMLOGW("GetSubOrSuperAdminByPkgName::not find Admin under default user id");
317         return ERR_EDM_SUPER_ADMIN_NOT_FOUND;
318     }
319     auto adminItem = std::find_if(userAdmin.begin(), userAdmin.end(), [&](const std::shared_ptr<Admin> &admin) {
320         return admin->adminInfo_.packageName_ == subAdminName && (admin->adminInfo_.adminType_ == AdminType::ENT ||
321             admin->adminInfo_.adminType_ == AdminType::SUB_SUPER_ADMIN);
322     });
323     if (adminItem == userAdmin.end()) {
324         EDMLOGW("GetSubOrSuperAdminByPkgName::not find sub-super admin or super Admin");
325         return ERR_EDM_SUPER_ADMIN_NOT_FOUND;
326     }
327     subOrSuperAdmin = *adminItem;
328     return ERR_OK;
329 }
330 
GetSubSuperAdminsByParentName(const std::string &parentName, std::vector<std::string> &subAdmins)331 ErrCode AdminManager::GetSubSuperAdminsByParentName(const std::string &parentName, std::vector<std::string> &subAdmins)
332 {
333     if (subAdmins.size() > 0) {
334         subAdmins.clear();
335     }
336     std::vector<std::shared_ptr<Admin>> userAdmin;
337     if (!GetAdminByUserId(DEFAULT_USER_ID, userAdmin)) {
338         EDMLOGE("GetSubSuperAdminsByParentName::not find Admin under default user id.");
339         return ERR_EDM_SUPER_ADMIN_NOT_FOUND;
340     }
341     for (const auto &admin : userAdmin) {
342         if (admin->adminInfo_.adminType_ == AdminType::SUB_SUPER_ADMIN &&
343             admin->adminInfo_.parentAdminName_ == parentName) {
344             subAdmins.push_back(admin->adminInfo_.packageName_);
345         }
346     }
347     return ERR_OK;
348 }
349 
GetEntInfo(const std::string &packageName, EntInfo &entInfo, int32_t userId)350 ErrCode AdminManager::GetEntInfo(const std::string &packageName, EntInfo &entInfo, int32_t userId)
351 {
352     std::vector<std::shared_ptr<Admin>> userAdmin;
353     bool ret = GetAdminByUserId(userId, userAdmin);
354     if (!ret) {
355         EDMLOGW("GetEntInfo::not find Admin. userId = %{public}d", userId);
356         return ERR_EDM_UNKNOWN_ADMIN;
357     }
358     for (const auto &item : userAdmin) {
359         if (item->adminInfo_.packageName_ == packageName) {
360             entInfo = item->adminInfo_.entInfo_;
361             return ERR_OK;
362         }
363     }
364     return ERR_EDM_UNKNOWN_ADMIN;
365 }
366 
SetEntInfo(const std::string &packageName, EntInfo &entInfo, int32_t userId)367 ErrCode AdminManager::SetEntInfo(const std::string &packageName, EntInfo &entInfo, int32_t userId)
368 {
369     std::vector<std::shared_ptr<Admin>> userAdmin;
370     bool ret = GetAdminByUserId(userId, userAdmin);
371     if (!ret) {
372         EDMLOGW("SetEntInfo::not find Admin. userId = %{public}d", userId);
373         return ERR_EDM_UNKNOWN_ADMIN;
374     }
375     auto adminPoliciesStorageRdb = AdminPoliciesStorageRdb::GetInstance();
376     if (adminPoliciesStorageRdb == nullptr) {
377         EDMLOGE("AdminManager::SetEntInfo get adminPoliciesStorageRdb failed.");
378         return ERR_GET_STORAGE_RDB_FAILED;
379     }
380     for (auto &item : userAdmin) {
381         if (item->adminInfo_.packageName_ == packageName &&
382             adminPoliciesStorageRdb->UpdateEntInfo(userId, packageName, entInfo)) {
383             item->adminInfo_.entInfo_ = entInfo;
384             return ERR_OK;
385         }
386     }
387     return ERR_EDM_UNKNOWN_ADMIN;
388 }
389 
SaveSubscribeEvents(const std::vector<uint32_t> &events, const std::string &bundleName, int32_t userId)390 ErrCode AdminManager::SaveSubscribeEvents(const std::vector<uint32_t> &events, const std::string &bundleName,
391     int32_t userId)
392 {
393     std::shared_ptr<Admin> admin = GetAdminByPkgName(bundleName, userId);
394     if (admin == nullptr) {
395         return ERR_EDM_UNKNOWN_ADMIN;
396     }
397     auto adminPoliciesStorageRdb = AdminPoliciesStorageRdb::GetInstance();
398     if (adminPoliciesStorageRdb == nullptr) {
399         EDMLOGE("AdminManager::SaveSubscribeEvents get adminPoliciesStorageRdb failed.");
400         return ERR_GET_STORAGE_RDB_FAILED;
401     }
402     std::vector<ManagedEvent> oldManagedEvents = admin->adminInfo_.managedEvents_;
403     size_t eventsNumber = admin->adminInfo_.managedEvents_.size();
404     for (const auto &event : events) {
405         std::vector<ManagedEvent> managedEvents = admin->adminInfo_.managedEvents_;
406         ManagedEvent subEvent = static_cast<ManagedEvent>(event);
407         if (std::find(managedEvents.begin(), managedEvents.end(), subEvent) == managedEvents.end()) {
408             admin->adminInfo_.managedEvents_.push_back(subEvent);
409         }
410     }
411     if (admin->adminInfo_.managedEvents_.size() > eventsNumber &&
412         !adminPoliciesStorageRdb->UpdateManagedEvents(userId, admin->adminInfo_.packageName_,
413             admin->adminInfo_.managedEvents_)) {
414         admin->adminInfo_.managedEvents_ = oldManagedEvents;
415         return ERR_EDM_UNKNOWN_ADMIN;
416     }
417     return ERR_OK;
418 }
419 
RemoveSubscribeEvents(const std::vector<uint32_t> &events, const std::string &bundleName, int32_t userId)420 ErrCode AdminManager::RemoveSubscribeEvents(const std::vector<uint32_t> &events, const std::string &bundleName,
421     int32_t userId)
422 {
423     std::shared_ptr<Admin> admin = GetAdminByPkgName(bundleName, userId);
424     if (admin == nullptr) {
425         return ERR_EDM_UNKNOWN_ADMIN;
426     }
427     auto adminPoliciesStorageRdb = AdminPoliciesStorageRdb::GetInstance();
428     if (adminPoliciesStorageRdb == nullptr) {
429         EDMLOGE("AdminManager::RemoveSubscribeEvents get adminPoliciesStorageRdb failed.");
430         return ERR_GET_STORAGE_RDB_FAILED;
431     }
432 
433     std::vector<ManagedEvent> oldManagedEvents = admin->adminInfo_.managedEvents_;
434     size_t eventsNumber = admin->adminInfo_.managedEvents_.size();
435     auto iter = std::remove_if(admin->adminInfo_.managedEvents_.begin(), admin->adminInfo_.managedEvents_.end(),
436         [&](ManagedEvent managedEvent) {
437             return std::find(events.begin(), events.end(), static_cast<uint32_t>(managedEvent)) != events.end();
438         });
439     admin->adminInfo_.managedEvents_.erase(iter, admin->adminInfo_.managedEvents_.end());
440 
441     if (admin->adminInfo_.managedEvents_.size() < eventsNumber &&
442         !adminPoliciesStorageRdb->UpdateManagedEvents(userId, admin->adminInfo_.packageName_,
443             admin->adminInfo_.managedEvents_)) {
444         admin->adminInfo_.managedEvents_ = oldManagedEvents;
445         return ERR_EDM_UNKNOWN_ADMIN;
446     }
447     return ERR_OK;
448 }
449 
SaveAuthorizedAdmin(const std::string &bundleName, const std::vector<std::string> &permissions, const std::string &parentName)450 ErrCode AdminManager::SaveAuthorizedAdmin(const std::string &bundleName, const std::vector<std::string> &permissions,
451     const std::string &parentName)
452 {
453     std::vector<std::shared_ptr<Admin>> admin;
454     if (!GetAdminByUserId(DEFAULT_USER_ID, admin)) {
455         return ERR_SAVE_AUTHORIZED_ADMIN_FAILED;
456     }
457     std::shared_ptr<Admin> adminItem = GetAdminByPkgName(bundleName, DEFAULT_USER_ID);
458     if (!adminItem &&
459         !AdminPoliciesStorageRdb::GetInstance()->InsertAuthorizedAdmin(bundleName, permissions, parentName)) {
460         EDMLOGE("AdminManager::InsertAuthorizedAdmin save authorized failed.");
461         return ERR_SAVE_AUTHORIZED_ADMIN_FAILED;
462     }
463     if (adminItem) {
464         if (adminItem->GetAdminType() != AdminType::SUB_SUPER_ADMIN) {
465             EDMLOGE("AdminManager::UpdateAuthorizedAdmin can only update sub-super admin.");
466             return ERR_SAVE_AUTHORIZED_ADMIN_FAILED;
467         }
468         if (!AdminPoliciesStorageRdb::GetInstance()->UpdateAuthorizedAdmin(bundleName, permissions, parentName)) {
469             EDMLOGE("AdminManager::UpdateAuthorizedAdmin save authorized failed.");
470             return ERR_SAVE_AUTHORIZED_ADMIN_FAILED;
471         }
472     }
473     if (!adminItem) {
474         admin.emplace_back(std::make_shared<Admin>());
475         admins_[DEFAULT_USER_ID] = admin;
476         adminItem = admin.back();
477         adminItem->adminInfo_.adminType_ = AdminType::SUB_SUPER_ADMIN;
478     }
479     adminItem->adminInfo_.packageName_ = bundleName;
480     adminItem->adminInfo_.permission_ = permissions;
481     adminItem->adminInfo_.parentAdminName_ = parentName;
482     return ERR_OK;
483 }
484 
GetSuperAdmin()485 std::shared_ptr<Admin> AdminManager::GetSuperAdmin()
486 {
487     if (admins_.find(DEFAULT_USER_ID) != admins_.end()) {
488         auto item = std::find_if(admins_[DEFAULT_USER_ID].begin(), admins_[DEFAULT_USER_ID].end(),
489             [&](const std::shared_ptr<Admin>& admin) { return admin->GetAdminType() == AdminType::ENT; });
490         if (item != admins_[DEFAULT_USER_ID].end()) {
491             return *item;
492         }
493     }
494     return nullptr;
495 }
496 
497 // init
Init()498 void AdminManager::Init()
499 {
500     auto adminPoliciesStorageRdb = AdminPoliciesStorageRdb::GetInstance();
501     if (adminPoliciesStorageRdb != nullptr) {
502         admins_ = adminPoliciesStorageRdb->QueryAllAdmin();
503     } else {
504         EDMLOGE("AdminManager::Init failed.");
505     }
506 }
507 
Dump()508 void AdminManager::Dump()
509 {
510     for (const auto &entry : admins_) {
511         EDMLOGI("AdminManager::Dump %{public}d.", entry.first);
512         for (const auto &admin : entry.second) {
513             EDMLOGI("AdminManager::Dump admin info adminType_ %{public}d.",
514                 admin->adminInfo_.adminType_);
515             EDMLOGI("AdminManager::Dump admin info packageName_ %{public}s.",
516                 admin->adminInfo_.packageName_.c_str());
517             EDMLOGI("AdminManager::Dump admin info parentAdminName_ %{public}s.",
518                 admin->adminInfo_.parentAdminName_.c_str());
519         }
520     }
521 }
522 } // namespace EDM
523 } // namespace OHOS
524