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