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