117fd14ceSopenharmony_ci/*
217fd14ceSopenharmony_ci * Copyright (C) 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 "pseudonym_manager.h"
1717fd14ceSopenharmony_ci
1817fd14ceSopenharmony_ci#include "string_util.h"
1917fd14ceSopenharmony_ci#include "hc_dev_info.h"
2017fd14ceSopenharmony_ci#include "hc_file.h"
2117fd14ceSopenharmony_ci#include "hc_log.h"
2217fd14ceSopenharmony_ci#include "hc_mutex.h"
2317fd14ceSopenharmony_ci#include "hc_time.h"
2417fd14ceSopenharmony_ci#include "hc_types.h"
2517fd14ceSopenharmony_ci#include "hc_vector.h"
2617fd14ceSopenharmony_ci#include "os_account_adapter.h"
2717fd14ceSopenharmony_ci#include "security_label_adapter.h"
2817fd14ceSopenharmony_ci
2917fd14ceSopenharmony_ci#define MAX_REFRESH_COUNT 1000
3017fd14ceSopenharmony_ci#define MAX_REFRESH_TIME 86400
3117fd14ceSopenharmony_ci#define MAX_DB_PATH_LEN 256
3217fd14ceSopenharmony_citypedef struct {
3317fd14ceSopenharmony_ci    char *pseudonymId;
3417fd14ceSopenharmony_ci    char *indexKey;
3517fd14ceSopenharmony_ci    char *realInfo;
3617fd14ceSopenharmony_ci    char *deviceId;
3717fd14ceSopenharmony_ci    int32_t refreshCount;
3817fd14ceSopenharmony_ci    int64_t startTime;
3917fd14ceSopenharmony_ci} PseudonymInfo;
4017fd14ceSopenharmony_ci
4117fd14ceSopenharmony_ciDECLARE_HC_VECTOR(PseudonymInfoVec, PseudonymInfo*);
4217fd14ceSopenharmony_ciIMPLEMENT_HC_VECTOR(PseudonymInfoVec, PseudonymInfo*, 1);
4317fd14ceSopenharmony_ci
4417fd14ceSopenharmony_citypedef struct {
4517fd14ceSopenharmony_ci    int32_t osAccountId;
4617fd14ceSopenharmony_ci    PseudonymInfoVec pseudonymInfoVec;
4717fd14ceSopenharmony_ci} OsAccountPseudonymInfo;
4817fd14ceSopenharmony_ci
4917fd14ceSopenharmony_ciDECLARE_HC_VECTOR(PseudonymDb, OsAccountPseudonymInfo)
5017fd14ceSopenharmony_ciIMPLEMENT_HC_VECTOR(PseudonymDb, OsAccountPseudonymInfo, 1)
5117fd14ceSopenharmony_ci
5217fd14ceSopenharmony_cistatic PseudonymDb g_pseudonymDb;
5317fd14ceSopenharmony_cistatic HcMutex *g_mutex = NULL;
5417fd14ceSopenharmony_cistatic bool g_isInitial = false;
5517fd14ceSopenharmony_ci
5617fd14ceSopenharmony_civoid DestroyPseudonymInfo(PseudonymInfo *pseudonymInfo)
5717fd14ceSopenharmony_ci{
5817fd14ceSopenharmony_ci    if (pseudonymInfo == NULL) {
5917fd14ceSopenharmony_ci        LOGE("Input pseudonymInfo is null");
6017fd14ceSopenharmony_ci        return;
6117fd14ceSopenharmony_ci    }
6217fd14ceSopenharmony_ci    HcFree(pseudonymInfo->pseudonymId);
6317fd14ceSopenharmony_ci    HcFree(pseudonymInfo->realInfo);
6417fd14ceSopenharmony_ci    HcFree(pseudonymInfo->deviceId);
6517fd14ceSopenharmony_ci    HcFree(pseudonymInfo->indexKey);
6617fd14ceSopenharmony_ci    HcFree(pseudonymInfo);
6717fd14ceSopenharmony_ci}
6817fd14ceSopenharmony_ci
6917fd14ceSopenharmony_civoid ClearPseudonymInfoVec(PseudonymInfoVec *vec)
7017fd14ceSopenharmony_ci{
7117fd14ceSopenharmony_ci    uint32_t index;
7217fd14ceSopenharmony_ci    PseudonymInfo **pseudonymInfoEntry;
7317fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(*vec, index, pseudonymInfoEntry) {
7417fd14ceSopenharmony_ci        DestroyPseudonymInfo(*pseudonymInfoEntry);
7517fd14ceSopenharmony_ci    }
7617fd14ceSopenharmony_ci    DestroyPseudonymInfoVec(vec);
7717fd14ceSopenharmony_ci}
7817fd14ceSopenharmony_ci
7917fd14ceSopenharmony_cistatic PseudonymInfo **QueryPseudonymInfoPtrIfMatch(const PseudonymInfoVec *vec, const char *realInfo)
8017fd14ceSopenharmony_ci{
8117fd14ceSopenharmony_ci    if (realInfo == NULL) {
8217fd14ceSopenharmony_ci        LOGE("Invalid input realInfo.");
8317fd14ceSopenharmony_ci        return NULL;
8417fd14ceSopenharmony_ci    }
8517fd14ceSopenharmony_ci    uint32_t index;
8617fd14ceSopenharmony_ci    PseudonymInfo **pseudonymInfo;
8717fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(*vec, index, pseudonymInfo) {
8817fd14ceSopenharmony_ci        if (strcmp(realInfo, (*pseudonymInfo)->realInfo) == 0) {
8917fd14ceSopenharmony_ci            return pseudonymInfo;
9017fd14ceSopenharmony_ci        }
9117fd14ceSopenharmony_ci    }
9217fd14ceSopenharmony_ci    return NULL;
9317fd14ceSopenharmony_ci}
9417fd14ceSopenharmony_ci
9517fd14ceSopenharmony_ciPseudonymInfo *CreatePseudonymInfo(void)
9617fd14ceSopenharmony_ci{
9717fd14ceSopenharmony_ci    PseudonymInfo *pseudonymInfo = (PseudonymInfo *)HcMalloc(sizeof(PseudonymInfo), 0);
9817fd14ceSopenharmony_ci    if (pseudonymInfo == NULL) {
9917fd14ceSopenharmony_ci        LOGE("Failed to allocate pseudonymInfo memory!");
10017fd14ceSopenharmony_ci        return NULL;
10117fd14ceSopenharmony_ci    }
10217fd14ceSopenharmony_ci    pseudonymInfo->pseudonymId = NULL;
10317fd14ceSopenharmony_ci    pseudonymInfo->indexKey = NULL;
10417fd14ceSopenharmony_ci    pseudonymInfo->realInfo = NULL;
10517fd14ceSopenharmony_ci    pseudonymInfo->deviceId = NULL;
10617fd14ceSopenharmony_ci    pseudonymInfo->refreshCount = MAX_REFRESH_COUNT;
10717fd14ceSopenharmony_ci    pseudonymInfo->startTime = HcGetCurTime();
10817fd14ceSopenharmony_ci    return pseudonymInfo;
10917fd14ceSopenharmony_ci}
11017fd14ceSopenharmony_ci
11117fd14ceSopenharmony_cistatic int32_t GeneratePseudonymInfoFromJson(const CJson *pseudonymJson, PseudonymInfo *pseudonymInfoEntry)
11217fd14ceSopenharmony_ci{
11317fd14ceSopenharmony_ci    const char *pseudonymId = GetStringFromJson(pseudonymJson, FIELD_PSEUDONYM_ID);
11417fd14ceSopenharmony_ci    if (pseudonymId == NULL) {
11517fd14ceSopenharmony_ci        LOGE("Failed to get pseudonymId");
11617fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
11717fd14ceSopenharmony_ci    }
11817fd14ceSopenharmony_ci    GOTO_IF_ERR(DeepCopyString(pseudonymId, &pseudonymInfoEntry->pseudonymId));
11917fd14ceSopenharmony_ci
12017fd14ceSopenharmony_ci    const char *indexKey = GetStringFromJson(pseudonymJson, FIELD_INDEX_KEY);
12117fd14ceSopenharmony_ci    if (indexKey == NULL) {
12217fd14ceSopenharmony_ci        LOGE("Failed to get indexKey");
12317fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
12417fd14ceSopenharmony_ci    }
12517fd14ceSopenharmony_ci    GOTO_IF_ERR(DeepCopyString(indexKey, &pseudonymInfoEntry->indexKey));
12617fd14ceSopenharmony_ci
12717fd14ceSopenharmony_ci    const char *realInfo = GetStringFromJson(pseudonymJson, FIELD_REAL_INFO);
12817fd14ceSopenharmony_ci    if (realInfo == NULL) {
12917fd14ceSopenharmony_ci        LOGE("Failed to get realInfo");
13017fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
13117fd14ceSopenharmony_ci    }
13217fd14ceSopenharmony_ci    GOTO_IF_ERR(DeepCopyString(realInfo, &pseudonymInfoEntry->realInfo));
13317fd14ceSopenharmony_ci
13417fd14ceSopenharmony_ci    const char *deviceId = GetStringFromJson(pseudonymJson, FIELD_DEVICE_ID);
13517fd14ceSopenharmony_ci    if (deviceId == NULL) {
13617fd14ceSopenharmony_ci        LOGE("Failed to get deviceId");
13717fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
13817fd14ceSopenharmony_ci    }
13917fd14ceSopenharmony_ci    GOTO_IF_ERR(DeepCopyString(deviceId, &pseudonymInfoEntry->deviceId));
14017fd14ceSopenharmony_ci
14117fd14ceSopenharmony_ci    pseudonymInfoEntry->refreshCount = 0;
14217fd14ceSopenharmony_ci    pseudonymInfoEntry->startTime = 0;
14317fd14ceSopenharmony_ci    return HC_SUCCESS;
14417fd14ceSopenharmony_ciERR:
14517fd14ceSopenharmony_ci    LOGE("Failed to copy string");
14617fd14ceSopenharmony_ci    return HC_ERR_MEMORY_COPY;
14717fd14ceSopenharmony_ci}
14817fd14ceSopenharmony_ci
14917fd14ceSopenharmony_cistatic int32_t CreatePseudonymFromJson(CJson *pseudonymJson, PseudonymInfoVec *vec)
15017fd14ceSopenharmony_ci{
15117fd14ceSopenharmony_ci    int32_t num = GetItemNum(pseudonymJson);
15217fd14ceSopenharmony_ci    if (num <= 0) {
15317fd14ceSopenharmony_ci        LOGE("No pseudonym info found.");
15417fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
15517fd14ceSopenharmony_ci    }
15617fd14ceSopenharmony_ci    int32_t ret;
15717fd14ceSopenharmony_ci    for (int32_t i = 0; i < num; i++) {
15817fd14ceSopenharmony_ci        CJson *pseudonymEntryJson = GetItemFromArray(pseudonymJson, i);
15917fd14ceSopenharmony_ci        if (pseudonymEntryJson == NULL) {
16017fd14ceSopenharmony_ci            LOGE("pseudonym entry json is null");
16117fd14ceSopenharmony_ci            return HC_ERR_JSON_GET;
16217fd14ceSopenharmony_ci        }
16317fd14ceSopenharmony_ci        PseudonymInfo *pseudonymInfo = CreatePseudonymInfo();
16417fd14ceSopenharmony_ci        if (pseudonymInfo == NULL) {
16517fd14ceSopenharmony_ci            LOGE("Failed to create pseudonymInfo");
16617fd14ceSopenharmony_ci            return HC_ERR_ALLOC_MEMORY;
16717fd14ceSopenharmony_ci        }
16817fd14ceSopenharmony_ci        ret = GeneratePseudonymInfoFromJson(pseudonymEntryJson, pseudonymInfo);
16917fd14ceSopenharmony_ci        if (ret != HC_SUCCESS) {
17017fd14ceSopenharmony_ci            LOGE("Generate pseudonymInfo failed");
17117fd14ceSopenharmony_ci            DestroyPseudonymInfo(pseudonymInfo);
17217fd14ceSopenharmony_ci            return ret;
17317fd14ceSopenharmony_ci        }
17417fd14ceSopenharmony_ci        if (vec->pushBackT(vec, pseudonymInfo) == NULL) {
17517fd14ceSopenharmony_ci            LOGE("Failed to push pseudonymInfo to vec");
17617fd14ceSopenharmony_ci            DestroyPseudonymInfo(pseudonymInfo);
17717fd14ceSopenharmony_ci            return HC_ERR_MEMORY_COPY;
17817fd14ceSopenharmony_ci        }
17917fd14ceSopenharmony_ci    }
18017fd14ceSopenharmony_ci    return HC_SUCCESS;
18117fd14ceSopenharmony_ci}
18217fd14ceSopenharmony_ci
18317fd14ceSopenharmony_cistatic bool GetPseudonymPathCe(int32_t osAccountId, char *path, uint32_t pathBufferLen)
18417fd14ceSopenharmony_ci{
18517fd14ceSopenharmony_ci    const char *beginPath = GetStorageDirPathCe();
18617fd14ceSopenharmony_ci    if (beginPath == NULL) {
18717fd14ceSopenharmony_ci        LOGE("Failed to get the storage path!");
18817fd14ceSopenharmony_ci        return false;
18917fd14ceSopenharmony_ci    }
19017fd14ceSopenharmony_ci    if (sprintf_s(path, pathBufferLen, "%s/%d/deviceauth/pseudonym/pseudonym_data.dat", beginPath, osAccountId) <= 0) {
19117fd14ceSopenharmony_ci        LOGE("Failed to generate pseudonym path!");
19217fd14ceSopenharmony_ci        return false;
19317fd14ceSopenharmony_ci    }
19417fd14ceSopenharmony_ci    return true;
19517fd14ceSopenharmony_ci}
19617fd14ceSopenharmony_ci
19717fd14ceSopenharmony_cistatic bool GetPseudonymPathDe(int32_t osAccountId, char *path, uint32_t pathBufferLen)
19817fd14ceSopenharmony_ci{
19917fd14ceSopenharmony_ci    const char *beginPath = GetPseudonymStoragePath();
20017fd14ceSopenharmony_ci    if (beginPath == NULL) {
20117fd14ceSopenharmony_ci        LOGE("Failed to get the pseudonym storage path!");
20217fd14ceSopenharmony_ci        return false;
20317fd14ceSopenharmony_ci    }
20417fd14ceSopenharmony_ci    int32_t writeByteNum;
20517fd14ceSopenharmony_ci    if (osAccountId == DEFAULT_OS_ACCOUNT) {
20617fd14ceSopenharmony_ci        writeByteNum = sprintf_s(path, pathBufferLen, "%s/pseudonym_data.dat", beginPath);
20717fd14ceSopenharmony_ci    } else {
20817fd14ceSopenharmony_ci        writeByteNum = sprintf_s(path, pathBufferLen, "%s/pseudonym_data%d.dat", beginPath, osAccountId);
20917fd14ceSopenharmony_ci    }
21017fd14ceSopenharmony_ci    if (writeByteNum <= 0) {
21117fd14ceSopenharmony_ci        LOGE("sprintf_s fail!");
21217fd14ceSopenharmony_ci        return false;
21317fd14ceSopenharmony_ci    }
21417fd14ceSopenharmony_ci    return true;
21517fd14ceSopenharmony_ci}
21617fd14ceSopenharmony_ci
21717fd14ceSopenharmony_cistatic bool GetPseudonymPath(int32_t osAccountId, char *path, uint32_t pathBufferLen)
21817fd14ceSopenharmony_ci{
21917fd14ceSopenharmony_ci    if (IsOsAccountSupported()) {
22017fd14ceSopenharmony_ci        return GetPseudonymPathCe(osAccountId, path, pathBufferLen);
22117fd14ceSopenharmony_ci    } else {
22217fd14ceSopenharmony_ci        return GetPseudonymPathDe(osAccountId, path, pathBufferLen);
22317fd14ceSopenharmony_ci    }
22417fd14ceSopenharmony_ci}
22517fd14ceSopenharmony_ci
22617fd14ceSopenharmony_cistatic int32_t OpenPseudonymFile(int32_t osAccountId, FileHandle *file, int32_t mode)
22717fd14ceSopenharmony_ci{
22817fd14ceSopenharmony_ci    char *pseudonymPath = (char *)HcMalloc(MAX_DB_PATH_LEN, 0);
22917fd14ceSopenharmony_ci    if (pseudonymPath == NULL) {
23017fd14ceSopenharmony_ci        LOGE("Malloc pseudonym Path failed");
23117fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
23217fd14ceSopenharmony_ci    }
23317fd14ceSopenharmony_ci    if (!GetPseudonymPath(osAccountId, pseudonymPath, MAX_DB_PATH_LEN)) {
23417fd14ceSopenharmony_ci        LOGE("Get pseudonym path failed");
23517fd14ceSopenharmony_ci        HcFree(pseudonymPath);
23617fd14ceSopenharmony_ci        return HC_ERROR;
23717fd14ceSopenharmony_ci    }
23817fd14ceSopenharmony_ci    int32_t ret = HcFileOpen(pseudonymPath, mode, file);
23917fd14ceSopenharmony_ci    if (ret == HC_SUCCESS) {
24017fd14ceSopenharmony_ci        SetSecurityLabel(pseudonymPath, SECURITY_LABEL_S2);
24117fd14ceSopenharmony_ci    }
24217fd14ceSopenharmony_ci    HcFree(pseudonymPath);
24317fd14ceSopenharmony_ci    return ret;
24417fd14ceSopenharmony_ci}
24517fd14ceSopenharmony_ci
24617fd14ceSopenharmony_cistatic int32_t LoadPseudonymDataFromFile(int32_t osAccountId, PseudonymInfoVec *vec)
24717fd14ceSopenharmony_ci{
24817fd14ceSopenharmony_ci    if (vec == NULL) {
24917fd14ceSopenharmony_ci        LOGE("Input PseudonymInfo vec is null.");
25017fd14ceSopenharmony_ci        return HC_ERR_NULL_PTR;
25117fd14ceSopenharmony_ci    }
25217fd14ceSopenharmony_ci    FileHandle file = { 0 };
25317fd14ceSopenharmony_ci    int32_t ret = OpenPseudonymFile(osAccountId, &file, MODE_FILE_READ);
25417fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
25517fd14ceSopenharmony_ci        LOGE("Open pseudonym data file failed, ret:%d", ret);
25617fd14ceSopenharmony_ci        return ret;
25717fd14ceSopenharmony_ci    }
25817fd14ceSopenharmony_ci    int32_t fileSize = HcFileSize(file);
25917fd14ceSopenharmony_ci    if (fileSize <= 0) {
26017fd14ceSopenharmony_ci        LOGE("file size stat failed");
26117fd14ceSopenharmony_ci        HcFileClose(file);
26217fd14ceSopenharmony_ci        return HC_ERROR;
26317fd14ceSopenharmony_ci    }
26417fd14ceSopenharmony_ci    char *fileData = (char *)HcMalloc(fileSize, 0);
26517fd14ceSopenharmony_ci    if (fileData == NULL) {
26617fd14ceSopenharmony_ci        LOGE("Malloc file data failed");
26717fd14ceSopenharmony_ci        HcFileClose(file);
26817fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
26917fd14ceSopenharmony_ci    }
27017fd14ceSopenharmony_ci    if (HcFileRead(file, fileData, fileSize) != fileSize) {
27117fd14ceSopenharmony_ci        LOGE("fileData read failed");
27217fd14ceSopenharmony_ci        HcFileClose(file);
27317fd14ceSopenharmony_ci        HcFree(fileData);
27417fd14ceSopenharmony_ci        return HC_ERROR;
27517fd14ceSopenharmony_ci    }
27617fd14ceSopenharmony_ci    HcFileClose(file);
27717fd14ceSopenharmony_ci    CJson *readJsonFile = CreateJsonFromString(fileData);
27817fd14ceSopenharmony_ci    HcFree(fileData);
27917fd14ceSopenharmony_ci    if (readJsonFile == NULL) {
28017fd14ceSopenharmony_ci        LOGE("fileData parse failed");
28117fd14ceSopenharmony_ci        return HC_ERR_JSON_CREATE;
28217fd14ceSopenharmony_ci    }
28317fd14ceSopenharmony_ci    ret = CreatePseudonymFromJson(readJsonFile, vec);
28417fd14ceSopenharmony_ci    FreeJson(readJsonFile);
28517fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
28617fd14ceSopenharmony_ci        LOGE("Failed to read pseudonym data from json");
28717fd14ceSopenharmony_ci    }
28817fd14ceSopenharmony_ci
28917fd14ceSopenharmony_ci    return ret;
29017fd14ceSopenharmony_ci}
29117fd14ceSopenharmony_ci
29217fd14ceSopenharmony_cistatic bool IsNeedRefresh(PseudonymInfo *pseudonymInfo)
29317fd14ceSopenharmony_ci{
29417fd14ceSopenharmony_ci    if (pseudonymInfo->refreshCount <= 0) {
29517fd14ceSopenharmony_ci        LOGI("count is 0, need refresh pseudonymId");
29617fd14ceSopenharmony_ci        return true;
29717fd14ceSopenharmony_ci    }
29817fd14ceSopenharmony_ci    int64_t curTime = HcGetCurTime();
29917fd14ceSopenharmony_ci    if (curTime > (pseudonymInfo->startTime + MAX_REFRESH_TIME)) {
30017fd14ceSopenharmony_ci        LOGI("time is overdue, need refresh pseudonymId");
30117fd14ceSopenharmony_ci        return true;
30217fd14ceSopenharmony_ci    }
30317fd14ceSopenharmony_ci    return false;
30417fd14ceSopenharmony_ci}
30517fd14ceSopenharmony_ci
30617fd14ceSopenharmony_cistatic int32_t GenerateJsonFromPseudonymInfo(PseudonymInfo *pseudonymInfo, CJson *pseudonymJson)
30717fd14ceSopenharmony_ci{
30817fd14ceSopenharmony_ci    if (AddStringToJson(pseudonymJson, FIELD_PSEUDONYM_ID, pseudonymInfo->pseudonymId) != HC_SUCCESS) {
30917fd14ceSopenharmony_ci        LOGE("Add pseudonymId to json failed");
31017fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
31117fd14ceSopenharmony_ci    }
31217fd14ceSopenharmony_ci    if (AddStringToJson(pseudonymJson, FIELD_INDEX_KEY, pseudonymInfo->indexKey) != HC_SUCCESS) {
31317fd14ceSopenharmony_ci        LOGE("Add indexKey to json failed");
31417fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
31517fd14ceSopenharmony_ci    }
31617fd14ceSopenharmony_ci    if (AddStringToJson(pseudonymJson, FIELD_REAL_INFO, pseudonymInfo->realInfo) != HC_SUCCESS) {
31717fd14ceSopenharmony_ci        LOGE("Add realInfo to json failed");
31817fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
31917fd14ceSopenharmony_ci    }
32017fd14ceSopenharmony_ci    if (AddStringToJson(pseudonymJson, FIELD_DEVICE_ID, pseudonymInfo->deviceId) != HC_SUCCESS) {
32117fd14ceSopenharmony_ci        LOGE("Add deviceId to json failed");
32217fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
32317fd14ceSopenharmony_ci    }
32417fd14ceSopenharmony_ci    return HC_SUCCESS;
32517fd14ceSopenharmony_ci}
32617fd14ceSopenharmony_ci
32717fd14ceSopenharmony_cistatic int32_t WritePseudonymJsonToFile(int32_t osAccountId, CJson *Json)
32817fd14ceSopenharmony_ci{
32917fd14ceSopenharmony_ci    char *storeJsonString = PackJsonToString(Json);
33017fd14ceSopenharmony_ci    if (storeJsonString == NULL) {
33117fd14ceSopenharmony_ci        LOGE("Pack stored json to string failed.");
33217fd14ceSopenharmony_ci        return HC_ERR_PACKAGE_JSON_TO_STRING_FAIL;
33317fd14ceSopenharmony_ci    }
33417fd14ceSopenharmony_ci    FileHandle file = { 0 };
33517fd14ceSopenharmony_ci    int32_t ret = OpenPseudonymFile(osAccountId, &file, MODE_FILE_WRITE);
33617fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
33717fd14ceSopenharmony_ci        LOGE("Open pseudonym file failed.");
33817fd14ceSopenharmony_ci        FreeJsonString(storeJsonString);
33917fd14ceSopenharmony_ci        return ret;
34017fd14ceSopenharmony_ci    }
34117fd14ceSopenharmony_ci    int32_t fileSize = (int32_t)(HcStrlen(storeJsonString) + 1);
34217fd14ceSopenharmony_ci    if (HcFileWrite(file, storeJsonString, fileSize) != fileSize) {
34317fd14ceSopenharmony_ci        LOGE("Failed to write Pseudonym array to file.");
34417fd14ceSopenharmony_ci        ret = HC_ERR_FILE;
34517fd14ceSopenharmony_ci    }
34617fd14ceSopenharmony_ci    FreeJsonString(storeJsonString);
34717fd14ceSopenharmony_ci    HcFileClose(file);
34817fd14ceSopenharmony_ci    return ret;
34917fd14ceSopenharmony_ci}
35017fd14ceSopenharmony_ci
35117fd14ceSopenharmony_cistatic int32_t SavePseudonymInfoToFile(int32_t osAccountId, const PseudonymInfoVec *vec)
35217fd14ceSopenharmony_ci{
35317fd14ceSopenharmony_ci    CJson *storeJson = CreateJsonArray();
35417fd14ceSopenharmony_ci    if (storeJson == NULL) {
35517fd14ceSopenharmony_ci        LOGE("Create json failed when save Pseudonym data to file.");
35617fd14ceSopenharmony_ci        return HC_ERR_JSON_CREATE;
35717fd14ceSopenharmony_ci    }
35817fd14ceSopenharmony_ci    int32_t ret;
35917fd14ceSopenharmony_ci    uint32_t index;
36017fd14ceSopenharmony_ci    PseudonymInfo **pseudonymInfoEntry;
36117fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(*vec, index, pseudonymInfoEntry) {
36217fd14ceSopenharmony_ci        CJson *entryJson = CreateJson();
36317fd14ceSopenharmony_ci        if (entryJson == NULL) {
36417fd14ceSopenharmony_ci            LOGE("Create json failed.");
36517fd14ceSopenharmony_ci            FreeJson(storeJson);
36617fd14ceSopenharmony_ci            return HC_ERR_JSON_CREATE;
36717fd14ceSopenharmony_ci        }
36817fd14ceSopenharmony_ci        ret = GenerateJsonFromPseudonymInfo(*pseudonymInfoEntry, entryJson);
36917fd14ceSopenharmony_ci        if (ret != HC_SUCCESS) {
37017fd14ceSopenharmony_ci            LOGE("Generate json from pseudonymInfo failed");
37117fd14ceSopenharmony_ci            FreeJson(entryJson);
37217fd14ceSopenharmony_ci            FreeJson(storeJson);
37317fd14ceSopenharmony_ci            return ret;
37417fd14ceSopenharmony_ci        }
37517fd14ceSopenharmony_ci        if (AddObjToArray(storeJson, entryJson) != HC_SUCCESS) {
37617fd14ceSopenharmony_ci            LOGE("Add pseudonymInfoEntry json to array failed");
37717fd14ceSopenharmony_ci            FreeJson(entryJson);
37817fd14ceSopenharmony_ci            FreeJson(storeJson);
37917fd14ceSopenharmony_ci            return HC_ERR_JSON_ADD;
38017fd14ceSopenharmony_ci        }
38117fd14ceSopenharmony_ci    }
38217fd14ceSopenharmony_ci    ret = WritePseudonymJsonToFile(osAccountId, storeJson);
38317fd14ceSopenharmony_ci    FreeJson(storeJson);
38417fd14ceSopenharmony_ci    return ret;
38517fd14ceSopenharmony_ci}
38617fd14ceSopenharmony_ci
38717fd14ceSopenharmony_cistatic const char *GetParamByFieldName(const char *fieldName, PseudonymInfo *pseudonymInfoEntry)
38817fd14ceSopenharmony_ci{
38917fd14ceSopenharmony_ci    if (strcmp(fieldName, FIELD_DEVICE_ID) == 0) {
39017fd14ceSopenharmony_ci        return pseudonymInfoEntry->deviceId;
39117fd14ceSopenharmony_ci    } else if (strcmp(fieldName, FIELD_INDEX_KEY) == 0) {
39217fd14ceSopenharmony_ci        return pseudonymInfoEntry->indexKey;
39317fd14ceSopenharmony_ci    } else {
39417fd14ceSopenharmony_ci        LOGE("Not support this field!");
39517fd14ceSopenharmony_ci        return NULL;
39617fd14ceSopenharmony_ci    }
39717fd14ceSopenharmony_ci}
39817fd14ceSopenharmony_ci
39917fd14ceSopenharmony_cistatic void LoadOsAccountPseudonymDb(int32_t osAccountId)
40017fd14ceSopenharmony_ci{
40117fd14ceSopenharmony_ci    OsAccountPseudonymInfo info;
40217fd14ceSopenharmony_ci    info.osAccountId = osAccountId;
40317fd14ceSopenharmony_ci    info.pseudonymInfoVec = CreatePseudonymInfoVec();
40417fd14ceSopenharmony_ci    if (LoadPseudonymDataFromFile(osAccountId, &info.pseudonymInfoVec) != HC_SUCCESS) {
40517fd14ceSopenharmony_ci        ClearPseudonymInfoVec(&info.pseudonymInfoVec);
40617fd14ceSopenharmony_ci        return;
40717fd14ceSopenharmony_ci    }
40817fd14ceSopenharmony_ci    if (g_pseudonymDb.pushBackT(&g_pseudonymDb, info) == NULL) {
40917fd14ceSopenharmony_ci        LOGE("Failed to push osAccountInfo to database!");
41017fd14ceSopenharmony_ci        ClearPseudonymInfoVec(&info.pseudonymInfoVec);
41117fd14ceSopenharmony_ci    }
41217fd14ceSopenharmony_ci    LOGI("Load pseudonym os account db successfully! [Id]: %d", osAccountId);
41317fd14ceSopenharmony_ci}
41417fd14ceSopenharmony_ci
41517fd14ceSopenharmony_cistatic void OnOsAccountUnlocked(int32_t osAccountId)
41617fd14ceSopenharmony_ci{
41717fd14ceSopenharmony_ci    LOGI("Os account is unlocked, osAccountId: %d", osAccountId);
41817fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
41917fd14ceSopenharmony_ci    LoadOsAccountPseudonymDb(osAccountId);
42017fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
42117fd14ceSopenharmony_ci}
42217fd14ceSopenharmony_ci
42317fd14ceSopenharmony_cistatic void RemoveOsAccountPseudonymInfo(int32_t osAccountId)
42417fd14ceSopenharmony_ci{
42517fd14ceSopenharmony_ci    uint32_t index = 0;
42617fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = NULL;
42717fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(g_pseudonymDb, index, info) {
42817fd14ceSopenharmony_ci        if (info->osAccountId == osAccountId) {
42917fd14ceSopenharmony_ci            OsAccountPseudonymInfo deleteInfo;
43017fd14ceSopenharmony_ci            HC_VECTOR_POPELEMENT(&g_pseudonymDb, &deleteInfo, index);
43117fd14ceSopenharmony_ci            ClearPseudonymInfoVec(&deleteInfo.pseudonymInfoVec);
43217fd14ceSopenharmony_ci            return;
43317fd14ceSopenharmony_ci        }
43417fd14ceSopenharmony_ci    }
43517fd14ceSopenharmony_ci}
43617fd14ceSopenharmony_ci
43717fd14ceSopenharmony_cistatic void OnOsAccountRemoved(int32_t osAccountId)
43817fd14ceSopenharmony_ci{
43917fd14ceSopenharmony_ci    LOGI("Os account is removed, osAccountId: %d", osAccountId);
44017fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
44117fd14ceSopenharmony_ci    RemoveOsAccountPseudonymInfo(osAccountId);
44217fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
44317fd14ceSopenharmony_ci}
44417fd14ceSopenharmony_ci
44517fd14ceSopenharmony_cistatic bool IsOsAccountDataLoaded(int32_t osAccountId)
44617fd14ceSopenharmony_ci{
44717fd14ceSopenharmony_ci    uint32_t index = 0;
44817fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = NULL;
44917fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(g_pseudonymDb, index, info) {
45017fd14ceSopenharmony_ci        if (info->osAccountId == osAccountId) {
45117fd14ceSopenharmony_ci            return true;
45217fd14ceSopenharmony_ci        }
45317fd14ceSopenharmony_ci    }
45417fd14ceSopenharmony_ci    return false;
45517fd14ceSopenharmony_ci}
45617fd14ceSopenharmony_ci
45717fd14ceSopenharmony_cistatic void LoadDataIfNotLoaded(int32_t osAccountId)
45817fd14ceSopenharmony_ci{
45917fd14ceSopenharmony_ci    if (IsOsAccountDataLoaded(osAccountId)) {
46017fd14ceSopenharmony_ci        return;
46117fd14ceSopenharmony_ci    }
46217fd14ceSopenharmony_ci    LOGI("Data has not been loaded, load it, osAccountId: %d", osAccountId);
46317fd14ceSopenharmony_ci    LoadOsAccountPseudonymDb(osAccountId);
46417fd14ceSopenharmony_ci}
46517fd14ceSopenharmony_ci
46617fd14ceSopenharmony_cistatic OsAccountPseudonymInfo *GetPseudonymInfoByOsAccountId(int32_t osAccountId)
46717fd14ceSopenharmony_ci{
46817fd14ceSopenharmony_ci    if (IsOsAccountSupported()) {
46917fd14ceSopenharmony_ci        LoadDataIfNotLoaded(osAccountId);
47017fd14ceSopenharmony_ci    }
47117fd14ceSopenharmony_ci    uint32_t index = 0;
47217fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = NULL;
47317fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(g_pseudonymDb, index, info) {
47417fd14ceSopenharmony_ci        if (info->osAccountId == osAccountId) {
47517fd14ceSopenharmony_ci            return info;
47617fd14ceSopenharmony_ci        }
47717fd14ceSopenharmony_ci    }
47817fd14ceSopenharmony_ci    LOGI("Create a new os account database cache! [Id]: %d", osAccountId);
47917fd14ceSopenharmony_ci    OsAccountPseudonymInfo newInfo;
48017fd14ceSopenharmony_ci    newInfo.osAccountId = osAccountId;
48117fd14ceSopenharmony_ci    newInfo.pseudonymInfoVec = CreatePseudonymInfoVec();
48217fd14ceSopenharmony_ci    OsAccountPseudonymInfo *returnInfo = g_pseudonymDb.pushBackT(&g_pseudonymDb, newInfo);
48317fd14ceSopenharmony_ci    if (returnInfo == NULL) {
48417fd14ceSopenharmony_ci        LOGE("Failed to push OsAccountPseudonymInfo to database!");
48517fd14ceSopenharmony_ci        DestroyPseudonymInfoVec(&newInfo.pseudonymInfoVec);
48617fd14ceSopenharmony_ci    }
48717fd14ceSopenharmony_ci    return returnInfo;
48817fd14ceSopenharmony_ci}
48917fd14ceSopenharmony_ci
49017fd14ceSopenharmony_cistatic int32_t SaveOsAccountPseudonymDb(int32_t osAccountId)
49117fd14ceSopenharmony_ci{
49217fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
49317fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = GetPseudonymInfoByOsAccountId(osAccountId);
49417fd14ceSopenharmony_ci    if (info == NULL) {
49517fd14ceSopenharmony_ci        LOGE("Get pseudonym info by os account id failed");
49617fd14ceSopenharmony_ci        UnlockHcMutex(g_mutex);
49717fd14ceSopenharmony_ci        return HC_ERROR;
49817fd14ceSopenharmony_ci    }
49917fd14ceSopenharmony_ci    int32_t ret = SavePseudonymInfoToFile(osAccountId, &info->pseudonymInfoVec);
50017fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
50117fd14ceSopenharmony_ci        LOGE("Save pseudonym info to file failed");
50217fd14ceSopenharmony_ci        UnlockHcMutex(g_mutex);
50317fd14ceSopenharmony_ci        return ret;
50417fd14ceSopenharmony_ci    }
50517fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
50617fd14ceSopenharmony_ci    LOGI("Save an os account database successfully! [Id]: %d", osAccountId);
50717fd14ceSopenharmony_ci    return HC_SUCCESS;
50817fd14ceSopenharmony_ci}
50917fd14ceSopenharmony_ci
51017fd14ceSopenharmony_cistatic int32_t DeletePseudonymInner(int32_t osAccountId, const char *dataTodelete, PseudonymInfoVec *deleteVec,
51117fd14ceSopenharmony_ci    const char *fieldName)
51217fd14ceSopenharmony_ci{
51317fd14ceSopenharmony_ci    LOGI("Start to delete Pseudonym from database!");
51417fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
51517fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = GetPseudonymInfoByOsAccountId(osAccountId);
51617fd14ceSopenharmony_ci    if (info == NULL) {
51717fd14ceSopenharmony_ci        LOGE("Get pseudonym info by os account id failed");
51817fd14ceSopenharmony_ci        UnlockHcMutex(g_mutex);
51917fd14ceSopenharmony_ci        return HC_ERROR;
52017fd14ceSopenharmony_ci    }
52117fd14ceSopenharmony_ci    int32_t count = 0;
52217fd14ceSopenharmony_ci    uint32_t index = 0;
52317fd14ceSopenharmony_ci    PseudonymInfo **pseudonymInfoEntry = NULL;
52417fd14ceSopenharmony_ci    while (index < HC_VECTOR_SIZE(&info->pseudonymInfoVec)) {
52517fd14ceSopenharmony_ci        pseudonymInfoEntry = info->pseudonymInfoVec.getp(&info->pseudonymInfoVec, index);
52617fd14ceSopenharmony_ci        if ((pseudonymInfoEntry == NULL) || (*pseudonymInfoEntry == NULL) ||
52717fd14ceSopenharmony_ci            (strcmp(dataTodelete, GetParamByFieldName(fieldName, *pseudonymInfoEntry))) != 0) {
52817fd14ceSopenharmony_ci            index++;
52917fd14ceSopenharmony_ci            continue;
53017fd14ceSopenharmony_ci        }
53117fd14ceSopenharmony_ci        PseudonymInfo *deletepseudonymInfoEntry = NULL;
53217fd14ceSopenharmony_ci        HC_VECTOR_POPELEMENT(&info->pseudonymInfoVec, &deletepseudonymInfoEntry, index);
53317fd14ceSopenharmony_ci        count++;
53417fd14ceSopenharmony_ci        LOGI("Delete pseudonymInfoEntry from database successfully!");
53517fd14ceSopenharmony_ci        if (deleteVec->pushBackT(deleteVec, deletepseudonymInfoEntry) == NULL) {
53617fd14ceSopenharmony_ci            LOGE("Failed to push deleted pseudonymInfoEntry to vec");
53717fd14ceSopenharmony_ci            DestroyPseudonymInfo(deletepseudonymInfoEntry);
53817fd14ceSopenharmony_ci        }
53917fd14ceSopenharmony_ci    }
54017fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
54117fd14ceSopenharmony_ci    if (count == 0) {
54217fd14ceSopenharmony_ci        LOGE("No pseudonym info deleted");
54317fd14ceSopenharmony_ci        return HC_ERROR;
54417fd14ceSopenharmony_ci    }
54517fd14ceSopenharmony_ci    LOGI("Number of pseudonym info deleted: %d", count);
54617fd14ceSopenharmony_ci    return HC_SUCCESS;
54717fd14ceSopenharmony_ci}
54817fd14ceSopenharmony_ci
54917fd14ceSopenharmony_cistatic void InitPseudonymManger(void)
55017fd14ceSopenharmony_ci{
55117fd14ceSopenharmony_ci    if (g_mutex == NULL) {
55217fd14ceSopenharmony_ci        g_mutex = (HcMutex *)HcMalloc(sizeof(HcMutex), 0);
55317fd14ceSopenharmony_ci        if (g_mutex == NULL) {
55417fd14ceSopenharmony_ci            LOGE("Alloc sessionMutex failed");
55517fd14ceSopenharmony_ci            return;
55617fd14ceSopenharmony_ci        }
55717fd14ceSopenharmony_ci        if (InitHcMutex(g_mutex) != HC_SUCCESS) {
55817fd14ceSopenharmony_ci            LOGE("Init mutex failed");
55917fd14ceSopenharmony_ci            HcFree(g_mutex);
56017fd14ceSopenharmony_ci            g_mutex = NULL;
56117fd14ceSopenharmony_ci            return;
56217fd14ceSopenharmony_ci        }
56317fd14ceSopenharmony_ci    }
56417fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
56517fd14ceSopenharmony_ci    if (!g_isInitial) {
56617fd14ceSopenharmony_ci        g_pseudonymDb = CREATE_HC_VECTOR(PseudonymDb);
56717fd14ceSopenharmony_ci        AddOsAccountEventCallback(PSEUDONYM_DATA_CALLBACK, OnOsAccountUnlocked, OnOsAccountRemoved);
56817fd14ceSopenharmony_ci        g_isInitial = true;
56917fd14ceSopenharmony_ci    }
57017fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
57117fd14ceSopenharmony_ci}
57217fd14ceSopenharmony_ci
57317fd14ceSopenharmony_cistatic void LoadPseudonymData(void)
57417fd14ceSopenharmony_ci{
57517fd14ceSopenharmony_ci    InitPseudonymManger();
57617fd14ceSopenharmony_ci    if (IsOsAccountSupported()) {
57717fd14ceSopenharmony_ci        return;
57817fd14ceSopenharmony_ci    }
57917fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
58017fd14ceSopenharmony_ci    StringVector dbNameVec = CreateStrVector();
58117fd14ceSopenharmony_ci    HcFileGetSubFileName(GetPseudonymStoragePath(), &dbNameVec);
58217fd14ceSopenharmony_ci    uint32_t index;
58317fd14ceSopenharmony_ci    HcString *dbName = NULL;
58417fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(dbNameVec, index, dbName) {
58517fd14ceSopenharmony_ci        int32_t osAccountId;
58617fd14ceSopenharmony_ci        const char *name = StringGet(dbName);
58717fd14ceSopenharmony_ci        if (name == NULL) {
58817fd14ceSopenharmony_ci            continue;
58917fd14ceSopenharmony_ci        }
59017fd14ceSopenharmony_ci        if (strcmp(name, "pseudonym_data.dat") == 0) {
59117fd14ceSopenharmony_ci            LoadOsAccountPseudonymDb(DEFAULT_OS_ACCOUNT);
59217fd14ceSopenharmony_ci        } else if (sscanf_s(name, "pseudonym_data%d.dat", &osAccountId) == 1) {
59317fd14ceSopenharmony_ci            LoadOsAccountPseudonymDb(osAccountId);
59417fd14ceSopenharmony_ci        }
59517fd14ceSopenharmony_ci    }
59617fd14ceSopenharmony_ci    DestroyStrVector(&dbNameVec);
59717fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
59817fd14ceSopenharmony_ci}
59917fd14ceSopenharmony_ci
60017fd14ceSopenharmony_cistatic int32_t GetRealInfo(int32_t osAccountId, const char *pseudonymId, char **realInfo)
60117fd14ceSopenharmony_ci{
60217fd14ceSopenharmony_ci    if (pseudonymId == NULL || realInfo == NULL) {
60317fd14ceSopenharmony_ci        LOGE("pseudonymId is null!");
60417fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
60517fd14ceSopenharmony_ci    }
60617fd14ceSopenharmony_ci    InitPseudonymManger();
60717fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
60817fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = GetPseudonymInfoByOsAccountId(osAccountId);
60917fd14ceSopenharmony_ci    if (info == NULL) {
61017fd14ceSopenharmony_ci        LOGE("Failed to get Pseudonym by os account id");
61117fd14ceSopenharmony_ci        UnlockHcMutex(g_mutex);
61217fd14ceSopenharmony_ci        return HC_ERROR;
61317fd14ceSopenharmony_ci    }
61417fd14ceSopenharmony_ci    uint32_t index;
61517fd14ceSopenharmony_ci    PseudonymInfo **pseudonymInfoEntry = NULL;
61617fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(info->pseudonymInfoVec, index, pseudonymInfoEntry) {
61717fd14ceSopenharmony_ci        if ((pseudonymInfoEntry != NULL) && (*pseudonymInfoEntry != NULL) &&
61817fd14ceSopenharmony_ci            (strcmp((*pseudonymInfoEntry)->pseudonymId, pseudonymId) == 0)) {
61917fd14ceSopenharmony_ci            if (DeepCopyString((*pseudonymInfoEntry)->realInfo, realInfo) != HC_SUCCESS) {
62017fd14ceSopenharmony_ci                LOGE("Failed to deep copy realInfo!");
62117fd14ceSopenharmony_ci                UnlockHcMutex(g_mutex);
62217fd14ceSopenharmony_ci                return HC_ERR_MEMORY_COPY;
62317fd14ceSopenharmony_ci            }
62417fd14ceSopenharmony_ci            UnlockHcMutex(g_mutex);
62517fd14ceSopenharmony_ci            return HC_SUCCESS;
62617fd14ceSopenharmony_ci        }
62717fd14ceSopenharmony_ci    }
62817fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
62917fd14ceSopenharmony_ci    return HC_SUCCESS;
63017fd14ceSopenharmony_ci}
63117fd14ceSopenharmony_ci
63217fd14ceSopenharmony_cistatic int32_t GetPseudonymId(int32_t osAccountId, const char *indexKey, char **pseudonymId)
63317fd14ceSopenharmony_ci{
63417fd14ceSopenharmony_ci    if (indexKey == NULL || pseudonymId == NULL) {
63517fd14ceSopenharmony_ci        LOGE("input params is null!");
63617fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
63717fd14ceSopenharmony_ci    }
63817fd14ceSopenharmony_ci    InitPseudonymManger();
63917fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
64017fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = GetPseudonymInfoByOsAccountId(osAccountId);
64117fd14ceSopenharmony_ci    if (info == NULL) {
64217fd14ceSopenharmony_ci        LOGE("Failed to get Pseudonym by os account id");
64317fd14ceSopenharmony_ci        UnlockHcMutex(g_mutex);
64417fd14ceSopenharmony_ci        return HC_ERROR;
64517fd14ceSopenharmony_ci    }
64617fd14ceSopenharmony_ci    uint32_t index;
64717fd14ceSopenharmony_ci    PseudonymInfo **pseudonymInfoEntry = NULL;
64817fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(info->pseudonymInfoVec, index, pseudonymInfoEntry) {
64917fd14ceSopenharmony_ci        if ((pseudonymInfoEntry != NULL) && (*pseudonymInfoEntry != NULL) &&
65017fd14ceSopenharmony_ci            (strcmp((*pseudonymInfoEntry)->indexKey, indexKey) == 0)) {
65117fd14ceSopenharmony_ci            if (DeepCopyString((*pseudonymInfoEntry)->pseudonymId, pseudonymId) != HC_SUCCESS) {
65217fd14ceSopenharmony_ci                LOGE("Failed to deep copy pseudonymId!");
65317fd14ceSopenharmony_ci                UnlockHcMutex(g_mutex);
65417fd14ceSopenharmony_ci                return HC_ERR_MEMORY_COPY;
65517fd14ceSopenharmony_ci            }
65617fd14ceSopenharmony_ci            UnlockHcMutex(g_mutex);
65717fd14ceSopenharmony_ci            return HC_SUCCESS;
65817fd14ceSopenharmony_ci        }
65917fd14ceSopenharmony_ci    }
66017fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
66117fd14ceSopenharmony_ci    return HC_SUCCESS;
66217fd14ceSopenharmony_ci}
66317fd14ceSopenharmony_ci
66417fd14ceSopenharmony_cistatic int32_t AddPseudonymIdInfoToMemory(int32_t osAccountId, PseudonymInfo *pseudonymInfo)
66517fd14ceSopenharmony_ci{
66617fd14ceSopenharmony_ci    LOGI("Start to add a pseudonymInfo to memory!");
66717fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
66817fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = GetPseudonymInfoByOsAccountId(osAccountId);
66917fd14ceSopenharmony_ci    if (info == NULL) {
67017fd14ceSopenharmony_ci        LOGE("Failed to get Pseudonym by os account id");
67117fd14ceSopenharmony_ci        UnlockHcMutex(g_mutex);
67217fd14ceSopenharmony_ci        return HC_ERROR;
67317fd14ceSopenharmony_ci    }
67417fd14ceSopenharmony_ci    PseudonymInfo **oldPtr = QueryPseudonymInfoPtrIfMatch(&info->pseudonymInfoVec,
67517fd14ceSopenharmony_ci        pseudonymInfo->realInfo);
67617fd14ceSopenharmony_ci    if (oldPtr != NULL) {
67717fd14ceSopenharmony_ci        DestroyPseudonymInfo(*oldPtr);
67817fd14ceSopenharmony_ci        *oldPtr = pseudonymInfo;
67917fd14ceSopenharmony_ci        UnlockHcMutex(g_mutex);
68017fd14ceSopenharmony_ci        LOGI("Replace an old pseudonymInfo successfully!");
68117fd14ceSopenharmony_ci        return HC_SUCCESS;
68217fd14ceSopenharmony_ci    }
68317fd14ceSopenharmony_ci    if (info->pseudonymInfoVec.pushBackT(&info->pseudonymInfoVec, pseudonymInfo) == NULL) {
68417fd14ceSopenharmony_ci        UnlockHcMutex(g_mutex);
68517fd14ceSopenharmony_ci        LOGE("Failed to push pseudonymInfo to vec!");
68617fd14ceSopenharmony_ci        return HC_ERR_MEMORY_COPY;
68717fd14ceSopenharmony_ci    }
68817fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
68917fd14ceSopenharmony_ci    LOGI("Add pseudonymInfo to memory successfully!");
69017fd14ceSopenharmony_ci    return HC_SUCCESS;
69117fd14ceSopenharmony_ci}
69217fd14ceSopenharmony_ci
69317fd14ceSopenharmony_cistatic PseudonymInfo *BuildPseudonymInfoEntry(const char *realInfo, const char *pseudonymId, const char *deviceId,
69417fd14ceSopenharmony_ci    const char *indexKey)
69517fd14ceSopenharmony_ci{
69617fd14ceSopenharmony_ci    PseudonymInfo *pseudonymInfoEntry = CreatePseudonymInfo();
69717fd14ceSopenharmony_ci    if (pseudonymInfoEntry == NULL) {
69817fd14ceSopenharmony_ci        LOGE("Failed to create pseudonymInfoEntry");
69917fd14ceSopenharmony_ci        return NULL;
70017fd14ceSopenharmony_ci    }
70117fd14ceSopenharmony_ci    GOTO_IF_ERR(DeepCopyString(pseudonymId, &pseudonymInfoEntry->pseudonymId));
70217fd14ceSopenharmony_ci    GOTO_IF_ERR(DeepCopyString(realInfo, &pseudonymInfoEntry->realInfo));
70317fd14ceSopenharmony_ci    GOTO_IF_ERR(DeepCopyString(deviceId, &pseudonymInfoEntry->deviceId));
70417fd14ceSopenharmony_ci    GOTO_IF_ERR(DeepCopyString(indexKey, &pseudonymInfoEntry->indexKey));
70517fd14ceSopenharmony_ci    return pseudonymInfoEntry;
70617fd14ceSopenharmony_ciERR:
70717fd14ceSopenharmony_ci    DestroyPseudonymInfo(pseudonymInfoEntry);
70817fd14ceSopenharmony_ci    return NULL;
70917fd14ceSopenharmony_ci}
71017fd14ceSopenharmony_ci
71117fd14ceSopenharmony_cistatic int32_t SavePseudonymId(int32_t osAccountId, const char *pseudonymId, const char *realInfo, const char *deviceId,
71217fd14ceSopenharmony_ci    const char *indexKey)
71317fd14ceSopenharmony_ci{
71417fd14ceSopenharmony_ci    if (realInfo == NULL || pseudonymId == NULL || deviceId == NULL || indexKey == NULL) {
71517fd14ceSopenharmony_ci        LOGE("params is null!");
71617fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
71717fd14ceSopenharmony_ci    }
71817fd14ceSopenharmony_ci    InitPseudonymManger();
71917fd14ceSopenharmony_ci    PseudonymInfo *pseudonymInfo = BuildPseudonymInfoEntry(realInfo, pseudonymId, deviceId, indexKey);
72017fd14ceSopenharmony_ci    if (pseudonymInfo == NULL) {
72117fd14ceSopenharmony_ci        LOGE("Failed to build pseudonymInfoEntry");
72217fd14ceSopenharmony_ci        return HC_ERROR;
72317fd14ceSopenharmony_ci    }
72417fd14ceSopenharmony_ci    int ret = AddPseudonymIdInfoToMemory(osAccountId, pseudonymInfo);
72517fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
72617fd14ceSopenharmony_ci        LOGE("Failed to add pseudonymId info to memory");
72717fd14ceSopenharmony_ci        DestroyPseudonymInfo(pseudonymInfo);
72817fd14ceSopenharmony_ci        return ret;
72917fd14ceSopenharmony_ci    }
73017fd14ceSopenharmony_ci    ret = SaveOsAccountPseudonymDb(osAccountId);
73117fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
73217fd14ceSopenharmony_ci        LOGE("Failed to add Save Pseudonym info to Database");
73317fd14ceSopenharmony_ci        DestroyPseudonymInfo(pseudonymInfo);
73417fd14ceSopenharmony_ci        return ret;
73517fd14ceSopenharmony_ci    }
73617fd14ceSopenharmony_ci    return HC_SUCCESS;
73717fd14ceSopenharmony_ci}
73817fd14ceSopenharmony_ci
73917fd14ceSopenharmony_cistatic int32_t DeleteAllPseudonymId(int32_t osAccountId, const char *deviceId)
74017fd14ceSopenharmony_ci{
74117fd14ceSopenharmony_ci    if (deviceId == NULL) {
74217fd14ceSopenharmony_ci        LOGE("deviceId is null!");
74317fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
74417fd14ceSopenharmony_ci    }
74517fd14ceSopenharmony_ci    InitPseudonymManger();
74617fd14ceSopenharmony_ci    PseudonymInfoVec deletePseudonymIdVec = CreatePseudonymInfoVec();
74717fd14ceSopenharmony_ci    int32_t ret = DeletePseudonymInner(osAccountId, deviceId, &deletePseudonymIdVec, FIELD_DEVICE_ID);
74817fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
74917fd14ceSopenharmony_ci        LOGE("Failed to delete pseudonym inner, account id is: %d", osAccountId);
75017fd14ceSopenharmony_ci        DestroyPseudonymInfoVec(&deletePseudonymIdVec);
75117fd14ceSopenharmony_ci        return ret;
75217fd14ceSopenharmony_ci    }
75317fd14ceSopenharmony_ci    ret = SaveOsAccountPseudonymDb(osAccountId);
75417fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
75517fd14ceSopenharmony_ci        LOGE("Failed to save pseudonym data to db, account id is: %d", osAccountId);
75617fd14ceSopenharmony_ci        ClearPseudonymInfoVec(&deletePseudonymIdVec);
75717fd14ceSopenharmony_ci        return ret;
75817fd14ceSopenharmony_ci    }
75917fd14ceSopenharmony_ci    ClearPseudonymInfoVec(&deletePseudonymIdVec);
76017fd14ceSopenharmony_ci    return HC_SUCCESS;
76117fd14ceSopenharmony_ci}
76217fd14ceSopenharmony_ci
76317fd14ceSopenharmony_cistatic int32_t DeletePseudonymId(int32_t osAccountId, const char *indexKey)
76417fd14ceSopenharmony_ci{
76517fd14ceSopenharmony_ci    if (indexKey == NULL) {
76617fd14ceSopenharmony_ci        LOGE("indexKey is null!");
76717fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
76817fd14ceSopenharmony_ci    }
76917fd14ceSopenharmony_ci    InitPseudonymManger();
77017fd14ceSopenharmony_ci    PseudonymInfoVec deletePseudonymIdVec = CreatePseudonymInfoVec();
77117fd14ceSopenharmony_ci    int32_t ret = DeletePseudonymInner(osAccountId, indexKey, &deletePseudonymIdVec, FIELD_INDEX_KEY);
77217fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
77317fd14ceSopenharmony_ci        LOGE("Failed to delete pseudonym inner, account id is: %d", osAccountId);
77417fd14ceSopenharmony_ci        DestroyPseudonymInfoVec(&deletePseudonymIdVec);
77517fd14ceSopenharmony_ci        return ret;
77617fd14ceSopenharmony_ci    }
77717fd14ceSopenharmony_ci    ret = SaveOsAccountPseudonymDb(osAccountId);
77817fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
77917fd14ceSopenharmony_ci        LOGE("Failed to save pseudonym data to db, account id is: %d", osAccountId);
78017fd14ceSopenharmony_ci        ClearPseudonymInfoVec(&deletePseudonymIdVec);
78117fd14ceSopenharmony_ci        return ret;
78217fd14ceSopenharmony_ci    }
78317fd14ceSopenharmony_ci    ClearPseudonymInfoVec(&deletePseudonymIdVec);
78417fd14ceSopenharmony_ci    return HC_SUCCESS;
78517fd14ceSopenharmony_ci}
78617fd14ceSopenharmony_ci
78717fd14ceSopenharmony_cistatic bool IsNeedRefreshPseudonymId(int32_t osAccountId, const char *indexKey)
78817fd14ceSopenharmony_ci{
78917fd14ceSopenharmony_ci    if (indexKey == NULL) {
79017fd14ceSopenharmony_ci        LOGE("indexKey is null");
79117fd14ceSopenharmony_ci        return true;
79217fd14ceSopenharmony_ci    }
79317fd14ceSopenharmony_ci    InitPseudonymManger();
79417fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
79517fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = GetPseudonymInfoByOsAccountId(osAccountId);
79617fd14ceSopenharmony_ci    if (info == NULL) {
79717fd14ceSopenharmony_ci        LOGE("Failed to get Pseudonym by os account id");
79817fd14ceSopenharmony_ci        UnlockHcMutex(g_mutex);
79917fd14ceSopenharmony_ci        return true;
80017fd14ceSopenharmony_ci    }
80117fd14ceSopenharmony_ci    uint32_t index;
80217fd14ceSopenharmony_ci    PseudonymInfo **pseudonymInfoEntry = NULL;
80317fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(info->pseudonymInfoVec, index, pseudonymInfoEntry) {
80417fd14ceSopenharmony_ci        if ((pseudonymInfoEntry != NULL) && (*pseudonymInfoEntry != NULL) &&
80517fd14ceSopenharmony_ci            (strcmp((*pseudonymInfoEntry)->indexKey, indexKey) == 0)) {
80617fd14ceSopenharmony_ci            if (IsNeedRefresh(*pseudonymInfoEntry)) {
80717fd14ceSopenharmony_ci                UnlockHcMutex(g_mutex);
80817fd14ceSopenharmony_ci                return true;
80917fd14ceSopenharmony_ci            }
81017fd14ceSopenharmony_ci            (*pseudonymInfoEntry)->refreshCount--;
81117fd14ceSopenharmony_ci            UnlockHcMutex(g_mutex);
81217fd14ceSopenharmony_ci            return false;
81317fd14ceSopenharmony_ci        }
81417fd14ceSopenharmony_ci    }
81517fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
81617fd14ceSopenharmony_ci    return true;
81717fd14ceSopenharmony_ci}
81817fd14ceSopenharmony_ci
81917fd14ceSopenharmony_cistatic PseudonymManager g_pseudonymManager = {
82017fd14ceSopenharmony_ci    .loadPseudonymData = LoadPseudonymData,
82117fd14ceSopenharmony_ci    .getRealInfo = GetRealInfo,
82217fd14ceSopenharmony_ci    .getPseudonymId = GetPseudonymId,
82317fd14ceSopenharmony_ci    .savePseudonymId = SavePseudonymId,
82417fd14ceSopenharmony_ci    .deleteAllPseudonymId = DeleteAllPseudonymId,
82517fd14ceSopenharmony_ci    .deletePseudonymId = DeletePseudonymId,
82617fd14ceSopenharmony_ci    .isNeedRefreshPseudonymId = IsNeedRefreshPseudonymId
82717fd14ceSopenharmony_ci};
82817fd14ceSopenharmony_ci
82917fd14ceSopenharmony_ciPseudonymManager *GetPseudonymInstance(void)
83017fd14ceSopenharmony_ci{
83117fd14ceSopenharmony_ci    return &g_pseudonymManager;
83217fd14ceSopenharmony_ci}
83317fd14ceSopenharmony_ci
83417fd14ceSopenharmony_civoid DestroyPseudonymManager(void)
83517fd14ceSopenharmony_ci{
83617fd14ceSopenharmony_ci    (void)LockHcMutex(g_mutex);
83717fd14ceSopenharmony_ci    RemoveOsAccountEventCallback(PSEUDONYM_DATA_CALLBACK);
83817fd14ceSopenharmony_ci    uint32_t index;
83917fd14ceSopenharmony_ci    OsAccountPseudonymInfo *info = NULL;
84017fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(g_pseudonymDb, index, info) {
84117fd14ceSopenharmony_ci        ClearPseudonymInfoVec(&info->pseudonymInfoVec);
84217fd14ceSopenharmony_ci    }
84317fd14ceSopenharmony_ci    DESTROY_HC_VECTOR(PseudonymDb, &g_pseudonymDb);
84417fd14ceSopenharmony_ci    UnlockHcMutex(g_mutex);
84517fd14ceSopenharmony_ci    DestroyHcMutex(g_mutex);
84617fd14ceSopenharmony_ci    HcFree(g_mutex);
84717fd14ceSopenharmony_ci    g_mutex = NULL;
84817fd14ceSopenharmony_ci}