• 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 "policy_manager.h"
17 #include <algorithm>
18 #include <ctime>
19 #include <fstream>
20 #include <unistd.h>
21 #include "edm_log.h"
22 
23 namespace OHOS {
24 namespace EDM {
25 const std::string EDM_POLICY_JSON_FILE = "/data/system/device_policies.json";
26 const std::string EDM_POLICY_JSON_FILE_BAK = "/data/system/device_policies.json.bak";
27 constexpr unsigned int INVALID_INDEX = -1;
28 
29 std::shared_ptr<PolicyManager> PolicyManager::instance_;
30 std::mutex PolicyManager::mutexLock_;
31 
PolicyManager()32 PolicyManager::PolicyManager()
33 {
34     EDMLOGD("PolicyManager::PolicyManager\n");
35 }
36 
~PolicyManager()37 PolicyManager::~PolicyManager()
38 {
39     EDMLOGD("PolicyManager::~PolicyManager\n");
40 }
41 
ParsePolicyItems(const Json::Value & items,PolicyItemsMap & itemsMap)42 bool PolicyManager::ParsePolicyItems(const Json::Value &items, PolicyItemsMap &itemsMap)
43 {
44     if (!items.isObject()) {
45         EDMLOGW("ParsePolicyItems items is not object");
46         return false;
47     }
48 
49     Json::Value::Members mem = items.getMemberNames();
50     for (const auto &i : mem) {
51         Json::StreamWriterBuilder builder;
52         builder["indentation"] = "    ";
53         std::string arrayToString = Json::writeString(builder, items[i]);
54         itemsMap.insert(std::pair<std::string, std::string>(i, arrayToString));
55     }
56     return true;
57 }
58 
ParseAdminList(const std::string & adminName,const PolicyItemsMap & itemsMap)59 bool PolicyManager::ParseAdminList(const std::string &adminName, const PolicyItemsMap &itemsMap)
60 {
61     for (auto &iter : itemsMap) {
62         std::string policyName = iter.first;
63         std::string policyValue = iter.second;
64         auto it = policyAdmins_.find(policyName);
65         if (it == policyAdmins_.end()) {
66             /* policy first added into map */
67             AdminValueItemsMap adminValueItem;
68             adminValueItem.insert(std::pair<std::string, std::string>(adminName, policyValue));
69             policyAdmins_.insert(std::pair<std::string, AdminValueItemsMap>(policyName, adminValueItem));
70         } else {
71             AdminValueItemsMap &adminValueRef = it->second;
72             auto iterValue = adminValueRef.find(adminName);
73             if (iterValue != adminValueRef.end()) {
74                 EDMLOGW("AdminName:%{public}s PolicyName:%{public}s should not repetitive\n",
75                         adminName.c_str(), policyName.c_str());
76                 iterValue->second = policyValue;
77             } else {
78                 adminValueRef.insert(std::pair<std::string, std::string>(adminName, policyValue));
79             }
80         }
81     }
82     return true;
83 }
84 
ParseAdminPolicy(const Json::Value & admin)85 bool PolicyManager::ParseAdminPolicy(const Json::Value &admin)
86 {
87     std::string adminName;
88     PolicyItemsMap itemsMap;
89     if (!admin.isObject()) {
90         EDMLOGI("admin root policy is not object\n");
91         return false;
92     }
93 
94     if (admin.isMember("AdminName") && admin["AdminName"].isString()) {
95         adminName = admin["AdminName"].asString();
96     }
97 
98     bool isParsePolicySuccess = false;
99     bool isParseAdminListSuccess = false;
100     if (admin.isMember("PolicyItems") && admin["PolicyItems"].isObject() && !adminName.empty()) {
101         isParsePolicySuccess = ParsePolicyItems(admin["PolicyItems"], itemsMap);
102         adminPolicies_.insert(std::pair<std::string, PolicyItemsMap>(adminName, itemsMap));
103         isParseAdminListSuccess = ParseAdminList(adminName, itemsMap);
104     }
105     return isParsePolicySuccess && isParseAdminListSuccess;
106 }
107 
ParseCombinedPolicy(const Json::Value & combined)108 bool PolicyManager::ParseCombinedPolicy(const Json::Value &combined)
109 {
110     if (!combined.isObject()) {
111         EDMLOGI("combined root is not object\n");
112         return false;
113     }
114     return ParsePolicyItems(combined, combinedPolicies_);
115 }
116 
ParseDevicePolicyJsonFile(const Json::Value & policyRoot)117 ErrCode PolicyManager::ParseDevicePolicyJsonFile(const Json::Value &policyRoot)
118 {
119     if (!policyRoot.isObject()) {
120         EDMLOGW("json root is not object\n");
121         return ERR_EDM_POLICY_PARSE_JSON_FAILED;
122     }
123 
124     bool isParseAdminSuccess = false;
125     bool isParseCombinedSuccess = false;
126     if (policyRoot.isMember("AdminPolicies") && policyRoot["AdminPolicies"].isArray()) {
127         for (const auto &item : policyRoot["AdminPolicies"]) {
128             if (!item.isObject()) {
129                 EDMLOGI("is not object");
130                 return ERR_EDM_POLICY_PARSE_JSON_FAILED;
131             }
132             isParseAdminSuccess = ParseAdminPolicy(item);
133             if (!isParseAdminSuccess) {
134                 EDMLOGI("AdminPolicies parse failed object");
135                 return ERR_EDM_POLICY_PARSE_JSON_FAILED;
136             }
137         }
138     }
139 
140     if (isParseAdminSuccess) {
141         if (policyRoot.isMember("CombinedPolicies") && policyRoot["CombinedPolicies"].isObject()) {
142             isParseCombinedSuccess = ParseCombinedPolicy(policyRoot["CombinedPolicies"]);
143         }
144     } else {
145         EDMLOGW("ParseAdminPolicy failed\n");
146     }
147 
148     if (isParseAdminSuccess && isParseCombinedSuccess) {
149         return ERR_OK;
150     }
151     return ERR_EDM_POLICY_PARSE_JSON_FAILED;
152 }
153 
LoadPolicy()154 ErrCode PolicyManager::LoadPolicy()
155 {
156     if (access(EDM_POLICY_JSON_FILE.c_str(), F_OK) != 0) {
157         EDMLOGI("LoadPolicy: create an empty json file\n");
158         CreateEmptyJsonFile();
159     }
160 
161     std::ifstream ifs(EDM_POLICY_JSON_FILE);
162     if (!ifs.is_open()) {
163         EDMLOGE("LoadPolicy: open edm policy json file failed\n");
164         return ERR_EDM_POLICY_OPEN_JSON_FAILED;
165     }
166 
167     Json::String errs;
168     Json::CharReaderBuilder builder;
169     if (!parseFromStream(builder, ifs, &policyRoot_, &errs)) {
170         EDMLOGW("parse from stream failed: %{public}s\n", errs.c_str());
171         ifs.close();
172         return ERR_EDM_POLICY_LOAD_JSON_FAILED;
173     }
174     ifs.close();
175     return ParseDevicePolicyJsonFile(policyRoot_);
176 }
177 
SavePolicy()178 void PolicyManager::SavePolicy()
179 {
180     /* the default file permission is 600, no need to change  */
181     std::ofstream ofs(EDM_POLICY_JSON_FILE_BAK, std::ofstream::binary);
182     if (!ofs.is_open()) {
183         EDMLOGW("SavePolicy open edm policy json file failed\n");
184         return;
185     }
186 
187     double time1 = clock();
188     Json::StreamWriterBuilder builder;
189     /* use 4 spaces instead of tab for indentation */
190     builder["indentation"] = "    ";
191     const std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
192     writer->write(policyRoot_, &ofs);
193 
194     ofs.flush();
195     ofs.close();
196     double time2 = clock();
197     std::rename(EDM_POLICY_JSON_FILE_BAK.c_str(), EDM_POLICY_JSON_FILE.c_str());
198     double time3 = clock();
199     EDMLOGI("SavePolicy spend time %{public}f, %{public}f", (time2 - time1) / CLOCKS_PER_SEC,
200         (time3 - time2) / CLOCKS_PER_SEC);
201 }
202 
GetAdminByPolicyName(const std::string & policyName,AdminValueItemsMap & adminValueItems)203 ErrCode PolicyManager::GetAdminByPolicyName(const std::string &policyName, AdminValueItemsMap &adminValueItems)
204 {
205     auto iter = policyAdmins_.find(policyName);
206     if (iter != policyAdmins_.end()) {
207         adminValueItems = iter->second;
208         return ERR_OK;
209     }
210     return ERR_EDM_POLICY_NOT_FOUND;
211 }
212 
GetAllPolicyByAdmin(const std::string & adminName,PolicyItemsMap & allAdminPolicy)213 ErrCode PolicyManager::GetAllPolicyByAdmin(const std::string &adminName, PolicyItemsMap &allAdminPolicy)
214 {
215     auto iter = adminPolicies_.find(adminName);
216     if (iter != adminPolicies_.end()) {
217         allAdminPolicy = iter->second;
218         return ERR_OK;
219     }
220     return ERR_EDM_POLICY_NOT_FIND;
221 }
222 
GetAdminPolicy(const std::string & adminName,const std::string & policyName,std::string & policyValue)223 ErrCode PolicyManager::GetAdminPolicy(const std::string &adminName, const std::string &policyName,
224     std::string &policyValue)
225 {
226     auto iter = adminPolicies_.find(adminName);
227     if (iter != adminPolicies_.end()) {
228         PolicyItemsMap &policyItem = iter->second;
229         auto it = policyItem.find(policyName);
230         if (it != policyItem.end()) {
231             policyValue = it->second;
232             return ERR_OK;
233         }
234     }
235     return ERR_EDM_POLICY_NOT_FIND;
236 }
237 
GetCombinedPolicy(const std::string & policyName,std::string & policyValue)238 ErrCode PolicyManager::GetCombinedPolicy(const std::string &policyName, std::string &policyValue)
239 {
240     auto it = combinedPolicies_.find(policyName);
241     if (it != combinedPolicies_.end()) {
242         policyValue = it->second;
243         return ERR_OK;
244     }
245     return ERR_EDM_POLICY_NOT_FIND;
246 }
247 
GetAdminItemJsonObject(const Json::Value & admin,const std::string & adminName)248 bool PolicyManager::GetAdminItemJsonObject(const Json::Value &admin, const std::string &adminName)
249 {
250     if (admin.isMember("AdminName") && admin["AdminName"].isString()) {
251         std::string adminItemName = admin["AdminName"].asString();
252         if ((adminItemName == adminName) && (admin.isMember("PolicyItems") && admin["PolicyItems"].isObject())) {
253             return true;
254         }
255     }
256     return false;
257 }
258 
GetPolicy(const std::string & adminName,const std::string & policyName,std::string & policyValue)259 ErrCode PolicyManager::GetPolicy(const std::string &adminName, const std::string &policyName,
260     std::string &policyValue)
261 {
262     if (adminName.empty()) {
263         return GetCombinedPolicy(policyName, policyValue);
264     } else {
265         return GetAdminPolicy(adminName, policyName, policyValue);
266     }
267 }
268 
SetAdminList(const std::string & adminName,const std::string & policyName,const std::string & policyValue)269 void PolicyManager::SetAdminList(const std::string &adminName, const std::string &policyName,
270     const std::string &policyValue)
271 {
272     auto iter = policyAdmins_.find(policyName);
273     if (iter == policyAdmins_.end()) {
274         /* policy first added into map */
275         AdminValueItemsMap adminValueItem;
276         adminValueItem.insert(std::pair<std::string, std::string>(adminName, policyValue));
277         policyAdmins_.insert(std::pair<std::string, AdminValueItemsMap>(policyName, adminValueItem));
278         return;
279     }
280 
281     AdminValueItemsMap &adminValueRef = iter->second;
282     auto it = adminValueRef.find(adminName);
283     if (it != adminValueRef.end()) {
284         it->second = policyValue;
285     } else {
286         adminValueRef.insert(std::pair<std::string, std::string>(adminName, policyValue));
287     }
288 }
289 
SetAdminPolicyItemJsonValue(Json::Value & admin,const std::string & adminName,const std::string & policyName,const std::string & policyValue)290 bool PolicyManager::SetAdminPolicyItemJsonValue(Json::Value &admin, const std::string &adminName,
291     const std::string &policyName, const std::string &policyValue)
292 {
293     if (GetAdminItemJsonObject(admin, adminName)) {
294         Json::Value policyValueRoot;
295         if (ParseJsonString(policyValue, policyValueRoot) != ERR_OK) {
296             return false;
297         }
298         Json::Value &adminObject = admin["PolicyItems"];
299         adminObject[policyName] = policyValueRoot;
300         return true;
301     }
302     return false;
303 }
304 
ParseJsonString(const std::string & policyValue,Json::Value & policyValueRoot)305 ErrCode PolicyManager::ParseJsonString(const std::string &policyValue, Json::Value &policyValueRoot)
306 {
307     const auto policyValueLength = static_cast<int>(policyValue.length());
308     JSONCPP_STRING err;
309     Json::CharReaderBuilder builder;
310     const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
311     if (!reader->parse(policyValue.c_str(), policyValue.c_str() + policyValueLength, &policyValueRoot, &err)) {
312         policyValueRoot = Json::Value(policyValue);
313     }
314     return ERR_OK;
315 }
316 
SetAdminJsonValue(const std::string & adminName,const std::string & policyName,const std::string & policyValue)317 ErrCode PolicyManager::SetAdminJsonValue(const std::string &adminName, const std::string &policyName,
318     const std::string &policyValue)
319 {
320     if (policyRoot_.isMember("AdminPolicies") && policyRoot_["AdminPolicies"].isArray()) {
321         for (auto &admin : policyRoot_["AdminPolicies"]) {
322             if (admin.isObject() && SetAdminPolicyItemJsonValue(admin, adminName, policyName, policyValue)) {
323                 EDMLOGW("SetAdminJsonValue exist:%{public}s %{public}s ", adminName.c_str(), policyName.c_str());
324                 return ERR_OK;
325             }
326         }
327         EDMLOGI("SetAdminJsonValue new object:%{public}s %{public}s ", adminName.c_str(), policyName.c_str());
328         Json::Value policyValueRoot;
329         if (ParseJsonString(policyValue, policyValueRoot) != ERR_OK) {
330             return ERR_EDM_POLICY_SET_FAILED;
331         }
332 
333         Json::Value adminObject;
334         Json::Value policyItemsObject;
335         adminObject["AdminName"] = adminName;
336         policyItemsObject[policyName] = policyValueRoot;
337         adminObject["PolicyItems"] = policyItemsObject;
338         policyRoot_["AdminPolicies"].append(adminObject);
339         return ERR_OK;
340     }
341     return ERR_EDM_POLICY_SET_FAILED;
342 }
343 
SetAdminPolicy(const std::string & adminName,const std::string & policyName,const std::string & policyValue)344 ErrCode PolicyManager::SetAdminPolicy(const std::string &adminName, const std::string &policyName,
345     const std::string &policyValue)
346 {
347     SetAdminList(adminName, policyName, policyValue);
348     auto iter = adminPolicies_.find(adminName);
349     if (iter == adminPolicies_.end()) {
350         PolicyItemsMap itemMap;
351         itemMap.insert(std::pair<std::string, std::string>(policyName, policyValue));
352         adminPolicies_.insert(std::pair<std::string, PolicyItemsMap>(adminName, itemMap));
353         return SetAdminJsonValue(adminName, policyName, policyValue);
354     }
355 
356     PolicyItemsMap &policyItem = iter->second;
357     auto it = policyItem.find(policyName);
358     if (it != policyItem.end()) {
359         it->second = policyValue;
360     } else {
361         policyItem.insert(std::pair<std::string, std::string>(policyName, policyValue));
362     }
363     return SetAdminJsonValue(adminName, policyName, policyValue);
364 }
365 
SetCombinedJsonValue(const std::string & policyName,const std::string & policyValue)366 ErrCode PolicyManager::SetCombinedJsonValue(const std::string &policyName, const std::string &policyValue)
367 {
368     if (policyRoot_.isMember("CombinedPolicies") && policyRoot_["CombinedPolicies"].isObject()) {
369         Json::Value policyValueRoot;
370         if (ParseJsonString(policyValue, policyValueRoot) != ERR_OK) {
371             return ERR_EDM_POLICY_SET_FAILED;
372         }
373         policyRoot_["CombinedPolicies"][policyName] = policyValueRoot;
374         return ERR_OK;
375     }
376     return ERR_EDM_POLICY_SET_FAILED;
377 }
378 
SetCombinedPolicy(const std::string & policyName,const std::string & policyValue)379 ErrCode PolicyManager::SetCombinedPolicy(const std::string &policyName, const std::string &policyValue)
380 {
381     auto it = combinedPolicies_.find(policyName);
382     if (it != combinedPolicies_.end()) {
383         it->second = policyValue;
384     } else {
385         combinedPolicies_.insert(std::pair<std::string, std::string>(policyName, policyValue));
386     }
387     return SetCombinedJsonValue(policyName, policyValue);
388 }
389 
DeleteAdminList(const std::string & adminName,const std::string & policyName)390 void PolicyManager::DeleteAdminList(const std::string &adminName, const std::string &policyName)
391 {
392     auto iter = policyAdmins_.find(policyName);
393     if (iter == policyAdmins_.end()) {
394         return;
395     }
396 
397     AdminValueItemsMap &adminValueRef = iter->second;
398     auto it = adminValueRef.find(adminName);
399     if (it == adminValueRef.end()) {
400         return;
401     }
402 
403     adminValueRef.erase(it);
404     if (adminValueRef.empty()) {
405         policyAdmins_.erase(iter);
406     }
407 }
408 
DeleteAdminPolicyItemJsonValue(Json::Value & admin,const std::string & adminName,const std::string & policyName,unsigned int & policyItemsNum)409 bool PolicyManager::DeleteAdminPolicyItemJsonValue(Json::Value &admin, const std::string &adminName,
410     const std::string &policyName, unsigned int &policyItemsNum)
411 {
412     if (GetAdminItemJsonObject(admin, adminName)) {
413         Json::Value &adminObject = admin["PolicyItems"];
414         if (adminObject.isMember(policyName)) {
415             adminObject.removeMember(policyName);
416             policyItemsNum = adminObject.size();
417             return true;
418         }
419     }
420     return false;
421 }
422 
DeleteAdminJsonValue(const std::string & adminName,const std::string & policyName)423 ErrCode PolicyManager::DeleteAdminJsonValue(const std::string &adminName, const std::string &policyName)
424 {
425     if (!policyRoot_.isMember("AdminPolicies") || !policyRoot_["AdminPolicies"].isArray()) {
426         return ERR_EDM_POLICY_DEL_FAILED;
427     }
428     unsigned int policyItemsNum = 0;
429     unsigned int deleteIndex = INVALID_INDEX;
430     unsigned int policyRootSize = policyRoot_["AdminPolicies"].size();
431     for (Json::ArrayIndex i = 0; i < policyRootSize; i++) {
432         Json::Value &admin = policyRoot_["AdminPolicies"][i];
433         if (admin.isObject() && DeleteAdminPolicyItemJsonValue(admin, adminName, policyName, policyItemsNum)) {
434             if (policyItemsNum == 0) {
435                 deleteIndex = i;
436                 break;
437             }
438         }
439     }
440     if (deleteIndex != INVALID_INDEX) {
441         policyRoot_["AdminPolicies"].removeIndex(deleteIndex, nullptr);
442     }
443     return ERR_OK;
444 }
445 
DeleteAdminPolicy(const std::string & adminName,const std::string & policyName)446 ErrCode PolicyManager::DeleteAdminPolicy(const std::string &adminName, const std::string &policyName)
447 {
448     auto iter = adminPolicies_.find(adminName);
449     if (iter != adminPolicies_.end()) {
450         PolicyItemsMap &policyItem = iter->second;
451         auto it = policyItem.find(policyName);
452         if (it != policyItem.end()) {
453             policyItem.erase(it);
454         }
455 
456         if (iter->second.empty()) {
457             adminPolicies_.erase(iter);
458         }
459 
460         DeleteAdminList(adminName, policyName);
461         return DeleteAdminJsonValue(adminName, policyName);
462     }
463     return ERR_OK;
464 }
465 
DeleteCombinedJsonValue(const std::string & policyName)466 ErrCode PolicyManager::DeleteCombinedJsonValue(const std::string &policyName)
467 {
468     if (policyRoot_.isMember("CombinedPolicies") && policyRoot_["CombinedPolicies"].isObject()) {
469         Json::Value &rootObject = policyRoot_["CombinedPolicies"];
470         if (rootObject.isMember(policyName)) {
471             rootObject.removeMember(policyName);
472             return true;
473         }
474     }
475     return ERR_EDM_POLICY_DEL_FAILED;
476 }
477 
DeleteCombinedPolicy(const std::string & policyName)478 ErrCode PolicyManager::DeleteCombinedPolicy(const std::string &policyName)
479 {
480     auto it = combinedPolicies_.find(policyName);
481     if (it != combinedPolicies_.end()) {
482         combinedPolicies_.erase(it);
483     }
484     return DeleteCombinedJsonValue(policyName);
485 }
486 
DumpAdminPolicy()487 void PolicyManager::DumpAdminPolicy()
488 {
489     std::for_each(adminPolicies_.begin(), adminPolicies_.end(), [](auto iter) {
490         EDMLOGD("AdminName: %{public}s\n", iter.first.c_str());
491         std::unordered_map<std::string, std::string> map = iter.second;
492         std::for_each(map.begin(), map.end(),
493             [](auto subIter) { EDMLOGD("%{public}s : %{public}s\n", subIter.first.c_str(), subIter.second.c_str()); });
494     });
495 }
496 
DumpAdminList()497 void PolicyManager::DumpAdminList()
498 {
499     std::for_each(policyAdmins_.begin(), policyAdmins_.end(), [](auto iter) {
500         EDMLOGD("PolicyName: %{public}s\n", iter.first.c_str());
501         std::unordered_map<std::string, std::string> map = iter.second;
502         std::for_each(map.begin(), map.end(),
503             [](auto subIter) { EDMLOGD("%{public}s : %{public}s\n", subIter.first.c_str(), subIter.second.c_str()); });
504     });
505 }
506 
DumpCombinedPolicy()507 void PolicyManager::DumpCombinedPolicy()
508 {
509     std::for_each(combinedPolicies_.begin(), combinedPolicies_.end(),
510         [](auto iter) { EDMLOGD("%{public}s : %{public}s\n", iter.first.c_str(), iter.second.c_str()); });
511 }
512 
SetPolicy(const std::string & adminName,const std::string & policyName,const std::string & adminPolicy,const std::string & mergedPolicy)513 ErrCode PolicyManager::SetPolicy(const std::string &adminName, const std::string &policyName,
514     const std::string &adminPolicy, const std::string &mergedPolicy)
515 {
516     if (policyName.empty()) {
517         return ERR_EDM_POLICY_SET_FAILED;
518     }
519 
520     ErrCode err;
521     if (mergedPolicy.empty()) {
522         err = DeleteCombinedPolicy(policyName);
523     } else {
524         err = SetCombinedPolicy(policyName, mergedPolicy);
525     }
526     if (FAILED(err)) {
527         EDMLOGW("Set or delete combined policy failed:%{public}d, merged policy:%{public}s\n",
528             err, mergedPolicy.c_str());
529     }
530 
531     if (!adminName.empty()) {
532         if (adminPolicy.empty()) {
533             err = DeleteAdminPolicy(adminName, policyName);
534         } else {
535             err = SetAdminPolicy(adminName, policyName, adminPolicy);
536         }
537     }
538     if (FAILED(err)) {
539         EDMLOGW("Set or delete admin policy failed:%{public}d, admin policy:%{public}s\n",
540             err, adminPolicy.c_str());
541     }
542 
543     SavePolicy();
544     return err;
545 }
546 
CreateEmptyJsonFile()547 void PolicyManager::CreateEmptyJsonFile()
548 {
549     Json::Value adminObject(Json::arrayValue);
550     Json::Value combinedObject(Json::objectValue);
551     policyRoot_["AdminPolicies"] = adminObject;
552     policyRoot_["CombinedPolicies"] = combinedObject;
553     SavePolicy();
554 }
555 
Init()556 void PolicyManager::Init()
557 {
558     LoadPolicy();
559 }
560 
GetInstance()561 std::shared_ptr<PolicyManager> PolicyManager::GetInstance()
562 {
563     if (instance_ == nullptr) {
564         std::lock_guard<std::mutex> lock(mutexLock_);
565         if (instance_ == nullptr) {
566             instance_.reset(new PolicyManager());
567         }
568     }
569     return instance_;
570 }
571 } // namespace EDM
572 } // namespace OHOS
573