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 "device_policies_storage_rdb.h"
17 #include "edm_log.h"
18 #include "edm_rdb_filed_const.h"
19
20 namespace OHOS {
21 namespace EDM {
22 std::shared_ptr<DevicePoliciesStorageRdb> DevicePoliciesStorageRdb::instance_ = nullptr;
23 std::once_flag DevicePoliciesStorageRdb::flag_;
24 bool DevicePoliciesStorageRdb::isAdminPoliciesTableInit_ = false;
25 bool DevicePoliciesStorageRdb::isCombinedPoliciesTableInit_ = false;
26
DevicePoliciesStorageRdb()27 DevicePoliciesStorageRdb::DevicePoliciesStorageRdb()
28 {
29 EDMLOGI("DevicePoliciesStorageRdb construct.");
30 }
31
CreateDeviceAdminPoliciesTable()32 bool DevicePoliciesStorageRdb::CreateDeviceAdminPoliciesTable()
33 {
34 EDMLOGI("DevicePoliciesStorageRdb::CreateDeviceAdminPoliciesTable.");
35 std::string createTableSql = "CREATE TABLE IF NOT EXISTS ";
36 createTableSql.append(EdmRdbFiledConst::DEVICE_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_NAME + " TEXT NOT NULL,")
40 .append(EdmRdbFiledConst::FILED_POLICY_NAME + " TEXT,")
41 .append(EdmRdbFiledConst::FILED_POLICY_VALUE + " TEXT);");
42 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
43 if (edmRdbDataManager != nullptr) {
44 return edmRdbDataManager->CreateTable(createTableSql);
45 }
46 EDMLOGE("DevicePoliciesStorageRdb::create database device_admin_policies failed.");
47 return false;
48 }
49
CreateDeviceCombinedPoliciesTable()50 bool DevicePoliciesStorageRdb::CreateDeviceCombinedPoliciesTable()
51 {
52 EDMLOGI("DevicePoliciesStorageRdb::CreateDeviceCombinedPoliciesTable.");
53 std::string createTableSql = "CREATE TABLE IF NOT EXISTS ";
54 createTableSql.append(EdmRdbFiledConst::DEVICE_COMBINED_POLICIES_RDB_TABLE_NAME + " (")
55 .append(EdmRdbFiledConst::FILED_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,")
56 .append(EdmRdbFiledConst::FILED_USER_ID + " INTEGER NOT NULL,")
57 .append(EdmRdbFiledConst::FILED_POLICY_NAME + " TEXT,")
58 .append(EdmRdbFiledConst::FILED_POLICY_VALUE + " TEXT);");
59 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
60 if (edmRdbDataManager != nullptr) {
61 return edmRdbDataManager->CreateTable(createTableSql);
62 }
63 EDMLOGE("DevicePoliciesStorageRdb::create database device_combined_policies failed.");
64 return false;
65 }
66
GetInstance()67 std::shared_ptr<DevicePoliciesStorageRdb> DevicePoliciesStorageRdb::GetInstance()
68 {
69 if (!isAdminPoliciesTableInit_) {
70 isAdminPoliciesTableInit_ = CreateDeviceAdminPoliciesTable();
71 }
72 if (!isCombinedPoliciesTableInit_) {
73 isCombinedPoliciesTableInit_ = CreateDeviceCombinedPoliciesTable();
74 }
75 if (!isAdminPoliciesTableInit_ || !isCombinedPoliciesTableInit_) {
76 return nullptr;
77 }
78 std::call_once(flag_, []() {
79 if (instance_ == nullptr) {
80 instance_ = std::make_shared<DevicePoliciesStorageRdb>();
81 }
82 });
83 return instance_;
84 }
85
InsertAdminPolicy(int32_t userId,const std::string & adminName,const std::string & policyName,const std::string & policyValue)86 bool DevicePoliciesStorageRdb::InsertAdminPolicy(int32_t userId, const std::string &adminName,
87 const std::string &policyName, const std::string &policyValue)
88 {
89 EDMLOGD("DevicePoliciesStorageRdb::InsertAdminPolicy.");
90 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
91 if (edmRdbDataManager == nullptr) {
92 EDMLOGE("DevicePoliciesStorageRdb::InsertAdminPolicy get edmRdbDataManager failed.");
93 return false;
94 }
95 // insert into device_admin_policies(user_id, admin_name, policy_name, policy_value) values(?, ?, ?, ?)
96 NativeRdb::ValuesBucket valuesBucket;
97 valuesBucket.PutInt(EdmRdbFiledConst::FILED_USER_ID, userId);
98 valuesBucket.PutString(EdmRdbFiledConst::FILED_ADMIN_NAME, adminName);
99 valuesBucket.PutString(EdmRdbFiledConst::FILED_POLICY_NAME, policyName);
100 valuesBucket.PutString(EdmRdbFiledConst::FILED_POLICY_VALUE, policyValue);
101 return edmRdbDataManager->Insert(EdmRdbFiledConst::DEVICE_ADMIN_POLICIES_RDB_TABLE_NAME, valuesBucket);
102 }
103
UpdateAdminPolicy(int32_t userId,const std::string & adminName,const std::string & policyName,const std::string & policyValue)104 bool DevicePoliciesStorageRdb::UpdateAdminPolicy(int32_t userId, const std::string &adminName,
105 const std::string &policyName, const std::string &policyValue)
106 {
107 EDMLOGD("DevicePoliciesStorageRdb::UpdateAdminPolicy.");
108 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
109 if (edmRdbDataManager == nullptr) {
110 EDMLOGE("DevicePoliciesStorageRdb::UpdateAdminPolicy get edmRdbDataManager failed.");
111 return false;
112 }
113 // update device_admin_policies set policy_value=? where user_id=? and admin_name=? and policy_name=?
114 NativeRdb::ValuesBucket valuesBucket;
115 valuesBucket.PutString(EdmRdbFiledConst::FILED_POLICY_VALUE, policyValue);
116 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::DEVICE_ADMIN_POLICIES_RDB_TABLE_NAME);
117 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
118 predicates.EqualTo(EdmRdbFiledConst::FILED_ADMIN_NAME, adminName);
119 predicates.EqualTo(EdmRdbFiledConst::FILED_POLICY_NAME, policyName);
120 return edmRdbDataManager->Update(valuesBucket, predicates);
121 }
122
ReplaceAdminPolicy(int32_t userId,const std::string & adminName,const std::string & newAdminName)123 bool DevicePoliciesStorageRdb::ReplaceAdminPolicy(int32_t userId, const std::string &adminName,
124 const std::string &newAdminName)
125 {
126 EDMLOGD("DevicePoliciesStorageRdb::UpdateAdminPolicy.");
127 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
128 if (edmRdbDataManager == nullptr) {
129 EDMLOGE("DevicePoliciesStorageRdb::UpdateAdminPolicy get edmRdbDataManager failed.");
130 return false;
131 }
132 // update device_admin_policies set policy_value=? where user_id=? and admin_name=?
133 NativeRdb::ValuesBucket valuesBucket;
134 valuesBucket.PutString(EdmRdbFiledConst::FILED_ADMIN_NAME, newAdminName);
135 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::DEVICE_ADMIN_POLICIES_RDB_TABLE_NAME);
136 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
137 predicates.EqualTo(EdmRdbFiledConst::FILED_ADMIN_NAME, adminName);
138 return edmRdbDataManager->Update(valuesBucket, predicates);
139 }
140
DeleteAdminPolicy(int32_t userId,const std::string & adminName,const std::string & policyName)141 bool DevicePoliciesStorageRdb::DeleteAdminPolicy(int32_t userId, const std::string &adminName,
142 const std::string &policyName)
143 {
144 EDMLOGD("AdminPoliciesStorageRdb::DeleteAdminPolicy.");
145 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
146 if (edmRdbDataManager == nullptr) {
147 EDMLOGE("DevicePoliciesStorageRdb::DeleteAdminPolicy get edmRdbDataManager failed.");
148 return false;
149 }
150 // delete from device_admin_policies where user_id=? and admin_name=? and policy_name=?
151 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::DEVICE_ADMIN_POLICIES_RDB_TABLE_NAME);
152 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
153 predicates.EqualTo(EdmRdbFiledConst::FILED_ADMIN_NAME, adminName);
154 predicates.EqualTo(EdmRdbFiledConst::FILED_POLICY_NAME, policyName);
155 return edmRdbDataManager->Delete(predicates);
156 }
157
QueryAdminPolicy(int32_t userId,std::unordered_map<std::string,PolicyItemsMap> & adminPolicies,std::unordered_map<std::string,AdminValueItemsMap> & policyAdmins)158 bool DevicePoliciesStorageRdb::QueryAdminPolicy(int32_t userId, std::unordered_map<std::string,
159 PolicyItemsMap> &adminPolicies, std::unordered_map<std::string, AdminValueItemsMap> &policyAdmins)
160 {
161 EDMLOGD("DevicePoliciesStorageRdb::QueryAdminPolicy.");
162 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
163 if (edmRdbDataManager == nullptr) {
164 EDMLOGE("DevicePoliciesStorageRdb::QueryAdminPolicy get edmRdbDataManager failed.");
165 return false;
166 }
167 // select * from device_admin_policies
168 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::DEVICE_ADMIN_POLICIES_RDB_TABLE_NAME);
169 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
170 auto resultSet = edmRdbDataManager->Query(predicates, std::vector<std::string>());
171 if (resultSet == nullptr) {
172 EDMLOGD("DevicePoliciesStorageRdb::QueryAdminPolicy failed.");
173 return false;
174 }
175 int resultSetNum = resultSet->GoToFirstRow();
176 while (resultSetNum == NativeRdb::E_OK) {
177 std::string adminName;
178 std::string policyName;
179 std::string policyValue;
180 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_TWO, adminName);
181 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_THREE, policyName);
182 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_FOUR, policyValue);
183 PraseAdminPolicies(adminName, policyName, policyValue, adminPolicies);
184 PrasePolicyAdmins(adminName, policyName, policyValue, policyAdmins);
185 resultSetNum = resultSet->GoToNextRow();
186 };
187 resultSet->Close();
188 return true;
189 }
190
PraseAdminPolicies(const std::string & adminName,const std::string & policyName,const std::string & policyValue,std::unordered_map<std::string,PolicyItemsMap> & adminPolicies)191 void DevicePoliciesStorageRdb::PraseAdminPolicies(const std::string &adminName, const std::string &policyName,
192 const std::string &policyValue, std::unordered_map<std::string, PolicyItemsMap> &adminPolicies)
193 {
194 auto iter = adminPolicies.find(adminName);
195 if (iter == adminPolicies.end()) {
196 PolicyItemsMap itemMap;
197 itemMap.insert(std::pair<std::string, std::string>(policyName, policyValue));
198 adminPolicies.insert(std::pair<std::string, PolicyItemsMap>(adminName, itemMap));
199 return;
200 }
201 iter->second.insert(std::pair<std::string, std::string>(policyName, policyValue));
202 }
203
PrasePolicyAdmins(const std::string & adminName,const std::string & policyName,const std::string & policyValue,std::unordered_map<std::string,AdminValueItemsMap> & policyAdmins)204 void DevicePoliciesStorageRdb::PrasePolicyAdmins(const std::string &adminName, const std::string &policyName,
205 const std::string &policyValue, std::unordered_map<std::string, AdminValueItemsMap> &policyAdmins)
206 {
207 auto iter = policyAdmins.find(policyName);
208 if (iter == policyAdmins.end()) {
209 AdminValueItemsMap adminValueItem;
210 adminValueItem.insert(std::pair<std::string, std::string>(adminName, policyValue));
211 policyAdmins.insert(std::pair<std::string, AdminValueItemsMap>(policyName, adminValueItem));
212 return;
213 }
214 iter->second.insert(std::pair<std::string, std::string>(adminName, policyValue));
215 }
216
InsertCombinedPolicy(int32_t userId,const std::string & policyName,const std::string & policyValue)217 bool DevicePoliciesStorageRdb::InsertCombinedPolicy(int32_t userId, const std::string &policyName,
218 const std::string &policyValue)
219 {
220 EDMLOGD("DevicePoliciesStorageRdb::InsertCombinedPolicy.");
221 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
222 if (edmRdbDataManager == nullptr) {
223 EDMLOGE("DevicePoliciesStorageRdb::InsertCombinedPolicy get edmRdbDataManager failed.");
224 return false;
225 }
226 // insert into device_combined_policies(user_id, policy_name, policy_value) values(?, ?, ?)
227 NativeRdb::ValuesBucket valuesBucket;
228 valuesBucket.PutInt(EdmRdbFiledConst::FILED_USER_ID, userId);
229 valuesBucket.PutString(EdmRdbFiledConst::FILED_POLICY_NAME, policyName);
230 valuesBucket.PutString(EdmRdbFiledConst::FILED_POLICY_VALUE, policyValue);
231 return edmRdbDataManager->Insert(EdmRdbFiledConst::DEVICE_COMBINED_POLICIES_RDB_TABLE_NAME,
232 valuesBucket);
233 }
234
UpdateCombinedPolicy(int32_t userId,const std::string & policyName,const std::string & policyValue)235 bool DevicePoliciesStorageRdb::UpdateCombinedPolicy(int32_t userId, const std::string &policyName,
236 const std::string &policyValue)
237 {
238 EDMLOGD("DevicePoliciesStorageRdb::UpdateCombinedPolicy.");
239 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
240 if (edmRdbDataManager == nullptr) {
241 EDMLOGE("DevicePoliciesStorageRdb::UpdateCombinedPolicy get edmRdbDataManager failed.");
242 return false;
243 }
244 // update device_combined_policies set policy_value=? where user_id=? and policy_name=?
245 NativeRdb::ValuesBucket valuesBucket;
246 valuesBucket.PutString(EdmRdbFiledConst::FILED_POLICY_VALUE, policyValue);
247 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::DEVICE_COMBINED_POLICIES_RDB_TABLE_NAME);
248 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
249 predicates.EqualTo(EdmRdbFiledConst::FILED_POLICY_NAME, policyName);
250 return edmRdbDataManager->Update(valuesBucket, predicates);
251 }
252
DeleteCombinedPolicy(int32_t userId,const std::string & policyName)253 bool DevicePoliciesStorageRdb::DeleteCombinedPolicy(int32_t userId, const std::string &policyName)
254 {
255 EDMLOGD("DevicePoliciesStorageRdb::DeleteCombinedPolicy.");
256 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
257 if (edmRdbDataManager == nullptr) {
258 EDMLOGE("DevicePoliciesStorageRdb::DeleteCombinedPolicy get edmRdbDataManager failed.");
259 return false;
260 }
261 // delete from device_combined_policies where user_id=? and policy_name=?
262 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::DEVICE_COMBINED_POLICIES_RDB_TABLE_NAME);
263 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
264 predicates.EqualTo(EdmRdbFiledConst::FILED_POLICY_NAME, policyName);
265 return edmRdbDataManager->Delete(predicates);
266 }
267
QueryCombinedPolicy(int32_t userId,PolicyItemsMap & itemsMap)268 bool DevicePoliciesStorageRdb::QueryCombinedPolicy(int32_t userId, PolicyItemsMap &itemsMap)
269 {
270 EDMLOGD("DevicePoliciesStorageRdb::QueryCombinedPolicy.");
271 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
272 if (edmRdbDataManager == nullptr) {
273 EDMLOGE("DevicePoliciesStorageRdb::QueryCombinedPolicy get edmRdbDataManager failed.");
274 return false;
275 }
276 // select * from device_combined_policies
277 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::DEVICE_COMBINED_POLICIES_RDB_TABLE_NAME);
278 predicates.EqualTo(EdmRdbFiledConst::FILED_USER_ID, std::to_string(userId));
279 auto resultSet = edmRdbDataManager->Query(predicates, std::vector<std::string>());
280 if (resultSet == nullptr) {
281 EDMLOGD("DevicePoliciesStorageRdb::QueryCombinedPolicy failed.");
282 return false;
283 }
284 int resultSetNum = resultSet->GoToFirstRow();
285 while (resultSetNum == NativeRdb::E_OK) {
286 std::string policyName;
287 std::string policyValue;
288 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_TWO, policyName);
289 resultSet->GetString(EdmRdbFiledConst::FILED_COLUMN_INDEX_THREE, policyValue);
290 itemsMap.insert(std::pair<std::string, std::string>(policyName, policyValue));
291 resultSetNum = resultSet->GoToNextRow();
292 };
293 resultSet->Close();
294 return true;
295 }
296
QueryAllUserId(std::vector<int32_t> & userIds)297 bool DevicePoliciesStorageRdb::QueryAllUserId(std::vector<int32_t> &userIds)
298 {
299 EDMLOGD("DevicePoliciesStorageRdb::QueryAllUserId.");
300 auto edmRdbDataManager = EdmRdbDataManager::GetInstance();
301 if (edmRdbDataManager == nullptr) {
302 EDMLOGE("DevicePoliciesStorageRdb::QueryAllUserId get edmRdbDataManager failed.");
303 return false;
304 }
305 // select user_id from device_admin_policies
306 NativeRdb::AbsRdbPredicates predicates(EdmRdbFiledConst::DEVICE_ADMIN_POLICIES_RDB_TABLE_NAME);
307 predicates.Distinct();
308 std::vector<std::string> queryColumns = { EdmRdbFiledConst::FILED_USER_ID };
309 auto resultSet = edmRdbDataManager->Query(predicates, queryColumns);
310 if (resultSet == nullptr) {
311 EDMLOGD("DevicePoliciesStorageRdb::QueryAllUserId failed.");
312 return false;
313 }
314 int resultSetNum = resultSet->GoToFirstRow();
315 while (resultSetNum == NativeRdb::E_OK) {
316 int32_t userId = 0;
317 resultSet->GetInt(EdmRdbFiledConst::FILED_COLUMN_INDEX_ZERO, userId);
318 userIds.push_back(userId);
319 resultSetNum = resultSet->GoToNextRow();
320 };
321 resultSet->Close();
322 return true;
323 }
324 } // namespace EDM
325 } // namespace OHOS