• 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 "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