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