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