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