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