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}