• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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