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_policies_storage_rdb.h"
17
18 #include "cjson_check.h"
19 #include "edm_constants.h"
20 #include "edm_log.h"
21 #include "edm_rdb_filed_const.h"
22
23 namespace OHOS {
24 namespace EDM {
25 std::shared_ptr<AdminPoliciesStorageRdb> AdminPoliciesStorageRdb::instance_ = nullptr;
26 std::once_flag AdminPoliciesStorageRdb::flag_;
27 bool AdminPoliciesStorageRdb::isAdminPoliciesTableInit_ = false;
28
AdminPoliciesStorageRdb()29 AdminPoliciesStorageRdb::AdminPoliciesStorageRdb()
30 {
31 EDMLOGD("AdminPoliciesStorageRdb::create database.");
32 }
33
CreateAdminPoliciesTable()34 bool AdminPoliciesStorageRdb::CreateAdminPoliciesTable()
35 {
36 std::string createTableSql = "CREATE TABLE IF NOT EXISTS ";
37 createTableSql.append(EdmRdbFiledConst::ADMIN_POLICIES_RDB_TABLE_NAME + " (")
38 .append(EdmRdbFiledConst::FILED_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,")
39 .append(EdmRdbFiledConst::FILED_USER_ID + " INTEGER NOT NULL,")
40 .append(EdmRdbFiledConst::FILED_ADMIN_TYPE + " INTEGER NOT NULL,")
41 .append(EdmRdbFiledConst::FILED_PACKAGE_NAME + " TEXT NOT NULL,")
42 .append(EdmRdbFiledConst::FILED_CLASS_NAME + " TEXT NOT NULL,")
43 .append(EdmRdbFiledConst::FILED_ENT_NAME + " TEXT,")
44 .append(EdmRdbFiledConst::FILED_ENT_DESC + " TEXT,")
45 .append(EdmRdbFiledConst::FILED_PERMISSIONS + " TEXT,")
46 .append(EdmRdbFiledConst::FILED_SUBSCRIBE_EVENTS + " TEXT,")
47 .append(EdmRdbFiledConst::FILED_PARENT_ADMIN + " TEXT,")
48 .append(EdmRdbFiledConst::FILED_IS_DEBUG + " INTEGER,")
49 .append(EdmRdbFiledConst::FILED_ACCESSIBLE_POLICIES + " TEXT,")
50 .append(EdmRdbFiledConst::FILED_RUNNING_MODE + " INTEGER);");
51 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
52 if (edmRdbDataManager != nullptr) {
53 return edmRdbDataManager->CreateTable(createTableSql);
54 }
55 EDMLOGE("AdminPoliciesStorageRdb::create database admin_policies failed.");
56 return false;
57 }
58
GetInstance()59 std::shared_ptr<AdminPoliciesStorageRdb> AdminPoliciesStorageRdb::GetInstance()
60 {
61 if (!isAdminPoliciesTableInit_) {
62 isAdminPoliciesTableInit_ = CreateAdminPoliciesTable();
63 }
64 if (!isAdminPoliciesTableInit_) {
65 return nullptr;
66 }
67 std::call_once(flag_, []() {
68 if (instance_ == nullptr) {
69 instance_ = std::make_shared<AdminPoliciesStorageRdb>();
70 }
71 });
72 return instance_;
73 }
74
InsertAdmin(int32_t userId,const Admin & admin)75 bool AdminPoliciesStorageRdb::InsertAdmin(int32_t userId, const Admin &admin)
76 {
77 EDMLOGD("AdminPoliciesStorageRdb::Insert data start.");
78 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
79 if (edmRdbDataManager == nullptr) {
80 EDMLOGE("AdminPoliciesStorageRdb::InsertAdmin get edmRdbDataManager failed.");
81 return false;
82 }
83 // insert into admin_policies(user_id, admin_type, package_name, class_name, ent_name, ent_desc, permissions,
84 // parent_admin, is_debug, accessible_policies) values(?, ?, ?, ?, ?, ?, ?, ?, ?)
85 return edmRdbDataManager->Insert(EdmRdbFiledConst::ADMIN_POLICIES_RDB_TABLE_NAME,
86 CreateInsertValuesBucket(userId, admin));
87 }
88
UpdateAdmin(int32_t userId,const Admin & admin)89 bool AdminPoliciesStorageRdb::UpdateAdmin(int32_t userId, const Admin &admin)
90 {
91 EDMLOGD("AdminPoliciesStorageRdb::Insert data start.");
92 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
93 if (edmRdbDataManager == nullptr) {
94 EDMLOGE("AdminPoliciesStorageRdb::UpdateAdmin get edmRdbDataManager failed.");
95 return false;
96 }
97 // update admin_policies set admin_type=?, ent_name=?, ent_desc=?, permissions=?, accessible_policies=?
98 // where user_id=? and package_name=?
99 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::ADMIN_POLICIES_RDB_TABLE_NAME);
100 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
101 predicates.EqualTo(EdmRdbFiledConst::FILED_PACKAGE_NAME, admin.adminInfo_.packageName_);
102 NativeRdb::ValuesBucket valuesBucket;
103 CreateUpdateValuesBucket(userId, admin, valuesBucket);
104 return edmRdbDataManager->Update(valuesBucket, predicates);
105 }
106
ReplaceAdmin(const std::string packageName,int32_t userId,const Admin & newAdmin)107 bool AdminPoliciesStorageRdb::ReplaceAdmin(const std::string packageName, int32_t userId, const Admin &newAdmin)
108 {
109 EDMLOGD("AdminPoliciesStorageRdb::ReplaceAdmin data start.");
110 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
111 if (edmRdbDataManager == nullptr) {
112 EDMLOGE("AdminPoliciesStorageRdb::UpdateAdmin get edmRdbDataManager failed.");
113 return false;
114 }
115 // update admin_policies set package_name=?, permissions=? where user_id=? and package_name=?
116 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::ADMIN_POLICIES_RDB_TABLE_NAME);
117 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
118 predicates.EqualTo(EdmRdbFiledConst::FILED_PACKAGE_NAME, packageName);
119 return edmRdbDataManager->Update(CreateInsertValuesBucket(userId, newAdmin), predicates);
120 }
121
UpdateParentName(const std::string packageName,const std::string currentParentName,const std::string targetParentName)122 bool AdminPoliciesStorageRdb::UpdateParentName(const std::string packageName, const std::string currentParentName,
123 const std::string targetParentName)
124 {
125 EDMLOGD("AdminPoliciesStorageRdb::UpdateParentName data start.");
126 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
127 if (edmRdbDataManager == nullptr) {
128 EDMLOGE("AdminPoliciesStorageRdb::UpdateParentName get edmRdbDataManager failed.");
129 return false;
130 }
131 // update admin_policies set ParentName=? where packageName=? and ParentName=?
132 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::ADMIN_POLICIES_RDB_TABLE_NAME);
133 predicates.EqualTo(EdmRdbFiledConst::FILED_PARENT_ADMIN, currentParentName);
134 predicates.EqualTo(EdmRdbFiledConst::FILED_PACKAGE_NAME, packageName);
135 NativeRdb::ValuesBucket valuesBucket;
136 valuesBucket.PutString(EdmRdbFiledConst::FILED_PARENT_ADMIN, targetParentName);
137 return edmRdbDataManager->Update(valuesBucket, predicates);
138 }
139
CreateInsertValuesBucket(int32_t userId,const Admin & admin)140 NativeRdb::ValuesBucket AdminPoliciesStorageRdb::CreateInsertValuesBucket(int32_t userId, const Admin &admin)
141 {
142 NativeRdb::ValuesBucket valuesBucket;
143 valuesBucket.PutInt(EdmRdbFiledConst::FILED_RUNNING_MODE, static_cast<int>(admin.adminInfo_.runningMode_));
144 CreateUpdateValuesBucket(userId, admin, valuesBucket);
145 valuesBucket.PutInt(EdmRdbFiledConst::FILED_USER_ID, userId);
146 valuesBucket.PutString(EdmRdbFiledConst::FILED_PACKAGE_NAME, admin.adminInfo_.packageName_);
147 valuesBucket.PutString(EdmRdbFiledConst::FILED_CLASS_NAME, admin.adminInfo_.className_);
148 valuesBucket.PutString(EdmRdbFiledConst::FILED_PARENT_ADMIN, admin.adminInfo_.parentAdminName_);
149 valuesBucket.PutBool(EdmRdbFiledConst::FILED_IS_DEBUG, admin.adminInfo_.isDebug_);
150 return valuesBucket;
151 }
152
CreateUpdateValuesBucket(int32_t userId,const Admin & admin,NativeRdb::ValuesBucket & valuesBucket)153 void AdminPoliciesStorageRdb::CreateUpdateValuesBucket(int32_t userId, const Admin &admin,
154 NativeRdb::ValuesBucket &valuesBucket)
155 {
156 valuesBucket.PutInt(EdmRdbFiledConst::FILED_ADMIN_TYPE, static_cast<int>(admin.adminInfo_.adminType_));
157
158 if (!admin.adminInfo_.entInfo_.enterpriseName.empty()) {
159 valuesBucket.PutString(EdmRdbFiledConst::FILED_ENT_NAME, admin.adminInfo_.entInfo_.enterpriseName);
160 }
161
162 if (!admin.adminInfo_.entInfo_.description.empty()) {
163 valuesBucket.PutString(EdmRdbFiledConst::FILED_ENT_DESC, admin.adminInfo_.entInfo_.description);
164 }
165
166 cJSON *permissionsArray = nullptr;
167 CJSON_CREATE_ARRAY_AND_CHECK_VOID(permissionsArray);
168 for (const auto &permission : admin.adminInfo_.permission_) {
169 cJSON* itemJson = cJSON_CreateString(permission.c_str());
170 if (itemJson == nullptr) {
171 cJSON_Delete(permissionsArray);
172 return;
173 }
174 CJSON_ADD_ITEM_TO_ARRAY_AND_CHECK_AND_CLEAR_VOID(itemJson, permissionsArray);
175 }
176 char *permissionsStr = cJSON_PrintUnformatted(permissionsArray);
177 if (permissionsStr != nullptr) {
178 valuesBucket.PutString(EdmRdbFiledConst::FILED_PERMISSIONS, permissionsStr);
179 cJSON_free(permissionsStr);
180 }
181 cJSON_Delete(permissionsArray);
182
183 if (admin.adminInfo_.adminType_ == AdminType::VIRTUAL_ADMIN) {
184 cJSON *policiesArray = nullptr;
185 CJSON_CREATE_ARRAY_AND_CHECK_VOID(policiesArray);
186 for (const auto &policy : admin.adminInfo_.accessiblePolicies_) {
187 cJSON* itemJson = cJSON_CreateString(policy.c_str());
188 if (itemJson == nullptr) {
189 cJSON_Delete(policiesArray);
190 return;
191 }
192 CJSON_ADD_ITEM_TO_ARRAY_AND_CHECK_AND_CLEAR_VOID(itemJson, policiesArray);
193 }
194 char *policiesStr = cJSON_PrintUnformatted(policiesArray);
195 if (policiesStr != nullptr) {
196 valuesBucket.PutString(EdmRdbFiledConst::FILED_ACCESSIBLE_POLICIES, policiesStr);
197 cJSON_free(policiesStr);
198 }
199 cJSON_Delete(policiesArray);
200 }
201
202 // Add running mode if not default
203 RunningMode runningMode = admin.adminInfo_.runningMode_;
204 if (runningMode != RunningMode::DEFAULT) {
205 valuesBucket.PutInt(EdmRdbFiledConst::FILED_RUNNING_MODE, static_cast<uint32_t>(runningMode));
206 }
207 }
208
DeleteAdmin(int32_t userId,const std::string & packageName)209 bool AdminPoliciesStorageRdb::DeleteAdmin(int32_t userId, const std::string &packageName)
210 {
211 EDMLOGD("AdminPoliciesStorageRdb::DeleteAdmin.");
212 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
213 if (edmRdbDataManager == nullptr) {
214 EDMLOGE("AdminPoliciesStorageRdb::DeleteAdmin get edmRdbDataManager failed.");
215 return false;
216 }
217 // delete from admin_policies where user_id=? and package_name=?
218 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::ADMIN_POLICIES_RDB_TABLE_NAME);
219 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
220 predicates.EqualTo(EdmRdbFiledConst::FILED_PACKAGE_NAME, packageName);
221 return edmRdbDataManager->Delete(predicates);
222 }
223
UpdateEntInfo(int32_t userId,const std::string & packageName,const EntInfo & entInfo)224 bool AdminPoliciesStorageRdb::UpdateEntInfo(int32_t userId, const std::string &packageName, const EntInfo &entInfo)
225 {
226 EDMLOGD("AdminPoliciesStorageRdb::UpdateEntInfo.");
227 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
228 if (edmRdbDataManager == nullptr) {
229 EDMLOGE("AdminPoliciesStorageRdb::UpdateEntInfo get edmRdbDataManager failed.");
230 return false;
231 }
232 // update admin_policies set ent_name=?, ent_desc=? where user_id=? and package_name=?
233 NativeRdb::ValuesBucket valuesBucket;
234 valuesBucket.PutString(EdmRdbFiledConst::FILED_ENT_NAME, entInfo.enterpriseName);
235 valuesBucket.PutString(EdmRdbFiledConst::FILED_ENT_DESC, entInfo.description);
236
237 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::ADMIN_POLICIES_RDB_TABLE_NAME);
238 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
239 predicates.EqualTo(EdmRdbFiledConst::FILED_PACKAGE_NAME, packageName);
240 return edmRdbDataManager->Update(valuesBucket, predicates);
241 }
242
UpdateManagedEvents(int32_t userId,const std::string & packageName,const std::vector<ManagedEvent> & managedEvents)243 bool AdminPoliciesStorageRdb::UpdateManagedEvents(int32_t userId, const std::string &packageName,
244 const std::vector<ManagedEvent> &managedEvents)
245 {
246 EDMLOGD("AdminPoliciesStorageRdb::UpdateManagedEvents.");
247 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
248 if (edmRdbDataManager == nullptr) {
249 EDMLOGE("AdminPoliciesStorageRdb::UpdateManagedEvents get edmRdbDataManager failed.");
250 return false;
251 }
252 // update admin_policies set subscribe_events=? where user_id=? and package_name=?
253 NativeRdb::ValuesBucket valuesBucket;
254
255 cJSON *managedEventsArray = nullptr;
256 CJSON_CREATE_ARRAY_AND_CHECK(managedEventsArray, false);
257 for (const auto &it : managedEvents) {
258 cJSON* itemJson = cJSON_CreateNumber(static_cast<uint32_t>(it));
259 if (itemJson == nullptr) {
260 cJSON_Delete(managedEventsArray);
261 return false;
262 }
263 CJSON_ADD_ITEM_TO_ARRAY_AND_CHECK_AND_CLEAR(itemJson, managedEventsArray, false);
264 }
265 char *managedEventsStr = cJSON_PrintUnformatted(managedEventsArray);
266 if (managedEventsStr != nullptr) {
267 valuesBucket.PutString(EdmRdbFiledConst::FILED_SUBSCRIBE_EVENTS, managedEventsStr);
268 cJSON_free(managedEventsStr);
269 }
270 cJSON_Delete(managedEventsArray);
271
272 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::ADMIN_POLICIES_RDB_TABLE_NAME);
273 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
274 predicates.EqualTo(EdmRdbFiledConst::FILED_PACKAGE_NAME, packageName);
275 return edmRdbDataManager->Update(valuesBucket, predicates);
276 }
277
QueryAllAdmin()278 std::unordered_map<int32_t, std::vector<std::shared_ptr<Admin>>> AdminPoliciesStorageRdb::QueryAllAdmin()
279 {
280 EDMLOGD("AdminPoliciesStorageRdb::QueryAllAdmin.");
281 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
282 std::unordered_map<int32_t, std::vector<std::shared_ptr<Admin>>> admins;
283 if (edmRdbDataManager == nullptr) {
284 EDMLOGE("AdminPoliciesStorageRdb::QueryAllAdmin get edmRdbDataManager failed.");
285 return admins;
286 }
287 // select * from admin_policies
288 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::ADMIN_POLICIES_RDB_TABLE_NAME);
289 auto resultSet = edmRdbDataManager->Query(predicates, std::vector<std::string>());
290 if (resultSet == nullptr) {
291 return admins;
292 }
293 int resultSetNum = resultSet->GoToFirstRow();
294 while (resultSetNum == NativeRdb::E_OK) {
295 std::shared_ptr<Admin> item = std::make_shared<Admin>();
296 int32_t userId = 0;
297 resultSet->GetInt(EdmRdbFiledConst::FILED_COLUMN_INDEX_ONE, userId);
298 SetAdminItems(resultSet, item);
299 if (admins.find(userId) != admins.end()) {
300 admins[userId].push_back(item);
301 } else {
302 std::vector<std::shared_ptr<Admin>> adminItems{item};
303 admins[userId] = adminItems;
304 }
305 resultSetNum = resultSet->GoToNextRow();
306 }
307 resultSet->Close();
308 return admins;
309 }
310
SetAdminStringInfo(const std::string & stringInfo,std::vector<std::string> & info)311 void AdminPoliciesStorageRdb::SetAdminStringInfo(const std::string &stringInfo, std::vector<std::string> &info)
312 {
313 if (stringInfo.empty() || stringInfo == "null") {
314 return;
315 }
316 cJSON *jsonInfo = cJSON_Parse(stringInfo.c_str());
317 if (jsonInfo == nullptr) {
318 EDMLOGE("AdminPoliciesStorageRdb::SetAdminStringInfo failed: JSON parsing failed.");
319 return;
320 }
321
322 if (cJSON_IsArray(jsonInfo)) {
323 int arraySize = cJSON_GetArraySize(jsonInfo);
324 if (arraySize > EdmConstants::DEFAULT_LOOP_MAX_SIZE) {
325 EDMLOGE("AdminPoliciesStorageRdb::SetAdminStringInfo failed: Array size exceeds limit.");
326 cJSON_Delete(jsonInfo);
327 return;
328 }
329
330 cJSON *element = nullptr;
331 cJSON_ArrayForEach(element, jsonInfo) {
332 if (cJSON_IsString(element)) {
333 info.emplace_back(element->valuestring);
334 }
335 }
336 }
337
338 cJSON_Delete(jsonInfo);
339 }
340
SetAdminItems(std::shared_ptr<NativeRdb::ResultSet> resultSet,std::shared_ptr<Admin> item)341 void AdminPoliciesStorageRdb::SetAdminItems(std::shared_ptr<NativeRdb::ResultSet> resultSet,
342 std::shared_ptr<Admin> item)
343 {
344 if (resultSet == nullptr || item == nullptr) {
345 EDMLOGE("AdminPoliciesStorageRdb::SetAdminItems failed.");
346 return;
347 }
348 int32_t adminType = 0;
349 resultSet->GetInt(EdmRdbFiledConst::FILED_COLUMN_INDEX_TWO, adminType);
350 item->adminInfo_.adminType_ = static_cast<AdminType>(adminType);
351 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_THREE, item->adminInfo_.packageName_);
352 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_FOUR, item->adminInfo_.className_);
353 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_FIVE, item->adminInfo_.entInfo_.enterpriseName);
354 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_SIX, item->adminInfo_.entInfo_.description);
355 bool isPermissionStrNull = false;
356 resultSet->IsColumnNull(EdmRdbFiledConst::FILED_COLUMN_INDEX_SEVEN, isPermissionStrNull);
357 if (!isPermissionStrNull) {
358 std::string permissionStr;
359 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_SEVEN, permissionStr);
360 SetAdminStringInfo(permissionStr, item->adminInfo_.permission_);
361 }
362 bool isManagedEventStrNull = false;
363 resultSet->IsColumnNull(EdmRdbFiledConst::FILED_COLUMN_INDEX_EIGHT, isManagedEventStrNull);
364 if (!isManagedEventStrNull) {
365 SetManagedEventStr(resultSet, item);
366 }
367 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_NINE, item->adminInfo_.parentAdminName_);
368 int isDebug = 0;
369 resultSet->GetInt(EdmRdbFiledConst::FILED_COLUMN_INDEX_TEN, isDebug);
370 item->adminInfo_.isDebug_ = isDebug != 0;
371 bool isPoliciesStrNull = false;
372 resultSet->IsColumnNull(EdmRdbFiledConst::FILED_COLUMN_INDEX_ELEVEN, isPoliciesStrNull);
373 if (!isPoliciesStrNull) {
374 std::string policiesStr;
375 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_ELEVEN, policiesStr);
376 SetAdminStringInfo(policiesStr, item->adminInfo_.accessiblePolicies_);
377 }
378 int32_t runningMode = 0;
379 resultSet->GetInt(EdmRdbFiledConst::FILED_COLUMN_INDEX_TWELVE, runningMode);
380 item->adminInfo_.runningMode_ = static_cast<RunningMode>(runningMode);
381 }
382
SetManagedEventStr(std::shared_ptr<NativeRdb::ResultSet> resultSet,std::shared_ptr<Admin> item)383 void AdminPoliciesStorageRdb::SetManagedEventStr(std::shared_ptr<NativeRdb::ResultSet> resultSet,
384 std::shared_ptr<Admin> item)
385 {
386 if (resultSet == nullptr || item == nullptr) {
387 EDMLOGE("AdminPoliciesStorageRdb::SetManagedEventStr failed.");
388 return;
389 }
390 std::string managedEventsStr;
391 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_EIGHT, managedEventsStr);
392 if (managedEventsStr.empty() || managedEventsStr == "null") {
393 return;
394 }
395
396 cJSON* managedEventsJson = cJSON_Parse(managedEventsStr.c_str());
397 if (managedEventsJson == nullptr) {
398 return;
399 }
400
401 if (cJSON_GetArraySize(managedEventsJson) > EdmConstants::DEFAULT_LOOP_MAX_SIZE) {
402 cJSON_Delete(managedEventsJson);
403 return;
404 }
405
406 cJSON* element = nullptr;
407 cJSON_ArrayForEach(element, managedEventsJson) {
408 if (cJSON_IsNumber(element)) {
409 item->adminInfo_.managedEvents_.push_back(static_cast<ManagedEvent>(element->valueint));
410 }
411 }
412
413 cJSON_Delete(managedEventsJson);
414 }
415 } // namespace EDM
416 } // namespace OHOS