• 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 #include <algorithm>
18 #include <ctime>
19 #include <fstream>
20 #include <iostream>
21 #include "directory_ex.h"
22 #include "edm_log.h"
23 #include "permission_manager.h"
24 #include "super_admin.h"
25 
26 namespace OHOS {
27 namespace EDM {
28 const std::string EDM_ADMIN_DOT = ".";
29 const std::string EDM_ADMIN_BASE = "/data/service/el1/public/edm/";
30 const std::string EDM_ADMIN_JSON_FILE = "admin_policies_";
31 const std::string EDM_ADMIN_JSON_EXT = ".json";
32 constexpr int32_t DEFAULT_USER_ID = 100;
33 std::shared_ptr<AdminManager> AdminManager::instance_;
34 std::mutex AdminManager::mutexLock_;
35 
GetInstance()36 std::shared_ptr<AdminManager> AdminManager::GetInstance()
37 {
38     if (instance_ == nullptr) {
39         std::lock_guard<std::mutex> autoLock(mutexLock_);
40         if (instance_ == nullptr) {
41             instance_.reset(new (std::nothrow) AdminManager());
42         }
43     }
44     return instance_;
45 }
46 
AdminManager()47 AdminManager::AdminManager()
48 {
49     EDMLOGI("AdminManager::AdminManager");
50 }
51 
~AdminManager()52 AdminManager::~AdminManager()
53 {
54     EDMLOGI("AdminManager::~AdminManager");
55     admins_.clear();
56 }
57 
GetReqPermission(const std::vector<std::string> & permissions,std::vector<EdmPermission> & reqPermissions)58 ErrCode AdminManager::GetReqPermission(const std::vector<std::string> &permissions,
59     std::vector<EdmPermission> &reqPermissions)
60 {
61     EDMLOGD("AdminManager::GetReqPermission");
62     PermissionManager::GetInstance()->GetReqPermission(permissions, reqPermissions);
63     return reqPermissions.empty() ? ERR_EDM_EMPTY_PERMISSIONS : ERR_OK;
64 }
65 
GetAdminByUserId(int32_t userId,std::vector<std::shared_ptr<Admin>> & userAdmin)66 bool AdminManager::GetAdminByUserId(int32_t userId, std::vector<std::shared_ptr<Admin>> &userAdmin)
67 {
68     userAdmin.clear();
69     auto iter = admins_.find(userId);
70     if (iter == admins_.end()) {
71         EDMLOGW("GetAdminByUserId::get userId Admin failed. userId = %{public}d", userId);
72         return false;
73     }
74     userAdmin = iter->second;
75     return true;
76 }
77 
GetAdminBySubscribeEvent(ManagedEvent event,std::unordered_map<int32_t,std::vector<std::shared_ptr<Admin>>> & subscribeAdmins)78 void AdminManager::GetAdminBySubscribeEvent(ManagedEvent event,
79     std::unordered_map<int32_t, std::vector<std::shared_ptr<Admin>>> &subscribeAdmins)
80 {
81     for (const auto &adminItem : admins_) {
82         std::vector<std::shared_ptr<Admin>> subAdmin;
83         for (const auto &it : adminItem.second) {
84             std::vector<ManagedEvent> events = it->adminInfo_.managedEvents_;
85             if (std::find(events.begin(), events.end(), event) != events.end()) {
86                 subAdmin.push_back(it);
87             }
88         }
89         if (subAdmin.size() > 0) {
90             subscribeAdmins[adminItem.first] = subAdmin;
91         }
92     }
93 }
94 
SetAdminValue(AppExecFwk::ExtensionAbilityInfo & abilityInfo,EntInfo & entInfo,AdminType role,std::vector<std::string> & permissions,int32_t userId)95 ErrCode AdminManager::SetAdminValue(AppExecFwk::ExtensionAbilityInfo &abilityInfo, EntInfo &entInfo, AdminType role,
96     std::vector<std::string> &permissions, int32_t userId)
97 {
98     std::vector<AdminPermission> reqPermission;
99     std::vector<std::string> permissionNames;
100     std::vector<std::shared_ptr<Admin>> admin;
101     PermissionManager::GetInstance()->GetReqPermission(permissions, reqPermission);
102     if (reqPermission.empty()) {
103         EDMLOGW("SetAdminValue::the application is requesting useless permissions");
104     }
105     for (const auto &it : reqPermission) {
106         if (role == AdminType::NORMAL && it.adminType == AdminType::ENT) {
107             return ERR_EDM_DENY_PERMISSION;
108         }
109         permissionNames.push_back(it.permissionName);
110     }
111 
112     bool ret = GetAdminByUserId(userId, admin);
113     std::shared_ptr<Admin> adminItem = GetAdminByPkgName(abilityInfo.bundleName, userId);
114     if (role == AdminType::NORMAL) {
115         admin.emplace_back(std::make_shared<Admin>());
116     } else {
117         admin.emplace_back(std::make_shared<SuperAdmin>());
118     }
119     if (!ret) {
120         admins_.insert(std::pair<int32_t, std::vector<std::shared_ptr<Admin>>>(userId, admin));
121         adminItem = admin.back();
122     } else if (ret && !adminItem) {
123         admins_[userId] = admin;
124         adminItem = admin.back();
125     }
126     adminItem->adminInfo_.adminType_ = role;
127     adminItem->adminInfo_.entInfo_ = entInfo;
128     adminItem->adminInfo_.permission_ = permissionNames;
129     adminItem->adminInfo_.packageName_ = abilityInfo.bundleName;
130     adminItem->adminInfo_.className_ = abilityInfo.name;
131     SaveAdmin(userId);
132     return ERR_OK;
133 }
134 
GetAdminByPkgName(const std::string & packageName,int32_t userId)135 std::shared_ptr<Admin> AdminManager::GetAdminByPkgName(const std::string &packageName, int32_t userId)
136 {
137     std::vector<std::shared_ptr<Admin>> userAdmin;
138     bool ret = GetAdminByUserId(userId, userAdmin);
139     if (!ret) {
140         EDMLOGW("GetAdminByPkgName::get userId Admin failed. userId = %{public}d", userId);
141         return nullptr;
142     }
143     for (const auto &item : userAdmin) {
144         if (item->adminInfo_.packageName_ == packageName) {
145             return item;
146         }
147     }
148     EDMLOGD("GetAdminByPkgName::get admin failed. admin size = %{public}u, packageName = %{public}s",
149         (uint32_t)userAdmin.size(), packageName.c_str());
150     return nullptr;
151 }
152 
DeleteAdmin(const std::string & packageName,int32_t userId)153 ErrCode AdminManager::DeleteAdmin(const std::string &packageName, int32_t userId)
154 {
155     ErrCode retCode = ERR_EDM_UNKNOWN_ADMIN;
156     auto iterMap = admins_.find(userId);
157     if (iterMap == admins_.end()) {
158         EDMLOGW("DeleteAdmin::get userId Admin failed. userId = %{public}d", userId);
159         return retCode;
160     }
161 
162     auto iter = (iterMap->second).begin();
163     while (iter != (iterMap->second).end()) {
164         if ((*iter)->adminInfo_.packageName_ == packageName) {
165             iter = (iterMap->second).erase(iter);
166             retCode = ERR_OK;
167         } else {
168             iter++;
169         }
170     }
171     if (SUCCEEDED(retCode)) {
172         EDMLOGD("SaveAdmin %{public}s", packageName.c_str());
173         SaveAdmin(userId);
174         return retCode;
175     }
176 
177     EDMLOGW("delete admin (%{public}s) failed!", packageName.c_str());
178     return ERR_EDM_UNKNOWN_ADMIN;
179 }
180 
GetGrantedPermission(AppExecFwk::ExtensionAbilityInfo & abilityInfo,std::vector<std::string> & permissions,AdminType type)181 ErrCode AdminManager::GetGrantedPermission(AppExecFwk::ExtensionAbilityInfo& abilityInfo,
182     std::vector<std::string>& permissions, AdminType type)
183 {
184     if (permissions.empty()) {
185         EDMLOGW("GetGrantedPermission::permissions is empty");
186         return ERR_OK;
187     }
188     // filtering out non-edm permissions
189     std::vector<AdminPermission> reqPermission;
190     PermissionManager::GetInstance()->GetReqPermission(permissions, reqPermission);
191     if (reqPermission.empty()) {
192         EDMLOGW("GetGrantedPermission::edm permission is empty");
193         return ERR_OK;
194     }
195 
196     // filter out super permissions if admin is NORMAL
197     std::vector<std::string> permissionNameList;
198     for (const auto &it : reqPermission) {
199         if ((type == AdminType::NORMAL) && (it.adminType == AdminType::ENT)) {
200             continue;
201         }
202         permissionNameList.push_back(it.permissionName);
203     }
204     permissions.assign(permissionNameList.begin(), permissionNameList.end());
205     return ERR_OK;
206 }
207 
UpdateAdmin(AppExecFwk::ExtensionAbilityInfo & abilityInfo,const std::vector<std::string> & permissions,int32_t userId)208 ErrCode AdminManager::UpdateAdmin(AppExecFwk::ExtensionAbilityInfo &abilityInfo,
209     const std::vector<std::string> &permissions, int32_t userId)
210 {
211     auto adminItem = GetAdminByPkgName(abilityInfo.bundleName, userId);
212     if (adminItem == nullptr) {
213         EDMLOGW("UpdateAdmin::get null admin, never get here");
214         return ERR_EDM_UNKNOWN_ADMIN;
215     }
216 
217     std::vector<std::string> combinePermission = permissions;
218     ErrCode ret = GetGrantedPermission(abilityInfo, combinePermission, adminItem->adminInfo_.adminType_);
219     if (ret != ERR_OK) {
220         EDMLOGW("UpdateAdmin::GetGrantedPermission failed");
221         return ret;
222     }
223 
224     adminItem->adminInfo_.permission_ = combinePermission;
225     adminItem->adminInfo_.packageName_ = abilityInfo.bundleName;
226     adminItem->adminInfo_.className_ = abilityInfo.name;
227     SaveAdmin(userId);
228     return ERR_OK;
229 }
230 
231 // success is returned as long as there is a super administrator
IsSuperAdminExist()232 bool AdminManager::IsSuperAdminExist()
233 {
234     std::vector<std::shared_ptr<Admin>> userAdmin;
235     bool ret = GetAdminByUserId(DEFAULT_USER_ID, userAdmin);
236     if (!ret) {
237         EDMLOGD("IsSuperAdminExist::not find super Admin");
238         return false;
239     }
240     return std::any_of(userAdmin.begin(), userAdmin.end(),
241         [](const std::shared_ptr<Admin> &admin) { return admin->adminInfo_.adminType_ == AdminType::ENT; });
242 }
243 
IsSuperAdmin(const std::string & bundleName)244 bool AdminManager::IsSuperAdmin(const std::string &bundleName)
245 {
246     std::shared_ptr<Admin> superAdmin;
247     superAdmin = GetAdminByPkgName(bundleName, DEFAULT_USER_ID);
248     if (superAdmin == nullptr) {
249         return false;
250     }
251     return superAdmin->adminInfo_.adminType_ == AdminType::ENT;
252 }
253 
254 /*
255  * There are different administrator types according to the input parameters.
256  * Returns a list of package names
257  */
GetEnabledAdmin(AdminType role,std::vector<std::string> & packageNameList,int32_t userId)258 void AdminManager::GetEnabledAdmin(AdminType role, std::vector<std::string> &packageNameList, int32_t userId)
259 {
260     packageNameList.clear();
261     std::vector<std::shared_ptr<Admin>> userAdmin;
262     bool ret = GetAdminByUserId(userId, userAdmin);
263     if (!ret) {
264         EDMLOGW("GetEnabledAdmin::not find enabled Admin. userId = %{public}d", userId);
265         return;
266     }
267     EDMLOGD("AdminManager:GetEnabledAdmin adminType: %{public}d , admin size: %{public}zu", role,
268         userAdmin.size());
269     if (role >= AdminType::UNKNOWN || role < AdminType::NORMAL) {
270         EDMLOGD("there is no admin(%{public}u) device manager package name list!", role);
271         return;
272     }
273 
274     for (const auto &item : userAdmin) {
275         if (item->adminInfo_.adminType_ == role) {
276             std::string adminName = item->adminInfo_.packageName_ + "/" + item->adminInfo_.className_;
277             packageNameList.push_back(adminName);
278         }
279     }
280 }
281 
GetEntInfo(const std::string & packageName,EntInfo & entInfo,int32_t userId)282 ErrCode AdminManager::GetEntInfo(const std::string &packageName, EntInfo &entInfo, int32_t userId)
283 {
284     std::vector<std::shared_ptr<Admin>> userAdmin;
285     bool ret = GetAdminByUserId(userId, userAdmin);
286     if (!ret) {
287         EDMLOGW("GetEntInfo::not find Admin. userId = %{public}d", userId);
288         return ERR_EDM_UNKNOWN_ADMIN;
289     }
290     for (const auto &item : userAdmin) {
291         if (item->adminInfo_.packageName_ == packageName) {
292             entInfo = item->adminInfo_.entInfo_;
293             return ERR_OK;
294         }
295     }
296     return ERR_EDM_UNKNOWN_ADMIN;
297 }
298 
SetEntInfo(const std::string & packageName,EntInfo & entInfo,int32_t userId)299 ErrCode AdminManager::SetEntInfo(const std::string &packageName, EntInfo &entInfo, int32_t userId)
300 {
301     std::vector<std::shared_ptr<Admin>> userAdmin;
302     bool ret = GetAdminByUserId(userId, userAdmin);
303     if (!ret) {
304         EDMLOGW("SetEntInfo::not find Admin. userId = %{public}d", userId);
305         return ERR_EDM_UNKNOWN_ADMIN;
306     }
307     for (auto &item : userAdmin) {
308         if (item->adminInfo_.packageName_ == packageName) {
309             item->adminInfo_.entInfo_ = entInfo;
310             SaveAdmin(userId);
311             return ERR_OK;
312         }
313     }
314     return ERR_EDM_UNKNOWN_ADMIN;
315 }
316 
SaveSubscribeEvents(const std::vector<uint32_t> & events,std::shared_ptr<Admin> & admin,int32_t userId)317 void AdminManager::SaveSubscribeEvents(const std::vector<uint32_t> &events,
318     std::shared_ptr<Admin> &admin, int32_t userId)
319 {
320     size_t eventsNumber = admin->adminInfo_.managedEvents_.size();
321     for (auto &event : events) {
322         std::vector<ManagedEvent> managedEvents = admin->adminInfo_.managedEvents_;
323         ManagedEvent subEvent = static_cast<ManagedEvent>(event);
324         if (std::find(managedEvents.begin(), managedEvents.end(), subEvent) == managedEvents.end()) {
325             admin->adminInfo_.managedEvents_.push_back(subEvent);
326         }
327     }
328     if (admin->adminInfo_.managedEvents_.size() > eventsNumber) {
329         SaveAdmin(userId);
330     }
331 }
332 
RemoveSubscribeEvents(const std::vector<uint32_t> & events,std::shared_ptr<Admin> & admin,int32_t userId)333 void AdminManager::RemoveSubscribeEvents(const std::vector<uint32_t> &events,
334     std::shared_ptr<Admin> &admin, int32_t userId)
335 {
336     size_t eventsNumber = admin->adminInfo_.managedEvents_.size();
337     for (auto &event : events) {
338         auto iter = admin->adminInfo_.managedEvents_.begin();
339         while (iter != admin->adminInfo_.managedEvents_.end()) {
340             if (*iter == static_cast<ManagedEvent>(event)) {
341                 iter = admin->adminInfo_.managedEvents_.erase(iter);
342             } else {
343                 ++iter;
344             }
345         }
346     }
347     if (admin->adminInfo_.managedEvents_.size() < eventsNumber) {
348         SaveAdmin(userId);
349     }
350 }
351 // init
Init()352 void AdminManager::Init()
353 {
354     RestoreAdminFromFile();
355 }
356 
FindPackageAndClass(const std::string & name,std::string & packageName,std::string & className)357 void FindPackageAndClass(const std::string &name, std::string &packageName, std::string &className)
358 {
359     std::size_t initPos = name.find('/', 0);
360     std::size_t len = name.size();
361     packageName = name.substr(0, initPos);
362     className = name.substr(initPos + 1, len - (initPos + 1));
363 }
364 
ReadJsonAdminType(Json::Value & admin,std::vector<std::shared_ptr<Admin>> & adminVector)365 void AdminManager::ReadJsonAdminType(Json::Value &admin,
366     std::vector<std::shared_ptr<Admin>> &adminVector)
367 {
368     std::shared_ptr<Admin> enabledAdmin;
369     if (admin["adminType"].asUInt() == AdminType::NORMAL) {
370         enabledAdmin = std::make_shared<Admin>();
371     } else if (admin["adminType"].asUInt() == AdminType::ENT) {
372         enabledAdmin = std::make_shared<SuperAdmin>();
373     } else {
374         EDMLOGD("admin type is error!");
375         return;
376     }
377 
378     FindPackageAndClass(admin["name"].asString(), enabledAdmin->adminInfo_.packageName_,
379         enabledAdmin->adminInfo_.className_);
380     enabledAdmin->adminInfo_.adminType_ = static_cast<AdminType>(admin["adminType"].asUInt());
381     enabledAdmin->adminInfo_.entInfo_.enterpriseName = admin["enterpriseInfo"]["enterpriseName"].asString(); // object
382     enabledAdmin->adminInfo_.entInfo_.description = admin["enterpriseInfo"]["declaration"].asString();
383     uint32_t adminSize = admin["permission"].size();
384     for (uint32_t i = 0; i < adminSize; i++) {
385         enabledAdmin->adminInfo_.permission_.push_back(admin["permission"][i].asString()); // array
386     }
387     uint32_t eventsSize = admin["subscribeEvents"].size();
388     for (uint32_t i = 0; i < eventsSize; i++) {
389         enabledAdmin->adminInfo_.managedEvents_.push_back(
390             static_cast<ManagedEvent>(admin["subscribeEvents"][i].asUInt()));
391     }
392 
393     // read admin and store it in vector container
394     adminVector.push_back(enabledAdmin);
395 }
396 
ReadJsonAdmin(const std::string & filePath,int32_t userId)397 void AdminManager::ReadJsonAdmin(const std::string &filePath, int32_t userId)
398 {
399     std::ifstream is(filePath);
400     JSONCPP_STRING errs;
401     Json::Value root, lang;
402     Json::CharReaderBuilder readerBuilder;
403     std::vector<std::shared_ptr<Admin>> adminVector;
404 
405     if (!is.is_open()) {
406         EDMLOGE("ReadJsonAdmin open admin policies file failed!");
407         return;
408     }
409     bool res = parseFromStream(readerBuilder, is, &root, &errs);
410     if (!res || !errs.empty()) {
411         // no data, return
412         EDMLOGW("AdminManager::read admin policies file = %{public}d , is not empty = %{public}d", res, errs.empty());
413         is.close();
414         return;
415     }
416     is.close();
417 
418     lang = root["admin"];
419     EDMLOGD("AdminManager::size = %{public}u", lang.size());
420 
421     for (auto &temp : lang) {
422         ReadJsonAdminType(temp, adminVector);
423     }
424     // not empty
425     if (!(adminVector.empty())) {
426         admins_.insert(std::pair<int32_t, std::vector<std::shared_ptr<Admin>>>(userId, adminVector));
427     }
428     EDMLOGI("AdminManager::ReadJsonAdmin empty = %{public}d", adminVector.empty());
429 }
430 
431 // read admin from file
RestoreAdminFromFile()432 void AdminManager::RestoreAdminFromFile()
433 {
434     std::vector<std::string> paths;
435     OHOS::GetDirFiles(EDM_ADMIN_BASE, paths);
436     for (size_t i = 0; i < paths.size(); i++) {
437         std::string::size_type pos = paths[i].find(EDM_ADMIN_DOT);
438         std::string::size_type posHead = paths[i].find(EDM_ADMIN_JSON_FILE);
439         if (pos == std::string::npos || posHead == std::string::npos) {
440             continue;
441         }
442         size_t start = (EDM_ADMIN_BASE + EDM_ADMIN_JSON_FILE).length();
443         std::string user = paths[i].substr(start, (pos - start));
444         if (!std::all_of(user.begin(), user.end(), ::isdigit)) {
445             continue;
446         }
447         // Indicates 0 user, and other user ID is 100
448         if ((std::stoi(user)) < DEFAULT_USER_ID) {
449             continue;
450         }
451         std::string path = EDM_ADMIN_BASE + EDM_ADMIN_JSON_FILE + user +
452             EDM_ADMIN_JSON_EXT;
453         // admin information storage location
454         ReadJsonAdmin(path, (std::stoi(user)));
455     }
456     EDMLOGD("RestoreAdminFromFile success! size = %{public}zu", paths.size());
457 }
458 
WriteJsonAdminType(std::shared_ptr<Admin> & enabledAdmin,Json::Value & tree)459 void AdminManager::WriteJsonAdminType(std::shared_ptr<Admin> &enabledAdmin, Json::Value &tree)
460 {
461     Json::Value entTree;
462     Json::Value permissionTree;
463     Json::Value eventsTree;
464 
465     tree["name"] = enabledAdmin->adminInfo_.packageName_ + "/" + enabledAdmin->adminInfo_.className_;
466     tree["adminType"] = enabledAdmin->adminInfo_.adminType_;
467 
468     entTree["enterpriseName"] = enabledAdmin->adminInfo_.entInfo_.enterpriseName;
469     entTree["declaration"] = enabledAdmin->adminInfo_.entInfo_.description;
470     tree["enterpriseInfo"] = entTree;
471 
472     for (auto &it : enabledAdmin->adminInfo_.permission_) {
473         permissionTree.append(it);
474     }
475     tree["permission"] = permissionTree;
476 
477     for (auto &it : enabledAdmin->adminInfo_.managedEvents_) {
478         eventsTree.append(static_cast<uint32_t>(it));
479     }
480     tree["subscribeEvents"] = eventsTree;
481 }
482 
WriteJsonAdmin(const std::string & filePath,int32_t userId)483 void AdminManager::WriteJsonAdmin(const std::string &filePath, int32_t userId)
484 {
485     Json::Value root, tree, temp;
486 
487     auto iterMap = admins_.find(userId);
488     if (iterMap == admins_.end()) {
489         EDMLOGW("WriteJsonAdmin::not find Admin. userId = %{public}d", userId);
490         return;
491     }
492     EDMLOGD("WriteJsonAdmin start!  size = %{public}u  empty = %{public}d", (uint32_t)(iterMap->second).size(),
493         (iterMap->second).empty());
494     // structure of each admin
495     for (std::uint32_t i = 0; i < (iterMap->second).size(); i++) {
496         WriteJsonAdminType((iterMap->second).at(i), temp);
497         tree.append(temp);
498     }
499     // root
500     root["admin"] = tree;
501 
502     double time1 = clock();
503     // write to file
504     std::ofstream ofs(filePath);
505     if (!ofs.is_open()) {
506         EDMLOGE("WriteJsonAdmin open admin policies file failed!");
507         return;
508     }
509 
510     Json::StreamWriterBuilder builder;
511     builder["indentation"] = "    ";
512     const std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
513     writer->write(root, &ofs);
514     ofs.flush();
515     ofs.close();
516     double time2 = clock();
517     if (time1 != 0 && time2 != 0) {
518         EDMLOGD("WriteJsonAdmin spend time %{public}f", (time2 - time1) / CLOCKS_PER_SEC);
519     }
520     if (!ChangeModeFile(filePath, S_IRUSR | S_IWUSR)) {
521         EDMLOGW("AdminManager::ChangeModeFile failed");
522     }
523     if ((iterMap->second).empty()) {
524         admins_.erase(iterMap);
525         // delete current userId file
526         bool delFlag = OHOS::RemoveFile(filePath);
527         EDMLOGD("WriteJsonAdmin delete userId = %{public}d map value; delFlag = %{public}d",
528             userId, delFlag);
529     }
530 }
531 
532 // write admin to file
SaveAdmin(int32_t userId)533 void AdminManager::SaveAdmin(int32_t userId)
534 {
535     std::string path = EDM_ADMIN_BASE + EDM_ADMIN_JSON_FILE + std::to_string(userId) +
536         EDM_ADMIN_JSON_EXT;
537     WriteJsonAdmin(path, userId);
538 }
539 } // namespace EDM
540 } // namespace OHOS
541