1 /*
2 * Copyright (c) 2024 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 "trust_profile_manager.h"
17 #include "subscribe_profile_manager.h"
18 #include "distributed_device_profile_log.h"
19 #include "rdb_adapter.h"
20 #include "profile_utils.h"
21 #include "device_manager.h"
22 #include "distributed_device_profile_constants.h"
23 #include "distributed_device_profile_errors.h"
24 #include "accesser.h"
25 #include "accessee.h"
26
27 namespace OHOS {
28 namespace DistributedDeviceProfile {
29 IMPLEMENT_SINGLE_INSTANCE(TrustProfileManager);
30 namespace {
31 const std::string TAG = "TrustProfileManager";
32 }
33
Init()34 int32_t TrustProfileManager::Init()
35 {
36 {
37 std::lock_guard<std::mutex> lock(rdbMutex_);
38 rdbStore_ = std::make_shared<RdbAdapter>();
39 if (rdbStore_ == nullptr) {
40 HILOGE("rdbStore_ is nullptr");
41 return DP_INIT_DB_FAILED;
42 }
43 int32_t ret = rdbStore_->Init();
44 if (ret != DP_SUCCESS) {
45 HILOGE("rdbStore_ Init failed");
46 return DP_INIT_DB_FAILED;
47 }
48 }
49 this->CreateTable();
50 this->CreateUniqueIndex();
51 HILOGI("end!");
52 return DP_SUCCESS;
53 }
54
UnInit()55 int32_t TrustProfileManager::UnInit()
56 {
57 {
58 std::lock_guard<std::mutex> lock(rdbMutex_);
59 if (rdbStore_ == nullptr) {
60 HILOGE("rdbStore_ is nullptr");
61 return DP_GET_RDBSTORE_FAIL;
62 }
63 int32_t ret = rdbStore_->UnInit();
64 if (ret != DP_SUCCESS) {
65 HILOGE("rdbStore_ Uninit failed");
66 return DP_UNINIT_FAIL;
67 }
68 rdbStore_ = nullptr;
69 }
70 HILOGI("end!");
71 return DP_SUCCESS;
72 }
73
PutTrustDeviceProfile(const TrustDeviceProfile & profile)74 int32_t TrustProfileManager::PutTrustDeviceProfile(const TrustDeviceProfile& profile)
75 {
76 ValuesBucket values;
77 ProfileUtils::TrustDeviceProfileToEntries(profile, values);
78 int64_t rowId = ROWID_INIT;
79 int32_t ret = RET_INIT;
80 {
81 std::lock_guard<std::mutex> lock(rdbMutex_);
82 if (rdbStore_ == nullptr) {
83 HILOGE("rdbStore_ is nullptr");
84 return DP_GET_RDBSTORE_FAIL;
85 }
86 ret = rdbStore_->Put(rowId, TRUST_DEVICE_TABLE, values);
87 if (ret != DP_SUCCESS) {
88 HILOGE("trust_device_table insert failed");
89 return DP_PUT_TRUST_DEVICE_PROFILE_FAIL;
90 }
91 }
92 HILOGI("end!");
93 return DP_SUCCESS;
94 }
95
PutAccessControlProfile(const AccessControlProfile & profile)96 int32_t TrustProfileManager::PutAccessControlProfile(const AccessControlProfile& profile)
97 {
98 bool isExists = false;
99 CheckDeviceIdAndUserIdExists(profile, isExists);
100 AccessControlProfile accessControlProfile(profile);
101 int32_t ret = this->SetAccessControlProfileId(accessControlProfile);
102 if (ret != DP_SUCCESS) {
103 HILOGE("SetAccessControlProfileId failed");
104 return ret;
105 }
106 ret = this->PutAccesserProfile(accessControlProfile);
107 if (ret != DP_SUCCESS) {
108 HILOGE("PutAccesserProfile failed");
109 return ret;
110 }
111 ret = this->PutAccesseeProfile(accessControlProfile);
112 if (ret != DP_SUCCESS) {
113 HILOGE("PutAccesseeProfile failed");
114 return ret;
115 }
116 if (IsAclExists(accessControlProfile) == DP_DATA_EXISTS) {
117 HILOGE("acl is exists");
118 return DP_SUCCESS;
119 }
120 ValuesBucket values;
121 ProfileUtils::AccessControlProfileToEntries(accessControlProfile, values);
122 {
123 std::lock_guard<std::mutex> lock(rdbMutex_);
124 if (rdbStore_ == nullptr) {
125 HILOGE("rdbStore_ is nullptr");
126 return DP_GET_RDBSTORE_FAIL;
127 }
128 int64_t rowId = ROWID_INIT;
129 if (rdbStore_->Put(rowId, ACCESS_CONTROL_TABLE, values) != DP_SUCCESS) {
130 HILOGE("access_control_table insert failed");
131 return DP_PUT_ACL_PROFILE_FAIL;
132 }
133 }
134 HILOGI("PutAclProfile : %{public}s", accessControlProfile.dump().c_str());
135 ret = this->PutAclCheck(accessControlProfile, isExists);
136 if (ret != DP_SUCCESS) {
137 HILOGE("PutAclCheck failed");
138 return ret;
139 }
140 DistributedHardware::DeviceManager::GetInstance().DpAclAdd(accessControlProfile.GetAccessControlId(),
141 accessControlProfile.GetTrustDeviceId(), accessControlProfile.GetBindType());
142 HILOGI("end!");
143 return DP_SUCCESS;
144 }
145
UpdateTrustDeviceProfile(const TrustDeviceProfile & profile)146 int32_t TrustProfileManager::UpdateTrustDeviceProfile(const TrustDeviceProfile& profile)
147 {
148 std::string deviceId = profile.GetDeviceId();
149 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_TRUST_DEVICE_TABLE_WHERE_DEVICEID,
150 std::vector<ValueObject>{ ValueObject(deviceId) });
151 if (resultSet == nullptr) {
152 HILOGE("resultSet is nullptr");
153 return DP_GET_RESULTSET_FAIL;
154 }
155 int32_t rowCount = ROWCOUNT_INIT;
156 resultSet->GetRowCount(rowCount);
157 if (rowCount == 0) {
158 HILOGE("deviceId not find");
159 resultSet->Close();
160 return DP_NOT_FIND_DATA;
161 }
162 int32_t ret = resultSet->GoToFirstRow();
163 if (ret != DP_SUCCESS) {
164 HILOGE("deviceId not find");
165 resultSet->Close();
166 return DP_NOT_FIND_DATA;
167 }
168 TrustDeviceProfile oldProfile;
169 ProfileUtils::ConvertToTrustDeviceProfile(resultSet, oldProfile);
170 resultSet->Close();
171 ValuesBucket values;
172 ProfileUtils::TrustDeviceProfileToEntries(profile, values);
173 int32_t changeRowCnt = CHANGEROWCNT_INIT;
174 {
175 std::lock_guard<std::mutex> lock(rdbMutex_);
176 if (rdbStore_ == nullptr) {
177 HILOGE("rdbStore_ is nullptr");
178 return DP_GET_RDBSTORE_FAIL;
179 }
180 ret = rdbStore_->Update(changeRowCnt, TRUST_DEVICE_TABLE, values, DEVICEID_EQUAL_CONDITION,
181 std::vector<ValueObject>{ ValueObject(profile.GetDeviceId()) });
182 if (ret != DP_SUCCESS) {
183 HILOGE("Update trust_device_table failed");
184 return DP_UPDATE_TRUST_DEVICE_PROFILE_FAIL;
185 }
186 }
187 this->UpdateTrustDeviceProfileNotify(oldProfile, profile);
188 HILOGI("end!");
189 return DP_SUCCESS;
190 }
191
UpdateAccessControlProfile(const AccessControlProfile & profile)192 int32_t TrustProfileManager::UpdateAccessControlProfile(const AccessControlProfile& profile)
193 {
194 AccessControlProfile oldProfile;
195 int32_t ret = this->UpdateAclCheck(profile, oldProfile);
196 if (ret != DP_SUCCESS) {
197 HILOGE("UpdateAclCheck faild");
198 return ret;
199 }
200 AccessControlProfile newProfile(profile);
201 this->UpdateAccesserProfile(newProfile);
202 this->UpdateAccesseeProfile(newProfile);
203 ValuesBucket values;
204 ProfileUtils::AccessControlProfileToEntries(newProfile, values);
205 int32_t changeRowCnt = CHANGEROWCNT_INIT;
206 {
207 std::lock_guard<std::mutex> lock(rdbMutex_);
208 if (rdbStore_ == nullptr) {
209 HILOGE("rdbStore_ is nullptr");
210 return DP_GET_RDBSTORE_FAIL;
211 }
212 ret = rdbStore_->Update(changeRowCnt, ACCESS_CONTROL_TABLE, values, ACCESSCONTROLID_EQUAL_CONDITION,
213 std::vector<ValueObject>{ ValueObject(newProfile.GetAccessControlId()) });
214 if (ret != DP_SUCCESS) {
215 HILOGE("update access_control_table failed");
216 return DP_UPDATE_ACL_PROFILE_FAIL;
217 }
218 }
219 this->NotifyCheck(newProfile, oldProfile);
220 HILOGI("UpdateAclProfile : %{public}s", newProfile.dump().c_str());
221 int32_t status = STATUS_INIT;
222 this->GetResultStatus(newProfile.GetTrustDeviceId(), status);
223 TrustDeviceProfile trustProfile;
224 ProfileUtils::ConvertToTrustDeviceProfile(newProfile, trustProfile);
225 trustProfile.SetStatus(status);
226 ret = this->UpdateTrustDeviceProfile(trustProfile);
227 if (ret != DP_SUCCESS) {
228 HILOGE("UpdateTrustDeviceProfile failed");
229 return DP_UPDATE_TRUST_DEVICE_PROFILE_FAIL;
230 }
231 HILOGI("end!");
232 return DP_SUCCESS;
233 }
234
GetTrustDeviceProfile(const std::string & deviceId,TrustDeviceProfile & profile)235 int32_t TrustProfileManager::GetTrustDeviceProfile(const std::string& deviceId, TrustDeviceProfile& profile)
236 {
237 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_TRUST_DEVICE_TABLE_WHERE_DEVICEID,
238 std::vector<ValueObject>{ ValueObject(deviceId) });
239 if (resultSet == nullptr) {
240 HILOGE("resultSet is nullptr");
241 return DP_GET_RESULTSET_FAIL;
242 }
243 int32_t rowCount = ROWCOUNT_INIT;
244 resultSet->GetRowCount(rowCount);
245 if (rowCount == 0) {
246 HILOGE("deviceId not find");
247 resultSet->Close();
248 return DP_NOT_FIND_DATA;
249 }
250 int32_t ret = resultSet->GoToFirstRow();
251 if (ret != DP_SUCCESS) {
252 HILOGE("not find trust device data");
253 resultSet->Close();
254 return DP_NOT_FIND_DATA;
255 }
256 ProfileUtils::ConvertToTrustDeviceProfile(resultSet, profile);
257 resultSet->Close();
258 HILOGI("end!");
259 return DP_SUCCESS;
260 }
261
GetAllTrustDeviceProfile(std::vector<TrustDeviceProfile> & profile)262 int32_t TrustProfileManager::GetAllTrustDeviceProfile(std::vector<TrustDeviceProfile>& profile)
263 {
264 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_TRUST_DEVICE_TABLE, std::vector<ValueObject> {});
265 if (resultSet == nullptr) {
266 HILOGE("resultSet is nullptr");
267 return DP_GET_RESULTSET_FAIL;
268 }
269 int32_t rowCount = ROWCOUNT_INIT;
270 resultSet->GetRowCount(rowCount);
271 if (rowCount == 0) {
272 HILOGE("trust_device_table no data");
273 resultSet->Close();
274 return DP_NOT_FIND_DATA;
275 }
276 while (resultSet->GoToNextRow() == DP_SUCCESS) {
277 TrustDeviceProfile trustProfile;
278 ProfileUtils::ConvertToTrustDeviceProfile(resultSet, trustProfile);
279 profile.push_back(trustProfile);
280 }
281 resultSet->Close();
282 if (profile.empty()) {
283 return DP_NOT_FIND_DATA;
284 }
285 HILOGI("end!");
286 return DP_SUCCESS;
287 }
288
GetAccessControlProfile(int32_t userId,const std::string & bundleName,int32_t bindType,int32_t status,std::vector<AccessControlProfile> & profile)289 int32_t TrustProfileManager::GetAccessControlProfile(int32_t userId, const std::string& bundleName,
290 int32_t bindType, int32_t status, std::vector<AccessControlProfile>& profile)
291 {
292 if (bundleName.size() > MAX_STRING_LEN) {
293 HILOGE("bundleName is invalid");
294 return DP_INVALID_PARAMS;
295 }
296 HILOGI("Params, userId : %{public}s, bundleName : %{public}s, bindtype : %{public}d, status : %{public}d",
297 ProfileUtils::GetAnonyString(std::to_string(userId)).c_str(), bundleName.c_str(), bindType, status);
298 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE_WHERE_BINDTYPE_AND_STATUS,
299 std::vector<ValueObject>{ ValueObject(bindType), ValueObject(status) });
300 if (resultSet == nullptr) {
301 HILOGE("resultSet is nullptr");
302 return DP_GET_RESULTSET_FAIL;
303 }
304 int32_t rowCount = ROWCOUNT_INIT;
305 resultSet->GetRowCount(rowCount);
306 if (rowCount == 0) {
307 HILOGE("bindType and status not find");
308 resultSet->Close();
309 return DP_NOT_FIND_DATA;
310 }
311 int32_t ret = this->GetAclProfileByUserIdAndBundleName(resultSet, userId, bundleName, profile);
312 resultSet->Close();
313 if (ret != DP_SUCCESS) {
314 HILOGE("GetAclProfileByUserIdAndBundleName faild");
315 return DP_NOT_FIND_DATA;
316 }
317 if (profile.empty()) {
318 HILOGE("by userId bundleName bindType status not find data");
319 return DP_NOT_FIND_DATA;
320 }
321 HILOGI("end!");
322 return DP_SUCCESS;
323 }
324
GetAccessControlProfile(int32_t userId,const std::string & bundleName,const std::string & trustDeviceId,int32_t status,std::vector<AccessControlProfile> & profile)325 int32_t TrustProfileManager::GetAccessControlProfile(int32_t userId, const std::string& bundleName,
326 const std::string& trustDeviceId, int32_t status, std::vector<AccessControlProfile>& profile)
327 {
328 if (bundleName.size() > MAX_STRING_LEN || trustDeviceId.size() > MAX_STRING_LEN) {
329 HILOGE("bundleName or trustDeviceId is invalid");
330 return DP_INVALID_PARAMS;
331 }
332 HILOGI("Params, userId : %{public}s, bundleName : %{public}s, trustDeviceId : %{public}s, status : %{public}d",
333 ProfileUtils::GetAnonyString(std::to_string(userId)).c_str(),
334 bundleName.c_str(), ProfileUtils::GetAnonyString(trustDeviceId).c_str(), status);
335 std::shared_ptr<ResultSet> resultSet =
336 GetResultSet(SELECT_ACCESS_CONTROL_TABLE_WHERE_TRUSTDEVICEID_AND_STATUS,
337 std::vector<ValueObject>{ ValueObject(trustDeviceId), ValueObject(status) });
338 if (resultSet == nullptr) {
339 HILOGE("resultSet is nullptr");
340 return DP_GET_RESULTSET_FAIL;
341 }
342 int32_t rowCount = ROWCOUNT_INIT;
343 resultSet->GetRowCount(rowCount);
344 if (rowCount == 0) {
345 HILOGE("trustDeviceId and status not find");
346 resultSet->Close();
347 return DP_NOT_FIND_DATA;
348 }
349 int32_t ret = this->GetAclProfileByUserIdAndBundleName(resultSet, userId, bundleName, profile);
350 resultSet->Close();
351 if (ret != DP_SUCCESS) {
352 HILOGE("GetAclProfileByUserIdAndBundleName faild");
353 return ret;
354 }
355 if (profile.empty()) {
356 HILOGE("by userId bundleName trustDeviceId status not find data");
357 return DP_NOT_FIND_DATA;
358 }
359 HILOGI("end!");
360 return DP_SUCCESS;
361 }
362
GetAccessControlProfileByTokenId(int64_t tokenId,const std::string & trustDeviceId,int32_t status,std::vector<AccessControlProfile> & profile)363 int32_t TrustProfileManager::GetAccessControlProfileByTokenId(int64_t tokenId,
364 const std::string& trustDeviceId, int32_t status, std::vector<AccessControlProfile>& profile)
365 {
366 if (trustDeviceId.size() > MAX_STRING_LEN) {
367 HILOGE("trustDeviceId is invalid");
368 return DP_INVALID_PARAMS;
369 }
370 HILOGI("Params, tokenId : %{public}" PRId64 ", trustDeviceId : %{public}s, status : %{public}d",
371 tokenId, ProfileUtils::GetAnonyString(trustDeviceId).c_str(), status);
372 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE_WHERE_STATUS,
373 std::vector<ValueObject>{ ValueObject(status) });
374 if (resultSet == nullptr) {
375 HILOGE("resultSet is nullptr");
376 return DP_GET_RESULTSET_FAIL;
377 }
378 int32_t rowCount = ROWCOUNT_INIT;
379 resultSet->GetRowCount(rowCount);
380 if (rowCount == 0) {
381 HILOGE("trustDeviceId and status not find");
382 resultSet->Close();
383 return DP_NOT_FIND_DATA;
384 }
385 int32_t ret = this->GetAclProfileByTokenId(resultSet, trustDeviceId, tokenId, profile);
386 resultSet->Close();
387 if (ret != DP_SUCCESS) {
388 HILOGE("GetAclProfileByTokenId faild");
389 return ret;
390 }
391 if (profile.empty()) {
392 HILOGE("tokenId not find data");
393 return DP_NOT_FIND_DATA;
394 }
395 HILOGI("end!");
396 return DP_SUCCESS;
397 }
398
GetAccessControlProfile(int32_t userId,const std::string & accountId,std::vector<AccessControlProfile> & profile)399 int32_t TrustProfileManager::GetAccessControlProfile(int32_t userId,
400 const std::string& accountId, std::vector<AccessControlProfile>& profile)
401 {
402 if (accountId.size() > MAX_STRING_LEN) {
403 HILOGE("accountId is invalid");
404 return DP_INVALID_PARAMS;
405 }
406 HILOGI("Params, userId : %{public}s, accountId : %{public}s",
407 ProfileUtils::GetAnonyString(std::to_string(userId)).c_str(),
408 ProfileUtils::GetAnonyString(accountId).c_str());
409 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE, std::vector<ValueObject> {});
410 if (resultSet == nullptr) {
411 HILOGE("resultSet is nullptr");
412 return DP_GET_RESULTSET_FAIL;
413 }
414 int32_t rowCount = ROWCOUNT_INIT;
415 resultSet->GetRowCount(rowCount);
416 if (rowCount == 0) {
417 HILOGE("access_control_table no data");
418 resultSet->Close();
419 return DP_NOT_FIND_DATA;
420 }
421 while (resultSet->GoToNextRow() == DP_SUCCESS) {
422 int32_t columnIndex = COLUMNINDEX_INIT;
423 int64_t accesserId = ACCESSERID_INIT;
424 resultSet->GetColumnIndex(ACCESSER_ID, columnIndex);
425 resultSet->GetLong(columnIndex, accesserId);
426 int64_t accesseeId = ACCESSEEID_INIT;
427 resultSet->GetColumnIndex(ACCESSEE_ID, columnIndex);
428 resultSet->GetLong(columnIndex, accesseeId);
429 int32_t ret = this->GetAclProfileByUserIdAndAccountId(
430 resultSet, accesserId, accesseeId, userId, accountId, profile);
431 if (ret != DP_SUCCESS) {
432 HILOGE("GetAclProfileByUserIdAndAccountId faild");
433 return ret;
434 }
435 }
436 resultSet->Close();
437 if (profile.empty()) {
438 HILOGE("by userId accountId not find data");
439 return DP_NOT_FIND_DATA;
440 }
441 HILOGD("end!");
442 return DP_SUCCESS;
443 }
444
GetAccessControlProfile(int32_t userId,std::vector<AccessControlProfile> & profile)445 int32_t TrustProfileManager::GetAccessControlProfile(int32_t userId, std::vector<AccessControlProfile> &profile)
446 {
447 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE, std::vector<ValueObject> {});
448 if (resultSet == nullptr) {
449 HILOGE("resultSet is nullptr");
450 return DP_GET_RESULTSET_FAIL;
451 }
452 int32_t rowCount = ROWCOUNT_INIT;
453 resultSet->GetRowCount(rowCount);
454 if (rowCount == 0) {
455 HILOGE("access_control_table no data");
456 resultSet->Close();
457 return DP_NOT_FIND_DATA;
458 }
459 while (resultSet->GoToNextRow() == DP_SUCCESS) {
460 int32_t columnIndex = COLUMNINDEX_INIT;
461 int64_t accesserId = ACCESSERID_INIT;
462 resultSet->GetColumnIndex(ACCESSER_ID, columnIndex);
463 resultSet->GetLong(columnIndex, accesserId);
464 int64_t accesseeId = ACCESSEEID_INIT;
465 resultSet->GetColumnIndex(ACCESSEE_ID, columnIndex);
466 resultSet->GetLong(columnIndex, accesseeId);
467 int32_t ret = GetAccessControlProfiles(resultSet, accesserId, accesseeId, userId, profile);
468 if (ret != DP_SUCCESS) {
469 HILOGE("GetAccessControlProfile faild");
470 resultSet->Close();
471 return ret;
472 }
473 }
474 resultSet->Close();
475 if (profile.empty()) {
476 HILOGE("by userId not find data, userId: %{public}s",
477 ProfileUtils::GetAnonyString(std::to_string(userId)).c_str());
478 return DP_NOT_FIND_DATA;
479 }
480 HILOGD("end!");
481 return DP_SUCCESS;
482 }
483
GetAllAccessControlProfile(std::vector<AccessControlProfile> & profile)484 int32_t TrustProfileManager::GetAllAccessControlProfile(std::vector<AccessControlProfile>& profile)
485 {
486 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE, std::vector<ValueObject> {});
487 if (resultSet == nullptr) {
488 HILOGE("resultSet is nullptr");
489 return DP_GET_RESULTSET_FAIL;
490 }
491 int32_t rowCount = ROWCOUNT_INIT;
492 resultSet->GetRowCount(rowCount);
493 if (rowCount == 0) {
494 HILOGE("access_control_table no data");
495 resultSet->Close();
496 return DP_NOT_FIND_DATA;
497 }
498 while (resultSet->GoToNextRow() == DP_SUCCESS) {
499 int32_t columnIndex = COLUMNINDEX_INIT;
500 int64_t accesserId = ACCESSERID_INIT;
501 resultSet->GetColumnIndex(ACCESSER_ID, columnIndex);
502 resultSet->GetLong(columnIndex, accesserId);
503 int64_t accesseeId = ACCESSEEID_INIT;
504 resultSet->GetColumnIndex(ACCESSEE_ID, columnIndex);
505 resultSet->GetLong(columnIndex, accesseeId);
506 int32_t ret = this->GetAccessControlProfile(resultSet, accesserId, accesseeId, profile);
507 if (ret != DP_SUCCESS) {
508 HILOGE("GetAccessControlProfile faild");
509 resultSet->Close();
510 return ret;
511 }
512 }
513 resultSet->Close();
514 if (profile.empty()) {
515 return DP_NOT_FIND_DATA;
516 }
517 HILOGI("end!");
518 return DP_SUCCESS;
519 }
520
GetAccessControlProfile(const std::string & bundleName,int32_t bindType,int32_t status,std::vector<AccessControlProfile> & profile)521 int32_t TrustProfileManager::GetAccessControlProfile(const std::string& bundleName,
522 int32_t bindType, int32_t status, std::vector<AccessControlProfile>& profile)
523 {
524 if (bundleName.size() > MAX_STRING_LEN) {
525 HILOGE("bundleName is invalid");
526 return DP_INVALID_PARAMS;
527 }
528 HILOGI("Params, bundleName : %{public}s, bindType : %{public}d, status : %{public}d",
529 bundleName.c_str(), bindType, status);
530 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE_WHERE_BINDTYPE_AND_STATUS,
531 std::vector<ValueObject>{ ValueObject(bindType), ValueObject(status) });
532 if (resultSet == nullptr) {
533 HILOGE("resultSet is nullptr");
534 return DP_GET_RESULTSET_FAIL;
535 }
536 int32_t rowCount = ROWCOUNT_INIT;
537 resultSet->GetRowCount(rowCount);
538 if (rowCount == 0) {
539 HILOGE("bindType and status not find");
540 resultSet->Close();
541 return DP_NOT_FIND_DATA;
542 }
543 int32_t ret = this->GetAclProfileByBundleName(resultSet, bundleName, profile);
544 resultSet->Close();
545 if (ret != DP_SUCCESS) {
546 HILOGE("GetAclProfileByBundleName faild");
547 return ret;
548 }
549 if (profile.empty()) {
550 HILOGE("by bundleName bindType status not find data");
551 return DP_NOT_FIND_DATA;
552 }
553 HILOGI("end!");
554 return DP_SUCCESS;
555 }
556
GetAccessControlProfile(const std::string & bundleName,const std::string & trustDeviceId,int32_t status,std::vector<AccessControlProfile> & profile)557 int32_t TrustProfileManager::GetAccessControlProfile(const std::string& bundleName,
558 const std::string& trustDeviceId, int32_t status, std::vector<AccessControlProfile>& profile)
559 {
560 if (bundleName.size() > MAX_STRING_LEN || trustDeviceId.size() > MAX_STRING_LEN) {
561 HILOGE("bundleName or trustDeviceId is invalid");
562 return DP_INVALID_PARAMS;
563 }
564 HILOGI("Params, bundleName : %{public}s, trustDeviceId : %{public}s, status : %{public}d",
565 bundleName.c_str(), ProfileUtils::GetAnonyString(trustDeviceId).c_str(), status);
566 std::shared_ptr<ResultSet> resultSet =
567 GetResultSet(SELECT_ACCESS_CONTROL_TABLE_WHERE_TRUSTDEVICEID_AND_STATUS,
568 std::vector<ValueObject>{ ValueObject(trustDeviceId), ValueObject(status) });
569 if (resultSet == nullptr) {
570 HILOGE("resultSet is nullptr");
571 return DP_GET_RESULTSET_FAIL;
572 }
573 int32_t rowCount = ROWCOUNT_INIT;
574 resultSet->GetRowCount(rowCount);
575 if (rowCount == 0) {
576 HILOGE("trustDeviceId and status not find");
577 resultSet->Close();
578 return DP_NOT_FIND_DATA;
579 }
580 int32_t ret = this->GetAclProfileByBundleName(resultSet, bundleName, profile);
581 resultSet->Close();
582 if (ret != DP_SUCCESS) {
583 HILOGE("GetAclProfileByBundleName faild");
584 return ret;
585 }
586 if (profile.empty()) {
587 HILOGE("by bundleName trustDeviceId status not find data");
588 return DP_NOT_FIND_DATA;
589 }
590 HILOGI("end!");
591 return DP_SUCCESS;
592 }
593
GetAccessControlProfile(const std::map<std::string,std::string> & params,std::vector<AccessControlProfile> & profile)594 int32_t TrustProfileManager::GetAccessControlProfile(const std::map<std::string, std::string>& params,
595 std::vector<AccessControlProfile>& profile)
596 {
597 if (params.find(TRUST_DEVICE_ID) != params.end() && params.find(STATUS) != params.end()) {
598 if (params.find(USERID) != params.end() && params.find(BUNDLENAME) != params.end()) {
599 int32_t ret = this->GetAccessControlProfile(std::atoi(params.at(USERID).c_str()),
600 params.at(BUNDLENAME), params.at(TRUST_DEVICE_ID),
601 std::atoi(params.at(STATUS).c_str()), profile);
602 return ret;
603 }
604 if (params.find(BUNDLENAME) != params.end()) {
605 int32_t ret = this->GetAccessControlProfile(params.at(BUNDLENAME),
606 params.at(TRUST_DEVICE_ID), std::atoi(params.at(STATUS).c_str()), profile);
607 return ret;
608 }
609 if (params.find(TOKENID) != params.end()) {
610 int32_t ret = this->GetAccessControlProfileByTokenId(std::atoi(params.at(TOKENID).c_str()),
611 params.at(TRUST_DEVICE_ID), std::atoi(params.at(STATUS).c_str()), profile);
612 return ret;
613 }
614 }
615 if (params.find(BIND_TYPE) != params.end() && params.find(STATUS) != params.end()) {
616 if (params.find(USERID) != params.end() && params.find(BUNDLENAME) != params.end()) {
617 int32_t ret = this->GetAccessControlProfile(std::atoi(params.at(USERID).c_str()),
618 params.at(BUNDLENAME), std::atoi(params.at(BIND_TYPE).c_str()),
619 std::atoi(params.at(STATUS).c_str()), profile);
620 return ret;
621 }
622 if (params.find(BUNDLENAME) != params.end()) {
623 int32_t ret = this->GetAccessControlProfile(params.at(BUNDLENAME),
624 std::atoi(params.at(BIND_TYPE).c_str()),
625 std::atoi(params.at(STATUS).c_str()), profile);
626 return ret;
627 }
628 }
629 if (params.find(USERID) != params.end()) {
630 if (params.find(ACCOUNTID) != params.end()) {
631 int32_t ret = this->GetAccessControlProfile(std::atoi(params.at(USERID).c_str()),
632 params.at(ACCOUNTID), profile);
633 return ret;
634 }
635 int32_t ret = this->GetAccessControlProfile(std::atoi(params.at(USERID).c_str()), profile);
636 return ret;
637 }
638 HILOGE("params is error");
639 return DP_INVALID_PARAMS;
640 }
641
DeleteTrustDeviceProfile(const std::string & deviceId)642 int32_t TrustProfileManager::DeleteTrustDeviceProfile(const std::string& deviceId)
643 {
644 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_TRUST_DEVICE_TABLE_WHERE_DEVICEID,
645 std::vector<ValueObject>{ ValueObject(deviceId) });
646 if (resultSet == nullptr) {
647 HILOGE("resultSet is nullptr");
648 return DP_GET_RESULTSET_FAIL;
649 }
650 int32_t rowCount = ROWCOUNT_INIT;
651 resultSet->GetRowCount(rowCount);
652 if (rowCount == 0) {
653 HILOGE("no data");
654 resultSet->Close();
655 return DP_NOT_FIND_DATA;
656 }
657 resultSet->GoToFirstRow();
658 TrustDeviceProfile profile;
659 ProfileUtils::ConvertToTrustDeviceProfile(resultSet, profile);
660 resultSet->Close();
661 {
662 std::lock_guard<std::mutex> lock(rdbMutex_);
663 if (rdbStore_ == nullptr) {
664 HILOGE("rdbStore_ is nullptr");
665 return DP_GET_RDBSTORE_FAIL;
666 }
667 int32_t deleteRows = DELETEROWS_INIT;
668 int32_t ret = rdbStore_->Delete(deleteRows, TRUST_DEVICE_TABLE, DEVICEID_EQUAL_CONDITION,
669 std::vector<ValueObject>{ ValueObject(deviceId) });
670 if (ret != DP_SUCCESS) {
671 HILOGE("delete trust_device_table data failed");
672 return DP_DELETE_TRUST_DEVICE_PROFILE_FAIL;
673 }
674 }
675 HILOGI("end!");
676 return DP_SUCCESS;
677 }
678
DeleteAccessControlProfile(int64_t accessControlId)679 int32_t TrustProfileManager::DeleteAccessControlProfile(int64_t accessControlId)
680 {
681 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE_WHERE_ACCESSCONTROLID,
682 std::vector<ValueObject>{ ValueObject(accessControlId) });
683 if (resultSet == nullptr) {
684 HILOGE("resultSet is nullptr");
685 return DP_GET_RESULTSET_FAIL;
686 }
687 int32_t rowCount = ROWCOUNT_INIT;
688 resultSet->GetRowCount(rowCount);
689 if (rowCount == 0) {
690 HILOGE("no data");
691 resultSet->Close();
692 return DP_NOT_FIND_DATA;
693 }
694 int32_t ret = resultSet->GoToNextRow();
695 if (ret != DP_SUCCESS) {
696 HILOGE("get AccessControlProfileResult failed");
697 return DP_NOT_FIND_DATA;
698 }
699 AccessControlProfile profile;
700 ProfileUtils::ConvertToAccessControlProfile(resultSet, profile);
701 resultSet->Close();
702 ret = this->DeleteAccessControlProfileCheck(profile);
703 if (ret != DP_SUCCESS) {
704 HILOGE("DeleteAccessControlProfileCheck failed");
705 return ret;
706 }
707 HILOGI("end!");
708 return DP_SUCCESS;
709 }
710
CreateTable()711 int32_t TrustProfileManager::CreateTable()
712 {
713 std::lock_guard<std::mutex> lock(rdbMutex_);
714 if (rdbStore_ == nullptr) {
715 HILOGE("rdbStore_ is nullptr");
716 return DP_GET_RDBSTORE_FAIL;
717 }
718 int32_t ret = rdbStore_->CreateTable(CREATE_TURST_DEVICE_TABLE_SQL);
719 if (ret != DP_SUCCESS) {
720 HILOGE("trust_device_table create failed");
721 return DP_CREATE_TABLE_FAIL;
722 }
723 ret = rdbStore_->CreateTable(CREATE_ACCESS_CONTROL_TABLE_SQL);
724 if (ret != DP_SUCCESS) {
725 HILOGE("access_control_table create failed");
726 return DP_CREATE_TABLE_FAIL;
727 }
728 ret = rdbStore_->CreateTable(CREATE_ACCESSER_TABLE_SQL);
729 if (ret != DP_SUCCESS) {
730 HILOGE("accesser_table create failed");
731 return DP_CREATE_TABLE_FAIL;
732 }
733 ret = rdbStore_->CreateTable(CREATE_ACCESSEE_TABLE_SQL);
734 if (ret != DP_SUCCESS) {
735 HILOGE("accessee_table create failed");
736 return DP_CREATE_TABLE_FAIL;
737 }
738 return DP_SUCCESS;
739 }
740
CreateUniqueIndex()741 int32_t TrustProfileManager::CreateUniqueIndex()
742 {
743 std::lock_guard<std::mutex> lock(rdbMutex_);
744 if (rdbStore_ == nullptr) {
745 HILOGE("rdbStore_ is nullptr");
746 return DP_GET_RDBSTORE_FAIL;
747 }
748 int32_t ret = rdbStore_->CreateTable(CREATE_TURST_DEVICE_TABLE_UNIQUE_INDEX_SQL);
749 if (ret != DP_SUCCESS) {
750 HILOGE("trust_device_table unique index create failed");
751 return DP_CREATE_UNIQUE_INDEX_FAIL;
752 }
753 ret = rdbStore_->CreateTable(CREATE_ACCESS_CONTROL_TABLE_UNIQUE_INDEX_SQL);
754 if (ret != DP_SUCCESS) {
755 HILOGE("access_control_table unique index create failed");
756 return DP_CREATE_UNIQUE_INDEX_FAIL;
757 }
758 ret = rdbStore_->CreateTable(CREATE_ACCESSER_TABLE_UNIQUE_INDEX_SQL);
759 if (ret != DP_SUCCESS) {
760 HILOGE("accesser_table unique index create failed");
761 return DP_CREATE_UNIQUE_INDEX_FAIL;
762 }
763 ret = rdbStore_->CreateTable(CREATE_ACCESSEE_TABLE_UNIQUE_INDEX_SQL);
764 if (ret != DP_SUCCESS) {
765 HILOGE("accessee_table unique index create failed");
766 return DP_CREATE_UNIQUE_INDEX_FAIL;
767 }
768 return DP_SUCCESS;
769 }
770
GetAclProfileByUserIdAndBundleName(std::shared_ptr<ResultSet> resultSet,int32_t userId,const std::string & bundleName,std::vector<AccessControlProfile> & profile)771 int32_t TrustProfileManager::GetAclProfileByUserIdAndBundleName(std::shared_ptr<ResultSet> resultSet,
772 int32_t userId, const std::string& bundleName, std::vector<AccessControlProfile>& profile)
773 {
774 if (resultSet == nullptr) {
775 HILOGE("resultSet is nullptr");
776 return DP_GET_RESULTSET_FAIL;
777 }
778 while (resultSet->GoToNextRow() == DP_SUCCESS) {
779 int32_t columnIndex = COLUMNINDEX_INIT;
780 int64_t accesserId = ACCESSERID_INIT;
781 resultSet->GetColumnIndex(ACCESSER_ID, columnIndex);
782 resultSet->GetLong(columnIndex, accesserId);
783 int64_t accesseeId = ACCESSEEID_INIT;
784 resultSet->GetColumnIndex(ACCESSEE_ID, columnIndex);
785 resultSet->GetLong(columnIndex, accesseeId);
786 int32_t bindType = BINDTYPE_INIT;
787 resultSet->GetColumnIndex(BIND_TYPE, columnIndex);
788 resultSet->GetInt(columnIndex, bindType);
789 int32_t bindLevel = BINDLEVEL_INIT;
790 resultSet->GetColumnIndex(BIND_LEVEL, columnIndex);
791 resultSet->GetInt(columnIndex, bindLevel);
792 if (bindType == static_cast<int32_t>(BindType::SAME_ACCOUNT) ||
793 bindLevel == static_cast<int32_t>(BindLevel::DEVICE)) {
794 int32_t ret = this->GetAccessControlProfiles(resultSet, accesserId, accesseeId, userId, profile);
795 if (ret != DP_SUCCESS) {
796 HILOGE("GetAccessControlProfiles failed");
797 return ret;
798 }
799 } else {
800 int32_t ret = this->GetAccessControlProfiles(resultSet, accesserId,
801 accesseeId, userId, bundleName, profile);
802 if (ret != DP_SUCCESS) {
803 HILOGE("GetAccessControlProfiles failed");
804 return ret;
805 }
806 }
807 }
808 return DP_SUCCESS;
809 }
810
GetAclProfileByUserIdAndAccountId(std::shared_ptr<ResultSet> resultSet,int64_t accesserId,int64_t accesseeId,int32_t userId,const std::string & accountId,std::vector<AccessControlProfile> & profile)811 int32_t TrustProfileManager::GetAclProfileByUserIdAndAccountId(std::shared_ptr<ResultSet> resultSet, int64_t accesserId,
812 int64_t accesseeId, int32_t userId, const std::string& accountId, std::vector<AccessControlProfile>& profile)
813 {
814 std::shared_ptr<ResultSet> accesserResultSet =
815 GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID_AND_ACCESSERUSERID_ACCESSERACCOUNTID,
816 std::vector<ValueObject>{ ValueObject(accesserId), ValueObject(userId), ValueObject(accountId) });
817 if (accesserResultSet == nullptr) {
818 HILOGE("accesserResultSet is nullptr");
819 return DP_GET_RESULTSET_FAIL;
820 }
821 int32_t rowCount = ROWCOUNT_INIT;
822 accesserResultSet->GetRowCount(rowCount);
823 if (rowCount != 0) {
824 std::shared_ptr<ResultSet> accesseeResultSet = GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID,
825 std::vector<ValueObject>{ ValueObject(accesseeId) });
826 if (accesseeResultSet == nullptr) {
827 HILOGE("accesseeResultSet is nullptr");
828 return DP_GET_RESULTSET_FAIL;
829 }
830 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
831 accesserResultSet->Close();
832 accesseeResultSet->Close();
833 return DP_SUCCESS;
834 }
835 accesserResultSet->Close();
836
837 std::shared_ptr<ResultSet> accesseeResultSet =
838 GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID_AND_ACCESSEEUSEEID_ACCESSEEACCOUNTID,
839 std::vector<ValueObject>{ ValueObject(accesseeId), ValueObject(userId), ValueObject(accountId) });
840 if (accesseeResultSet == nullptr) {
841 HILOGE("accesseeResultSet is nullptr");
842 return DP_GET_RESULTSET_FAIL;
843 }
844 accesseeResultSet->GetRowCount(rowCount);
845 if (rowCount != 0) {
846 accesserResultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID,
847 std::vector<ValueObject>{ ValueObject(accesserId) });
848 if (accesserResultSet == nullptr) {
849 HILOGE("accesserResultSet is nullptr");
850 return DP_GET_RESULTSET_FAIL;
851 }
852 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
853 accesserResultSet->Close();
854 }
855 accesseeResultSet->Close();
856 return DP_SUCCESS;
857 }
858
GetAclProfileByTokenId(std::shared_ptr<ResultSet> resultSet,const std::string & trustDeviceId,int64_t tokenId,std::vector<AccessControlProfile> & profile)859 int32_t TrustProfileManager::GetAclProfileByTokenId(std::shared_ptr<ResultSet> resultSet,
860 const std::string& trustDeviceId, int64_t tokenId, std::vector<AccessControlProfile>& profile)
861 {
862 if (resultSet == nullptr) {
863 HILOGE("resultSet is nullptr");
864 return DP_GET_RESULTSET_FAIL;
865 }
866 while (resultSet->GoToNextRow() == DP_SUCCESS) {
867 int32_t columnIndex = COLUMNINDEX_INIT;
868 int64_t accesserId = ACCESSERID_INIT;
869 resultSet->GetColumnIndex(ACCESSER_ID, columnIndex);
870 resultSet->GetLong(columnIndex, accesserId);
871 int64_t accesseeId = ACCESSEEID_INIT;
872 resultSet->GetColumnIndex(ACCESSEE_ID, columnIndex);
873 resultSet->GetLong(columnIndex, accesseeId);
874 int32_t bindType = BINDTYPE_INIT;
875 resultSet->GetColumnIndex(BIND_TYPE, columnIndex);
876 resultSet->GetInt(columnIndex, bindType);
877 int32_t bindLevel = BINDLEVEL_INIT;
878 resultSet->GetColumnIndex(BIND_LEVEL, columnIndex);
879 resultSet->GetInt(columnIndex, bindLevel);
880 if (bindType == static_cast<int32_t> (BindType::SAME_ACCOUNT) ||
881 bindLevel == static_cast<int32_t> (BindLevel::DEVICE)) {
882 int32_t ret = this->GetAccessControlProfilesByDeviceId(
883 resultSet, accesserId, accesseeId, trustDeviceId, profile);
884 if (ret != DP_SUCCESS) {
885 HILOGE("GetAccessControlProfile failed");
886 return ret;
887 }
888 } else {
889 int32_t ret = this->GetAccessControlProfilesByTokenId(resultSet, accesserId,
890 accesseeId, trustDeviceId, tokenId, profile);
891 if (ret != DP_SUCCESS) {
892 HILOGE("GetAccessControlProfilesByTokenId failed");
893 return ret;
894 }
895 }
896 }
897 return DP_SUCCESS;
898 }
899
GetAclProfileByBundleName(std::shared_ptr<ResultSet> resultSet,const std::string & bundleName,std::vector<AccessControlProfile> & profile)900 int32_t TrustProfileManager::GetAclProfileByBundleName(std::shared_ptr<ResultSet> resultSet,
901 const std::string& bundleName, std::vector<AccessControlProfile>& profile)
902 {
903 if (resultSet == nullptr) {
904 HILOGE("resultSet is nullptr");
905 return DP_GET_RESULTSET_FAIL;
906 }
907 while (resultSet->GoToNextRow() == DP_SUCCESS) {
908 int32_t columnIndex = COLUMNINDEX_INIT;
909 int64_t accesserId = ACCESSERID_INIT;
910 resultSet->GetColumnIndex(ACCESSER_ID, columnIndex);
911 resultSet->GetLong(columnIndex, accesserId);
912 int64_t accesseeId = ACCESSEEID_INIT;
913 resultSet->GetColumnIndex(ACCESSEE_ID, columnIndex);
914 resultSet->GetLong(columnIndex, accesseeId);
915 int32_t bindType = BINDTYPE_INIT;
916 resultSet->GetColumnIndex(BIND_TYPE, columnIndex);
917 resultSet->GetInt(columnIndex, bindType);
918 int32_t bindLevel = BINDLEVEL_INIT;
919 resultSet->GetColumnIndex(BIND_LEVEL, columnIndex);
920 resultSet->GetInt(columnIndex, bindLevel);
921 if (bindType == static_cast<int32_t> (BindType::SAME_ACCOUNT) ||
922 bindLevel == static_cast<int32_t> (BindLevel::DEVICE)) {
923 int32_t ret = this->GetAccessControlProfile(resultSet, accesserId, accesseeId, profile);
924 if (ret != DP_SUCCESS) {
925 HILOGE("GetAccessControlProfile failed");
926 return ret;
927 }
928 } else {
929 int32_t ret = this->GetAccessControlProfiles(resultSet, accesserId, accesseeId, bundleName, profile);
930 if (ret != DP_SUCCESS) {
931 HILOGE("GetAccessControlProfiles failed");
932 return ret;
933 }
934 }
935 }
936 return DP_SUCCESS;
937 }
938
PutAccesserProfile(const AccessControlProfile & profile)939 int32_t TrustProfileManager::PutAccesserProfile(const AccessControlProfile& profile)
940 {
941 Accesser accesser = profile.GetAccesser();
942 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ALL, std::vector<ValueObject>{
943 ValueObject(accesser.GetAccesserDeviceId()), ValueObject(accesser.GetAccesserUserId()),
944 ValueObject(accesser.GetAccesserAccountId()), ValueObject(accesser.GetAccesserTokenId()),
945 ValueObject(accesser.GetAccesserBundleName()), ValueObject(accesser.GetAccesserHapSignature()),
946 ValueObject(static_cast<int32_t>(accesser.GetAccesserBindLevel()))});
947 if (resultSet == nullptr) {
948 HILOGE("resultSet is nullptr");
949 return DP_GET_RESULTSET_FAIL;
950 }
951 int32_t rowCount = ROWCOUNT_INIT;
952 resultSet->GetRowCount(rowCount);
953 if (rowCount != 0) {
954 HILOGI("accesser is exists");
955 resultSet->Close();
956 return DP_SUCCESS;
957 }
958 resultSet->Close();
959 ValuesBucket values;
960 ProfileUtils::AccesserToEntries(profile, values);
961 int64_t rowId = ROWID_INIT;
962 {
963 std::lock_guard<std::mutex> lock(rdbMutex_);
964 if (rdbStore_ == nullptr) {
965 HILOGE("rdbStore_ is nullptr");
966 return DP_GET_RDBSTORE_FAIL;
967 }
968 int32_t ret = rdbStore_->Put(rowId, ACCESSER_TABLE, values);
969 if (ret != DP_SUCCESS) {
970 HILOGE("accesser_table insert failed");
971 return DP_PUT_ACCESSER_PROFILE_FAIL;
972 }
973 }
974 HILOGI("PutAccesser : %{public}s", profile.GetAccesser().dump().c_str());
975 return DP_SUCCESS;
976 }
977
PutAccesseeProfile(const AccessControlProfile & profile)978 int32_t TrustProfileManager::PutAccesseeProfile(const AccessControlProfile& profile)
979 {
980 Accessee accessee = profile.GetAccessee();
981 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ALL, std::vector<ValueObject>{
982 ValueObject(accessee.GetAccesseeDeviceId()), ValueObject(accessee.GetAccesseeUserId()),
983 ValueObject(accessee.GetAccesseeAccountId()), ValueObject(accessee.GetAccesseeTokenId()),
984 ValueObject(accessee.GetAccesseeBundleName()), ValueObject(accessee.GetAccesseeHapSignature()),
985 ValueObject(static_cast<int32_t>(accessee.GetAccesseeBindLevel()))});
986 if (resultSet == nullptr) {
987 HILOGE("resultSet is nullptr");
988 return DP_GET_RESULTSET_FAIL;
989 }
990 int32_t rowCount = ROWCOUNT_INIT;
991 resultSet->GetRowCount(rowCount);
992 if (rowCount != 0) {
993 HILOGI("accessee is exists");
994 resultSet->Close();
995 return DP_SUCCESS;
996 }
997 resultSet->Close();
998 ValuesBucket values;
999 ProfileUtils::AccesseeToEntries(profile, values);
1000 int64_t rowId = ROWID_INIT;
1001 {
1002 std::lock_guard<std::mutex> lock(rdbMutex_);
1003 if (rdbStore_ == nullptr) {
1004 HILOGE("rdbStore_ is nullptr");
1005 return DP_GET_RDBSTORE_FAIL;
1006 }
1007 int32_t ret = rdbStore_->Put(rowId, ACCESSEE_TABLE, values);
1008 if (ret != DP_SUCCESS) {
1009 HILOGE("accessee_table insert failed");
1010 return DP_PUT_ACCESSEE_PROFILE_FAIL;
1011 }
1012 }
1013 HILOGI("PutAccessee : %{public}s", profile.GetAccessee().dump().c_str());
1014 return DP_SUCCESS;
1015 }
1016
SetAccessControlId(AccessControlProfile & profile)1017 int32_t TrustProfileManager::SetAccessControlId(AccessControlProfile& profile)
1018 {
1019 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE, std::vector<ValueObject> {});
1020 if (resultSet == nullptr) {
1021 HILOGE("resultSet is nullptr");
1022 return DP_GET_RESULTSET_FAIL;
1023 }
1024 int32_t rowCount = ROWCOUNT_INIT;
1025 resultSet->GetRowCount(rowCount);
1026 if (rowCount == 0) {
1027 profile.SetAccessControlId(1);
1028 resultSet->Close();
1029 return DP_SUCCESS;
1030 }
1031 int64_t accessControlId = ACCESSCONTROLID_INIT;
1032 int32_t columnIndex = COLUMNINDEX_INIT;
1033 resultSet->GoToLastRow();
1034 resultSet->GetColumnIndex(ACCESS_CONTROL_ID, columnIndex);
1035 resultSet->GetLong(columnIndex, accessControlId);
1036 resultSet->Close();
1037 profile.SetAccessControlId(accessControlId+1);
1038 return DP_SUCCESS;
1039 }
1040
SetAccesserId(AccessControlProfile & profile)1041 int32_t TrustProfileManager::SetAccesserId(AccessControlProfile& profile)
1042 {
1043 Accesser accesser = profile.GetAccesser();
1044 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ALL, std::vector<ValueObject>{
1045 ValueObject(accesser.GetAccesserDeviceId()), ValueObject(accesser.GetAccesserUserId()),
1046 ValueObject(accesser.GetAccesserAccountId()), ValueObject(accesser.GetAccesserTokenId()),
1047 ValueObject(accesser.GetAccesserBundleName()), ValueObject(accesser.GetAccesserHapSignature()),
1048 ValueObject(static_cast<int32_t>(accesser.GetAccesserBindLevel()))});
1049 if (resultSet == nullptr) {
1050 HILOGE("resultSet is nullptr");
1051 return DP_GET_RESULTSET_FAIL;
1052 }
1053 int32_t rowCount = ROWCOUNT_INIT;
1054 int64_t accesserId = ACCESSERID_INIT;
1055 int32_t columnIndex = COLUMNINDEX_INIT;
1056 resultSet->GetRowCount(rowCount);
1057 if (rowCount != 0) {
1058 resultSet->GoToFirstRow();
1059 resultSet->GetColumnIndex(ACCESSER_ID, columnIndex);
1060 resultSet->GetLong(columnIndex, accesserId);
1061 profile.SetAccesserId(accesserId);
1062 resultSet->Close();
1063 return DP_SUCCESS;
1064 }
1065 resultSet->Close();
1066 resultSet = GetResultSet(SELECT_ACCESSER_TABLE, std::vector<ValueObject> {});
1067 if (resultSet == nullptr) {
1068 HILOGE("resultSet is nullptr");
1069 return DP_GET_RESULTSET_FAIL;
1070 }
1071 resultSet->GetRowCount(rowCount);
1072 if (rowCount == 0) {
1073 profile.GetAccesser().SetAccesserId(1);
1074 profile.SetAccesserId(1);
1075 resultSet->Close();
1076 return DP_SUCCESS;
1077 }
1078 resultSet->GoToLastRow();
1079 resultSet->GetColumnIndex(ACCESSER_ID, columnIndex);
1080 resultSet->GetLong(columnIndex, accesserId);
1081 resultSet->Close();
1082 accesserId = accesserId + 1;
1083 profile.SetAccesserId(accesserId);
1084 return DP_SUCCESS;
1085 }
1086
SetAccesseeId(AccessControlProfile & profile)1087 int32_t TrustProfileManager::SetAccesseeId(AccessControlProfile& profile)
1088 {
1089 Accessee accessee = profile.GetAccessee();
1090 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ALL, std::vector<ValueObject>{
1091 ValueObject(accessee.GetAccesseeDeviceId()), ValueObject(accessee.GetAccesseeUserId()),
1092 ValueObject(accessee.GetAccesseeAccountId()), ValueObject(accessee.GetAccesseeTokenId()),
1093 ValueObject(accessee.GetAccesseeBundleName()), ValueObject(accessee.GetAccesseeHapSignature()),
1094 ValueObject(static_cast<int32_t>(accessee.GetAccesseeBindLevel()))});
1095 if (resultSet == nullptr) {
1096 HILOGE("resultSet is nullptr");
1097 return DP_GET_RESULTSET_FAIL;
1098 }
1099 int32_t rowCount = ROWCOUNT_INIT;
1100 int64_t accesseeId = ACCESSEEID_INIT;
1101 int32_t columnIndex = COLUMNINDEX_INIT;
1102 resultSet->GetRowCount(rowCount);
1103 if (rowCount != 0) {
1104 resultSet->GoToFirstRow();
1105 resultSet->GetColumnIndex(ACCESSEE_ID, columnIndex);
1106 resultSet->GetLong(columnIndex, accesseeId);
1107 profile.SetAccesseeId(accesseeId);
1108 resultSet->Close();
1109 return DP_SUCCESS;
1110 }
1111 resultSet->Close();
1112 resultSet = GetResultSet(SELECT_ACCESSEE_TABLE, std::vector<ValueObject> {});
1113 if (resultSet == nullptr) {
1114 HILOGE("resultSet is nullptr");
1115 return DP_GET_RESULTSET_FAIL;
1116 }
1117 resultSet->GetRowCount(rowCount);
1118 if (rowCount == 0) {
1119 profile.GetAccessee().SetAccesseeId(1);
1120 profile.SetAccesseeId(1);
1121 resultSet->Close();
1122 return DP_SUCCESS;
1123 }
1124 resultSet->GoToLastRow();
1125 resultSet->GetColumnIndex(ACCESSEE_ID, columnIndex);
1126 resultSet->GetLong(columnIndex, accesseeId);
1127 resultSet->Close();
1128 accesseeId = accesseeId + 1;
1129 profile.SetAccesseeId(accesseeId);
1130 return DP_SUCCESS;
1131 }
1132
UpdateAccesserProfile(AccessControlProfile & profile)1133 int32_t TrustProfileManager::UpdateAccesserProfile(AccessControlProfile& profile)
1134 {
1135 ValuesBucket values;
1136 ProfileUtils::AccesserToEntries(profile, values);
1137 int32_t changeRowCnt = CHANGEROWCNT_INIT;
1138 {
1139 std::lock_guard<std::mutex> lock(rdbMutex_);
1140 if (rdbStore_ == nullptr) {
1141 HILOGE("rdbStore_ is nullptr");
1142 return DP_GET_RDBSTORE_FAIL;
1143 }
1144 int32_t ret = rdbStore_->Update(changeRowCnt, ACCESSER_TABLE, values, ACCESSERID_EQUAL_CONDITION,
1145 std::vector<ValueObject> {ValueObject(profile.GetAccesserId())});
1146 if (ret != DP_SUCCESS) {
1147 HILOGE("accesser_table update failed");
1148 return DP_UPDATE_ACCESSER_PROFILE_FAIL;
1149 }
1150 }
1151 HILOGI("UpdateAccesser : %{public}s", profile.GetAccesser().dump().c_str());
1152 return DP_SUCCESS;
1153 }
1154
UpdateAccesseeProfile(AccessControlProfile & profile)1155 int32_t TrustProfileManager::UpdateAccesseeProfile(AccessControlProfile& profile)
1156 {
1157 ValuesBucket values;
1158 ProfileUtils::AccesseeToEntries(profile, values);
1159 int32_t changeRowCnt = CHANGEROWCNT_INIT;
1160 {
1161 std::lock_guard<std::mutex> lock(rdbMutex_);
1162 if (rdbStore_ == nullptr) {
1163 HILOGE("rdbStore_ is nullptr");
1164 return DP_GET_RDBSTORE_FAIL;
1165 }
1166 int32_t ret = rdbStore_->Update(changeRowCnt, ACCESSEE_TABLE, values, ACCESSEEID_EQUAL_CONDITION,
1167 std::vector<ValueObject>{ ValueObject(profile.GetAccesseeId()) });
1168 if (ret != DP_SUCCESS) {
1169 HILOGE("accessee_table update failed");
1170 return DP_UPDATE_ACCESSEE_PROFILE_FAIL;
1171 }
1172 }
1173 HILOGI("UpdateAccessee : %{public}s", profile.GetAccessee().dump().c_str());
1174 return DP_SUCCESS;
1175 }
1176
UpdateTrustDeviceProfileNotify(const TrustDeviceProfile & oldProfile,const TrustDeviceProfile & newProfile)1177 int32_t TrustProfileManager::UpdateTrustDeviceProfileNotify(const TrustDeviceProfile& oldProfile,
1178 const TrustDeviceProfile &newProfile)
1179 {
1180 if (oldProfile.GetStatus() != newProfile.GetStatus()) {
1181 int32_t ret = SubscribeProfileManager::GetInstance().NotifyTrustDeviceProfileUpdate(oldProfile, newProfile);
1182 if (ret != DP_SUCCESS) {
1183 HILOGE("NotifyTrustDeviceProfileUpdate failed");
1184 return DP_NOTIFY_TRUST_DEVICE_FAIL;
1185 }
1186 }
1187 return DP_SUCCESS;
1188 }
1189
GetResultStatus(const std::string & trustDeviceId,int32_t & trustDeviceStatus)1190 int32_t TrustProfileManager::GetResultStatus(const std::string& trustDeviceId, int32_t& trustDeviceStatus)
1191 {
1192 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE_WHERE_TRUSTDEVICEID,
1193 std::vector<ValueObject>{ ValueObject(trustDeviceId) });
1194 if (resultSet == nullptr) {
1195 HILOGE("resultSet is nullptr");
1196 return DP_GET_RESULTSET_FAIL;
1197 }
1198 int32_t rowCount = ROWCOUNT_INIT;
1199 resultSet->GetRowCount(rowCount);
1200 if (rowCount == 0) {
1201 HILOGE("trustDeviceId not find");
1202 resultSet->Close();
1203 return DP_NOT_FIND_DATA;
1204 }
1205 int32_t columnIndex = COLUMNINDEX_INIT;
1206 trustDeviceStatus = 0;
1207 while (resultSet->GoToNextRow() == DP_SUCCESS) {
1208 int32_t status = STATUS_INIT;
1209 resultSet->GetColumnIndex(STATUS, columnIndex);
1210 resultSet->GetInt(columnIndex, status);
1211 if (status == 1) {
1212 trustDeviceStatus = 1;
1213 break;
1214 }
1215 }
1216 resultSet->Close();
1217 return DP_SUCCESS;
1218 }
1219
GetAccessControlProfile(std::shared_ptr<ResultSet> resultSet,int64_t accesserId,int64_t accesseeId,std::vector<AccessControlProfile> & profile)1220 int32_t TrustProfileManager::GetAccessControlProfile(std::shared_ptr<ResultSet> resultSet,
1221 int64_t accesserId, int64_t accesseeId, std::vector<AccessControlProfile>& profile)
1222 {
1223 std::shared_ptr<ResultSet> accesserResultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID,
1224 std::vector<ValueObject>{ ValueObject(accesserId) });
1225 if (accesserResultSet == nullptr) {
1226 HILOGE("accesserResultSet is nullptr");
1227 return DP_GET_RESULTSET_FAIL;
1228 }
1229 int32_t rowCount = ROWCOUNT_INIT;
1230 accesserResultSet->GetRowCount(rowCount);
1231 if (rowCount == 0) {
1232 HILOGE("not find data");
1233 accesserResultSet->Close();
1234 return DP_NOT_FIND_DATA;
1235 }
1236 std::shared_ptr<ResultSet> accesseeResultSet = GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID,
1237 std::vector<ValueObject>{ ValueObject(accesseeId) });
1238 if (accesseeResultSet == nullptr) {
1239 HILOGE("accesseeResultSet is nullptr");
1240 return DP_GET_RESULTSET_FAIL;
1241 }
1242 accesseeResultSet->GetRowCount(rowCount);
1243 if (rowCount == 0) {
1244 HILOGE("not find data");
1245 accesserResultSet->Close();
1246 accesseeResultSet->Close();
1247 return DP_NOT_FIND_DATA;
1248 }
1249 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1250 accesserResultSet->Close();
1251 accesseeResultSet->Close();
1252 return DP_SUCCESS;
1253 }
1254
GetAccessControlProfilesByDeviceId(std::shared_ptr<ResultSet> resultSet,int64_t accesserId,int64_t accesseeId,const std::string & trustDeviceId,std::vector<AccessControlProfile> & profile)1255 int32_t TrustProfileManager::GetAccessControlProfilesByDeviceId(
1256 std::shared_ptr<ResultSet> resultSet, int64_t accesserId, int64_t accesseeId,
1257 const std::string& trustDeviceId, std::vector<AccessControlProfile>& profile)
1258 {
1259 std::shared_ptr<ResultSet> accesserResultSet =
1260 GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID_AND_ACCESSERDEVICEID,
1261 std::vector<ValueObject>{ ValueObject(accesserId), ValueObject(trustDeviceId) });
1262 if (accesserResultSet == nullptr) {
1263 HILOGE("accesserResultSet is nullptr");
1264 return DP_GET_RESULTSET_FAIL;
1265 }
1266 int32_t rowCount = ROWCOUNT_INIT;
1267 accesserResultSet->GetRowCount(rowCount);
1268 if (rowCount != 0) {
1269 std::shared_ptr<ResultSet> accesseeResultSet = GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID,
1270 std::vector<ValueObject>{ ValueObject(accesseeId) });
1271 if (accesseeResultSet == nullptr) {
1272 HILOGE("accesseeResultSet is nullptr");
1273 return DP_GET_RESULTSET_FAIL;
1274 }
1275 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1276 accesserResultSet->Close();
1277 accesseeResultSet->Close();
1278 return DP_SUCCESS;
1279 }
1280 accesserResultSet->Close();
1281
1282 std::shared_ptr<ResultSet> accesseeResultSet =
1283 GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID_AND_ACCESSEEDEVICEID,
1284 std::vector<ValueObject>{ ValueObject(accesseeId), ValueObject(trustDeviceId) });
1285 if (accesseeResultSet == nullptr) {
1286 HILOGE("accesseeResultSet is nullptr");
1287 return DP_GET_RESULTSET_FAIL;
1288 }
1289 accesseeResultSet->GetRowCount(rowCount);
1290 if (rowCount != 0) {
1291 accesserResultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID,
1292 std::vector<ValueObject>{ ValueObject(accesserId) });
1293 if (accesserResultSet == nullptr) {
1294 HILOGE("accesserResultSet is nullptr");
1295 return DP_GET_RESULTSET_FAIL;
1296 }
1297 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1298 accesserResultSet->Close();
1299 }
1300 accesseeResultSet->Close();
1301 return DP_SUCCESS;
1302 }
1303
DeleteAccessControlProfileCheck(const AccessControlProfile & profile)1304 int32_t TrustProfileManager::DeleteAccessControlProfileCheck(const AccessControlProfile& profile)
1305 {
1306 Accessee accessee;
1307 int32_t ret = this->DeleteAccesseeCheck(profile.GetAccesseeId(), accessee);
1308 if (ret != DP_SUCCESS) {
1309 HILOGE("DeleteAccesseeCheck failed");
1310 return ret;
1311 }
1312 Accesser accesser;
1313 ret = this->DeleteAccesserCheck(profile.GetAccesserId(), accesser);
1314 if (ret != DP_SUCCESS) {
1315 HILOGE("DeleteAccesserCheck failed");
1316 return ret;
1317 }
1318 {
1319 std::lock_guard<std::mutex> lock(rdbMutex_);
1320 if (rdbStore_ == nullptr) {
1321 HILOGE("rdbStore_ is nullptr");
1322 return DP_GET_RDBSTORE_FAIL;
1323 }
1324 int32_t deleteRows = DELETEROWS_INIT;
1325 ret = rdbStore_->Delete(deleteRows, ACCESS_CONTROL_TABLE, ACCESSCONTROLID_EQUAL_CONDITION,
1326 std::vector<ValueObject>{ ValueObject(profile.GetAccessControlId()) });
1327 if (ret != DP_SUCCESS) {
1328 HILOGE("delete access_control_table failed");
1329 return DP_DELETE_ACCESS_CONTROL_PROFILE_FAIL;
1330 }
1331 }
1332 HILOGI("DeleteAclProfile : %{public}s", profile.dump().c_str());
1333 AccessControlProfile resultProfile(profile);
1334 resultProfile.SetAccesser(accesser);
1335 resultProfile.SetAccessee(accessee);
1336 ret = this->DeleteTrustDeviceCheck(resultProfile);
1337 if (ret != DP_SUCCESS) {
1338 HILOGE("DeleteTrustDeviceCheck failed");
1339 return ret;
1340 }
1341 return DP_SUCCESS;
1342 }
1343
GetResultSet(const std::string & sql,std::vector<ValueObject> condition)1344 std::shared_ptr<ResultSet> TrustProfileManager::GetResultSet(
1345 const std::string& sql, std::vector<ValueObject> condition)
1346 {
1347 if (sql.empty() || sql.length() > MAX_STRING_LEN) {
1348 HILOGE("sql is invalid");
1349 return nullptr;
1350 }
1351 if (condition.size() > MAX_PARAM_SIZE) {
1352 HILOGE("condition is invalid");
1353 return nullptr;
1354 }
1355 std::lock_guard<std::mutex> lock(rdbMutex_);
1356 if (rdbStore_ == nullptr) {
1357 HILOGE("rdbStore_ is nullptr");
1358 return nullptr;
1359 }
1360 return rdbStore_->Get(sql, condition);
1361 }
1362
SetAccessControlProfileId(AccessControlProfile & accessControlProfile)1363 int32_t TrustProfileManager::SetAccessControlProfileId(AccessControlProfile& accessControlProfile)
1364 {
1365 int32_t ret = this->SetAccessControlId(accessControlProfile);
1366 if (ret != DP_SUCCESS) {
1367 HILOGE("SetAccessControlId failed");
1368 return ret;
1369 }
1370 ret = this->SetAccesserId(accessControlProfile);
1371 if (ret != DP_SUCCESS) {
1372 HILOGE("SetAccesserId failed");
1373 return ret;
1374 }
1375 ret = this->SetAccesseeId(accessControlProfile);
1376 if (ret != DP_SUCCESS) {
1377 HILOGE("SetAccesseeId failed");
1378 return ret;
1379 }
1380 Accesser accesser(accessControlProfile.GetAccesser());
1381 accesser.SetAccesserId(accessControlProfile.GetAccesserId());
1382 accessControlProfile.SetAccesser(accesser);
1383 Accessee accessee(accessControlProfile.GetAccessee());
1384 accessee.SetAccesseeId(accessControlProfile.GetAccesseeId());
1385 accessControlProfile.SetAccessee(accessee);
1386 return DP_SUCCESS;
1387 }
1388
GetAccessControlProfiles(std::shared_ptr<ResultSet> resultSet,int64_t accesserId,int64_t accesseeId,int32_t userId,const std::string & bundleName,std::vector<AccessControlProfile> & profile)1389 int32_t TrustProfileManager::GetAccessControlProfiles(std::shared_ptr<ResultSet> resultSet,
1390 int64_t accesserId, int64_t accesseeId, int32_t userId, const std::string& bundleName,
1391 std::vector<AccessControlProfile>& profile)
1392 {
1393 std::shared_ptr<ResultSet> accesserResultSet =
1394 GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID_AND_ACCESSERUSERID_ACCESSERBUNDLENAME,
1395 std::vector<ValueObject>{ ValueObject(accesserId), ValueObject(userId), ValueObject(bundleName) });
1396 if (accesserResultSet == nullptr) {
1397 HILOGE("accesserResultSet is nullptr");
1398 return DP_GET_RESULTSET_FAIL;
1399 }
1400 int32_t rowCount = ROWCOUNT_INIT;
1401 accesserResultSet->GetRowCount(rowCount);
1402 if (rowCount != 0) {
1403 std::shared_ptr<ResultSet> accesseeResultSet = GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID,
1404 std::vector<ValueObject>{ ValueObject(accesseeId) });
1405 if (accesseeResultSet == nullptr) {
1406 HILOGE("accesseeResultSet is nullptr");
1407 return DP_GET_RESULTSET_FAIL;
1408 }
1409 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1410 accesserResultSet->Close();
1411 accesseeResultSet->Close();
1412 return DP_SUCCESS;
1413 }
1414 accesserResultSet->Close();
1415
1416 std::shared_ptr<ResultSet> accesseeResultSet =
1417 GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID_AND_ACCESSEEUSEEID_ACCESSEEBUNDLENAME,
1418 std::vector<ValueObject>{ ValueObject(accesseeId), ValueObject(userId), ValueObject(bundleName) });
1419 if (accesseeResultSet == nullptr) {
1420 HILOGE("accesseeResultSet is nullptr");
1421 return DP_GET_RESULTSET_FAIL;
1422 }
1423 accesseeResultSet->GetRowCount(rowCount);
1424 if (rowCount != 0) {
1425 accesserResultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID,
1426 std::vector<ValueObject>{ ValueObject(accesserId) });
1427 if (accesserResultSet == nullptr) {
1428 HILOGE("accesserResultSet is nullptr");
1429 return DP_GET_RESULTSET_FAIL;
1430 }
1431 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1432 accesserResultSet->Close();
1433 }
1434 accesseeResultSet->Close();
1435 return DP_SUCCESS;
1436 }
1437
GetAccessControlProfiles(std::shared_ptr<ResultSet> resultSet,int64_t accesserId,int64_t accesseeId,int32_t userId,std::vector<AccessControlProfile> & profile)1438 int32_t TrustProfileManager::GetAccessControlProfiles(std::shared_ptr<ResultSet> resultSet, int64_t accesserId,
1439 int64_t accesseeId, int32_t userId, std::vector<AccessControlProfile>& profile)
1440 {
1441 std::shared_ptr<ResultSet> accesserResultSet =
1442 GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID_AND_ACCESSERUSERID,
1443 std::vector<ValueObject>{ ValueObject(accesserId), ValueObject(userId) });
1444 if (accesserResultSet == nullptr) {
1445 HILOGE("accesserResultSet is nullptr");
1446 return DP_GET_RESULTSET_FAIL;
1447 }
1448 int32_t rowCount = ROWCOUNT_INIT;
1449 accesserResultSet->GetRowCount(rowCount);
1450 if (rowCount != 0) {
1451 std::shared_ptr<ResultSet> accesseeResultSet = GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID,
1452 std::vector<ValueObject>{ ValueObject(accesseeId) });
1453 if (accesseeResultSet == nullptr) {
1454 HILOGE("accesseeResultSet is nullptr");
1455 return DP_GET_RESULTSET_FAIL;
1456 }
1457 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1458 accesserResultSet->Close();
1459 accesseeResultSet->Close();
1460 return DP_SUCCESS;
1461 }
1462 accesserResultSet->Close();
1463
1464 std::shared_ptr<ResultSet> accesseeResultSet =
1465 GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID_AND_ACCESSEEUSERID,
1466 std::vector<ValueObject>{ ValueObject(accesseeId), ValueObject(userId) });
1467 if (accesseeResultSet == nullptr) {
1468 HILOGE("accesseeResultSet is nullptr");
1469 return DP_GET_RESULTSET_FAIL;
1470 }
1471 accesseeResultSet->GetRowCount(rowCount);
1472 if (rowCount != 0) {
1473 accesserResultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID,
1474 std::vector<ValueObject>{ ValueObject(accesserId) });
1475 if (accesserResultSet == nullptr) {
1476 HILOGE("accesserResultSet is nullptr");
1477 return DP_GET_RESULTSET_FAIL;
1478 }
1479 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1480 accesserResultSet->Close();
1481 }
1482 accesseeResultSet->Close();
1483 return DP_SUCCESS;
1484 }
1485
GetAccessControlProfiles(std::shared_ptr<ResultSet> resultSet,int64_t accesserId,int64_t accesseeId,const std::string & bundleName,std::vector<AccessControlProfile> & profile)1486 int32_t TrustProfileManager::GetAccessControlProfiles(std::shared_ptr<ResultSet> resultSet, int64_t accesserId,
1487 int64_t accesseeId, const std::string& bundleName, std::vector<AccessControlProfile>& profile)
1488 {
1489 std::shared_ptr<ResultSet> accesserResultSet =
1490 GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID_AND_ACCESSERBUNDLENAME,
1491 std::vector<ValueObject>{ ValueObject(accesserId), ValueObject(bundleName) });
1492 if (accesserResultSet == nullptr) {
1493 HILOGE("accesserResultSet is nullptr");
1494 return DP_GET_RESULTSET_FAIL;
1495 }
1496 int32_t rowCount = ROWCOUNT_INIT;
1497 accesserResultSet->GetRowCount(rowCount);
1498 if (rowCount != 0) {
1499 std::shared_ptr<ResultSet> accesseeResultSet = GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID,
1500 std::vector<ValueObject>{ ValueObject(accesseeId) });
1501 if (accesseeResultSet == nullptr) {
1502 HILOGE("accesseeResultSet is nullptr");
1503 return DP_GET_RESULTSET_FAIL;
1504 }
1505 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1506 accesserResultSet->Close();
1507 accesseeResultSet->Close();
1508 return DP_SUCCESS;
1509 }
1510 accesserResultSet->Close();
1511
1512 std::shared_ptr<ResultSet> accesseeResultSet =
1513 GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID_AND_ACCESSEEBUNDLENAME,
1514 std::vector<ValueObject>{ ValueObject(accesseeId), ValueObject(bundleName) });
1515 if (accesseeResultSet == nullptr) {
1516 HILOGE("accesseeResultSet is nullptr");
1517 return DP_GET_RESULTSET_FAIL;
1518 }
1519 accesseeResultSet->GetRowCount(rowCount);
1520 if (rowCount != 0) {
1521 accesserResultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID,
1522 std::vector<ValueObject>{ ValueObject(accesserId) });
1523 if (accesserResultSet == nullptr) {
1524 HILOGE("accesserResultSet is nullptr");
1525 return DP_GET_RESULTSET_FAIL;
1526 }
1527 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1528 accesserResultSet->Close();
1529 }
1530 accesseeResultSet->Close();
1531 return DP_SUCCESS;
1532 }
1533
GetAccessControlProfilesByTokenId(std::shared_ptr<ResultSet> resultSet,int64_t accesserId,int64_t accesseeId,const std::string & trustDeviceId,int64_t tokenId,std::vector<AccessControlProfile> & profile)1534 int32_t TrustProfileManager::GetAccessControlProfilesByTokenId(std::shared_ptr<ResultSet> resultSet,
1535 int64_t accesserId, int64_t accesseeId, const std::string& trustDeviceId,
1536 int64_t tokenId, std::vector<AccessControlProfile> &profile)
1537 {
1538 std::shared_ptr<ResultSet> accesserResultSet =
1539 GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID_AND_ACCESSERDEVICEID,
1540 std::vector<ValueObject>{ ValueObject(accesserId), ValueObject(trustDeviceId) });
1541 if (accesserResultSet == nullptr) {
1542 HILOGE("accesserResultSet is nullptr");
1543 return DP_GET_RESULTSET_FAIL;
1544 }
1545 int32_t rowCount = ROWCOUNT_INIT;
1546 accesserResultSet->GetRowCount(rowCount);
1547 if (rowCount != 0) {
1548 std::shared_ptr<ResultSet> accesseeResultSet =
1549 GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID_AND_ACCESSEETOKENID,
1550 std::vector<ValueObject>{ ValueObject(accesseeId), ValueObject(tokenId) });
1551 if (accesseeResultSet == nullptr) {
1552 HILOGE("accesseeResultSet is nullptr");
1553 return DP_GET_RESULTSET_FAIL;
1554 }
1555 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1556 accesserResultSet->Close();
1557 accesseeResultSet->Close();
1558 return DP_SUCCESS;
1559 }
1560 accesserResultSet->Close();
1561
1562 std::shared_ptr<ResultSet> accesseeResultSet =
1563 GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID_AND_ACCESSEEDEVICEID,
1564 std::vector<ValueObject>{ ValueObject(accesseeId), ValueObject(trustDeviceId) });
1565 if (accesseeResultSet == nullptr) {
1566 HILOGE("accesseeResultSet is nullptr");
1567 return DP_GET_RESULTSET_FAIL;
1568 }
1569 accesseeResultSet->GetRowCount(rowCount);
1570 if (rowCount != 0) {
1571 accesserResultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID_AND_ACCESSERTOKENID,
1572 std::vector<ValueObject>{ ValueObject(accesserId), ValueObject(tokenId) });
1573 if (accesserResultSet == nullptr) {
1574 HILOGE("accesserResultSet is nullptr");
1575 return DP_GET_RESULTSET_FAIL;
1576 }
1577 ProfileUtils::ConvertToAccessControlProfiles(resultSet, accesserResultSet, accesseeResultSet, profile);
1578 accesserResultSet->Close();
1579 }
1580 accesseeResultSet->Close();
1581 return DP_SUCCESS;
1582 }
1583
DeleteAccesserCheck(int64_t accesserId,Accesser & accesser)1584 int32_t TrustProfileManager::DeleteAccesserCheck(int64_t accesserId, Accesser& accesser)
1585 {
1586 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE_WHERE_ACCESSERID,
1587 std::vector<ValueObject>{ ValueObject(accesserId) });
1588 if (resultSet == nullptr) {
1589 HILOGE("resultSet is nullptr");
1590 return DP_GET_RESULTSET_FAIL;
1591 }
1592 int32_t rowCount = ROWCOUNT_INIT;
1593 resultSet->GetRowCount(rowCount);
1594 resultSet->Close();
1595 resultSet = GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID,
1596 std::vector<ValueObject>{ ValueObject(accesserId) });
1597 if (resultSet == nullptr) {
1598 HILOGE("resultSet is nullptr");
1599 return DP_GET_RESULTSET_FAIL;
1600 }
1601 resultSet->GoToNextRow();
1602 ProfileUtils::ConvertToAccesser(resultSet, accesser);
1603 resultSet->Close();
1604 if (rowCount == DELETE_ACCESSER_CONDITION) {
1605 std::lock_guard<std::mutex> lock(rdbMutex_);
1606 if (rdbStore_ == nullptr) {
1607 HILOGE("rdbStore_ is nullptr");
1608 return DP_GET_RDBSTORE_FAIL;
1609 }
1610 int32_t deleteRows = DELETEROWS_INIT;
1611 int32_t ret = rdbStore_->Delete(deleteRows, ACCESSER_TABLE, ACCESSERID_EQUAL_CONDITION,
1612 std::vector<ValueObject>{ ValueObject(accesserId) });
1613 if (ret != DP_SUCCESS) {
1614 HILOGE("delete accesser_table accesserId failed");
1615 return DP_DELETE_ACCESSER_PROFILE_FAIL;
1616 }
1617 HILOGI("DeleteAccesser : %{public}s", accesser.dump().c_str());
1618 }
1619 return DP_SUCCESS;
1620 }
1621
UpdateAclCheck(const AccessControlProfile & profile,AccessControlProfile & oldProfile)1622 int32_t TrustProfileManager::UpdateAclCheck(const AccessControlProfile& profile, AccessControlProfile& oldProfile)
1623 {
1624 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_ACCESS_CONTROL_TABLE_WHERE_ACCESSCONTROLID,
1625 std::vector<ValueObject>{ ValueObject(profile.GetAccessControlId()) });
1626 if (resultSet == nullptr) {
1627 HILOGE("resultSet is nullptr");
1628 return DP_GET_RESULTSET_FAIL;
1629 }
1630 int32_t rowCount = ROWCOUNT_INIT;
1631 resultSet->GetRowCount(rowCount);
1632 if (rowCount == 0) {
1633 HILOGE("accessControlId not find");
1634 resultSet->Close();
1635 return DP_NOT_FIND_DATA;
1636 }
1637 resultSet->GoToNextRow();
1638 ProfileUtils::ConvertToAccessControlProfile(resultSet, oldProfile);
1639 resultSet->Close();
1640 if (oldProfile.GetAccesseeId() != profile.GetAccessee().GetAccesseeId() ||
1641 oldProfile.GetAccesserId() != profile.GetAccesser().GetAccesserId() ||
1642 oldProfile.GetAccesserId() != profile.GetAccesserId() ||
1643 oldProfile.GetAccesseeId() != profile.GetAccesseeId()) {
1644 HILOGE("UpdateAclCheck:Can't Update not allowed attribute");
1645 return DP_UPDATE_ACL_NOT_ALLOW;
1646 }
1647 return DP_SUCCESS;
1648 }
1649
PutAclCheck(const AccessControlProfile & profile,bool peerDevInfoExists)1650 int32_t TrustProfileManager::PutAclCheck(const AccessControlProfile& profile, bool peerDevInfoExists)
1651 {
1652 TrustDeviceProfile trustProfile;
1653 ProfileUtils::ConvertToTrustDeviceProfile(profile, trustProfile);
1654 if (!peerDevInfoExists) {
1655 int32_t ret = SubscribeProfileManager::GetInstance().NotifyTrustDeviceProfileAdd(trustProfile);
1656 if (ret != DP_SUCCESS) {
1657 HILOGE("NotifyTrustDeviceProfileAdd failed");
1658 return DP_NOTIFY_TRUST_DEVICE_FAIL;
1659 }
1660 }
1661 std::string trustDeviceId = profile.GetTrustDeviceId();
1662 std::shared_ptr<ResultSet> resultSet = GetResultSet(SELECT_TRUST_DEVICE_TABLE_WHERE_DEVICEID,
1663 std::vector<ValueObject>{ ValueObject(trustDeviceId) });
1664 if (resultSet == nullptr) {
1665 HILOGE("resultSet is nullptr");
1666 return DP_GET_RESULTSET_FAIL;
1667 }
1668 int32_t rowCount = ROWCOUNT_INIT;
1669 resultSet->GetRowCount(rowCount);
1670 resultSet->Close();
1671 if (rowCount == 0) {
1672 this->PutTrustDeviceProfile(trustProfile);
1673 return DP_SUCCESS;
1674 }
1675 int32_t status = STATUS_INIT;
1676 if (this->GetResultStatus(trustDeviceId, status) != DP_SUCCESS) {
1677 HILOGE("GetResultStatus failed");
1678 return DP_GET_RESULTSET_FAIL;
1679 }
1680 trustProfile.SetStatus(status);
1681 if (this->UpdateTrustDeviceProfile(trustProfile) != DP_SUCCESS) {
1682 HILOGE("UpdateTrustDeviceProfile failed");
1683 return DP_UPDATE_TRUST_DEVICE_PROFILE_FAIL;
1684 }
1685 return DP_SUCCESS;
1686 }
1687
CheckUserIdExists(int64_t accesserId,int64_t accesseeId,const std::string & peerDeviceId,int32_t peerUserId,const std::string & localDeviceId,int32_t localUserId)1688 bool TrustProfileManager::CheckUserIdExists(int64_t accesserId, int64_t accesseeId,
1689 const std::string& peerDeviceId, int32_t peerUserId, const std::string& localDeviceId, int32_t localUserId)
1690 {
1691 std::shared_ptr<ResultSet> accesserResultSet =
1692 GetResultSet(SELECT_ACCESSER_TABLE_WHERE_ACCESSERID_AND_DEVICEID_AND_USERID,
1693 std::vector<ValueObject>{ ValueObject(accesserId), ValueObject(peerDeviceId), ValueObject(peerUserId) });
1694 if (accesserResultSet == nullptr) {
1695 HILOGE("accesserResultSet is nullptr");
1696 return false;
1697 }
1698 int32_t acerRowCount = ROWCOUNT_INIT;
1699 accesserResultSet->GetRowCount(acerRowCount);
1700 accesserResultSet->Close();
1701 if (acerRowCount > 0) {
1702 std::shared_ptr<ResultSet> accesseeResultSet =
1703 GetResultSet(SELECT_ACCESSEE_TABLE_WHERE_ACCESSEEID_AND_DEVICEID_AND_USERID,
1704 std::vector<ValueObject>{ ValueObject(accesseeId),
1705 ValueObject(localDeviceId), ValueObject(localUserId) });
1706 int32_t aceeRowCount = ROWCOUNT_INIT;
1707 accesseeResultSet->GetRowCount(aceeRowCount);
1708 accesseeResultSet->Close();
1709 if (aceeRowCount > 0) {
1710 HILOGE("localUserId and peerUserId status : 1");
1711 return true;
1712 }
1713 }
1714 return false;
1715 }
1716 } // namespace DistributedDeviceProfile
1717 } // namespace OHOS