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, &params);
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, &params);
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}