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