117fd14ceSopenharmony_ci/* 217fd14ceSopenharmony_ci * Copyright (C) 2022-2023 Huawei Device Co., Ltd. 317fd14ceSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 417fd14ceSopenharmony_ci * you may not use this file except in compliance with the License. 517fd14ceSopenharmony_ci * You may obtain a copy of the License at 617fd14ceSopenharmony_ci * 717fd14ceSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 817fd14ceSopenharmony_ci * 917fd14ceSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1017fd14ceSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1117fd14ceSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1217fd14ceSopenharmony_ci * See the License for the specific language governing permissions and 1317fd14ceSopenharmony_ci * limitations under the License. 1417fd14ceSopenharmony_ci */ 1517fd14ceSopenharmony_ci 1617fd14ceSopenharmony_ci#include "data_manager.h" 1717fd14ceSopenharmony_ci 1817fd14ceSopenharmony_ci#include "broadcast_manager.h" 1917fd14ceSopenharmony_ci#include "common_defs.h" 2017fd14ceSopenharmony_ci#include "device_auth.h" 2117fd14ceSopenharmony_ci#include "device_auth_defines.h" 2217fd14ceSopenharmony_ci#include "hc_dev_info.h" 2317fd14ceSopenharmony_ci#include "hc_file.h" 2417fd14ceSopenharmony_ci#include "hc_log.h" 2517fd14ceSopenharmony_ci#include "hc_mutex.h" 2617fd14ceSopenharmony_ci#include "hc_string_vector.h" 2717fd14ceSopenharmony_ci#include "hc_types.h" 2817fd14ceSopenharmony_ci#include "key_manager.h" 2917fd14ceSopenharmony_ci#include "securec.h" 3017fd14ceSopenharmony_ci#include "hidump_adapter.h" 3117fd14ceSopenharmony_ci#include "os_account_adapter.h" 3217fd14ceSopenharmony_ci#include "pseudonym_manager.h" 3317fd14ceSopenharmony_ci#include "security_label_adapter.h" 3417fd14ceSopenharmony_ci 3517fd14ceSopenharmony_citypedef struct { 3617fd14ceSopenharmony_ci DECLARE_TLV_STRUCT(10) 3717fd14ceSopenharmony_ci TlvString name; 3817fd14ceSopenharmony_ci TlvString id; 3917fd14ceSopenharmony_ci TlvUint32 type; 4017fd14ceSopenharmony_ci TlvInt32 visibility; 4117fd14ceSopenharmony_ci TlvInt32 expireTime; 4217fd14ceSopenharmony_ci TlvString userId; 4317fd14ceSopenharmony_ci TlvString sharedUserId; 4417fd14ceSopenharmony_ci TlvBuffer managers; 4517fd14ceSopenharmony_ci TlvBuffer friends; 4617fd14ceSopenharmony_ci TlvUint8 upgradeFlag; 4717fd14ceSopenharmony_ci} TlvGroupElement; 4817fd14ceSopenharmony_ciDECLEAR_INIT_FUNC(TlvGroupElement) 4917fd14ceSopenharmony_ciDECLARE_TLV_VECTOR(TlvGroupVec, TlvGroupElement) 5017fd14ceSopenharmony_ci 5117fd14ceSopenharmony_citypedef struct { 5217fd14ceSopenharmony_ci uint8_t credential; 5317fd14ceSopenharmony_ci uint8_t devType; 5417fd14ceSopenharmony_ci uint8_t source; 5517fd14ceSopenharmony_ci int64_t userId; 5617fd14ceSopenharmony_ci uint64_t lastTm; 5717fd14ceSopenharmony_ci} DevAuthFixedLenInfo; 5817fd14ceSopenharmony_ciDECLARE_TLV_FIX_LENGTH_TYPE(TlvDevAuthFixedLenInfo, DevAuthFixedLenInfo) 5917fd14ceSopenharmony_ciDECLEAR_INIT_FUNC(TlvDevAuthFixedLenInfo) 6017fd14ceSopenharmony_ci 6117fd14ceSopenharmony_citypedef struct { 6217fd14ceSopenharmony_ci DECLARE_TLV_STRUCT(8) 6317fd14ceSopenharmony_ci TlvString groupId; 6417fd14ceSopenharmony_ci TlvString udid; 6517fd14ceSopenharmony_ci TlvString authId; 6617fd14ceSopenharmony_ci TlvString userId; 6717fd14ceSopenharmony_ci TlvString serviceType; 6817fd14ceSopenharmony_ci TlvBuffer ext; 6917fd14ceSopenharmony_ci TlvDevAuthFixedLenInfo info; 7017fd14ceSopenharmony_ci TlvUint8 upgradeFlag; 7117fd14ceSopenharmony_ci} TlvDeviceElement; 7217fd14ceSopenharmony_ciDECLEAR_INIT_FUNC(TlvDeviceElement) 7317fd14ceSopenharmony_ciDECLARE_TLV_VECTOR(TlvDeviceVec, TlvDeviceElement) 7417fd14ceSopenharmony_ci 7517fd14ceSopenharmony_citypedef struct { 7617fd14ceSopenharmony_ci DECLARE_TLV_STRUCT(3) 7717fd14ceSopenharmony_ci TlvInt32 version; 7817fd14ceSopenharmony_ci TlvGroupVec groups; 7917fd14ceSopenharmony_ci TlvDeviceVec devices; 8017fd14ceSopenharmony_ci} HCDataBaseV1; 8117fd14ceSopenharmony_ciDECLEAR_INIT_FUNC(HCDataBaseV1) 8217fd14ceSopenharmony_ci 8317fd14ceSopenharmony_ciDEFINE_TLV_FIX_LENGTH_TYPE(TlvDevAuthFixedLenInfo, NO_REVERT) 8417fd14ceSopenharmony_ci 8517fd14ceSopenharmony_ciBEGIN_TLV_STRUCT_DEFINE(TlvGroupElement, 0x0001) 8617fd14ceSopenharmony_ci TLV_MEMBER(TlvString, name, 0x4001) 8717fd14ceSopenharmony_ci TLV_MEMBER(TlvString, id, 0x4002) 8817fd14ceSopenharmony_ci TLV_MEMBER(TlvUint32, type, 0x4003) 8917fd14ceSopenharmony_ci TLV_MEMBER(TlvInt32, visibility, 0x4004) 9017fd14ceSopenharmony_ci TLV_MEMBER(TlvInt32, expireTime, 0x4005) 9117fd14ceSopenharmony_ci TLV_MEMBER(TlvString, userId, 0x4006) 9217fd14ceSopenharmony_ci TLV_MEMBER(TlvString, sharedUserId, 0x4007) 9317fd14ceSopenharmony_ci TLV_MEMBER(TlvBuffer, managers, 0x4008) 9417fd14ceSopenharmony_ci TLV_MEMBER(TlvBuffer, friends, 0x4009) 9517fd14ceSopenharmony_ci TLV_MEMBER(TlvUint8, upgradeFlag, 0x400A) 9617fd14ceSopenharmony_ciEND_TLV_STRUCT_DEFINE() 9717fd14ceSopenharmony_ciIMPLEMENT_TLV_VECTOR(TlvGroupVec, TlvGroupElement, 1) 9817fd14ceSopenharmony_ci 9917fd14ceSopenharmony_ciBEGIN_TLV_STRUCT_DEFINE(TlvDeviceElement, 0x0002) 10017fd14ceSopenharmony_ci TLV_MEMBER(TlvString, groupId, 0x4101) 10117fd14ceSopenharmony_ci TLV_MEMBER(TlvString, udid, 0x4102) 10217fd14ceSopenharmony_ci TLV_MEMBER(TlvString, authId, 0x4103) 10317fd14ceSopenharmony_ci TLV_MEMBER(TlvString, userId, 0x4107) 10417fd14ceSopenharmony_ci TLV_MEMBER(TlvString, serviceType, 0x4104) 10517fd14ceSopenharmony_ci TLV_MEMBER(TlvBuffer, ext, 0x4105) 10617fd14ceSopenharmony_ci TLV_MEMBER(TlvDevAuthFixedLenInfo, info, 0x4106) 10717fd14ceSopenharmony_ci TLV_MEMBER(TlvUint8, upgradeFlag, 0x4108) 10817fd14ceSopenharmony_ciEND_TLV_STRUCT_DEFINE() 10917fd14ceSopenharmony_ciIMPLEMENT_TLV_VECTOR(TlvDeviceVec, TlvDeviceElement, 1) 11017fd14ceSopenharmony_ci 11117fd14ceSopenharmony_ciBEGIN_TLV_STRUCT_DEFINE(HCDataBaseV1, 0x0001) 11217fd14ceSopenharmony_ci TLV_MEMBER(TlvInt32, version, 0x6001) 11317fd14ceSopenharmony_ci TLV_MEMBER(TlvGroupVec, groups, 0x6002) 11417fd14ceSopenharmony_ci TLV_MEMBER(TlvDeviceVec, devices, 0x6003) 11517fd14ceSopenharmony_ciEND_TLV_STRUCT_DEFINE() 11617fd14ceSopenharmony_ci 11717fd14ceSopenharmony_ciIMPLEMENT_HC_VECTOR(GroupEntryVec, TrustedGroupEntry*, 1) 11817fd14ceSopenharmony_ciIMPLEMENT_HC_VECTOR(DeviceEntryVec, TrustedDeviceEntry*, 1) 11917fd14ceSopenharmony_ci 12017fd14ceSopenharmony_citypedef struct { 12117fd14ceSopenharmony_ci int32_t osAccountId; 12217fd14ceSopenharmony_ci GroupEntryVec groups; 12317fd14ceSopenharmony_ci DeviceEntryVec devices; 12417fd14ceSopenharmony_ci} OsAccountTrustedInfo; 12517fd14ceSopenharmony_ci 12617fd14ceSopenharmony_ciDECLARE_HC_VECTOR(DeviceAuthDb, OsAccountTrustedInfo) 12717fd14ceSopenharmony_ciIMPLEMENT_HC_VECTOR(DeviceAuthDb, OsAccountTrustedInfo, 1) 12817fd14ceSopenharmony_ci 12917fd14ceSopenharmony_ci#define MAX_DB_PATH_LEN 256 13017fd14ceSopenharmony_ci 13117fd14ceSopenharmony_cistatic HcMutex *g_databaseMutex = NULL; 13217fd14ceSopenharmony_cistatic DeviceAuthDb g_deviceauthDb; 13317fd14ceSopenharmony_ci 13417fd14ceSopenharmony_cistatic bool EndWithZero(HcParcel *parcel) 13517fd14ceSopenharmony_ci{ 13617fd14ceSopenharmony_ci const char *p = GetParcelLastChar(parcel); 13717fd14ceSopenharmony_ci if (p == NULL) { 13817fd14ceSopenharmony_ci return false; 13917fd14ceSopenharmony_ci } 14017fd14ceSopenharmony_ci return (*p == '\0'); 14117fd14ceSopenharmony_ci} 14217fd14ceSopenharmony_ci 14317fd14ceSopenharmony_cistatic bool LoadStringVectorFromParcel(StringVector *vec, HcParcel *parcel) 14417fd14ceSopenharmony_ci{ 14517fd14ceSopenharmony_ci uint32_t strLen = 0; 14617fd14ceSopenharmony_ci do { 14717fd14ceSopenharmony_ci if (!ParcelReadUint32(parcel, &strLen)) { 14817fd14ceSopenharmony_ci return true; 14917fd14ceSopenharmony_ci } 15017fd14ceSopenharmony_ci if ((strLen == 0) || (strLen > MAX_STRING_LEN)) { 15117fd14ceSopenharmony_ci return false; 15217fd14ceSopenharmony_ci } 15317fd14ceSopenharmony_ci HcString str = CreateString(); 15417fd14ceSopenharmony_ci ClearParcel(&str.parcel); 15517fd14ceSopenharmony_ci if (!ParcelReadParcel(parcel, &str.parcel, strLen, false) || 15617fd14ceSopenharmony_ci !EndWithZero(&str.parcel)) { 15717fd14ceSopenharmony_ci DeleteString(&str); 15817fd14ceSopenharmony_ci return false; 15917fd14ceSopenharmony_ci } else { 16017fd14ceSopenharmony_ci if (vec->pushBack(vec, &str) == NULL) { 16117fd14ceSopenharmony_ci DeleteString(&str); 16217fd14ceSopenharmony_ci return false; 16317fd14ceSopenharmony_ci } 16417fd14ceSopenharmony_ci } 16517fd14ceSopenharmony_ci } while (1); 16617fd14ceSopenharmony_ci} 16717fd14ceSopenharmony_ci 16817fd14ceSopenharmony_cistatic bool SaveStringVectorToParcel(const StringVector *vec, HcParcel *parcel) 16917fd14ceSopenharmony_ci{ 17017fd14ceSopenharmony_ci uint32_t index; 17117fd14ceSopenharmony_ci HcString *str = NULL; 17217fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(*vec, index, str) { 17317fd14ceSopenharmony_ci uint32_t len = StringLength(str) + sizeof(char); 17417fd14ceSopenharmony_ci if (!ParcelWriteUint32(parcel, len)) { 17517fd14ceSopenharmony_ci return false; 17617fd14ceSopenharmony_ci } 17717fd14ceSopenharmony_ci if (!ParcelWrite(parcel, GetParcelData(&str->parcel), GetParcelDataSize(&str->parcel))) { 17817fd14ceSopenharmony_ci return false; 17917fd14ceSopenharmony_ci } 18017fd14ceSopenharmony_ci } 18117fd14ceSopenharmony_ci return true; 18217fd14ceSopenharmony_ci} 18317fd14ceSopenharmony_ci 18417fd14ceSopenharmony_cistatic bool GetOsAccountInfoPathCe(int32_t osAccountId, char *infoPath, uint32_t pathBufferLen) 18517fd14ceSopenharmony_ci{ 18617fd14ceSopenharmony_ci const char *beginPath = GetStorageDirPathCe(); 18717fd14ceSopenharmony_ci if (beginPath == NULL) { 18817fd14ceSopenharmony_ci LOGE("[DB]: Failed to get the storage path!"); 18917fd14ceSopenharmony_ci return false; 19017fd14ceSopenharmony_ci } 19117fd14ceSopenharmony_ci if (sprintf_s(infoPath, pathBufferLen, "%s/%d/deviceauth/hcgroup.dat", beginPath, osAccountId) <= 0) { 19217fd14ceSopenharmony_ci LOGE("[DB]: Failed to generate db file path!"); 19317fd14ceSopenharmony_ci return false; 19417fd14ceSopenharmony_ci } 19517fd14ceSopenharmony_ci return true; 19617fd14ceSopenharmony_ci} 19717fd14ceSopenharmony_ci 19817fd14ceSopenharmony_cistatic bool GetOsAccountInfoPathDe(int32_t osAccountId, char *infoPath, uint32_t pathBufferLen) 19917fd14ceSopenharmony_ci{ 20017fd14ceSopenharmony_ci const char *beginPath = GetStorageDirPath(); 20117fd14ceSopenharmony_ci if (beginPath == NULL) { 20217fd14ceSopenharmony_ci LOGE("[DB]: Failed to get the storage path dir!"); 20317fd14ceSopenharmony_ci return false; 20417fd14ceSopenharmony_ci } 20517fd14ceSopenharmony_ci int32_t writeByteNum; 20617fd14ceSopenharmony_ci if (osAccountId == DEFAULT_OS_ACCOUNT) { 20717fd14ceSopenharmony_ci writeByteNum = sprintf_s(infoPath, pathBufferLen, "%s/hcgroup.dat", beginPath); 20817fd14ceSopenharmony_ci } else { 20917fd14ceSopenharmony_ci writeByteNum = sprintf_s(infoPath, pathBufferLen, "%s/hcgroup%d.dat", beginPath, osAccountId); 21017fd14ceSopenharmony_ci } 21117fd14ceSopenharmony_ci if (writeByteNum <= 0) { 21217fd14ceSopenharmony_ci LOGE("[DB]: sprintf_s fail!"); 21317fd14ceSopenharmony_ci return false; 21417fd14ceSopenharmony_ci } 21517fd14ceSopenharmony_ci return true; 21617fd14ceSopenharmony_ci} 21717fd14ceSopenharmony_ci 21817fd14ceSopenharmony_cistatic bool GetOsAccountInfoPath(int32_t osAccountId, char *infoPath, uint32_t pathBufferLen) 21917fd14ceSopenharmony_ci{ 22017fd14ceSopenharmony_ci if (IsOsAccountSupported()) { 22117fd14ceSopenharmony_ci return GetOsAccountInfoPathCe(osAccountId, infoPath, pathBufferLen); 22217fd14ceSopenharmony_ci } else { 22317fd14ceSopenharmony_ci return GetOsAccountInfoPathDe(osAccountId, infoPath, pathBufferLen); 22417fd14ceSopenharmony_ci } 22517fd14ceSopenharmony_ci} 22617fd14ceSopenharmony_ci 22717fd14ceSopenharmony_cibool GenerateGroupEntryFromEntry(const TrustedGroupEntry *entry, TrustedGroupEntry *returnEntry) 22817fd14ceSopenharmony_ci{ 22917fd14ceSopenharmony_ci if (HC_VECTOR_SIZE(&entry->managers) <= 0) { 23017fd14ceSopenharmony_ci LOGE("[DB]: The group owner is lost!"); 23117fd14ceSopenharmony_ci return false; 23217fd14ceSopenharmony_ci } 23317fd14ceSopenharmony_ci HcString entryOwner = HC_VECTOR_GET(&entry->managers, 0); 23417fd14ceSopenharmony_ci if (!StringSet(&returnEntry->name, entry->name)) { 23517fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy groupName!"); 23617fd14ceSopenharmony_ci return false; 23717fd14ceSopenharmony_ci } 23817fd14ceSopenharmony_ci if (!StringSet(&returnEntry->id, entry->id)) { 23917fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy groupId!"); 24017fd14ceSopenharmony_ci return false; 24117fd14ceSopenharmony_ci } 24217fd14ceSopenharmony_ci if (!StringSet(&returnEntry->userId, entry->userId)) { 24317fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy userId!"); 24417fd14ceSopenharmony_ci return false; 24517fd14ceSopenharmony_ci } 24617fd14ceSopenharmony_ci if (!StringSet(&returnEntry->sharedUserId, entry->sharedUserId)) { 24717fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy sharedUserId!"); 24817fd14ceSopenharmony_ci return false; 24917fd14ceSopenharmony_ci } 25017fd14ceSopenharmony_ci returnEntry->type = entry->type; 25117fd14ceSopenharmony_ci returnEntry->visibility = entry->visibility; 25217fd14ceSopenharmony_ci returnEntry->upgradeFlag = entry->upgradeFlag; 25317fd14ceSopenharmony_ci returnEntry->expireTime = entry->expireTime; 25417fd14ceSopenharmony_ci HcString ownerName = CreateString(); 25517fd14ceSopenharmony_ci if (!StringSet(&ownerName, entryOwner)) { 25617fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy groupOwner!"); 25717fd14ceSopenharmony_ci DeleteString(&ownerName); 25817fd14ceSopenharmony_ci return false; 25917fd14ceSopenharmony_ci } 26017fd14ceSopenharmony_ci if (returnEntry->managers.pushBack(&returnEntry->managers, &ownerName) == NULL) { 26117fd14ceSopenharmony_ci LOGE("[DB]: Failed to push groupOwner to managers!"); 26217fd14ceSopenharmony_ci DeleteString(&ownerName); 26317fd14ceSopenharmony_ci return false; 26417fd14ceSopenharmony_ci } 26517fd14ceSopenharmony_ci return true; 26617fd14ceSopenharmony_ci} 26717fd14ceSopenharmony_ci 26817fd14ceSopenharmony_cibool GenerateDeviceEntryFromEntry(const TrustedDeviceEntry *entry, TrustedDeviceEntry *returnEntry) 26917fd14ceSopenharmony_ci{ 27017fd14ceSopenharmony_ci returnEntry->groupEntry = NULL; 27117fd14ceSopenharmony_ci if (!StringSet(&returnEntry->groupId, entry->groupId)) { 27217fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy udid!"); 27317fd14ceSopenharmony_ci return false; 27417fd14ceSopenharmony_ci } 27517fd14ceSopenharmony_ci if (!StringSet(&returnEntry->udid, entry->udid)) { 27617fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy udid!"); 27717fd14ceSopenharmony_ci return false; 27817fd14ceSopenharmony_ci } 27917fd14ceSopenharmony_ci if (!StringSet(&returnEntry->authId, entry->authId)) { 28017fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy authId!"); 28117fd14ceSopenharmony_ci return false; 28217fd14ceSopenharmony_ci } 28317fd14ceSopenharmony_ci if (!StringSet(&returnEntry->userId, entry->userId)) { 28417fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy userId!"); 28517fd14ceSopenharmony_ci return false; 28617fd14ceSopenharmony_ci } 28717fd14ceSopenharmony_ci if (!StringSet(&returnEntry->serviceType, entry->serviceType)) { 28817fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy serviceType!"); 28917fd14ceSopenharmony_ci return false; 29017fd14ceSopenharmony_ci } 29117fd14ceSopenharmony_ci returnEntry->credential = entry->credential; 29217fd14ceSopenharmony_ci returnEntry->devType = entry->devType; 29317fd14ceSopenharmony_ci returnEntry->upgradeFlag = entry->upgradeFlag; 29417fd14ceSopenharmony_ci returnEntry->source = entry->source; 29517fd14ceSopenharmony_ci returnEntry->lastTm = entry->lastTm; 29617fd14ceSopenharmony_ci return true; 29717fd14ceSopenharmony_ci} 29817fd14ceSopenharmony_ci 29917fd14ceSopenharmony_cistatic bool GenerateGroupEntryFromTlv(TlvGroupElement *group, TrustedGroupEntry *entry) 30017fd14ceSopenharmony_ci{ 30117fd14ceSopenharmony_ci if (!StringSet(&entry->name, group->name.data)) { 30217fd14ceSopenharmony_ci LOGE("[DB]: Failed to load groupName from tlv!"); 30317fd14ceSopenharmony_ci return false; 30417fd14ceSopenharmony_ci } 30517fd14ceSopenharmony_ci if (!StringSet(&entry->id, group->id.data)) { 30617fd14ceSopenharmony_ci LOGE("[DB]: Failed to load groupId from tlv!"); 30717fd14ceSopenharmony_ci return false; 30817fd14ceSopenharmony_ci } 30917fd14ceSopenharmony_ci if (!StringSet(&entry->userId, group->userId.data)) { 31017fd14ceSopenharmony_ci LOGE("[DB]: Failed to load userId from tlv!"); 31117fd14ceSopenharmony_ci return false; 31217fd14ceSopenharmony_ci } 31317fd14ceSopenharmony_ci if (!StringSet(&entry->sharedUserId, group->sharedUserId.data)) { 31417fd14ceSopenharmony_ci LOGE("[DB]: Failed to load sharedUserId from tlv!"); 31517fd14ceSopenharmony_ci return false; 31617fd14ceSopenharmony_ci } 31717fd14ceSopenharmony_ci if (!LoadStringVectorFromParcel(&entry->managers, &group->managers.data)) { 31817fd14ceSopenharmony_ci LOGE("[DB]: Failed to load managers from tlv!"); 31917fd14ceSopenharmony_ci return false; 32017fd14ceSopenharmony_ci } 32117fd14ceSopenharmony_ci if (!LoadStringVectorFromParcel(&entry->friends, &group->friends.data)) { 32217fd14ceSopenharmony_ci LOGE("[DB]: Failed to load friends from tlv!"); 32317fd14ceSopenharmony_ci return false; 32417fd14ceSopenharmony_ci } 32517fd14ceSopenharmony_ci entry->type = group->type.data; 32617fd14ceSopenharmony_ci entry->visibility = group->visibility.data; 32717fd14ceSopenharmony_ci entry->upgradeFlag = group->upgradeFlag.data; 32817fd14ceSopenharmony_ci entry->expireTime = group->expireTime.data; 32917fd14ceSopenharmony_ci return true; 33017fd14ceSopenharmony_ci} 33117fd14ceSopenharmony_ci 33217fd14ceSopenharmony_cistatic bool GenerateDeviceEntryFromTlv(TlvDeviceElement *device, TrustedDeviceEntry *deviceEntry) 33317fd14ceSopenharmony_ci{ 33417fd14ceSopenharmony_ci deviceEntry->groupEntry = NULL; 33517fd14ceSopenharmony_ci if (!StringSet(&deviceEntry->groupId, device->groupId.data)) { 33617fd14ceSopenharmony_ci LOGE("[DB]: Failed to load groupId from tlv!"); 33717fd14ceSopenharmony_ci return false; 33817fd14ceSopenharmony_ci } 33917fd14ceSopenharmony_ci if (!StringSet(&deviceEntry->udid, device->udid.data)) { 34017fd14ceSopenharmony_ci LOGE("[DB]: Failed to load udid from tlv!"); 34117fd14ceSopenharmony_ci return false; 34217fd14ceSopenharmony_ci } 34317fd14ceSopenharmony_ci if (!StringSet(&deviceEntry->authId, device->authId.data)) { 34417fd14ceSopenharmony_ci LOGE("[DB]: Failed to load authId from tlv!"); 34517fd14ceSopenharmony_ci return false; 34617fd14ceSopenharmony_ci } 34717fd14ceSopenharmony_ci if (!StringSet(&deviceEntry->userId, device->userId.data)) { 34817fd14ceSopenharmony_ci LOGE("[DB]: Failed to load userId from tlv!"); 34917fd14ceSopenharmony_ci return false; 35017fd14ceSopenharmony_ci } 35117fd14ceSopenharmony_ci if (!StringSet(&deviceEntry->serviceType, device->serviceType.data)) { 35217fd14ceSopenharmony_ci LOGE("[DB]: Failed to load serviceType from tlv!"); 35317fd14ceSopenharmony_ci return false; 35417fd14ceSopenharmony_ci } 35517fd14ceSopenharmony_ci if (!ParcelCopy(&device->ext.data, &deviceEntry->ext)) { 35617fd14ceSopenharmony_ci LOGE("[DB]: Failed to load external data from tlv!"); 35717fd14ceSopenharmony_ci return false; 35817fd14ceSopenharmony_ci } 35917fd14ceSopenharmony_ci deviceEntry->credential = device->info.data.credential; 36017fd14ceSopenharmony_ci deviceEntry->devType = device->info.data.devType; 36117fd14ceSopenharmony_ci deviceEntry->upgradeFlag = device->upgradeFlag.data; 36217fd14ceSopenharmony_ci deviceEntry->source = device->info.data.source; 36317fd14ceSopenharmony_ci deviceEntry->lastTm = device->info.data.lastTm; 36417fd14ceSopenharmony_ci return true; 36517fd14ceSopenharmony_ci} 36617fd14ceSopenharmony_ci 36717fd14ceSopenharmony_cistatic bool LoadGroups(HCDataBaseV1 *db, GroupEntryVec *vec) 36817fd14ceSopenharmony_ci{ 36917fd14ceSopenharmony_ci uint32_t index; 37017fd14ceSopenharmony_ci TlvGroupElement *group = NULL; 37117fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(db->groups.data, index, group) { 37217fd14ceSopenharmony_ci if (group == NULL) { 37317fd14ceSopenharmony_ci continue; 37417fd14ceSopenharmony_ci } 37517fd14ceSopenharmony_ci TrustedGroupEntry *entry = CreateGroupEntry(); 37617fd14ceSopenharmony_ci if (entry == NULL) { 37717fd14ceSopenharmony_ci LOGE("[DB]: Failed to allocate entry memory!"); 37817fd14ceSopenharmony_ci ClearGroupEntryVec(vec); 37917fd14ceSopenharmony_ci return false; 38017fd14ceSopenharmony_ci } 38117fd14ceSopenharmony_ci if (!GenerateGroupEntryFromTlv(group, entry)) { 38217fd14ceSopenharmony_ci DestroyGroupEntry(entry); 38317fd14ceSopenharmony_ci ClearGroupEntryVec(vec); 38417fd14ceSopenharmony_ci return false; 38517fd14ceSopenharmony_ci } 38617fd14ceSopenharmony_ci if (vec->pushBackT(vec, entry) == NULL) { 38717fd14ceSopenharmony_ci LOGE("[DB]: Failed to push entry to vec!"); 38817fd14ceSopenharmony_ci DestroyGroupEntry(entry); 38917fd14ceSopenharmony_ci ClearGroupEntryVec(vec); 39017fd14ceSopenharmony_ci return false; 39117fd14ceSopenharmony_ci } 39217fd14ceSopenharmony_ci } 39317fd14ceSopenharmony_ci return true; 39417fd14ceSopenharmony_ci} 39517fd14ceSopenharmony_ci 39617fd14ceSopenharmony_cistatic bool LoadDevices(HCDataBaseV1 *db, DeviceEntryVec *vec) 39717fd14ceSopenharmony_ci{ 39817fd14ceSopenharmony_ci uint32_t index; 39917fd14ceSopenharmony_ci TlvDeviceElement *device = NULL; 40017fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(db->devices.data, index, device) { 40117fd14ceSopenharmony_ci if (device == NULL) { 40217fd14ceSopenharmony_ci continue; 40317fd14ceSopenharmony_ci } 40417fd14ceSopenharmony_ci TrustedDeviceEntry *entry = CreateDeviceEntry(); 40517fd14ceSopenharmony_ci if (entry == NULL) { 40617fd14ceSopenharmony_ci LOGE("[DB]: Failed to allocate entry memory!"); 40717fd14ceSopenharmony_ci ClearDeviceEntryVec(vec); 40817fd14ceSopenharmony_ci return false; 40917fd14ceSopenharmony_ci } 41017fd14ceSopenharmony_ci if (!GenerateDeviceEntryFromTlv(device, entry)) { 41117fd14ceSopenharmony_ci DestroyDeviceEntry(entry); 41217fd14ceSopenharmony_ci ClearDeviceEntryVec(vec); 41317fd14ceSopenharmony_ci return false; 41417fd14ceSopenharmony_ci } 41517fd14ceSopenharmony_ci if (vec->pushBackT(vec, entry) == NULL) { 41617fd14ceSopenharmony_ci LOGE("[DB]: Failed to push entry to vec!"); 41717fd14ceSopenharmony_ci DestroyDeviceEntry(entry); 41817fd14ceSopenharmony_ci ClearDeviceEntryVec(vec); 41917fd14ceSopenharmony_ci return false; 42017fd14ceSopenharmony_ci } 42117fd14ceSopenharmony_ci } 42217fd14ceSopenharmony_ci return true; 42317fd14ceSopenharmony_ci} 42417fd14ceSopenharmony_ci 42517fd14ceSopenharmony_cistatic bool ReadInfoFromParcel(HcParcel *parcel, OsAccountTrustedInfo *info) 42617fd14ceSopenharmony_ci{ 42717fd14ceSopenharmony_ci bool ret = false; 42817fd14ceSopenharmony_ci HCDataBaseV1 dbv1; 42917fd14ceSopenharmony_ci TLV_INIT(HCDataBaseV1, &dbv1) 43017fd14ceSopenharmony_ci if (DecodeTlvMessage((TlvBase *)&dbv1, parcel, false)) { 43117fd14ceSopenharmony_ci if (!LoadGroups(&dbv1, &info->groups)) { 43217fd14ceSopenharmony_ci TLV_DEINIT(dbv1) 43317fd14ceSopenharmony_ci return false; 43417fd14ceSopenharmony_ci } 43517fd14ceSopenharmony_ci if (!LoadDevices(&dbv1, &info->devices)) { 43617fd14ceSopenharmony_ci ClearGroupEntryVec(&info->groups); 43717fd14ceSopenharmony_ci TLV_DEINIT(dbv1) 43817fd14ceSopenharmony_ci return false; 43917fd14ceSopenharmony_ci } 44017fd14ceSopenharmony_ci ret = true; 44117fd14ceSopenharmony_ci } else { 44217fd14ceSopenharmony_ci LOGE("[DB]: Decode Tlv Message Failed!"); 44317fd14ceSopenharmony_ci } 44417fd14ceSopenharmony_ci TLV_DEINIT(dbv1) 44517fd14ceSopenharmony_ci return ret; 44617fd14ceSopenharmony_ci} 44717fd14ceSopenharmony_ci 44817fd14ceSopenharmony_cistatic bool ReadParcelFromFile(const char *filePath, HcParcel *parcel) 44917fd14ceSopenharmony_ci{ 45017fd14ceSopenharmony_ci FileHandle file; 45117fd14ceSopenharmony_ci int ret = HcFileOpen(filePath, MODE_FILE_READ, &file); 45217fd14ceSopenharmony_ci if (ret != 0) { 45317fd14ceSopenharmony_ci LOGE("[DB]: Failed to open database file!"); 45417fd14ceSopenharmony_ci return false; 45517fd14ceSopenharmony_ci } 45617fd14ceSopenharmony_ci SetSecurityLabel(filePath, SECURITY_LABEL_S2); 45717fd14ceSopenharmony_ci int fileSize = HcFileSize(file); 45817fd14ceSopenharmony_ci if (fileSize <= 0) { 45917fd14ceSopenharmony_ci LOGE("[DB]: The database file size is invalid!"); 46017fd14ceSopenharmony_ci HcFileClose(file); 46117fd14ceSopenharmony_ci return false; 46217fd14ceSopenharmony_ci } 46317fd14ceSopenharmony_ci char *fileData = (char *)HcMalloc(fileSize, 0); 46417fd14ceSopenharmony_ci if (fileData == NULL) { 46517fd14ceSopenharmony_ci LOGE("[DB]: Failed to allocate fileData memory!"); 46617fd14ceSopenharmony_ci HcFileClose(file); 46717fd14ceSopenharmony_ci return false; 46817fd14ceSopenharmony_ci } 46917fd14ceSopenharmony_ci if (HcFileRead(file, fileData, fileSize) != fileSize) { 47017fd14ceSopenharmony_ci LOGE("[DB]: Read file error!"); 47117fd14ceSopenharmony_ci HcFileClose(file); 47217fd14ceSopenharmony_ci HcFree(fileData); 47317fd14ceSopenharmony_ci return false; 47417fd14ceSopenharmony_ci } 47517fd14ceSopenharmony_ci HcFileClose(file); 47617fd14ceSopenharmony_ci if (!ParcelWrite(parcel, fileData, fileSize)) { 47717fd14ceSopenharmony_ci LOGE("[DB]: parcel write error!"); 47817fd14ceSopenharmony_ci HcFree(fileData); 47917fd14ceSopenharmony_ci return false; 48017fd14ceSopenharmony_ci } 48117fd14ceSopenharmony_ci HcFree(fileData); 48217fd14ceSopenharmony_ci return true; 48317fd14ceSopenharmony_ci} 48417fd14ceSopenharmony_ci 48517fd14ceSopenharmony_cistatic bool SaveParcelToFile(const char *filePath, HcParcel *parcel) 48617fd14ceSopenharmony_ci{ 48717fd14ceSopenharmony_ci FileHandle file; 48817fd14ceSopenharmony_ci int ret = HcFileOpen(filePath, MODE_FILE_WRITE, &file); 48917fd14ceSopenharmony_ci if (ret != HC_SUCCESS) { 49017fd14ceSopenharmony_ci LOGE("[DB]: Failed to open database file!"); 49117fd14ceSopenharmony_ci return false; 49217fd14ceSopenharmony_ci } 49317fd14ceSopenharmony_ci SetSecurityLabel(filePath, SECURITY_LABEL_S2); 49417fd14ceSopenharmony_ci int fileSize = (int)GetParcelDataSize(parcel); 49517fd14ceSopenharmony_ci const char *fileData = GetParcelData(parcel); 49617fd14ceSopenharmony_ci int writeSize = HcFileWrite(file, fileData, fileSize); 49717fd14ceSopenharmony_ci HcFileClose(file); 49817fd14ceSopenharmony_ci if (writeSize == fileSize) { 49917fd14ceSopenharmony_ci return true; 50017fd14ceSopenharmony_ci } else { 50117fd14ceSopenharmony_ci LOGE("[DB]: write file error!"); 50217fd14ceSopenharmony_ci return false; 50317fd14ceSopenharmony_ci } 50417fd14ceSopenharmony_ci} 50517fd14ceSopenharmony_ci 50617fd14ceSopenharmony_cistatic void LoadOsAccountDb(int32_t osAccountId) 50717fd14ceSopenharmony_ci{ 50817fd14ceSopenharmony_ci char filePath[MAX_DB_PATH_LEN] = { 0 }; 50917fd14ceSopenharmony_ci if (!GetOsAccountInfoPath(osAccountId, filePath, MAX_DB_PATH_LEN)) { 51017fd14ceSopenharmony_ci LOGE("[DB]: Failed to get os account info path!"); 51117fd14ceSopenharmony_ci return; 51217fd14ceSopenharmony_ci } 51317fd14ceSopenharmony_ci HcParcel parcel = CreateParcel(0, 0); 51417fd14ceSopenharmony_ci if (!ReadParcelFromFile(filePath, &parcel)) { 51517fd14ceSopenharmony_ci DeleteParcel(&parcel); 51617fd14ceSopenharmony_ci return; 51717fd14ceSopenharmony_ci } 51817fd14ceSopenharmony_ci OsAccountTrustedInfo info; 51917fd14ceSopenharmony_ci info.osAccountId = osAccountId; 52017fd14ceSopenharmony_ci info.groups = CreateGroupEntryVec(); 52117fd14ceSopenharmony_ci info.devices = CreateDeviceEntryVec(); 52217fd14ceSopenharmony_ci if (!ReadInfoFromParcel(&parcel, &info)) { 52317fd14ceSopenharmony_ci DestroyGroupEntryVec(&info.groups); 52417fd14ceSopenharmony_ci DestroyDeviceEntryVec(&info.devices); 52517fd14ceSopenharmony_ci DeleteParcel(&parcel); 52617fd14ceSopenharmony_ci return; 52717fd14ceSopenharmony_ci } 52817fd14ceSopenharmony_ci DeleteParcel(&parcel); 52917fd14ceSopenharmony_ci if (g_deviceauthDb.pushBackT(&g_deviceauthDb, info) == NULL) { 53017fd14ceSopenharmony_ci LOGE("[DB]: Failed to push osAccountInfo to database!"); 53117fd14ceSopenharmony_ci ClearGroupEntryVec(&info.groups); 53217fd14ceSopenharmony_ci ClearDeviceEntryVec(&info.devices); 53317fd14ceSopenharmony_ci return; 53417fd14ceSopenharmony_ci } 53517fd14ceSopenharmony_ci LOGI("[DB]: Load os account db successfully! [Id]: %d", osAccountId); 53617fd14ceSopenharmony_ci} 53717fd14ceSopenharmony_ci 53817fd14ceSopenharmony_cistatic void TryMoveDeDataToCe(int32_t osAccountId) 53917fd14ceSopenharmony_ci{ 54017fd14ceSopenharmony_ci char ceFilePath[MAX_DB_PATH_LEN] = { 0 }; 54117fd14ceSopenharmony_ci if (!GetOsAccountInfoPathCe(osAccountId, ceFilePath, MAX_DB_PATH_LEN)) { 54217fd14ceSopenharmony_ci LOGE("[DB]: Failed to get ce database file path!"); 54317fd14ceSopenharmony_ci return; 54417fd14ceSopenharmony_ci } 54517fd14ceSopenharmony_ci HcParcel parcelCe = CreateParcel(0, 0); 54617fd14ceSopenharmony_ci if (ReadParcelFromFile(ceFilePath, &parcelCe)) { 54717fd14ceSopenharmony_ci LOGI("[DB]: ce data exists, no need to move."); 54817fd14ceSopenharmony_ci DeleteParcel(&parcelCe); 54917fd14ceSopenharmony_ci return; 55017fd14ceSopenharmony_ci } 55117fd14ceSopenharmony_ci DeleteParcel(&parcelCe); 55217fd14ceSopenharmony_ci char deFilePath[MAX_DB_PATH_LEN] = { 0 }; 55317fd14ceSopenharmony_ci if (!GetOsAccountInfoPathDe(osAccountId, deFilePath, MAX_DB_PATH_LEN)) { 55417fd14ceSopenharmony_ci LOGE("[DB]: Failed to get de database file path!"); 55517fd14ceSopenharmony_ci return; 55617fd14ceSopenharmony_ci } 55717fd14ceSopenharmony_ci HcParcel parcelDe = CreateParcel(0, 0); 55817fd14ceSopenharmony_ci if (!ReadParcelFromFile(deFilePath, &parcelDe)) { 55917fd14ceSopenharmony_ci LOGI("[DB]: no data in de file, no need to move!"); 56017fd14ceSopenharmony_ci DeleteParcel(&parcelDe); 56117fd14ceSopenharmony_ci return; 56217fd14ceSopenharmony_ci } 56317fd14ceSopenharmony_ci if (!SaveParcelToFile(ceFilePath, &parcelDe)) { 56417fd14ceSopenharmony_ci LOGE("[DB]: save de parcel to ce file failed!"); 56517fd14ceSopenharmony_ci DeleteParcel(&parcelDe); 56617fd14ceSopenharmony_ci return; 56717fd14ceSopenharmony_ci } 56817fd14ceSopenharmony_ci DeleteParcel(&parcelDe); 56917fd14ceSopenharmony_ci parcelCe = CreateParcel(0, 0); 57017fd14ceSopenharmony_ci if (!ReadParcelFromFile(ceFilePath, &parcelCe)) { 57117fd14ceSopenharmony_ci LOGE("[DB]: Failed to read ce file data!"); 57217fd14ceSopenharmony_ci DeleteParcel(&parcelCe); 57317fd14ceSopenharmony_ci return; 57417fd14ceSopenharmony_ci } 57517fd14ceSopenharmony_ci DeleteParcel(&parcelCe); 57617fd14ceSopenharmony_ci LOGI("[DB]: move de data to ce successfully, remove de file!"); 57717fd14ceSopenharmony_ci HcFileRemove(deFilePath); 57817fd14ceSopenharmony_ci} 57917fd14ceSopenharmony_ci 58017fd14ceSopenharmony_cistatic void RemoveOsAccountTrustedInfo(int32_t osAccountId) 58117fd14ceSopenharmony_ci{ 58217fd14ceSopenharmony_ci uint32_t index = 0; 58317fd14ceSopenharmony_ci OsAccountTrustedInfo *info = NULL; 58417fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(g_deviceauthDb, index, info) { 58517fd14ceSopenharmony_ci if (info->osAccountId == osAccountId) { 58617fd14ceSopenharmony_ci OsAccountTrustedInfo deleteInfo; 58717fd14ceSopenharmony_ci HC_VECTOR_POPELEMENT(&g_deviceauthDb, &deleteInfo, index); 58817fd14ceSopenharmony_ci ClearGroupEntryVec(&deleteInfo.groups); 58917fd14ceSopenharmony_ci ClearDeviceEntryVec(&deleteInfo.devices); 59017fd14ceSopenharmony_ci return; 59117fd14ceSopenharmony_ci } 59217fd14ceSopenharmony_ci } 59317fd14ceSopenharmony_ci} 59417fd14ceSopenharmony_ci 59517fd14ceSopenharmony_cistatic void LoadOsAccountDbCe(int32_t osAccountId) 59617fd14ceSopenharmony_ci{ 59717fd14ceSopenharmony_ci TryMoveDeDataToCe(osAccountId); 59817fd14ceSopenharmony_ci RemoveOsAccountTrustedInfo(osAccountId); 59917fd14ceSopenharmony_ci LoadOsAccountDb(osAccountId); 60017fd14ceSopenharmony_ci} 60117fd14ceSopenharmony_ci 60217fd14ceSopenharmony_cistatic void OnOsAccountUnlocked(int32_t osAccountId) 60317fd14ceSopenharmony_ci{ 60417fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 60517fd14ceSopenharmony_ci LoadOsAccountDbCe(osAccountId); 60617fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 60717fd14ceSopenharmony_ci} 60817fd14ceSopenharmony_ci 60917fd14ceSopenharmony_cistatic void OnOsAccountRemoved(int32_t osAccountId) 61017fd14ceSopenharmony_ci{ 61117fd14ceSopenharmony_ci LOGI("[DB]: os account is removed, osAccountId: %d", osAccountId); 61217fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 61317fd14ceSopenharmony_ci RemoveOsAccountTrustedInfo(osAccountId); 61417fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 61517fd14ceSopenharmony_ci} 61617fd14ceSopenharmony_ci 61717fd14ceSopenharmony_cistatic bool IsOsAccountDataLoaded(int32_t osAccountId) 61817fd14ceSopenharmony_ci{ 61917fd14ceSopenharmony_ci uint32_t index = 0; 62017fd14ceSopenharmony_ci OsAccountTrustedInfo *info = NULL; 62117fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(g_deviceauthDb, index, info) { 62217fd14ceSopenharmony_ci if (info->osAccountId == osAccountId) { 62317fd14ceSopenharmony_ci return true; 62417fd14ceSopenharmony_ci } 62517fd14ceSopenharmony_ci } 62617fd14ceSopenharmony_ci return false; 62717fd14ceSopenharmony_ci} 62817fd14ceSopenharmony_ci 62917fd14ceSopenharmony_cistatic void LoadDataIfNotLoaded(int32_t osAccountId) 63017fd14ceSopenharmony_ci{ 63117fd14ceSopenharmony_ci if (IsOsAccountDataLoaded(osAccountId)) { 63217fd14ceSopenharmony_ci return; 63317fd14ceSopenharmony_ci } 63417fd14ceSopenharmony_ci LOGI("[DB]: data has not been loaded, load it, osAccountId: %d", osAccountId); 63517fd14ceSopenharmony_ci LoadOsAccountDbCe(osAccountId); 63617fd14ceSopenharmony_ci} 63717fd14ceSopenharmony_ci 63817fd14ceSopenharmony_cistatic OsAccountTrustedInfo *GetTrustedInfoByOsAccountId(int32_t osAccountId) 63917fd14ceSopenharmony_ci{ 64017fd14ceSopenharmony_ci if (IsOsAccountSupported()) { 64117fd14ceSopenharmony_ci LoadDataIfNotLoaded(osAccountId); 64217fd14ceSopenharmony_ci } 64317fd14ceSopenharmony_ci uint32_t index = 0; 64417fd14ceSopenharmony_ci OsAccountTrustedInfo *info = NULL; 64517fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(g_deviceauthDb, index, info) { 64617fd14ceSopenharmony_ci if (info->osAccountId == osAccountId) { 64717fd14ceSopenharmony_ci return info; 64817fd14ceSopenharmony_ci } 64917fd14ceSopenharmony_ci } 65017fd14ceSopenharmony_ci LOGI("[DB]: Create a new os account database cache! [Id]: %d", osAccountId); 65117fd14ceSopenharmony_ci OsAccountTrustedInfo newInfo; 65217fd14ceSopenharmony_ci newInfo.osAccountId = osAccountId; 65317fd14ceSopenharmony_ci newInfo.groups = CreateGroupEntryVec(); 65417fd14ceSopenharmony_ci newInfo.devices = CreateDeviceEntryVec(); 65517fd14ceSopenharmony_ci OsAccountTrustedInfo *returnInfo = g_deviceauthDb.pushBackT(&g_deviceauthDb, newInfo); 65617fd14ceSopenharmony_ci if (returnInfo == NULL) { 65717fd14ceSopenharmony_ci LOGE("[DB]: Failed to push osAccountInfo to database!"); 65817fd14ceSopenharmony_ci DestroyGroupEntryVec(&newInfo.groups); 65917fd14ceSopenharmony_ci DestroyDeviceEntryVec(&newInfo.devices); 66017fd14ceSopenharmony_ci } 66117fd14ceSopenharmony_ci return returnInfo; 66217fd14ceSopenharmony_ci} 66317fd14ceSopenharmony_ci 66417fd14ceSopenharmony_cistatic void LoadDeviceAuthDb(void) 66517fd14ceSopenharmony_ci{ 66617fd14ceSopenharmony_ci if (IsOsAccountSupported()) { 66717fd14ceSopenharmony_ci return; 66817fd14ceSopenharmony_ci } 66917fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 67017fd14ceSopenharmony_ci StringVector osAccountDbNameVec = CreateStrVector(); 67117fd14ceSopenharmony_ci HcFileGetSubFileName(GetStorageDirPath(), &osAccountDbNameVec); 67217fd14ceSopenharmony_ci uint32_t index; 67317fd14ceSopenharmony_ci HcString *dbName; 67417fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(osAccountDbNameVec, index, dbName) { 67517fd14ceSopenharmony_ci int32_t osAccountId; 67617fd14ceSopenharmony_ci const char *osAccountIdStr = StringGet(dbName); 67717fd14ceSopenharmony_ci if (osAccountIdStr == NULL) { 67817fd14ceSopenharmony_ci continue; 67917fd14ceSopenharmony_ci } 68017fd14ceSopenharmony_ci if (strcmp(osAccountIdStr, "hcgroup.dat") == 0) { 68117fd14ceSopenharmony_ci LoadOsAccountDb(DEFAULT_OS_ACCOUNT); 68217fd14ceSopenharmony_ci } else if (sscanf_s(osAccountIdStr, "hcgroup%d.dat", &osAccountId) == 1) { 68317fd14ceSopenharmony_ci LoadOsAccountDb(osAccountId); 68417fd14ceSopenharmony_ci } 68517fd14ceSopenharmony_ci } 68617fd14ceSopenharmony_ci DestroyStrVector(&osAccountDbNameVec); 68717fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 68817fd14ceSopenharmony_ci} 68917fd14ceSopenharmony_ci 69017fd14ceSopenharmony_cistatic bool SetGroupElement(TlvGroupElement *element, TrustedGroupEntry *entry) 69117fd14ceSopenharmony_ci{ 69217fd14ceSopenharmony_ci if (!StringSet(&element->name.data, entry->name)) { 69317fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy groupName!"); 69417fd14ceSopenharmony_ci return false; 69517fd14ceSopenharmony_ci } 69617fd14ceSopenharmony_ci if (!StringSet(&element->id.data, entry->id)) { 69717fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy groupId!"); 69817fd14ceSopenharmony_ci return false; 69917fd14ceSopenharmony_ci } 70017fd14ceSopenharmony_ci if (!StringSet(&element->userId.data, entry->userId)) { 70117fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy userId!"); 70217fd14ceSopenharmony_ci return false; 70317fd14ceSopenharmony_ci } 70417fd14ceSopenharmony_ci if (!StringSet(&element->sharedUserId.data, entry->sharedUserId)) { 70517fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy sharedUserId!"); 70617fd14ceSopenharmony_ci return false; 70717fd14ceSopenharmony_ci } 70817fd14ceSopenharmony_ci element->type.data = entry->type; 70917fd14ceSopenharmony_ci element->visibility.data = entry->visibility; 71017fd14ceSopenharmony_ci element->upgradeFlag.data = entry->upgradeFlag; 71117fd14ceSopenharmony_ci element->expireTime.data = entry->expireTime; 71217fd14ceSopenharmony_ci if (!SaveStringVectorToParcel(&entry->managers, &element->managers.data)) { 71317fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy managers!"); 71417fd14ceSopenharmony_ci return false; 71517fd14ceSopenharmony_ci } 71617fd14ceSopenharmony_ci if (!SaveStringVectorToParcel(&entry->friends, &element->friends.data)) { 71717fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy friends!"); 71817fd14ceSopenharmony_ci return false; 71917fd14ceSopenharmony_ci } 72017fd14ceSopenharmony_ci return true; 72117fd14ceSopenharmony_ci} 72217fd14ceSopenharmony_ci 72317fd14ceSopenharmony_cistatic bool SetDeviceElement(TlvDeviceElement *element, TrustedDeviceEntry *entry) 72417fd14ceSopenharmony_ci{ 72517fd14ceSopenharmony_ci if (!StringSet(&element->groupId.data, entry->groupId)) { 72617fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy groupId!"); 72717fd14ceSopenharmony_ci return false; 72817fd14ceSopenharmony_ci } 72917fd14ceSopenharmony_ci if (!StringSet(&element->udid.data, entry->udid)) { 73017fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy udid!"); 73117fd14ceSopenharmony_ci return false; 73217fd14ceSopenharmony_ci } 73317fd14ceSopenharmony_ci if (!StringSet(&element->authId.data, entry->authId)) { 73417fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy authId!"); 73517fd14ceSopenharmony_ci return false; 73617fd14ceSopenharmony_ci } 73717fd14ceSopenharmony_ci if (!StringSet(&element->userId.data, entry->userId)) { 73817fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy userId!"); 73917fd14ceSopenharmony_ci return false; 74017fd14ceSopenharmony_ci } 74117fd14ceSopenharmony_ci if (!StringSet(&element->serviceType.data, entry->serviceType)) { 74217fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy serviceType!"); 74317fd14ceSopenharmony_ci return false; 74417fd14ceSopenharmony_ci } 74517fd14ceSopenharmony_ci if (!ParcelCopy(&element->ext.data, &entry->ext)) { 74617fd14ceSopenharmony_ci LOGE("[DB]: Failed to copy external data!"); 74717fd14ceSopenharmony_ci return false; 74817fd14ceSopenharmony_ci } 74917fd14ceSopenharmony_ci element->info.data.credential = entry->credential; 75017fd14ceSopenharmony_ci element->info.data.devType = entry->devType; 75117fd14ceSopenharmony_ci element->upgradeFlag.data = entry->upgradeFlag; 75217fd14ceSopenharmony_ci element->info.data.source = entry->source; 75317fd14ceSopenharmony_ci element->info.data.lastTm = entry->lastTm; 75417fd14ceSopenharmony_ci return true; 75517fd14ceSopenharmony_ci} 75617fd14ceSopenharmony_ci 75717fd14ceSopenharmony_cistatic bool SaveGroups(const GroupEntryVec *vec, HCDataBaseV1 *db) 75817fd14ceSopenharmony_ci{ 75917fd14ceSopenharmony_ci uint32_t index; 76017fd14ceSopenharmony_ci TrustedGroupEntry **entry; 76117fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(*vec, index, entry) { 76217fd14ceSopenharmony_ci TlvGroupElement tmp; 76317fd14ceSopenharmony_ci TlvGroupElement *element = db->groups.data.pushBack(&db->groups.data, &tmp); 76417fd14ceSopenharmony_ci if (element == NULL) { 76517fd14ceSopenharmony_ci return false; 76617fd14ceSopenharmony_ci } 76717fd14ceSopenharmony_ci TLV_INIT(TlvGroupElement, element); 76817fd14ceSopenharmony_ci if (!SetGroupElement(element, *entry)) { 76917fd14ceSopenharmony_ci TLV_DEINIT((*element)); 77017fd14ceSopenharmony_ci return false; 77117fd14ceSopenharmony_ci } 77217fd14ceSopenharmony_ci } 77317fd14ceSopenharmony_ci return true; 77417fd14ceSopenharmony_ci} 77517fd14ceSopenharmony_ci 77617fd14ceSopenharmony_cistatic bool SaveDevices(const DeviceEntryVec *vec, HCDataBaseV1 *db) 77717fd14ceSopenharmony_ci{ 77817fd14ceSopenharmony_ci uint32_t index; 77917fd14ceSopenharmony_ci TrustedDeviceEntry **entry; 78017fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(*vec, index, entry) { 78117fd14ceSopenharmony_ci TlvDeviceElement tmp; 78217fd14ceSopenharmony_ci TlvDeviceElement *element = db->devices.data.pushBack(&db->devices.data, &tmp); 78317fd14ceSopenharmony_ci if (element == NULL) { 78417fd14ceSopenharmony_ci return false; 78517fd14ceSopenharmony_ci } 78617fd14ceSopenharmony_ci TLV_INIT(TlvDeviceElement, element); 78717fd14ceSopenharmony_ci if (!SetDeviceElement(element, *entry)) { 78817fd14ceSopenharmony_ci TLV_DEINIT((*element)); 78917fd14ceSopenharmony_ci return false; 79017fd14ceSopenharmony_ci } 79117fd14ceSopenharmony_ci } 79217fd14ceSopenharmony_ci return true; 79317fd14ceSopenharmony_ci} 79417fd14ceSopenharmony_ci 79517fd14ceSopenharmony_cistatic bool SaveInfoToParcel(const OsAccountTrustedInfo *info, HcParcel *parcel) 79617fd14ceSopenharmony_ci{ 79717fd14ceSopenharmony_ci int32_t ret = false; 79817fd14ceSopenharmony_ci HCDataBaseV1 dbv1; 79917fd14ceSopenharmony_ci TLV_INIT(HCDataBaseV1, &dbv1) 80017fd14ceSopenharmony_ci dbv1.version.data = 1; 80117fd14ceSopenharmony_ci do { 80217fd14ceSopenharmony_ci if (!SaveGroups(&info->groups, &dbv1)) { 80317fd14ceSopenharmony_ci break; 80417fd14ceSopenharmony_ci } 80517fd14ceSopenharmony_ci if (!SaveDevices(&info->devices, &dbv1)) { 80617fd14ceSopenharmony_ci break; 80717fd14ceSopenharmony_ci } 80817fd14ceSopenharmony_ci if (!EncodeTlvMessage((TlvBase *)&dbv1, parcel)) { 80917fd14ceSopenharmony_ci LOGE("[DB]: Encode Tlv Message failed!"); 81017fd14ceSopenharmony_ci break; 81117fd14ceSopenharmony_ci } 81217fd14ceSopenharmony_ci ret = true; 81317fd14ceSopenharmony_ci } while (0); 81417fd14ceSopenharmony_ci TLV_DEINIT(dbv1) 81517fd14ceSopenharmony_ci return ret; 81617fd14ceSopenharmony_ci} 81717fd14ceSopenharmony_ci 81817fd14ceSopenharmony_cistatic bool CompareQueryGroupParams(const QueryGroupParams *params, const TrustedGroupEntry *entry) 81917fd14ceSopenharmony_ci{ 82017fd14ceSopenharmony_ci if ((params->groupId != NULL) && (strcmp(params->groupId, StringGet(&entry->id)) != 0)) { 82117fd14ceSopenharmony_ci return false; 82217fd14ceSopenharmony_ci } 82317fd14ceSopenharmony_ci if ((params->groupName != NULL) && (strcmp(params->groupName, StringGet(&entry->name)) != 0)) { 82417fd14ceSopenharmony_ci return false; 82517fd14ceSopenharmony_ci } 82617fd14ceSopenharmony_ci if ((params->userId != NULL) && (strcmp(params->userId, StringGet(&entry->userId)) != 0)) { 82717fd14ceSopenharmony_ci return false; 82817fd14ceSopenharmony_ci } 82917fd14ceSopenharmony_ci if ((params->sharedUserId != NULL) && (strcmp(params->sharedUserId, StringGet(&entry->sharedUserId)) != 0)) { 83017fd14ceSopenharmony_ci return false; 83117fd14ceSopenharmony_ci } 83217fd14ceSopenharmony_ci if ((params->groupType != ALL_GROUP) && (params->groupType != entry->type)) { 83317fd14ceSopenharmony_ci return false; 83417fd14ceSopenharmony_ci } 83517fd14ceSopenharmony_ci if ((params->groupVisibility != ALL_GROUP_VISIBILITY) && (params->groupVisibility != entry->visibility)) { 83617fd14ceSopenharmony_ci return false; 83717fd14ceSopenharmony_ci } 83817fd14ceSopenharmony_ci if (params->ownerName != NULL) { 83917fd14ceSopenharmony_ci HcString entryOwner = HC_VECTOR_GET(&entry->managers, 0); 84017fd14ceSopenharmony_ci if (strcmp(params->ownerName, StringGet(&entryOwner)) != 0) { 84117fd14ceSopenharmony_ci return false; 84217fd14ceSopenharmony_ci } 84317fd14ceSopenharmony_ci } 84417fd14ceSopenharmony_ci return true; 84517fd14ceSopenharmony_ci} 84617fd14ceSopenharmony_ci 84717fd14ceSopenharmony_cistatic bool CompareQueryDeviceParams(const QueryDeviceParams *params, const TrustedDeviceEntry *entry) 84817fd14ceSopenharmony_ci{ 84917fd14ceSopenharmony_ci if ((params->groupId != NULL) && (strcmp(params->groupId, StringGet(&entry->groupId)) != 0)) { 85017fd14ceSopenharmony_ci return false; 85117fd14ceSopenharmony_ci } 85217fd14ceSopenharmony_ci if ((params->udid != NULL) && (strcmp(params->udid, StringGet(&entry->udid)) != 0)) { 85317fd14ceSopenharmony_ci return false; 85417fd14ceSopenharmony_ci } 85517fd14ceSopenharmony_ci if ((params->authId != NULL) && (strcmp(params->authId, StringGet(&entry->authId)) != 0)) { 85617fd14ceSopenharmony_ci return false; 85717fd14ceSopenharmony_ci } 85817fd14ceSopenharmony_ci if ((params->userId != NULL) && (strcmp(params->userId, StringGet(&entry->userId)) != 0)) { 85917fd14ceSopenharmony_ci return false; 86017fd14ceSopenharmony_ci } 86117fd14ceSopenharmony_ci return true; 86217fd14ceSopenharmony_ci} 86317fd14ceSopenharmony_ci 86417fd14ceSopenharmony_cistatic TrustedGroupEntry **QueryGroupEntryPtrIfMatch(const GroupEntryVec *vec, const QueryGroupParams *params) 86517fd14ceSopenharmony_ci{ 86617fd14ceSopenharmony_ci uint32_t index; 86717fd14ceSopenharmony_ci TrustedGroupEntry **entry; 86817fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(*vec, index, entry) { 86917fd14ceSopenharmony_ci if (CompareQueryGroupParams(params, *entry)) { 87017fd14ceSopenharmony_ci return entry; 87117fd14ceSopenharmony_ci } 87217fd14ceSopenharmony_ci } 87317fd14ceSopenharmony_ci return NULL; 87417fd14ceSopenharmony_ci} 87517fd14ceSopenharmony_ci 87617fd14ceSopenharmony_cistatic TrustedDeviceEntry **QueryDeviceEntryPtrIfMatch(const DeviceEntryVec *vec, const QueryDeviceParams *params) 87717fd14ceSopenharmony_ci{ 87817fd14ceSopenharmony_ci uint32_t index; 87917fd14ceSopenharmony_ci TrustedDeviceEntry **entry; 88017fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(*vec, index, entry) { 88117fd14ceSopenharmony_ci if (CompareQueryDeviceParams(params, *entry)) { 88217fd14ceSopenharmony_ci return entry; 88317fd14ceSopenharmony_ci } 88417fd14ceSopenharmony_ci } 88517fd14ceSopenharmony_ci return NULL; 88617fd14ceSopenharmony_ci} 88717fd14ceSopenharmony_ci 88817fd14ceSopenharmony_cistatic int32_t AddGroupNameToReturn(const TrustedGroupEntry *groupInfo, CJson *json) 88917fd14ceSopenharmony_ci{ 89017fd14ceSopenharmony_ci const char *groupName = StringGet(&groupInfo->name); 89117fd14ceSopenharmony_ci if (groupName == NULL) { 89217fd14ceSopenharmony_ci LOGE("Failed to get groupName from groupInfo!"); 89317fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 89417fd14ceSopenharmony_ci } 89517fd14ceSopenharmony_ci if (AddStringToJson(json, FIELD_GROUP_NAME, groupName) != HC_SUCCESS) { 89617fd14ceSopenharmony_ci LOGE("Failed to add groupName to json!"); 89717fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 89817fd14ceSopenharmony_ci } 89917fd14ceSopenharmony_ci return HC_SUCCESS; 90017fd14ceSopenharmony_ci} 90117fd14ceSopenharmony_ci 90217fd14ceSopenharmony_cistatic int32_t AddGroupIdToReturn(const TrustedGroupEntry *groupInfo, CJson *json) 90317fd14ceSopenharmony_ci{ 90417fd14ceSopenharmony_ci const char *groupId = StringGet(&groupInfo->id); 90517fd14ceSopenharmony_ci if (groupId == NULL) { 90617fd14ceSopenharmony_ci LOGE("Failed to get groupId from groupInfo!"); 90717fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 90817fd14ceSopenharmony_ci } 90917fd14ceSopenharmony_ci if (AddStringToJson(json, FIELD_GROUP_ID, groupId) != HC_SUCCESS) { 91017fd14ceSopenharmony_ci LOGE("Failed to add groupId to json!"); 91117fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 91217fd14ceSopenharmony_ci } 91317fd14ceSopenharmony_ci return HC_SUCCESS; 91417fd14ceSopenharmony_ci} 91517fd14ceSopenharmony_ci 91617fd14ceSopenharmony_cistatic int32_t AddGroupOwnerToReturn(const TrustedGroupEntry *groupInfo, CJson *json) 91717fd14ceSopenharmony_ci{ 91817fd14ceSopenharmony_ci HcString entryManager = HC_VECTOR_GET(&groupInfo->managers, 0); 91917fd14ceSopenharmony_ci const char *groupOwner = StringGet(&entryManager); 92017fd14ceSopenharmony_ci if (groupOwner == NULL) { 92117fd14ceSopenharmony_ci LOGE("Failed to get groupOwner from groupInfo!"); 92217fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 92317fd14ceSopenharmony_ci } 92417fd14ceSopenharmony_ci if (AddStringToJson(json, FIELD_GROUP_OWNER, groupOwner) != HC_SUCCESS) { 92517fd14ceSopenharmony_ci LOGE("Failed to add groupOwner to json!"); 92617fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 92717fd14ceSopenharmony_ci } 92817fd14ceSopenharmony_ci return HC_SUCCESS; 92917fd14ceSopenharmony_ci} 93017fd14ceSopenharmony_ci 93117fd14ceSopenharmony_cistatic int32_t AddGroupTypeToReturn(const TrustedGroupEntry *groupInfo, CJson *json) 93217fd14ceSopenharmony_ci{ 93317fd14ceSopenharmony_ci int32_t groupType = groupInfo->type; 93417fd14ceSopenharmony_ci if (AddIntToJson(json, FIELD_GROUP_TYPE, groupType) != HC_SUCCESS) { 93517fd14ceSopenharmony_ci LOGE("Failed to add groupType to json!"); 93617fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 93717fd14ceSopenharmony_ci } 93817fd14ceSopenharmony_ci return HC_SUCCESS; 93917fd14ceSopenharmony_ci} 94017fd14ceSopenharmony_ci 94117fd14ceSopenharmony_cistatic int32_t AddGroupVisibilityToReturn(const TrustedGroupEntry *groupInfo, CJson *json) 94217fd14ceSopenharmony_ci{ 94317fd14ceSopenharmony_ci int groupVisibility = groupInfo->visibility; 94417fd14ceSopenharmony_ci if (AddIntToJson(json, FIELD_GROUP_VISIBILITY, groupVisibility) != HC_SUCCESS) { 94517fd14ceSopenharmony_ci LOGE("Failed to add groupType to json!"); 94617fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 94717fd14ceSopenharmony_ci } 94817fd14ceSopenharmony_ci return HC_SUCCESS; 94917fd14ceSopenharmony_ci} 95017fd14ceSopenharmony_ci 95117fd14ceSopenharmony_cistatic int32_t AddUserIdToReturnIfAccountGroup(const TrustedGroupEntry *groupInfo, CJson *json) 95217fd14ceSopenharmony_ci{ 95317fd14ceSopenharmony_ci if ((groupInfo->type != ACROSS_ACCOUNT_AUTHORIZE_GROUP) && (groupInfo->type != IDENTICAL_ACCOUNT_GROUP)) { 95417fd14ceSopenharmony_ci return HC_SUCCESS; 95517fd14ceSopenharmony_ci } 95617fd14ceSopenharmony_ci const char *userId = StringGet(&groupInfo->userId); 95717fd14ceSopenharmony_ci if (userId == NULL) { 95817fd14ceSopenharmony_ci LOGE("Failed to get userId from groupInfo!"); 95917fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 96017fd14ceSopenharmony_ci } 96117fd14ceSopenharmony_ci if (AddStringToJson(json, FIELD_USER_ID, userId) != HC_SUCCESS) { 96217fd14ceSopenharmony_ci LOGE("Failed to add userId to json!"); 96317fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 96417fd14ceSopenharmony_ci } 96517fd14ceSopenharmony_ci return HC_SUCCESS; 96617fd14ceSopenharmony_ci} 96717fd14ceSopenharmony_ci 96817fd14ceSopenharmony_cistatic int32_t AddSharedUserIdToReturnIfAcrossAccountGroup(const TrustedGroupEntry *groupInfo, CJson *json) 96917fd14ceSopenharmony_ci{ 97017fd14ceSopenharmony_ci if (groupInfo->type != ACROSS_ACCOUNT_AUTHORIZE_GROUP) { 97117fd14ceSopenharmony_ci return HC_SUCCESS; 97217fd14ceSopenharmony_ci } 97317fd14ceSopenharmony_ci const char *sharedUserId = StringGet(&groupInfo->sharedUserId); 97417fd14ceSopenharmony_ci if (sharedUserId == NULL) { 97517fd14ceSopenharmony_ci LOGE("Failed to get sharedUserId from groupInfo!"); 97617fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 97717fd14ceSopenharmony_ci } 97817fd14ceSopenharmony_ci if (AddStringToJson(json, FIELD_SHARED_USER_ID, sharedUserId) != HC_SUCCESS) { 97917fd14ceSopenharmony_ci LOGE("Failed to add sharedUserId to json!"); 98017fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 98117fd14ceSopenharmony_ci } 98217fd14ceSopenharmony_ci return HC_SUCCESS; 98317fd14ceSopenharmony_ci} 98417fd14ceSopenharmony_ci 98517fd14ceSopenharmony_cistatic int32_t AddAuthIdToReturn(const TrustedDeviceEntry *deviceInfo, CJson *json) 98617fd14ceSopenharmony_ci{ 98717fd14ceSopenharmony_ci const char *authId = StringGet(&deviceInfo->authId); 98817fd14ceSopenharmony_ci if (authId == NULL) { 98917fd14ceSopenharmony_ci LOGE("Failed to get authId from deviceInfo!"); 99017fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 99117fd14ceSopenharmony_ci } 99217fd14ceSopenharmony_ci if (AddStringToJson(json, FIELD_AUTH_ID, authId) != HC_SUCCESS) { 99317fd14ceSopenharmony_ci LOGE("Failed to add authId to json!"); 99417fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 99517fd14ceSopenharmony_ci } 99617fd14ceSopenharmony_ci return HC_SUCCESS; 99717fd14ceSopenharmony_ci} 99817fd14ceSopenharmony_ci 99917fd14ceSopenharmony_cistatic int32_t AddCredentialTypeToReturn(const TrustedDeviceEntry *deviceInfo, CJson *json) 100017fd14ceSopenharmony_ci{ 100117fd14ceSopenharmony_ci int credentialType = deviceInfo->credential; 100217fd14ceSopenharmony_ci if (AddIntToJson(json, FIELD_CREDENTIAL_TYPE, credentialType) != HC_SUCCESS) { 100317fd14ceSopenharmony_ci LOGE("Failed to add credentialType to json!"); 100417fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 100517fd14ceSopenharmony_ci } 100617fd14ceSopenharmony_ci return HC_SUCCESS; 100717fd14ceSopenharmony_ci} 100817fd14ceSopenharmony_ci 100917fd14ceSopenharmony_cistatic int32_t AddUserTypeToReturn(const TrustedDeviceEntry *deviceInfo, CJson *json) 101017fd14ceSopenharmony_ci{ 101117fd14ceSopenharmony_ci int userType = deviceInfo->devType; 101217fd14ceSopenharmony_ci if (AddIntToJson(json, FIELD_USER_TYPE, userType) != HC_SUCCESS) { 101317fd14ceSopenharmony_ci LOGE("Failed to add userType to json!"); 101417fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 101517fd14ceSopenharmony_ci } 101617fd14ceSopenharmony_ci return HC_SUCCESS; 101717fd14ceSopenharmony_ci} 101817fd14ceSopenharmony_ci 101917fd14ceSopenharmony_cistatic int32_t GenerateMessage(const TrustedGroupEntry *groupEntry, char **returnGroupInfo) 102017fd14ceSopenharmony_ci{ 102117fd14ceSopenharmony_ci if (groupEntry == NULL) { 102217fd14ceSopenharmony_ci LOGE("groupEntry is null!"); 102317fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 102417fd14ceSopenharmony_ci } 102517fd14ceSopenharmony_ci CJson *message = CreateJson(); 102617fd14ceSopenharmony_ci if (message == NULL) { 102717fd14ceSopenharmony_ci LOGE("Failed to allocate message memory!"); 102817fd14ceSopenharmony_ci return HC_ERR_ALLOC_MEMORY; 102917fd14ceSopenharmony_ci } 103017fd14ceSopenharmony_ci int32_t result = GenerateReturnGroupInfo(groupEntry, message); 103117fd14ceSopenharmony_ci if (result != HC_SUCCESS) { 103217fd14ceSopenharmony_ci FreeJson(message); 103317fd14ceSopenharmony_ci return result; 103417fd14ceSopenharmony_ci } 103517fd14ceSopenharmony_ci char *messageStr = PackJsonToString(message); 103617fd14ceSopenharmony_ci FreeJson(message); 103717fd14ceSopenharmony_ci if (messageStr == NULL) { 103817fd14ceSopenharmony_ci LOGE("Failed to convert json to string!"); 103917fd14ceSopenharmony_ci return HC_ERR_JSON_FAIL; 104017fd14ceSopenharmony_ci } 104117fd14ceSopenharmony_ci *returnGroupInfo = messageStr; 104217fd14ceSopenharmony_ci return HC_SUCCESS; 104317fd14ceSopenharmony_ci} 104417fd14ceSopenharmony_ci 104517fd14ceSopenharmony_cistatic void PostGroupCreatedMsg(const TrustedGroupEntry *groupEntry) 104617fd14ceSopenharmony_ci{ 104717fd14ceSopenharmony_ci if (!IsBroadcastSupported()) { 104817fd14ceSopenharmony_ci return; 104917fd14ceSopenharmony_ci } 105017fd14ceSopenharmony_ci char *messageStr = NULL; 105117fd14ceSopenharmony_ci if (GenerateMessage(groupEntry, &messageStr) != HC_SUCCESS) { 105217fd14ceSopenharmony_ci return; 105317fd14ceSopenharmony_ci } 105417fd14ceSopenharmony_ci GetBroadcaster()->postOnGroupCreated(messageStr); 105517fd14ceSopenharmony_ci FreeJsonString(messageStr); 105617fd14ceSopenharmony_ci} 105717fd14ceSopenharmony_ci 105817fd14ceSopenharmony_cistatic void PostGroupDeletedMsg(const TrustedGroupEntry *groupEntry) 105917fd14ceSopenharmony_ci{ 106017fd14ceSopenharmony_ci if (!IsBroadcastSupported()) { 106117fd14ceSopenharmony_ci return; 106217fd14ceSopenharmony_ci } 106317fd14ceSopenharmony_ci char *messageStr = NULL; 106417fd14ceSopenharmony_ci if (GenerateMessage(groupEntry, &messageStr) != HC_SUCCESS) { 106517fd14ceSopenharmony_ci return; 106617fd14ceSopenharmony_ci } 106717fd14ceSopenharmony_ci GetBroadcaster()->postOnGroupDeleted(messageStr); 106817fd14ceSopenharmony_ci FreeJsonString(messageStr); 106917fd14ceSopenharmony_ci} 107017fd14ceSopenharmony_ci 107117fd14ceSopenharmony_cistatic void PostDeviceBoundMsg(OsAccountTrustedInfo *info, const TrustedDeviceEntry *deviceEntry) 107217fd14ceSopenharmony_ci{ 107317fd14ceSopenharmony_ci if (!IsBroadcastSupported()) { 107417fd14ceSopenharmony_ci return; 107517fd14ceSopenharmony_ci } 107617fd14ceSopenharmony_ci QueryGroupParams groupParams = InitQueryGroupParams(); 107717fd14ceSopenharmony_ci groupParams.groupId = StringGet(&deviceEntry->groupId); 107817fd14ceSopenharmony_ci TrustedGroupEntry **groupEntryPtr = QueryGroupEntryPtrIfMatch(&info->groups, &groupParams); 107917fd14ceSopenharmony_ci if (groupEntryPtr != NULL) { 108017fd14ceSopenharmony_ci char *messageStr = NULL; 108117fd14ceSopenharmony_ci if (GenerateMessage(*groupEntryPtr, &messageStr) != HC_SUCCESS) { 108217fd14ceSopenharmony_ci return; 108317fd14ceSopenharmony_ci } 108417fd14ceSopenharmony_ci GetBroadcaster()->postOnDeviceBound(StringGet(&deviceEntry->udid), messageStr); 108517fd14ceSopenharmony_ci FreeJsonString(messageStr); 108617fd14ceSopenharmony_ci } 108717fd14ceSopenharmony_ci} 108817fd14ceSopenharmony_ci 108917fd14ceSopenharmony_cistatic bool IsSelfDeviceEntry(const TrustedDeviceEntry *deviceEntry) 109017fd14ceSopenharmony_ci{ 109117fd14ceSopenharmony_ci char selfUdid[INPUT_UDID_LEN] = { 0 }; 109217fd14ceSopenharmony_ci int32_t res = HcGetUdid((uint8_t *)selfUdid, INPUT_UDID_LEN); 109317fd14ceSopenharmony_ci if (res != HC_SUCCESS) { 109417fd14ceSopenharmony_ci LOGE("Failed to get local udid! res: %d", res); 109517fd14ceSopenharmony_ci return false; 109617fd14ceSopenharmony_ci } 109717fd14ceSopenharmony_ci const char *entryUdid = StringGet(&deviceEntry->udid); 109817fd14ceSopenharmony_ci if (entryUdid == NULL) { 109917fd14ceSopenharmony_ci LOGE("The entryUdid is NULL!"); 110017fd14ceSopenharmony_ci return false; 110117fd14ceSopenharmony_ci } 110217fd14ceSopenharmony_ci return strcmp(selfUdid, entryUdid) == 0; 110317fd14ceSopenharmony_ci} 110417fd14ceSopenharmony_ci 110517fd14ceSopenharmony_cistatic void PostDeviceUnBoundMsg(OsAccountTrustedInfo *info, const TrustedDeviceEntry *deviceEntry) 110617fd14ceSopenharmony_ci{ 110717fd14ceSopenharmony_ci if (!IsBroadcastSupported()) { 110817fd14ceSopenharmony_ci return; 110917fd14ceSopenharmony_ci } 111017fd14ceSopenharmony_ci const char *groupId = StringGet(&deviceEntry->groupId); 111117fd14ceSopenharmony_ci const char *udid = StringGet(&deviceEntry->udid); 111217fd14ceSopenharmony_ci QueryGroupParams groupParams = InitQueryGroupParams(); 111317fd14ceSopenharmony_ci groupParams.groupId = groupId; 111417fd14ceSopenharmony_ci TrustedGroupEntry **groupEntryPtr = QueryGroupEntryPtrIfMatch(&info->groups, &groupParams); 111517fd14ceSopenharmony_ci if (groupEntryPtr != NULL) { 111617fd14ceSopenharmony_ci char *messageStr = NULL; 111717fd14ceSopenharmony_ci if (GenerateMessage(*groupEntryPtr, &messageStr) != HC_SUCCESS) { 111817fd14ceSopenharmony_ci return; 111917fd14ceSopenharmony_ci } 112017fd14ceSopenharmony_ci GetBroadcaster()->postOnDeviceUnBound(udid, messageStr); 112117fd14ceSopenharmony_ci FreeJsonString(messageStr); 112217fd14ceSopenharmony_ci } 112317fd14ceSopenharmony_ci QueryDeviceParams deviceParams = InitQueryDeviceParams(); 112417fd14ceSopenharmony_ci deviceParams.udid = udid; 112517fd14ceSopenharmony_ci if (QueryDeviceEntryPtrIfMatch(&info->devices, &deviceParams) == NULL) { 112617fd14ceSopenharmony_ci GetBroadcaster()->postOnDeviceNotTrusted(udid); 112717fd14ceSopenharmony_ci if (!IsSelfDeviceEntry(deviceEntry)) { 112817fd14ceSopenharmony_ci (void)DeleteMk(info->osAccountId, udid); 112917fd14ceSopenharmony_ci (void)DeletePseudonymPsk(info->osAccountId, udid); 113017fd14ceSopenharmony_ci } 113117fd14ceSopenharmony_ci } 113217fd14ceSopenharmony_ci} 113317fd14ceSopenharmony_ci 113417fd14ceSopenharmony_cistatic void DeletePdidByDeviceEntry(int32_t osAccountId, const TrustedDeviceEntry *deviceEntry) 113517fd14ceSopenharmony_ci{ 113617fd14ceSopenharmony_ci if (IsSelfDeviceEntry(deviceEntry)) { 113717fd14ceSopenharmony_ci return; 113817fd14ceSopenharmony_ci } 113917fd14ceSopenharmony_ci const char *userId = StringGet(&deviceEntry->userId); 114017fd14ceSopenharmony_ci if (userId == NULL) { 114117fd14ceSopenharmony_ci LOGW("userId is null!"); 114217fd14ceSopenharmony_ci return; 114317fd14ceSopenharmony_ci } 114417fd14ceSopenharmony_ci if (deviceEntry->credential != ASYMMETRIC_CRED) { 114517fd14ceSopenharmony_ci LOGW("credential type is not asymmetric!"); 114617fd14ceSopenharmony_ci return; 114717fd14ceSopenharmony_ci } 114817fd14ceSopenharmony_ci PseudonymManager *manager = GetPseudonymInstance(); 114917fd14ceSopenharmony_ci if (manager == NULL) { 115017fd14ceSopenharmony_ci LOGE("Pseudonym manager is null!"); 115117fd14ceSopenharmony_ci return; 115217fd14ceSopenharmony_ci } 115317fd14ceSopenharmony_ci int32_t res = manager->deletePseudonymId(osAccountId, userId); 115417fd14ceSopenharmony_ci if (res != HC_SUCCESS) { 115517fd14ceSopenharmony_ci LOGE("Failed to delete pdid!"); 115617fd14ceSopenharmony_ci } else { 115717fd14ceSopenharmony_ci LOGI("Delete pdid successfully!"); 115817fd14ceSopenharmony_ci } 115917fd14ceSopenharmony_ci} 116017fd14ceSopenharmony_ci 116117fd14ceSopenharmony_ciQueryGroupParams InitQueryGroupParams(void) 116217fd14ceSopenharmony_ci{ 116317fd14ceSopenharmony_ci QueryGroupParams params = { 116417fd14ceSopenharmony_ci .groupId = NULL, 116517fd14ceSopenharmony_ci .groupName = NULL, 116617fd14ceSopenharmony_ci .ownerName = NULL, 116717fd14ceSopenharmony_ci .userId = NULL, 116817fd14ceSopenharmony_ci .groupType = ALL_GROUP, 116917fd14ceSopenharmony_ci .groupVisibility = ALL_GROUP_VISIBILITY 117017fd14ceSopenharmony_ci }; 117117fd14ceSopenharmony_ci return params; 117217fd14ceSopenharmony_ci} 117317fd14ceSopenharmony_ci 117417fd14ceSopenharmony_ciQueryDeviceParams InitQueryDeviceParams(void) 117517fd14ceSopenharmony_ci{ 117617fd14ceSopenharmony_ci QueryDeviceParams params = { 117717fd14ceSopenharmony_ci .groupId = NULL, 117817fd14ceSopenharmony_ci .udid = NULL, 117917fd14ceSopenharmony_ci .authId = NULL, 118017fd14ceSopenharmony_ci .userId = NULL 118117fd14ceSopenharmony_ci }; 118217fd14ceSopenharmony_ci return params; 118317fd14ceSopenharmony_ci} 118417fd14ceSopenharmony_ci 118517fd14ceSopenharmony_ciTrustedGroupEntry *CreateGroupEntry(void) 118617fd14ceSopenharmony_ci{ 118717fd14ceSopenharmony_ci TrustedGroupEntry *ptr = (TrustedGroupEntry *)HcMalloc(sizeof(TrustedGroupEntry), 0); 118817fd14ceSopenharmony_ci if (ptr == NULL) { 118917fd14ceSopenharmony_ci LOGE("[DB]: Failed to allocate groupEntry memory!"); 119017fd14ceSopenharmony_ci return NULL; 119117fd14ceSopenharmony_ci } 119217fd14ceSopenharmony_ci ptr->name = CreateString(); 119317fd14ceSopenharmony_ci ptr->id = CreateString(); 119417fd14ceSopenharmony_ci ptr->userId = CreateString(); 119517fd14ceSopenharmony_ci ptr->sharedUserId = CreateString(); 119617fd14ceSopenharmony_ci ptr->managers = CreateStrVector(); 119717fd14ceSopenharmony_ci ptr->friends = CreateStrVector(); 119817fd14ceSopenharmony_ci return ptr; 119917fd14ceSopenharmony_ci} 120017fd14ceSopenharmony_ci 120117fd14ceSopenharmony_civoid DestroyGroupEntry(TrustedGroupEntry *groupEntry) 120217fd14ceSopenharmony_ci{ 120317fd14ceSopenharmony_ci if (groupEntry == NULL) { 120417fd14ceSopenharmony_ci return; 120517fd14ceSopenharmony_ci } 120617fd14ceSopenharmony_ci DeleteString(&groupEntry->name); 120717fd14ceSopenharmony_ci DeleteString(&groupEntry->id); 120817fd14ceSopenharmony_ci DeleteString(&groupEntry->userId); 120917fd14ceSopenharmony_ci DeleteString(&groupEntry->sharedUserId); 121017fd14ceSopenharmony_ci DestroyStrVector(&groupEntry->managers); 121117fd14ceSopenharmony_ci DestroyStrVector(&groupEntry->friends); 121217fd14ceSopenharmony_ci HcFree(groupEntry); 121317fd14ceSopenharmony_ci} 121417fd14ceSopenharmony_ci 121517fd14ceSopenharmony_ciTrustedGroupEntry *DeepCopyGroupEntry(const TrustedGroupEntry *entry) 121617fd14ceSopenharmony_ci{ 121717fd14ceSopenharmony_ci TrustedGroupEntry *returnEntry = CreateGroupEntry(); 121817fd14ceSopenharmony_ci if (returnEntry == NULL) { 121917fd14ceSopenharmony_ci return NULL; 122017fd14ceSopenharmony_ci } 122117fd14ceSopenharmony_ci if (!GenerateGroupEntryFromEntry(entry, returnEntry)) { 122217fd14ceSopenharmony_ci DestroyGroupEntry(returnEntry); 122317fd14ceSopenharmony_ci return NULL; 122417fd14ceSopenharmony_ci } 122517fd14ceSopenharmony_ci return returnEntry; 122617fd14ceSopenharmony_ci} 122717fd14ceSopenharmony_ci 122817fd14ceSopenharmony_ciTrustedDeviceEntry *CreateDeviceEntry(void) 122917fd14ceSopenharmony_ci{ 123017fd14ceSopenharmony_ci TrustedDeviceEntry *ptr = (TrustedDeviceEntry *)HcMalloc(sizeof(TrustedDeviceEntry), 0); 123117fd14ceSopenharmony_ci if (ptr == NULL) { 123217fd14ceSopenharmony_ci LOGE("[DB]: Failed to allocate deviceEntry memory!"); 123317fd14ceSopenharmony_ci return NULL; 123417fd14ceSopenharmony_ci } 123517fd14ceSopenharmony_ci ptr->groupId = CreateString(); 123617fd14ceSopenharmony_ci ptr->udid = CreateString(); 123717fd14ceSopenharmony_ci ptr->authId = CreateString(); 123817fd14ceSopenharmony_ci ptr->userId = CreateString(); 123917fd14ceSopenharmony_ci ptr->serviceType = CreateString(); 124017fd14ceSopenharmony_ci ptr->ext = CreateParcel(0, 0); 124117fd14ceSopenharmony_ci return ptr; 124217fd14ceSopenharmony_ci} 124317fd14ceSopenharmony_ci 124417fd14ceSopenharmony_civoid DestroyDeviceEntry(TrustedDeviceEntry *deviceEntry) 124517fd14ceSopenharmony_ci{ 124617fd14ceSopenharmony_ci if (deviceEntry == NULL) { 124717fd14ceSopenharmony_ci return; 124817fd14ceSopenharmony_ci } 124917fd14ceSopenharmony_ci DeleteString(&deviceEntry->groupId); 125017fd14ceSopenharmony_ci DeleteString(&deviceEntry->udid); 125117fd14ceSopenharmony_ci DeleteString(&deviceEntry->authId); 125217fd14ceSopenharmony_ci DeleteString(&deviceEntry->userId); 125317fd14ceSopenharmony_ci DeleteString(&deviceEntry->serviceType); 125417fd14ceSopenharmony_ci DeleteParcel(&deviceEntry->ext); 125517fd14ceSopenharmony_ci HcFree(deviceEntry); 125617fd14ceSopenharmony_ci} 125717fd14ceSopenharmony_ci 125817fd14ceSopenharmony_ciTrustedDeviceEntry *DeepCopyDeviceEntry(const TrustedDeviceEntry *entry) 125917fd14ceSopenharmony_ci{ 126017fd14ceSopenharmony_ci if (entry == NULL) { 126117fd14ceSopenharmony_ci return NULL; 126217fd14ceSopenharmony_ci } 126317fd14ceSopenharmony_ci TrustedDeviceEntry *returnEntry = CreateDeviceEntry(); 126417fd14ceSopenharmony_ci if (returnEntry == NULL) { 126517fd14ceSopenharmony_ci return NULL; 126617fd14ceSopenharmony_ci } 126717fd14ceSopenharmony_ci if (!GenerateDeviceEntryFromEntry(entry, returnEntry)) { 126817fd14ceSopenharmony_ci DestroyDeviceEntry(returnEntry); 126917fd14ceSopenharmony_ci return NULL; 127017fd14ceSopenharmony_ci } 127117fd14ceSopenharmony_ci return returnEntry; 127217fd14ceSopenharmony_ci} 127317fd14ceSopenharmony_ci 127417fd14ceSopenharmony_civoid ClearGroupEntryVec(GroupEntryVec *vec) 127517fd14ceSopenharmony_ci{ 127617fd14ceSopenharmony_ci uint32_t index; 127717fd14ceSopenharmony_ci TrustedGroupEntry **entry; 127817fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(*vec, index, entry) { 127917fd14ceSopenharmony_ci DestroyGroupEntry(*entry); 128017fd14ceSopenharmony_ci } 128117fd14ceSopenharmony_ci DESTROY_HC_VECTOR(GroupEntryVec, vec); 128217fd14ceSopenharmony_ci} 128317fd14ceSopenharmony_ci 128417fd14ceSopenharmony_civoid ClearDeviceEntryVec(DeviceEntryVec *vec) 128517fd14ceSopenharmony_ci{ 128617fd14ceSopenharmony_ci uint32_t index; 128717fd14ceSopenharmony_ci TrustedDeviceEntry **entry; 128817fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(*vec, index, entry) { 128917fd14ceSopenharmony_ci DestroyDeviceEntry(*entry); 129017fd14ceSopenharmony_ci } 129117fd14ceSopenharmony_ci DESTROY_HC_VECTOR(DeviceEntryVec, vec); 129217fd14ceSopenharmony_ci} 129317fd14ceSopenharmony_ci 129417fd14ceSopenharmony_ciint32_t GenerateReturnGroupInfo(const TrustedGroupEntry *groupEntry, CJson *returnJson) 129517fd14ceSopenharmony_ci{ 129617fd14ceSopenharmony_ci int32_t result; 129717fd14ceSopenharmony_ci if (((result = AddGroupNameToReturn(groupEntry, returnJson)) != HC_SUCCESS) || 129817fd14ceSopenharmony_ci ((result = AddGroupIdToReturn(groupEntry, returnJson)) != HC_SUCCESS) || 129917fd14ceSopenharmony_ci ((result = AddGroupOwnerToReturn(groupEntry, returnJson)) != HC_SUCCESS) || 130017fd14ceSopenharmony_ci ((result = AddGroupTypeToReturn(groupEntry, returnJson)) != HC_SUCCESS) || 130117fd14ceSopenharmony_ci ((result = AddGroupVisibilityToReturn(groupEntry, returnJson)) != HC_SUCCESS) || 130217fd14ceSopenharmony_ci ((result = AddUserIdToReturnIfAccountGroup(groupEntry, returnJson)) != HC_SUCCESS) || 130317fd14ceSopenharmony_ci ((result = AddSharedUserIdToReturnIfAcrossAccountGroup(groupEntry, returnJson)) != HC_SUCCESS)) { 130417fd14ceSopenharmony_ci return result; 130517fd14ceSopenharmony_ci } 130617fd14ceSopenharmony_ci return HC_SUCCESS; 130717fd14ceSopenharmony_ci} 130817fd14ceSopenharmony_ci 130917fd14ceSopenharmony_ciint32_t GenerateReturnDevInfo(const TrustedDeviceEntry *deviceEntry, CJson *returnJson) 131017fd14ceSopenharmony_ci{ 131117fd14ceSopenharmony_ci int32_t result; 131217fd14ceSopenharmony_ci if (((result = AddAuthIdToReturn(deviceEntry, returnJson)) != HC_SUCCESS) || 131317fd14ceSopenharmony_ci ((result = AddCredentialTypeToReturn(deviceEntry, returnJson)) != HC_SUCCESS) || 131417fd14ceSopenharmony_ci ((result = AddUserTypeToReturn(deviceEntry, returnJson)) != HC_SUCCESS)) { 131517fd14ceSopenharmony_ci return result; 131617fd14ceSopenharmony_ci } 131717fd14ceSopenharmony_ci return HC_SUCCESS; 131817fd14ceSopenharmony_ci} 131917fd14ceSopenharmony_ci 132017fd14ceSopenharmony_ciint32_t AddGroup(int32_t osAccountId, const TrustedGroupEntry *groupEntry) 132117fd14ceSopenharmony_ci{ 132217fd14ceSopenharmony_ci LOGI("[DB]: Start to add a group to database! [OsAccountId]: %d", osAccountId); 132317fd14ceSopenharmony_ci if (groupEntry == NULL) { 132417fd14ceSopenharmony_ci LOGE("[DB]: The input groupEntry is NULL!"); 132517fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 132617fd14ceSopenharmony_ci } 132717fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 132817fd14ceSopenharmony_ci OsAccountTrustedInfo *info = GetTrustedInfoByOsAccountId(osAccountId); 132917fd14ceSopenharmony_ci if (info == NULL) { 133017fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 133117fd14ceSopenharmony_ci return HC_ERR_INVALID_PARAMS; 133217fd14ceSopenharmony_ci } 133317fd14ceSopenharmony_ci TrustedGroupEntry *newEntry = DeepCopyGroupEntry(groupEntry); 133417fd14ceSopenharmony_ci if (newEntry == NULL) { 133517fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 133617fd14ceSopenharmony_ci return HC_ERR_MEMORY_COPY; 133717fd14ceSopenharmony_ci } 133817fd14ceSopenharmony_ci QueryGroupParams params = InitQueryGroupParams(); 133917fd14ceSopenharmony_ci params.groupId = StringGet(&groupEntry->id); 134017fd14ceSopenharmony_ci TrustedGroupEntry **oldEntryPtr = QueryGroupEntryPtrIfMatch(&info->groups, ¶ms); 134117fd14ceSopenharmony_ci if (oldEntryPtr != NULL) { 134217fd14ceSopenharmony_ci DestroyGroupEntry(*oldEntryPtr); 134317fd14ceSopenharmony_ci *oldEntryPtr = newEntry; 134417fd14ceSopenharmony_ci PostGroupCreatedMsg(newEntry); 134517fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 134617fd14ceSopenharmony_ci LOGI("[DB]: Replace an old group successfully! [GroupType]: %u", groupEntry->type); 134717fd14ceSopenharmony_ci return HC_SUCCESS; 134817fd14ceSopenharmony_ci } 134917fd14ceSopenharmony_ci if (info->groups.pushBackT(&info->groups, newEntry) == NULL) { 135017fd14ceSopenharmony_ci DestroyGroupEntry(newEntry); 135117fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 135217fd14ceSopenharmony_ci LOGE("[DB]: Failed to push groupEntry to vec!"); 135317fd14ceSopenharmony_ci return HC_ERR_MEMORY_COPY; 135417fd14ceSopenharmony_ci } 135517fd14ceSopenharmony_ci PostGroupCreatedMsg(newEntry); 135617fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 135717fd14ceSopenharmony_ci LOGI("[DB]: Add a group to database successfully! [GroupType]: %u", groupEntry->type); 135817fd14ceSopenharmony_ci return HC_SUCCESS; 135917fd14ceSopenharmony_ci} 136017fd14ceSopenharmony_ci 136117fd14ceSopenharmony_ciint32_t AddTrustedDevice(int32_t osAccountId, const TrustedDeviceEntry *deviceEntry) 136217fd14ceSopenharmony_ci{ 136317fd14ceSopenharmony_ci LOGI("[DB]: Start to add a trusted device to database! [OsAccountId]: %d", osAccountId); 136417fd14ceSopenharmony_ci if (deviceEntry == NULL) { 136517fd14ceSopenharmony_ci LOGE("[DB]: The input deviceEntry is NULL!"); 136617fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 136717fd14ceSopenharmony_ci } 136817fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 136917fd14ceSopenharmony_ci OsAccountTrustedInfo *info = GetTrustedInfoByOsAccountId(osAccountId); 137017fd14ceSopenharmony_ci if (info == NULL) { 137117fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 137217fd14ceSopenharmony_ci return HC_ERR_INVALID_PARAMS; 137317fd14ceSopenharmony_ci } 137417fd14ceSopenharmony_ci TrustedDeviceEntry *newEntry = DeepCopyDeviceEntry(deviceEntry); 137517fd14ceSopenharmony_ci if (newEntry == NULL) { 137617fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 137717fd14ceSopenharmony_ci return HC_ERR_MEMORY_COPY; 137817fd14ceSopenharmony_ci } 137917fd14ceSopenharmony_ci QueryDeviceParams params = InitQueryDeviceParams(); 138017fd14ceSopenharmony_ci params.udid = StringGet(&deviceEntry->udid); 138117fd14ceSopenharmony_ci params.groupId = StringGet(&deviceEntry->groupId); 138217fd14ceSopenharmony_ci TrustedDeviceEntry **oldEntryPtr = QueryDeviceEntryPtrIfMatch(&info->devices, ¶ms); 138317fd14ceSopenharmony_ci if (oldEntryPtr != NULL) { 138417fd14ceSopenharmony_ci DestroyDeviceEntry(*oldEntryPtr); 138517fd14ceSopenharmony_ci *oldEntryPtr = newEntry; 138617fd14ceSopenharmony_ci PostDeviceBoundMsg(info, newEntry); 138717fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 138817fd14ceSopenharmony_ci LOGI("[DB]: Replace an old trusted device successfully!"); 138917fd14ceSopenharmony_ci return HC_SUCCESS; 139017fd14ceSopenharmony_ci } 139117fd14ceSopenharmony_ci if (info->devices.pushBackT(&info->devices, newEntry) == NULL) { 139217fd14ceSopenharmony_ci DestroyDeviceEntry(newEntry); 139317fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 139417fd14ceSopenharmony_ci LOGE("[DB]: Failed to push deviceEntry to vec!"); 139517fd14ceSopenharmony_ci return HC_ERR_MEMORY_COPY; 139617fd14ceSopenharmony_ci } 139717fd14ceSopenharmony_ci PostDeviceBoundMsg(info, newEntry); 139817fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 139917fd14ceSopenharmony_ci LOGI("[DB]: Add a trusted device to database successfully!"); 140017fd14ceSopenharmony_ci return HC_SUCCESS; 140117fd14ceSopenharmony_ci} 140217fd14ceSopenharmony_ci 140317fd14ceSopenharmony_ciint32_t DelGroup(int32_t osAccountId, const QueryGroupParams *params) 140417fd14ceSopenharmony_ci{ 140517fd14ceSopenharmony_ci LOGI("[DB]: Start to delete groups from database! [OsAccountId]: %d", osAccountId); 140617fd14ceSopenharmony_ci if (params == NULL) { 140717fd14ceSopenharmony_ci LOGE("[DB]: The input params is NULL!"); 140817fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 140917fd14ceSopenharmony_ci } 141017fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 141117fd14ceSopenharmony_ci OsAccountTrustedInfo *info = GetTrustedInfoByOsAccountId(osAccountId); 141217fd14ceSopenharmony_ci if (info == NULL) { 141317fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 141417fd14ceSopenharmony_ci return HC_ERR_INVALID_PARAMS; 141517fd14ceSopenharmony_ci } 141617fd14ceSopenharmony_ci int32_t count = 0; 141717fd14ceSopenharmony_ci uint32_t index = 0; 141817fd14ceSopenharmony_ci TrustedGroupEntry **entry = NULL; 141917fd14ceSopenharmony_ci while (index < HC_VECTOR_SIZE(&info->groups)) { 142017fd14ceSopenharmony_ci entry = info->groups.getp(&info->groups, index); 142117fd14ceSopenharmony_ci if ((entry == NULL) || (*entry == NULL) || (!CompareQueryGroupParams(params, *entry))) { 142217fd14ceSopenharmony_ci index++; 142317fd14ceSopenharmony_ci continue; 142417fd14ceSopenharmony_ci } 142517fd14ceSopenharmony_ci TrustedGroupEntry *popEntry; 142617fd14ceSopenharmony_ci HC_VECTOR_POPELEMENT(&info->groups, &popEntry, index); 142717fd14ceSopenharmony_ci PostGroupDeletedMsg(popEntry); 142817fd14ceSopenharmony_ci LOGI("[DB]: Delete a group from database successfully! [GroupType]: %u", popEntry->type); 142917fd14ceSopenharmony_ci DestroyGroupEntry(popEntry); 143017fd14ceSopenharmony_ci count++; 143117fd14ceSopenharmony_ci } 143217fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 143317fd14ceSopenharmony_ci LOGI("[DB]: Number of groups deleted: %d", count); 143417fd14ceSopenharmony_ci return HC_SUCCESS; 143517fd14ceSopenharmony_ci} 143617fd14ceSopenharmony_ci 143717fd14ceSopenharmony_ciint32_t DelTrustedDevice(int32_t osAccountId, const QueryDeviceParams *params) 143817fd14ceSopenharmony_ci{ 143917fd14ceSopenharmony_ci LOGI("[DB]: Start to delete devices from database! [OsAccountId]: %d", osAccountId); 144017fd14ceSopenharmony_ci if (params == NULL) { 144117fd14ceSopenharmony_ci LOGE("[DB]: The input params is NULL!"); 144217fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 144317fd14ceSopenharmony_ci } 144417fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 144517fd14ceSopenharmony_ci OsAccountTrustedInfo *info = GetTrustedInfoByOsAccountId(osAccountId); 144617fd14ceSopenharmony_ci if (info == NULL) { 144717fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 144817fd14ceSopenharmony_ci return HC_ERR_INVALID_PARAMS; 144917fd14ceSopenharmony_ci } 145017fd14ceSopenharmony_ci int32_t count = 0; 145117fd14ceSopenharmony_ci uint32_t index = 0; 145217fd14ceSopenharmony_ci TrustedDeviceEntry **entry = NULL; 145317fd14ceSopenharmony_ci while (index < HC_VECTOR_SIZE(&info->devices)) { 145417fd14ceSopenharmony_ci entry = info->devices.getp(&info->devices, index); 145517fd14ceSopenharmony_ci if ((entry == NULL) || (*entry == NULL) || (!CompareQueryDeviceParams(params, *entry))) { 145617fd14ceSopenharmony_ci index++; 145717fd14ceSopenharmony_ci continue; 145817fd14ceSopenharmony_ci } 145917fd14ceSopenharmony_ci TrustedDeviceEntry *popEntry; 146017fd14ceSopenharmony_ci HC_VECTOR_POPELEMENT(&info->devices, &popEntry, index); 146117fd14ceSopenharmony_ci PostDeviceUnBoundMsg(info, popEntry); 146217fd14ceSopenharmony_ci DeletePdidByDeviceEntry(osAccountId, popEntry); 146317fd14ceSopenharmony_ci LOGI("[DB]: Delete a trusted device from database successfully!"); 146417fd14ceSopenharmony_ci DestroyDeviceEntry(popEntry); 146517fd14ceSopenharmony_ci count++; 146617fd14ceSopenharmony_ci } 146717fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 146817fd14ceSopenharmony_ci LOGI("[DB]: Number of trusted devices deleted: %d", count); 146917fd14ceSopenharmony_ci return HC_SUCCESS; 147017fd14ceSopenharmony_ci} 147117fd14ceSopenharmony_ci 147217fd14ceSopenharmony_ciint32_t QueryGroups(int32_t osAccountId, const QueryGroupParams *params, GroupEntryVec *vec) 147317fd14ceSopenharmony_ci{ 147417fd14ceSopenharmony_ci if ((params == NULL) || (vec == NULL)) { 147517fd14ceSopenharmony_ci LOGE("[DB]: The input params or vec is NULL!"); 147617fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 147717fd14ceSopenharmony_ci } 147817fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 147917fd14ceSopenharmony_ci OsAccountTrustedInfo *info = GetTrustedInfoByOsAccountId(osAccountId); 148017fd14ceSopenharmony_ci if (info == NULL) { 148117fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 148217fd14ceSopenharmony_ci return HC_ERR_INVALID_PARAMS; 148317fd14ceSopenharmony_ci } 148417fd14ceSopenharmony_ci uint32_t index; 148517fd14ceSopenharmony_ci TrustedGroupEntry **entry; 148617fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(info->groups, index, entry) { 148717fd14ceSopenharmony_ci if (!CompareQueryGroupParams(params, *entry)) { 148817fd14ceSopenharmony_ci continue; 148917fd14ceSopenharmony_ci } 149017fd14ceSopenharmony_ci TrustedGroupEntry *newEntry = DeepCopyGroupEntry(*entry); 149117fd14ceSopenharmony_ci if (newEntry == NULL) { 149217fd14ceSopenharmony_ci continue; 149317fd14ceSopenharmony_ci } 149417fd14ceSopenharmony_ci if (vec->pushBackT(vec, newEntry) == NULL) { 149517fd14ceSopenharmony_ci LOGE("[DB]: Failed to push entry to vec!"); 149617fd14ceSopenharmony_ci DestroyGroupEntry(newEntry); 149717fd14ceSopenharmony_ci } 149817fd14ceSopenharmony_ci } 149917fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 150017fd14ceSopenharmony_ci return HC_SUCCESS; 150117fd14ceSopenharmony_ci} 150217fd14ceSopenharmony_ci 150317fd14ceSopenharmony_ciint32_t QueryDevices(int32_t osAccountId, const QueryDeviceParams *params, DeviceEntryVec *vec) 150417fd14ceSopenharmony_ci{ 150517fd14ceSopenharmony_ci if ((params == NULL) || (vec == NULL)) { 150617fd14ceSopenharmony_ci LOGE("[DB]: The input params or vec is NULL!"); 150717fd14ceSopenharmony_ci return HC_ERR_NULL_PTR; 150817fd14ceSopenharmony_ci } 150917fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 151017fd14ceSopenharmony_ci OsAccountTrustedInfo *info = GetTrustedInfoByOsAccountId(osAccountId); 151117fd14ceSopenharmony_ci if (info == NULL) { 151217fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 151317fd14ceSopenharmony_ci return HC_ERR_INVALID_PARAMS; 151417fd14ceSopenharmony_ci } 151517fd14ceSopenharmony_ci uint32_t index; 151617fd14ceSopenharmony_ci TrustedDeviceEntry **entry; 151717fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(info->devices, index, entry) { 151817fd14ceSopenharmony_ci if (!CompareQueryDeviceParams(params, *entry)) { 151917fd14ceSopenharmony_ci continue; 152017fd14ceSopenharmony_ci } 152117fd14ceSopenharmony_ci TrustedDeviceEntry *newEntry = DeepCopyDeviceEntry(*entry); 152217fd14ceSopenharmony_ci if (newEntry == NULL) { 152317fd14ceSopenharmony_ci continue; 152417fd14ceSopenharmony_ci } 152517fd14ceSopenharmony_ci if (vec->pushBackT(vec, newEntry) == NULL) { 152617fd14ceSopenharmony_ci LOGE("[DB]: Failed to push entry to vec!"); 152717fd14ceSopenharmony_ci DestroyDeviceEntry(newEntry); 152817fd14ceSopenharmony_ci } 152917fd14ceSopenharmony_ci } 153017fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 153117fd14ceSopenharmony_ci return HC_SUCCESS; 153217fd14ceSopenharmony_ci} 153317fd14ceSopenharmony_ci 153417fd14ceSopenharmony_ciint32_t SaveOsAccountDb(int32_t osAccountId) 153517fd14ceSopenharmony_ci{ 153617fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 153717fd14ceSopenharmony_ci OsAccountTrustedInfo *info = GetTrustedInfoByOsAccountId(osAccountId); 153817fd14ceSopenharmony_ci if (info == NULL) { 153917fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 154017fd14ceSopenharmony_ci return HC_ERR_INVALID_PARAMS; 154117fd14ceSopenharmony_ci } 154217fd14ceSopenharmony_ci HcParcel parcel = CreateParcel(0, 0); 154317fd14ceSopenharmony_ci if (!SaveInfoToParcel(info, &parcel)) { 154417fd14ceSopenharmony_ci DeleteParcel(&parcel); 154517fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 154617fd14ceSopenharmony_ci return HC_ERR_MEMORY_COPY; 154717fd14ceSopenharmony_ci } 154817fd14ceSopenharmony_ci char filePath[MAX_DB_PATH_LEN] = { 0 }; 154917fd14ceSopenharmony_ci if (!GetOsAccountInfoPath(osAccountId, filePath, MAX_DB_PATH_LEN)) { 155017fd14ceSopenharmony_ci DeleteParcel(&parcel); 155117fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 155217fd14ceSopenharmony_ci return HC_ERROR; 155317fd14ceSopenharmony_ci } 155417fd14ceSopenharmony_ci if (!SaveParcelToFile(filePath, &parcel)) { 155517fd14ceSopenharmony_ci DeleteParcel(&parcel); 155617fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 155717fd14ceSopenharmony_ci return HC_ERR_MEMORY_COPY; 155817fd14ceSopenharmony_ci } 155917fd14ceSopenharmony_ci DeleteParcel(&parcel); 156017fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 156117fd14ceSopenharmony_ci LOGI("[DB]: Save an os account database successfully! [Id]: %d", osAccountId); 156217fd14ceSopenharmony_ci return HC_SUCCESS; 156317fd14ceSopenharmony_ci} 156417fd14ceSopenharmony_ci 156517fd14ceSopenharmony_civoid ReloadOsAccountDb(int32_t osAccountId) 156617fd14ceSopenharmony_ci{ 156717fd14ceSopenharmony_ci if (g_databaseMutex == NULL) { 156817fd14ceSopenharmony_ci LOGE("[DB]: not initialized!"); 156917fd14ceSopenharmony_ci return; 157017fd14ceSopenharmony_ci } 157117fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 157217fd14ceSopenharmony_ci LoadOsAccountDbCe(osAccountId); 157317fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 157417fd14ceSopenharmony_ci} 157517fd14ceSopenharmony_ci 157617fd14ceSopenharmony_ci#ifdef DEV_AUTH_HIVIEW_ENABLE 157717fd14ceSopenharmony_cistatic void DumpGroup(int fd, const TrustedGroupEntry *group) 157817fd14ceSopenharmony_ci{ 157917fd14ceSopenharmony_ci dprintf(fd, "||----------------------------Group----------------------------| |\n"); 158017fd14ceSopenharmony_ci dprintf(fd, "||%-12s = %-46.8s| |\n", "name", StringGet(&group->name)); 158117fd14ceSopenharmony_ci dprintf(fd, "||%-12s = %-46.8s| |\n", "id", StringGet(&group->id)); 158217fd14ceSopenharmony_ci dprintf(fd, "||%-12s = %-46d| |\n", "type", group->type); 158317fd14ceSopenharmony_ci dprintf(fd, "||%-12s = %-46d| |\n", "visibility", group->visibility); 158417fd14ceSopenharmony_ci dprintf(fd, "||%-12s = %-46d| |\n", "upgradeFlag", group->upgradeFlag); 158517fd14ceSopenharmony_ci dprintf(fd, "||%-12s = %-46d| |\n", "expireTime", group->expireTime); 158617fd14ceSopenharmony_ci HcString entryOwner = HC_VECTOR_GET(&group->managers, 0); 158717fd14ceSopenharmony_ci dprintf(fd, "||%-12s = %-46.8s| |\n", "ownerName", StringGet(&entryOwner)); 158817fd14ceSopenharmony_ci dprintf(fd, "||%-12s = %-46.8s| |\n", "userId", StringGet(&group->userId)); 158917fd14ceSopenharmony_ci dprintf(fd, "||%-12s = %-46.8s| |\n", "sharedUserId", StringGet(&group->sharedUserId)); 159017fd14ceSopenharmony_ci dprintf(fd, "||----------------------------Group----------------------------| |\n"); 159117fd14ceSopenharmony_ci} 159217fd14ceSopenharmony_ci 159317fd14ceSopenharmony_cistatic void DumpDevice(int fd, const TrustedDeviceEntry *device) 159417fd14ceSopenharmony_ci{ 159517fd14ceSopenharmony_ci dprintf(fd, "|||--------------------DEV--------------------| |\n"); 159617fd14ceSopenharmony_ci dprintf(fd, "|||%-12s = %-28.8s| |\n", "groupId", StringGet(&device->groupId)); 159717fd14ceSopenharmony_ci dprintf(fd, "|||%-12s = %-28.8s| |\n", "udid", StringGet(&device->udid)); 159817fd14ceSopenharmony_ci dprintf(fd, "|||%-12s = %-28.8s| |\n", "authId", StringGet(&device->authId)); 159917fd14ceSopenharmony_ci dprintf(fd, "|||%-12s = %-28.8s| |\n", "userId", StringGet(&device->userId)); 160017fd14ceSopenharmony_ci dprintf(fd, "|||%-12s = %-28.8s| |\n", "serviceType", 160117fd14ceSopenharmony_ci StringGet(&device->serviceType)); 160217fd14ceSopenharmony_ci dprintf(fd, "|||%-12s = %-28d| |\n", "credential", device->credential); 160317fd14ceSopenharmony_ci dprintf(fd, "|||%-12s = %-28d| |\n", "devType", device->devType); 160417fd14ceSopenharmony_ci dprintf(fd, "|||%-12s = %-28d| |\n", "upgradeFlag", device->upgradeFlag); 160517fd14ceSopenharmony_ci dprintf(fd, "|||%-12s = %-28d| |\n", "credSource", device->source); 160617fd14ceSopenharmony_ci dprintf(fd, "|||--------------------DEV--------------------| |\n"); 160717fd14ceSopenharmony_ci} 160817fd14ceSopenharmony_ci 160917fd14ceSopenharmony_cistatic void DumpDb(int fd, const OsAccountTrustedInfo *db) 161017fd14ceSopenharmony_ci{ 161117fd14ceSopenharmony_ci const GroupEntryVec *groups = &db->groups; 161217fd14ceSopenharmony_ci const DeviceEntryVec *devices = &db->devices; 161317fd14ceSopenharmony_ci dprintf(fd, "|-------------------------------------DataBase-------------------------------------|\n"); 161417fd14ceSopenharmony_ci dprintf(fd, "|%-12s = %-67d|\n", "osAccountId", db->osAccountId); 161517fd14ceSopenharmony_ci dprintf(fd, "|%-12s = %-67d|\n", "groupNum", groups->size(groups)); 161617fd14ceSopenharmony_ci dprintf(fd, "|%-12s = %-67d|\n", "deviceNum", devices->size(devices)); 161717fd14ceSopenharmony_ci uint32_t index; 161817fd14ceSopenharmony_ci TrustedGroupEntry **groupEntry; 161917fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(*groups, index, groupEntry) { 162017fd14ceSopenharmony_ci DumpGroup(fd, *groupEntry); 162117fd14ceSopenharmony_ci } 162217fd14ceSopenharmony_ci TrustedDeviceEntry **deviceEntry; 162317fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(*devices, index, deviceEntry) { 162417fd14ceSopenharmony_ci DumpDevice(fd, *deviceEntry); 162517fd14ceSopenharmony_ci } 162617fd14ceSopenharmony_ci dprintf(fd, "|-------------------------------------DataBase-------------------------------------|\n"); 162717fd14ceSopenharmony_ci} 162817fd14ceSopenharmony_ci 162917fd14ceSopenharmony_cistatic void LoadAllAccountsData(void) 163017fd14ceSopenharmony_ci{ 163117fd14ceSopenharmony_ci int32_t *accountIds = NULL; 163217fd14ceSopenharmony_ci uint32_t size = 0; 163317fd14ceSopenharmony_ci int32_t ret = GetAllOsAccountIds(&accountIds, &size); 163417fd14ceSopenharmony_ci if (ret != HC_SUCCESS) { 163517fd14ceSopenharmony_ci LOGE("[DB]: Failed to get all os account ids, [res]: %d", ret); 163617fd14ceSopenharmony_ci return; 163717fd14ceSopenharmony_ci } 163817fd14ceSopenharmony_ci for (uint32_t index = 0; index < size; index++) { 163917fd14ceSopenharmony_ci LoadDataIfNotLoaded(accountIds[index]); 164017fd14ceSopenharmony_ci } 164117fd14ceSopenharmony_ci HcFree(accountIds); 164217fd14ceSopenharmony_ci} 164317fd14ceSopenharmony_ci 164417fd14ceSopenharmony_cistatic void DevAuthDataBaseDump(int fd) 164517fd14ceSopenharmony_ci{ 164617fd14ceSopenharmony_ci if (g_databaseMutex == NULL) { 164717fd14ceSopenharmony_ci LOGE("[DB]: Init mutex failed"); 164817fd14ceSopenharmony_ci return; 164917fd14ceSopenharmony_ci } 165017fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 165117fd14ceSopenharmony_ci if (IsOsAccountSupported()) { 165217fd14ceSopenharmony_ci LoadAllAccountsData(); 165317fd14ceSopenharmony_ci } 165417fd14ceSopenharmony_ci uint32_t index; 165517fd14ceSopenharmony_ci OsAccountTrustedInfo *info; 165617fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(g_deviceauthDb, index, info) { 165717fd14ceSopenharmony_ci DumpDb(fd, info); 165817fd14ceSopenharmony_ci } 165917fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 166017fd14ceSopenharmony_ci} 166117fd14ceSopenharmony_ci#endif 166217fd14ceSopenharmony_ci 166317fd14ceSopenharmony_ciint32_t InitDatabase(void) 166417fd14ceSopenharmony_ci{ 166517fd14ceSopenharmony_ci if (g_databaseMutex == NULL) { 166617fd14ceSopenharmony_ci g_databaseMutex = (HcMutex *)HcMalloc(sizeof(HcMutex), 0); 166717fd14ceSopenharmony_ci if (g_databaseMutex == NULL) { 166817fd14ceSopenharmony_ci LOGE("[DB]: Alloc databaseMutex failed"); 166917fd14ceSopenharmony_ci return HC_ERR_ALLOC_MEMORY; 167017fd14ceSopenharmony_ci } 167117fd14ceSopenharmony_ci if (InitHcMutex(g_databaseMutex) != HC_SUCCESS) { 167217fd14ceSopenharmony_ci LOGE("[DB]: Init mutex failed"); 167317fd14ceSopenharmony_ci HcFree(g_databaseMutex); 167417fd14ceSopenharmony_ci g_databaseMutex = NULL; 167517fd14ceSopenharmony_ci return HC_ERROR; 167617fd14ceSopenharmony_ci } 167717fd14ceSopenharmony_ci } 167817fd14ceSopenharmony_ci g_deviceauthDb = CREATE_HC_VECTOR(DeviceAuthDb); 167917fd14ceSopenharmony_ci AddOsAccountEventCallback(GROUP_DATA_CALLBACK, OnOsAccountUnlocked, OnOsAccountRemoved); 168017fd14ceSopenharmony_ci LoadDeviceAuthDb(); 168117fd14ceSopenharmony_ci DEV_AUTH_REG_DUMP_FUNC(DevAuthDataBaseDump); 168217fd14ceSopenharmony_ci return HC_SUCCESS; 168317fd14ceSopenharmony_ci} 168417fd14ceSopenharmony_ci 168517fd14ceSopenharmony_civoid DestroyDatabase(void) 168617fd14ceSopenharmony_ci{ 168717fd14ceSopenharmony_ci RemoveOsAccountEventCallback(GROUP_DATA_CALLBACK); 168817fd14ceSopenharmony_ci (void)LockHcMutex(g_databaseMutex); 168917fd14ceSopenharmony_ci uint32_t index; 169017fd14ceSopenharmony_ci OsAccountTrustedInfo *info; 169117fd14ceSopenharmony_ci FOR_EACH_HC_VECTOR(g_deviceauthDb, index, info) { 169217fd14ceSopenharmony_ci ClearGroupEntryVec(&info->groups); 169317fd14ceSopenharmony_ci ClearDeviceEntryVec(&info->devices); 169417fd14ceSopenharmony_ci } 169517fd14ceSopenharmony_ci DESTROY_HC_VECTOR(DeviceAuthDb, &g_deviceauthDb); 169617fd14ceSopenharmony_ci UnlockHcMutex(g_databaseMutex); 169717fd14ceSopenharmony_ci DestroyHcMutex(g_databaseMutex); 169817fd14ceSopenharmony_ci HcFree(g_databaseMutex); 169917fd14ceSopenharmony_ci g_databaseMutex = NULL; 170017fd14ceSopenharmony_ci}