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