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