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