diff --git a/interfaces/innerkits/accesstoken/test/unittest/src/accesstoken_kit_test.cpp b/interfaces/innerkits/accesstoken/test/unittest/src/accesstoken_kit_test.cpp index fa4fec5ea538f8c4ddd4071e1d58111ecc2643bd..84fd25bc9347ac500114da052872b2ad60d166ba 100755 --- a/interfaces/innerkits/accesstoken/test/unittest/src/accesstoken_kit_test.cpp +++ b/interfaces/innerkits/accesstoken/test/unittest/src/accesstoken_kit_test.cpp @@ -2012,42 +2012,6 @@ HWTEST_F(AccessTokenKitTest, CheckNativeDCap002, TestSize.Level1) ASSERT_EQ(RET_FAILED, ret); } -static void ConcurrencyCheckNativeDCapTask(unsigned int tokenID) -{ - for (int i = 0; i < CYCLE_TIMES; i++) { - int ret = AccessTokenKit::CheckNativeDCap(tokenID, "AT_CAP_01"); - ASSERT_EQ(RET_SUCCESS, ret); - } -} - -/** - * @tc.name: CheckNativeDCap004 - * @tc.desc: Check native dcap multiple threads. - * @tc.type: FUNC - * @tc.require:AR000GK6TD - */ -HWTEST_F(AccessTokenKitTest, CheckNativeDCap004, TestSize.Level1) -{ - const char **dcaps = (const char **)malloc(sizeof(char *) * 1); - dcaps[0] = "AT_CAP_01"; - int dcapNum = 1; - uint64_t tokenId; - tokenId = GetAccessTokenId("foundation", dcaps, dcapNum, "system_core"); - ASSERT_NE(tokenId, 0); - tokenId = GetAccessTokenId("CheckNativeDCap004", dcaps, dcapNum, "system_core"); - ASSERT_NE(tokenId, 0); - - sleep(5); - AccessTokenID tokenID = tokenId & 0xffffffff; - std::vector threadVec; - for (int i = 0; i < THREAD_NUM; i++) { - threadVec.emplace_back(std::thread(ConcurrencyCheckNativeDCapTask, tokenID)); - } - for (auto it = threadVec.begin(); it != threadVec.end(); it++) { - it->join(); - } -} - /** * @tc.name: GetNativeTokenInfo001 * @tc.desc: cannot get native token with invalid tokenID. @@ -2064,103 +2028,4 @@ HWTEST_F(AccessTokenKitTest, GetNativeTokenInfo001, TestSize.Level1) tokenID = 0xff; ret = AccessTokenKit::GetNativeTokenInfo(tokenID, findInfo); ASSERT_EQ(ret, RET_FAILED); -} - -/** - * @tc.name: GetNativeTokenInfo002 - * @tc.desc: get native token successfully. - * @tc.type: FUNC - * @tc.require:AR000GK6TD - */ -HWTEST_F(AccessTokenKitTest, GetNativeTokenInfo002, TestSize.Level1) -{ - const char **dcaps = (const char **)malloc(sizeof(char *) * 2); - dcaps[0] = "AT_CAP_01"; - dcaps[1] = "ST_CAP_01"; - int dcapNum = 2; - uint64_t tokenId; - tokenId = GetAccessTokenId("foundation", dcaps, dcapNum, "system_core"); - ASSERT_NE(tokenId, 0); - tokenId = GetAccessTokenId("GetNativeTokenInfo002", dcaps, dcapNum, "system_core"); - ASSERT_NE(tokenId, 0); - - sleep(5); - AccessTokenID tokenID = tokenId & 0xffffffff; - NativeTokenInfo findInfo; - int ret = AccessTokenKit::GetNativeTokenInfo(tokenID, findInfo); - ASSERT_EQ(ret, RET_SUCCESS); - ASSERT_EQ(findInfo.apl, 3); - ASSERT_EQ(findInfo.ver, 1); - ASSERT_EQ(findInfo.processName, "GetNativeTokenInfo002"); - ASSERT_EQ(findInfo.tokenID, tokenID); - ASSERT_EQ(findInfo.tokenAttr, 0); - std::vector dcap = {"AT_CAP_01", "ST_CAP_01"}; - ASSERT_EQ(findInfo.dcap, dcap); -} - -/** - * @tc.name: GetNativeTokenInfo003 - * @tc.desc: get native token successfully. - * @tc.type: FUNC - * @tc.require:AR000GK6TD - */ -HWTEST_F(AccessTokenKitTest, GetNativeTokenInfo003, TestSize.Level1) -{ - const char **dcaps = (const char **)malloc(sizeof(char *) * 2); - dcaps[0] = "AT_CAP_01"; - dcaps[1] = "ST_CAP_01"; - int dcapNum = 0; - uint64_t tokenId; - tokenId = GetAccessTokenId("foundation", dcaps, dcapNum, "system_core"); - ASSERT_NE(tokenId, 0); - tokenId = GetAccessTokenId("GetNativeTokenInfo003", nullptr, 0, "system_core"); - ASSERT_NE(tokenId, 0); - - sleep(5); - AccessTokenID tokenID = tokenId & 0xffffffff; - NativeTokenInfo findInfo; - int ret = AccessTokenKit::GetNativeTokenInfo(tokenID, findInfo); - ASSERT_EQ(ret, RET_SUCCESS); - ASSERT_EQ(findInfo.apl, 3); - ASSERT_EQ(findInfo.ver, 1); - ASSERT_EQ(findInfo.processName, "GetNativeTokenInfo003"); - ASSERT_EQ(findInfo.tokenID, tokenID); - ASSERT_EQ(findInfo.tokenAttr, 0); -} - -static void ConcurrGetNativeTokenInfoTask(unsigned int tokenID) -{ - NativeTokenInfo findInfo; - for (int i = 0; i < CYCLE_TIMES; i++) { - int ret = AccessTokenKit::GetNativeTokenInfo(tokenID, findInfo); - ASSERT_EQ(RET_SUCCESS, ret); - } -} - -/** - * @tc.name: GetNativeTokenInfo004 - * @tc.desc: Concurrency testing. - * @tc.type: FUNC - * @tc.require:AR000GK6TD - */ -HWTEST_F(AccessTokenKitTest, GetNativeTokenInfo004, TestSize.Level1) -{ - const char **dcaps = (const char **)malloc(sizeof(char *) * 1); - dcaps[0] = "AT_CAP_01"; - int dcapNum = 1; - uint64_t tokenId; - tokenId = GetAccessTokenId("foundation", dcaps, dcapNum, "system_core"); - ASSERT_NE(tokenId, 0); - tokenId = GetAccessTokenId("GetNativeTokenInfo004", dcaps, dcapNum, "system_core"); - ASSERT_NE(tokenId, 0); - - sleep(5); - AccessTokenID tokenID = tokenId & 0xffffffff; - std::vector threadVec; - for (int i = 0; i < THREAD_NUM; i++) { - threadVec.emplace_back(std::thread(ConcurrGetNativeTokenInfoTask, tokenID)); - } - for (auto it = threadVec.begin(); it != threadVec.end(); it++) { - it->join(); - } } \ No newline at end of file diff --git a/interfaces/innerkits/nativetoken/BUILD.gn b/interfaces/innerkits/nativetoken/BUILD.gn index cfac0a9248e397ca2a5d9c889794a96ba1d9a83a..5a4163d3be70cb500db2d82bf8630d4dc37d2c62 100644 --- a/interfaces/innerkits/nativetoken/BUILD.gn +++ b/interfaces/innerkits/nativetoken/BUILD.gn @@ -29,26 +29,19 @@ ohos_static_library("libnativetoken") { public_configs = [ ":accesstokenlib" ] cflags = [ "-Wall" ] - cflags += [ "-pthread" ] include_dirs = [ - "//utils/native/base/include", - "//base/security/access_token/frameworks/common/include", "include", "src", "//third_party/cJSON", "//third_party/bounds_checking_function/include", - "//base/startup/syspara_lite/interfaces/innerkits/native/syspara/include/", ] sources = [ "src/nativetoken.c" ] deps = [ - "//base/security/access_token/frameworks/common:accesstoken_common_cxx", - "//base/startup/syspara_lite/interfaces/innerkits/native/syspara:syspara", + "//third_party/bounds_checking_function:libsec_static", "//third_party/cJSON:cjson_static", - "//utils/native/base:utils", - "//utils/native/base:utilsecurec_shared", ] external_deps = [ "hiviewdfx_hilog_native:libhilog" ] diff --git a/interfaces/innerkits/nativetoken/include/nativetoken.h b/interfaces/innerkits/nativetoken/include/nativetoken.h index ed40a070474eecd96def195c46d432ba78e85ff1..dc036b648e26cb19ba0f083365d839e728576d01 100644 --- a/interfaces/innerkits/nativetoken/include/nativetoken.h +++ b/interfaces/innerkits/nativetoken/include/nativetoken.h @@ -13,14 +13,14 @@ * limitations under the License. */ -#include -#include -#include +#include #include +#include #include -#include #include #include +#include + #include "cJSON.h" #include "securec.h" #include "nativetoken_log.h" @@ -33,7 +33,7 @@ extern "C" { #endif #define MAX_PROCESS_NAME_LEN 256 -#define TOKEN_ID_CFG_PATH "/data/token.json" +#define TOKEN_ID_CFG_PATH "/data/system/access_token/nativetoken.json" #define SOCKET_FILE "/data/system/token_unix_socket.socket" #define TOKEN_NATIVE_TYPE 1 #define DEFAULT_AT_VERSION 1 @@ -45,13 +45,20 @@ extern "C" { #define SYSTEM_PROP_NATIVE_RECEPTOR "rw.nativetoken.receptor.startup" #define PATH_MAX_LEN 4096 -#define FOUNDATION_NOT_STARTED 0 -#define FOUNDATION_STARTING 1 -#define ATM_SERVICE_STARTUP 2 - #define ATRET_FAILED 1 #define ATRET_SUCCESS 0 +#define DCAPS_KEY_NAME "dcaps" +#define TOKENID_KEY_NAME "tokenId" +#define TOKEN_ATTR_KEY_NAME "tokenAttr" +#define APL_KEY_NAME "APL" +#define VERSION_KEY_NAME "version" +#define PROCESS_KEY_NAME "processName" + +#define SYSTEM_CORE 3 +#define SYSTEM_BASIC 2 +#define NORMAL 1 + typedef unsigned int NativeAtId; typedef unsigned int NativeAtAttr; @@ -69,32 +76,16 @@ typedef struct { typedef struct TokenList { NativeAtId tokenId; + int32_t apl; + char *dcaps[MAX_DCAPS_NUM]; + int dcapsNum; char processName[MAX_PROCESS_NAME_LEN + 1]; struct TokenList *next; } NativeTokenList; -typedef struct TokenQueue { - NativeAtId tokenId; - int apl; - const char *processName; - const char **dcaps; - int dcapsNum; - int flag; - struct TokenQueue *next; -} NativeTokenQueue; - -#define TOKEN_QUEUE_NODE_INFO_SET(tmp, apl, processname, tokenId, exist, dcap, dacpNum) do { \ - (tmp).apl = (apl); \ - (tmp).processName = (processname); \ - (tmp).tokenId = (tokenId); \ - (tmp).flag = (exist); \ - (tmp).dcaps = (dcap); \ - (tmp).dcapsNum = (dacpNum); \ -} while (0) - extern int32_t GetFileBuff(const char *cfg, char **retBuff); #ifdef __cplusplus } #endif -#endif // NATIVE_TOKEN_H +#endif // NATIVE_TOKEN_H \ No newline at end of file diff --git a/interfaces/innerkits/nativetoken/include/nativetoken_kit.h b/interfaces/innerkits/nativetoken/include/nativetoken_kit.h index f03eff95bc354e4f00debcf60c6d9d423426d673..564dcb76fd6b5d07054417d374895fe459fc877e 100644 --- a/interfaces/innerkits/nativetoken/include/nativetoken_kit.h +++ b/interfaces/innerkits/nativetoken/include/nativetoken_kit.h @@ -25,8 +25,6 @@ extern "C" { #endif -extern int32_t AtlibInit(void); - extern uint64_t GetAccessTokenId(const char *processname, const char **dcap, int32_t dacpNum, const char *aplStr); #ifdef __cplusplus diff --git a/interfaces/innerkits/nativetoken/src/nativetoken.c b/interfaces/innerkits/nativetoken/src/nativetoken.c index 5cedde57201c90c6fe0fe4bc8833e3cf730ae543..5373e41a6527f160d6a757315a748f7d88f76965 100644 --- a/interfaces/innerkits/nativetoken/src/nativetoken.c +++ b/interfaces/innerkits/nativetoken/src/nativetoken.c @@ -14,15 +14,9 @@ */ #include "nativetoken.h" #include "nativetoken_kit.h" -#include "parameter.h" -#include "random.h" -NativeTokenQueue *g_tokenQueueHead; NativeTokenList *g_tokenListHead; -int32_t g_tranferStatus; int32_t g_isNativeTokenInited = 0; -int32_t g_signalFd; -static pthread_mutex_t g_tokenQueueHeadLock = PTHREAD_MUTEX_INITIALIZER; int32_t GetFileBuff(const char *cfg, char **retBuff) { @@ -64,7 +58,7 @@ int32_t GetFileBuff(const char *cfg, char **retBuff) return ATRET_FAILED; } - if (fread(buff, fileSize, 1, cfgFd) != 1) { + if (fread(buff, (size_t)fileSize, 1, cfgFd) != 1) { ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:fread failed.", __func__); free(buff); buff = NULL; @@ -79,13 +73,95 @@ int32_t GetFileBuff(const char *cfg, char **retBuff) return ret; } +void FreeDcaps(char *dcaps[MAX_DCAPS_NUM], int32_t num) +{ + for (int32_t i = 0; i <= num; i++) { + if (dcaps[i] != NULL) { + free(dcaps[i]); + dcaps[i] = NULL; + } + } +} + +int32_t GetprocessNameFromJson(cJSON *cjsonItem, NativeTokenList *tokenNode) +{ + cJSON *processNameJson = cJSON_GetObjectItem(cjsonItem, PROCESS_KEY_NAME); + if (cJSON_IsString(processNameJson) == 0 || (strlen(processNameJson->valuestring) > MAX_PROCESS_NAME_LEN)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:processNameJson is invalid.", __func__); + return ATRET_FAILED; + } + + if (strcpy_s(tokenNode->processName, MAX_PROCESS_NAME_LEN + 1, processNameJson->valuestring) != EOK) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:strcpy_s failed.", __func__); + return ATRET_FAILED; + } + return ATRET_SUCCESS; +} + +int32_t GetTokenIdFromJson(cJSON *cjsonItem, NativeTokenList *tokenNode) +{ + cJSON *tokenIdJson = cJSON_GetObjectItem(cjsonItem, TOKENID_KEY_NAME); + if ((cJSON_IsNumber(tokenIdJson) == 0) || (cJSON_GetNumberValue(tokenIdJson) <= 0)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:tokenIdJson is invalid.", __func__); + return ATRET_FAILED; + } + tokenNode->tokenId = (NativeAtId)tokenIdJson->valueint; + return ATRET_SUCCESS; +} + +int32_t GetAplFromJson(cJSON *cjsonItem, NativeTokenList *tokenNode) +{ + cJSON *aplJson = cJSON_GetObjectItem(cjsonItem, APL_KEY_NAME); + if (cJSON_IsNumber(aplJson) == 0) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:aplJson is invalid.", __func__); + return ATRET_FAILED; + } + int apl = cJSON_GetNumberValue(aplJson); + if (apl <= 0 || apl > SYSTEM_CORE) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:apl = %d in file is invalid.", __func__, apl); + return ATRET_FAILED; + } + tokenNode->apl = aplJson->valueint; + return ATRET_SUCCESS; +} + +int32_t GetDcapsInfoFromJson(cJSON *cjsonItem, NativeTokenList *tokenNode) +{ + cJSON *dcapsJson = cJSON_GetObjectItem(cjsonItem, DCAPS_KEY_NAME); + int32_t dcapSize = cJSON_GetArraySize(dcapsJson); + + tokenNode->dcapsNum = dcapSize; + for (int32_t i = 0; i < dcapSize; i++) { + cJSON *dcapItem = cJSON_GetArrayItem(dcapsJson, i); + if (dcapItem == NULL) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_GetArrayItem failed.", __func__); + return ATRET_FAILED; + } + size_t length = strlen(dcapItem->valuestring); + if (cJSON_IsString(dcapItem) == 0 || (length > MAX_DCAP_LEN)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:dcapItem is invalid.", __func__); + return ATRET_FAILED; + } + tokenNode->dcaps[i] = (char *)malloc(sizeof(char) * length); + if (tokenNode->dcaps[i] == NULL) { + FreeDcaps(tokenNode->dcaps, i - 1); + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:malloc invalid.", __func__); + return ATRET_FAILED; + } + if (strcpy_s(tokenNode->dcaps[i], length + 1, dcapItem->valuestring) != EOK) { + FreeDcaps(tokenNode->dcaps, i); + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:strcpy_s failed.", __func__); + return ATRET_FAILED; + } + } + return ATRET_SUCCESS; +} + int32_t GetTokenList(const cJSON *object) { - cJSON *cjsonItem = NULL; int32_t arraySize; int32_t i; - cJSON *processNameJson = NULL; - cJSON *tokenIdJson = NULL; + int ret; NativeTokenList *tmp = NULL; if (object == NULL) { @@ -93,29 +169,26 @@ int32_t GetTokenList(const cJSON *object) } arraySize = cJSON_GetArraySize(object); for (i = 0; i < arraySize; i++) { - cjsonItem = cJSON_GetArrayItem(object, i); - processNameJson = cJSON_GetObjectItem(cjsonItem, "processName"); - tokenIdJson = cJSON_GetObjectItem(cjsonItem, "tokenId"); - if (cJSON_IsString(processNameJson) == 0 || (strlen(processNameJson->valuestring) > MAX_PROCESS_NAME_LEN)) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:processNameJson is invalid.", __func__); - return ATRET_FAILED; - } - if ((cJSON_IsNumber(tokenIdJson) == 0) || (cJSON_GetNumberValue(tokenIdJson) <= 0)) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:tokenIdJson is invalid.", __func__); - return ATRET_FAILED; - } - tmp = (NativeTokenList *)malloc(sizeof(NativeTokenList)); if (tmp == NULL) { ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:memory alloc failed.", __func__); return ATRET_FAILED; } - if (strcpy_s(tmp->processName, MAX_PROCESS_NAME_LEN + 1, processNameJson->valuestring) != EOK) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:strcpy_s failed.", __func__); + cJSON *cjsonItem = cJSON_GetArrayItem(object, i); + if (cjsonItem == NULL) { free(tmp); + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_GetArrayItem failed.", __func__); return ATRET_FAILED; } - tmp->tokenId = (NativeAtId)tokenIdJson->valueint; + ret = GetprocessNameFromJson(cjsonItem, tmp); + ret |= GetTokenIdFromJson(cjsonItem, tmp); + ret |= GetAplFromJson(cjsonItem, tmp); + ret |= GetDcapsInfoFromJson(cjsonItem, tmp); + if (ret != ATRET_SUCCESS) { + free(tmp); + return ret; + } + tmp->next = g_tokenListHead->next; g_tokenListHead->next = tmp; } @@ -157,36 +230,45 @@ int32_t AtlibInit(void) } g_tokenListHead->next = NULL; - g_tokenQueueHead = (NativeTokenQueue *)malloc(sizeof(NativeTokenQueue)); - if (g_tokenQueueHead == NULL) { - free(g_tokenListHead); - g_tokenListHead = NULL; - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:g_tokenQueueHead memory alloc failed.", __func__); - return ATRET_FAILED; - } - g_tokenQueueHead->next = NULL; - int32_t ret = ParseTokenInfoFromCfg(TOKEN_ID_CFG_PATH); if (ret != ATRET_SUCCESS) { free(g_tokenListHead); g_tokenListHead = NULL; - free(g_tokenQueueHead); - g_tokenQueueHead = NULL; return ret; } - g_tranferStatus = FOUNDATION_NOT_STARTED; g_isNativeTokenInited = 1; return ATRET_SUCCESS; } +int GetRandomTokenId(uint32_t *randNum) +{ + uint32_t random; + int len; + int fd = open("/dev/urandom", O_RDONLY); + if (fd < 0) { + return ATRET_FAILED; + } + len = read(fd, &random, sizeof(random)); + (void)close(fd); + if (len != sizeof(random)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:read failed.", __func__); + return ATRET_FAILED; + } + *randNum = random; + return ATRET_SUCCESS; +} + NativeAtId CreateNativeTokenId(void) { uint32_t rand; NativeAtId tokenId; AtInnerInfo *innerId = (AtInnerInfo *)(&tokenId); - rand = GetRandomUint32(); + int ret = GetRandomTokenId(&rand); + if (ret != ATRET_SUCCESS) { + return 0; + } innerId->reserved = 0; innerId->tokenUniqueId = rand & (0xFFFFFF); @@ -195,78 +277,24 @@ NativeAtId CreateNativeTokenId(void) return tokenId; } -int32_t TriggerTransfer() -{ - int32_t ret; - static const uint64_t increment = 1; - ret = write(g_signalFd, &increment, sizeof(increment)); - if (ret == -1) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:TriggerTransfer write failed.", __func__); - return ATRET_FAILED; - } - return ATRET_SUCCESS; -} - -int32_t TokenInfoSave(const NativeTokenQueue *node) -{ - if (node->apl == 0) { - return ATRET_FAILED; - } - NativeTokenQueue *curr; - curr = (NativeTokenQueue *)malloc(sizeof(NativeTokenQueue)); - if (curr == NULL) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:memory alloc failed.", __func__); - return ATRET_FAILED; - } - curr->apl = node->apl; - curr->processName = node->processName; - curr->tokenId = node->tokenId; - curr->flag = node->flag; - curr->dcaps = node->dcaps; - curr->dcapsNum = node->dcapsNum; - - pthread_mutex_lock(&g_tokenQueueHeadLock); - curr->next = g_tokenQueueHead->next; - g_tokenQueueHead->next = curr; - pthread_mutex_unlock(&g_tokenQueueHeadLock); - - if (g_tranferStatus == ATM_SERVICE_STARTUP) { - return TriggerTransfer(); - } - return ATRET_SUCCESS; -} - int32_t GetAplLevel(const char *aplStr) { if (aplStr == NULL) { return 0; } if (strcmp(aplStr, "system_core") == 0) { - return 3; // system_core means apl level is 3 + return SYSTEM_CORE; // system_core means apl level is 3 } if (strcmp(aplStr, "system_basic") == 0) { - return 2; // system_basic means apl level is 2 + return SYSTEM_BASIC; // system_basic means apl level is 2 } if (strcmp(aplStr, "normal") == 0) { - return 1; + return NORMAL; } ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:aplStr is invalid.", __func__); return 0; } -int32_t SendString(const char *str, int32_t fd) -{ - int32_t writtenSize; - int32_t len = strlen(str); - - writtenSize = write(fd, str, len); - if (len != writtenSize) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:SendString write failed.", __func__); - return ATRET_FAILED; - } - return ATRET_SUCCESS; -} - void WriteToFile(const cJSON *root) { int32_t strLen; @@ -286,7 +314,7 @@ void WriteToFile(const cJSON *root) break; } strLen = strlen(jsonStr); - writtenLen = write(fd, (void *)jsonStr, strLen); + writtenLen = write(fd, (void *)jsonStr, (size_t)strLen); close(fd); if (writtenLen != strLen) { ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:write failed, writtenLen is %d.", __func__, writtenLen); @@ -298,288 +326,118 @@ void WriteToFile(const cJSON *root) return; } -int32_t ExistNewTokenInfo(const NativeTokenQueue *head) +int32_t AddDcapsArray(cJSON *object, const NativeTokenList *curr) { - const NativeTokenQueue *iter = head; - while (iter != NULL) { - if (iter->flag == 0) { - return 1; - } - iter = iter->next; - } - return 0; -} -void SaveTokenIdToCfg(const NativeTokenQueue *head) -{ - const NativeTokenQueue *iter = head; - char *fileBuff = NULL; - cJSON *record = NULL; - int32_t ret; - - ret = ExistNewTokenInfo(head); - if (ret == 0) { - ACCESSTOKEN_LOG_INFO("[ATLIB-%s]:there is no new info.", __func__); - return; - } - ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); - if (ret != ATRET_SUCCESS) { - return; - } - - if (fileBuff == NULL) { - record = cJSON_CreateArray(); - } else { - record = cJSON_Parse(fileBuff); - free(fileBuff); - fileBuff = NULL; - } - - if (record == NULL) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:get record failed.", __func__); - return; + cJSON *dcapsArr = cJSON_CreateArray(); + if (dcapsArr == NULL) { + return ATRET_FAILED; } - - while (iter != NULL) { - if (iter->flag == 1) { - iter = iter->next; - continue; - } - cJSON *node = cJSON_CreateObject(); - if (node == NULL) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_CreateObject failed.", __func__); - cJSON_Delete(record); - return; + for (int32_t i = 0; i < curr->dcapsNum; i++) { + cJSON *item = cJSON_CreateString(curr->dcaps[i]); + if (item == NULL || !cJSON_AddItemToArray(dcapsArr, item)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:tokenAttr cJSON_AddItemToArray failed.", __func__); + cJSON_Delete(item); + cJSON_Delete(dcapsArr); + return ATRET_FAILED; } - cJSON_AddItemToObject(node, "processName", cJSON_CreateString(iter->processName)); - cJSON_AddItemToObject(node, "tokenId", cJSON_CreateNumber(iter->tokenId)); - cJSON_AddItemToArray(record, node); - iter = iter->next; } - WriteToFile(record); - cJSON_Delete(record); - return; + if (!cJSON_AddItemToObject(object, DCAPS_KEY_NAME, dcapsArr)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:dcaps cJSON_AddItemToObject failed.", __func__); + cJSON_Delete(dcapsArr); + return ATRET_FAILED; + } + return ATRET_SUCCESS; } -static cJSON *CreateNativeTokenJsonObject(const NativeTokenQueue *curr) +static cJSON *CreateNativeTokenJsonObject(const NativeTokenList *curr) { cJSON *object = cJSON_CreateObject(); if (object == NULL) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_CreateObject failed.", __func__); return NULL; } + cJSON *item = cJSON_CreateString(curr->processName); - if (item == NULL || !cJSON_AddItemToObject(object, "processName", item)) { + if (item == NULL || !cJSON_AddItemToObject(object, PROCESS_KEY_NAME, item)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:processName cJSON_AddItemToObject failed.", __func__); cJSON_Delete(item); + cJSON_Delete(object); return NULL; } item = cJSON_CreateNumber(curr->apl); - if (item == NULL || !cJSON_AddItemToObject(object, "APL", item)) { + if (item == NULL || !cJSON_AddItemToObject(object, APL_KEY_NAME, item)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:APL cJSON_AddItemToObject failed.", __func__); cJSON_Delete(item); + cJSON_Delete(object); return NULL; } item = cJSON_CreateNumber(DEFAULT_AT_VERSION); - if (item == NULL || !cJSON_AddItemToObject(object, "version", item)) { + if (item == NULL || !cJSON_AddItemToObject(object, VERSION_KEY_NAME, item)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:version cJSON_AddItemToObject failed.", __func__); cJSON_Delete(item); + cJSON_Delete(object); return NULL; } item = cJSON_CreateNumber(curr->tokenId); - if (item == NULL || !cJSON_AddItemToObject(object, "tokenId", item)) { + if (item == NULL || !cJSON_AddItemToObject(object, TOKENID_KEY_NAME, item)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:tokenId cJSON_AddItemToObject failed.", __func__); cJSON_Delete(item); + cJSON_Delete(object); return NULL; } item = cJSON_CreateNumber(0); - if (item == NULL || !cJSON_AddItemToObject(object, "tokenAttr", item)) { + if (item == NULL || !cJSON_AddItemToObject(object, TOKEN_ATTR_KEY_NAME, item)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:tokenAttr cJSON_AddItemToObject failed.", __func__); cJSON_Delete(item); + cJSON_Delete(object); return NULL; } - - cJSON *dcapsArr = cJSON_CreateArray(); - if (dcapsArr == NULL) { - return NULL; - } - for (int32_t i = 0; i < curr->dcapsNum; i++) { - item = cJSON_CreateString(curr->dcaps[i]); - if (item == NULL || !cJSON_AddItemToArray(dcapsArr, item)) { - cJSON_Delete(item); - cJSON_Delete(dcapsArr); - return NULL; - } - } - if (!cJSON_AddItemToObject(object, "dcaps", dcapsArr)) { - cJSON_Delete(dcapsArr); - return NULL; + int ret = AddDcapsArray(object, curr); + if (ret != ATRET_SUCCESS) { + cJSON_Delete(object); } - return object; } - -static char *GetStrFromJson(const cJSON *root) -{ - char *jsonStr = cJSON_PrintUnformatted(root); - if (jsonStr == NULL) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_PrintUnformatted failed.", __func__); - return NULL; - } - - char *str = (char *)malloc(sizeof(char) * (strlen(jsonStr) + 1)); - if (str == NULL) { - cJSON_free(jsonStr); - return NULL; - } - - if (strcpy_s(str, strlen(jsonStr) + 1, jsonStr) != EOK) { - free(str); - str = NULL; - } - cJSON_free(jsonStr); - return str; -} - -static char *GetStringToBeSync(NativeTokenQueue *head) + +void SaveTokenIdToCfg(const NativeTokenList *curr) { - cJSON *object = NULL; - NativeTokenQueue *node = NULL; - - cJSON *array = cJSON_CreateArray(); - if (array == NULL) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_CreateArray failed.", __func__); - return NULL; - } - - NativeTokenQueue *curr = head; - while (curr != 0) { - object = CreateNativeTokenJsonObject(curr); - if (object == NULL) { - cJSON_Delete(array); - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:CreateNativeTokenJsonObject failed.", __func__); - return NULL; - } - if (!cJSON_AddItemToArray(array, object)) { - cJSON_Delete(object); - cJSON_Delete(array); - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_AddItemToArray failed.", __func__); - return NULL; - } - node = curr; - curr = curr->next; - free(node); - node = NULL; - } - - cJSON *root = cJSON_CreateObject(); - if (root == NULL) { - cJSON_Delete(array); - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_CreateObject failed.", __func__); - return NULL; - } - - if (!cJSON_AddItemToObject(root, TRANSFER_KEY_WORDS, array)) { - cJSON_Delete(root); - cJSON_Delete(array); - return NULL; - } - char *str = GetStrFromJson(root); - cJSON_Delete(root); - return str; -} + char *fileBuff = NULL; + cJSON *record = NULL; + int32_t ret; -static int32_t SyncToAtm(void) -{ - int32_t result; - struct sockaddr_un addr; - int32_t fd = -1; - char *str = NULL; - - pthread_mutex_lock(&g_tokenQueueHeadLock); - NativeTokenQueue *begin = g_tokenQueueHead->next; - g_tokenQueueHead->next = NULL; - pthread_mutex_unlock(&g_tokenQueueHeadLock); - - if (begin == NULL) { - ACCESSTOKEN_LOG_INFO("[ATLIB-%s]:noting to be sent.", __func__); - return ATRET_SUCCESS; + ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); + if (ret != ATRET_SUCCESS) { + return; } - SaveTokenIdToCfg(begin); - - str = GetStringToBeSync(begin); - if (str == NULL) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:str is null.", __func__); - return ATRET_FAILED; + if (fileBuff == NULL) { + record = cJSON_CreateArray(); + } else { + record = cJSON_Parse(fileBuff); + free(fileBuff); + fileBuff = NULL; } - do { - fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd < 0) { - result = ATRET_FAILED; - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:socket failed.", __func__); - break; - } - (void)memset_s(&addr, sizeof(struct sockaddr_un), 0, sizeof(struct sockaddr_un)); - addr.sun_family = AF_UNIX; - if (strncpy_s(addr.sun_path, sizeof(addr.sun_path), SOCKET_FILE, sizeof(addr.sun_path) - 1) != EOK) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:strncpy_s failed.", __func__); - close(fd); - result = ATRET_FAILED; - break; - } - result = connect(fd, (struct sockaddr *)&addr, sizeof(addr)); - if (result != 0) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:connect failed. errno %d", __func__, errno); - close(fd); - result = ATRET_FAILED; - break; - } - ACCESSTOKEN_LOG_INFO("[ATLIB-%s]:str is to be sent %s.", __func__, str); - result = SendString(str, fd); - close(fd); - } while (0); - - free(str); - return result; -} - -void *ThreadTransferFunc(const void *args) -{ - int32_t ret; - g_tranferStatus = FOUNDATION_STARTING; - - /* getpram */ - while (1) { - char buffer[MAX_PARAMTER_LEN] = {0}; - ret = GetParameter(SYSTEM_PROP_NATIVE_RECEPTOR, "false", buffer, MAX_PARAMTER_LEN - 1); - if (ret > 0 && !strncmp(buffer, "true", strlen("true"))) { - break; - } - ACCESSTOKEN_LOG_INFO("[ATLIB-%s]: %s get failed.", __func__, SYSTEM_PROP_NATIVE_RECEPTOR); - sleep(1); + if (record == NULL) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:get record failed.", __func__); + return; } - g_signalFd = eventfd(0, 0); - if (g_signalFd == -1) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:eventfd failed.", __func__); - return NULL; + cJSON *node = CreateNativeTokenJsonObject(curr); + if (node == NULL) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:CreateNativeTokenJsonObject failed.", __func__); + cJSON_Delete(record); + return; } + cJSON_AddItemToArray(record, node); - g_tranferStatus = ATM_SERVICE_STARTUP; - - uint64_t result; - while (1) { - ret = read(g_signalFd, &result, sizeof(uint64_t)); - if (ret == -1) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:read failed.", __func__); - continue; - } - - ret = SyncToAtm(); - if (ret != ATRET_SUCCESS) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:SyncToAtm failed.", __func__); - } - } - return NULL; + WriteToFile(record); + cJSON_Delete(record); + return; } int32_t CheckProcessInfo(const char *processname, const char **dcaps, @@ -595,7 +453,7 @@ int32_t CheckProcessInfo(const char *processname, const char **dcaps, ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:dcaps is null or dacpNum is invalid.", __func__); return ATRET_FAILED; } - for (int i = 0; i < dacpNum; i++) { + for (int32_t i = 0; i < dacpNum; i++) { if (strlen(dcaps[i]) > MAX_DCAP_LEN) { ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:dcap length is invalid.", __func__); return ATRET_FAILED; @@ -610,7 +468,7 @@ int32_t CheckProcessInfo(const char *processname, const char **dcaps, return ATRET_SUCCESS; } -int NativeTokenIdCheck(NativeAtId tokenId) +int32_t NativeTokenIdCheck(NativeAtId tokenId) { NativeTokenList *tokenNode = g_tokenListHead; while (tokenNode != NULL) { @@ -621,11 +479,14 @@ int NativeTokenIdCheck(NativeAtId tokenId) } return 0; } -static int32_t AddNewNativeTokenToList(const char *processname, NativeAtId *tokenId) + +static int32_t AddNewTokenToListAndCfgFile(const char *processname, const char **dcapsIn, + int32_t dacpNumIn, int32_t aplIn, NativeAtId *tokenId) { NativeTokenList *tokenNode; NativeAtId id; int32_t repeat; + do { id = CreateNativeTokenId(); repeat = NativeTokenIdCheck(id); @@ -636,25 +497,169 @@ static int32_t AddNewNativeTokenToList(const char *processname, NativeAtId *toke ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:memory alloc failed.", __func__); return ATRET_FAILED; } + tokenNode->tokenId = id; + tokenNode->apl = aplIn; if (strcpy_s(tokenNode->processName, MAX_PROCESS_NAME_LEN + 1, processname) != EOK) { ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:strcpy_s failed.", __func__); free(tokenNode); return ATRET_FAILED; } - tokenNode->tokenId = id; + tokenNode->dcapsNum = dacpNumIn; + + for (int32_t i = 0; i < dacpNumIn; i++) { + tokenNode->dcaps[i] = (char *)malloc(sizeof(char) * (strlen(dcapsIn[i]) + 1)); + if (tokenNode->dcaps[i] != NULL && + (strcpy_s(tokenNode->dcaps[i], strlen(dcapsIn[i]) + 1, dcapsIn[i]) != EOK)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:copy dcapsIn[%d] failed.", __func__, i); + FreeDcaps(tokenNode->dcaps, i); + free(tokenNode); + return ATRET_FAILED; + } + } tokenNode->next = g_tokenListHead->next; g_tokenListHead->next = tokenNode; *tokenId = id; + + SaveTokenIdToCfg(tokenNode); + return ATRET_SUCCESS; +} + +int32_t CompareProcessInfo(NativeTokenList *tokenNode, const char **dcapsIn, int32_t dacpNumIn, int32_t aplIn) +{ + if (tokenNode->apl != aplIn) { + return 1; + } + if (tokenNode->dcapsNum != dacpNumIn) { + return 1; + } + for (int32_t i = 0; i < dacpNumIn; i++) { + if (strcmp(tokenNode->dcaps[i], dcapsIn[i]) != 0) { + return 1; + } + } + return 0; +} + +int32_t UpdateTokenInfoInList(NativeTokenList *tokenNode, const char **dcapsIn, int32_t dacpNumIn, int32_t aplIn) +{ + tokenNode->apl = aplIn; + + for (int32_t i = 0; i < tokenNode->dcapsNum; i++) { + free(tokenNode->dcaps[i]); + tokenNode->dcaps[i] = NULL; + } + + tokenNode->dcapsNum = dacpNumIn; + for (int32_t i = 0; i < dacpNumIn; i++) { + int32_t len = strlen(dcapsIn[i]) + 1; + tokenNode->dcaps[i] = (char *)malloc(sizeof(char) * len); + if (tokenNode->dcaps[i] != NULL && (strcpy_s(tokenNode->dcaps[i], len, dcapsIn[i]) != EOK)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:copy dcapsIn[%d] failed.", __func__, i); + FreeDcaps(tokenNode->dcaps, i); + return ATRET_FAILED; + } + } + return ATRET_SUCCESS; +} + +int32_t UpdateItemcontent(const NativeTokenList *tokenNode, cJSON *record) +{ + cJSON *itemApl = cJSON_CreateNumber(tokenNode->apl); + if (itemApl == NULL) { + return ATRET_FAILED; + } + if (!cJSON_ReplaceItemInObject(record, APL_KEY_NAME, itemApl)) { + cJSON_Delete(itemApl); + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:APL update failed.", __func__); + return ATRET_FAILED; + } + + cJSON *dcapsArr = cJSON_CreateArray(); + if (dcapsArr == NULL) { + return ATRET_FAILED; + } + for (int32_t i = 0; i < tokenNode->dcapsNum; i++) { + cJSON *item = cJSON_CreateString(tokenNode->dcaps[i]); + if (item == NULL) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_CreateString failed.", __func__); + cJSON_Delete(dcapsArr); + return ATRET_FAILED; + } + if (!cJSON_AddItemToArray(dcapsArr, item)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_AddItemToArray failed.", __func__); + cJSON_Delete(item); + return ATRET_FAILED; + } + } + if (!cJSON_ReplaceItemInObject(record, DCAPS_KEY_NAME, dcapsArr)) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:dcaps update failed.", __func__); + cJSON_Delete(dcapsArr); + return ATRET_FAILED; + } + return ATRET_SUCCESS; +} + +int32_t UpdateGoalItemFromRecord(const NativeTokenList *tokenNode, cJSON *record) +{ + int32_t arraySize = cJSON_GetArraySize(record); + for (int32_t i = 0; i < arraySize; i++) { + cJSON *cjsonItem = cJSON_GetArrayItem(record, i); + if (cjsonItem == NULL) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cJSON_GetArrayItem failed.", __func__); + return ATRET_FAILED; + } + cJSON *processNameJson = cJSON_GetObjectItem(cjsonItem, PROCESS_KEY_NAME); + if (processNameJson == NULL) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:processNameJson is null.", __func__); + return ATRET_FAILED; + } + if (strcmp(processNameJson->valuestring, tokenNode->processName) == 0) { + return UpdateItemcontent(tokenNode, cjsonItem); + } + } + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:cannot find process in config file.", __func__); + return ATRET_FAILED; +} + +int32_t UpdateTokenInfoInCfgFile(NativeTokenList *tokenNode) +{ + cJSON *record = NULL; + char *fileBuff = NULL; + + int32_t ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); + if (ret != ATRET_SUCCESS) { + return ret; + } + + if (fileBuff == NULL) { + record = cJSON_CreateArray(); + } else { + record = cJSON_Parse(fileBuff); + free(fileBuff); + fileBuff = NULL; + } + + if (record == NULL) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:get record failed.", __func__); + return ATRET_FAILED; + } + + ret = UpdateGoalItemFromRecord(tokenNode, record); + if (ret != ATRET_SUCCESS) { + ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:UpdateGoalItemFromRecord failed.", __func__); + cJSON_Delete(record); + return ATRET_FAILED; + } + + WriteToFile(record); + cJSON_Delete(record); return ATRET_SUCCESS; } uint64_t GetAccessTokenId(const char *processname, const char **dcaps, int32_t dacpNum, const char *aplStr) { - NativeAtId tokenId; - NativeTokenQueue tmp = {0}; - pthread_t tid; - int32_t exist = 0; + NativeAtId tokenId = 0; uint64_t result = 0; int32_t apl; NativeAtIdEx *atPoint = (NativeAtIdEx *)(&result); @@ -668,14 +673,9 @@ uint64_t GetAccessTokenId(const char *processname, const char **dcaps, int32_t d return 0; } - if ((g_tranferStatus == FOUNDATION_NOT_STARTED) && strcmp("foundation", processname) == 0) { - (void)pthread_create(&tid, 0, (void*)ThreadTransferFunc, NULL); - } - NativeTokenList *tokenNode = g_tokenListHead; while (tokenNode != NULL) { if (strcmp(tokenNode->processName, processname) == 0) { - exist = 1; tokenId = tokenNode->tokenId; break; } @@ -683,18 +683,19 @@ uint64_t GetAccessTokenId(const char *processname, const char **dcaps, int32_t d } if (tokenNode == NULL) { - ret = AddNewNativeTokenToList(processname, &tokenId); - if (ret != ATRET_SUCCESS) { - return 0; + ret = AddNewTokenToListAndCfgFile(processname, dcaps, dacpNum, apl, &tokenId); + } else { + int32_t needUpdate = CompareProcessInfo(tokenNode, dcaps, dacpNum, apl); + if (needUpdate != 0) { + ret = UpdateTokenInfoInList(tokenNode, dcaps, dacpNum, apl); + ret |= UpdateTokenInfoInCfgFile(tokenNode); } } - - TOKEN_QUEUE_NODE_INFO_SET(tmp, apl, processname, tokenId, exist, dcaps, dacpNum); - ret = TokenInfoSave(&tmp); - if (ret != 0) { - return result; + if (ret != ATRET_SUCCESS) { + return 0; } + atPoint->tokenId = tokenId; atPoint->tokenAttr = 0; return result; -} +} \ No newline at end of file diff --git a/interfaces/innerkits/nativetoken/test/BUILD.gn b/interfaces/innerkits/nativetoken/test/BUILD.gn index 25f2784d00e254d907bd51ac86c48975673d23d7..6b14f56e06e729f142c5a50743ff54bd3571bd2a 100644 --- a/interfaces/innerkits/nativetoken/test/BUILD.gn +++ b/interfaces/innerkits/nativetoken/test/BUILD.gn @@ -19,15 +19,12 @@ ohos_unittest("libnativetoken_test") { module_out_path = part_name + "/" + part_name include_dirs = [ - "//utils/native/base/include", "//third_party/cJSON", "//third_party/bounds_checking_function/include", "//base/security/access_token/interfaces/innerkits/nativetoken/include", ] sources = [ "unittest/src/nativetoken_kit_test.cpp" ] - cflags_cc = [ "-fexceptions" ] - cflags_cc += [ "-pthread" ] deps = [ "//base/security/access_token/interfaces/innerkits/nativetoken:libnativetoken", @@ -35,7 +32,6 @@ ohos_unittest("libnativetoken_test") { "//third_party/cJSON:cjson_static", "//third_party/googletest:gmock", "//third_party/googletest:gtest", - "//utils/native/base:utils", ] } diff --git a/interfaces/innerkits/nativetoken/test/unittest/src/nativetoken_kit_test.cpp b/interfaces/innerkits/nativetoken/test/unittest/src/nativetoken_kit_test.cpp index 69fd15cf24f8366516cd5cb8adda84dd474b4083..a6782999ad14ede5b8452a6fef64e9abbc2bb2e8 100644 --- a/interfaces/innerkits/nativetoken/test/unittest/src/nativetoken_kit_test.cpp +++ b/interfaces/innerkits/nativetoken/test/unittest/src/nativetoken_kit_test.cpp @@ -21,16 +21,17 @@ using namespace testing::ext; using namespace OHOS::Security; -extern NativeTokenQueue *g_tokenQueueHead; extern NativeTokenList *g_tokenListHead; extern int32_t g_isNativeTokenInited; extern int32_t GetFileBuff(const char *cfg, char **retBuff); namespace { -static NativeTokenQueue g_readRes; static string g_jsonStr = "[" - "{\"processName\":\"asdf\", \"tokenId\":15}," - "{\"processName\":\"GetAccessTokenId008\", \"tokenId\":16}," - "{\"processName\":\"GetAccessTokenId009\", \"tokenId\":17}" + "{\"processName\":\"asdf\", \"tokenId\":15, \"APL\":3, \"version\":1, " + "\"tokenAttr\":0, \"dcaps\":[\"AT_CAP\", \"ST_CAP\"]}," + "{\"processName\":\"GetAccessTokenId008\", \"tokenId\":16, \"APL\":3, \"version\":1," + " \"tokenAttr\":0, \"dcaps\":[\"AT_CAP\", \"ST_CAP\"]}," + "{\"processName\":\"GetAccessTokenId009\", \"tokenId\":17, \"APL\":3, \"version\":1, " + "\"tokenAttr\":0, \"dcaps\":[\"AT_CAP\", \"ST_CAP\"]}" "]"; } void TokenLibKitTest::SetUpTestCase() @@ -43,29 +44,16 @@ void TokenLibKitTest::SetUp() { g_isNativeTokenInited = 0; ResetFile(); - g_readRes.next = nullptr; } void TokenLibKitTest::TearDown() { - while (g_tokenQueueHead->next != nullptr) { - NativeTokenQueue *tmp = g_tokenQueueHead->next; - g_tokenQueueHead->next = tmp->next; - free(tmp); - tmp = nullptr; - } while (g_tokenListHead->next != nullptr) { NativeTokenList *tmp = g_tokenListHead->next; g_tokenListHead->next = tmp->next; free(tmp); tmp = nullptr; } - while (g_readRes.next != nullptr) { - NativeTokenQueue *tmp = g_readRes.next; - g_readRes.next = tmp->next; - free(tmp); - tmp = nullptr; - } } void TokenLibKitTest::ResetFile(void) @@ -83,36 +71,6 @@ void TokenLibKitTest::ResetFile(void) } } -void TokenLibKitTest::PthreadCloseTrigger(void) -{ - struct sockaddr_un addr; - int32_t fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd < 0) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:socket failed.", __func__); - return; - } - (void)memset_s(&addr, sizeof(struct sockaddr_un), 0, sizeof(struct sockaddr_un)); - addr.sun_family = AF_UNIX; - if (strncpy_s(addr.sun_path, sizeof(addr.sun_path), SOCKET_FILE, sizeof(addr.sun_path) - 1) != EOK) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:strncpy_s failed.", __func__); - close(fd); - return; - } - int result = connect(fd, (struct sockaddr *)&addr, sizeof(addr)); - if (result != 0) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:connect failed.", __func__); - close(fd); - return; - } - int32_t writtenSize = write(fd, "over", 4); - if (writtenSize != 4) { - ACCESSTOKEN_LOG_ERROR("[ATLIB-%s]:SendString write failed.", __func__); - } - close(fd); - return; -} - - int Start(const char *processName) { const char *processname = processName; @@ -122,6 +80,7 @@ int Start(const char *processName) int dcapNum = 2; uint64_t tokenId; tokenId = GetAccessTokenId(processname, dcaps, dcapNum, "system_core"); + free(dcaps); return tokenId; } @@ -157,6 +116,7 @@ HWTEST_F(TokenLibKitTest, GetAccessTokenId001, TestSize.Level1) const std::string validProcName02 (256, 'x'); tokenId = GetAccessTokenId(validProcName02.c_str(), dcaps, dcapNum, "system_core"); ASSERT_NE(tokenId, 0); + free(dcaps); } /** @@ -167,7 +127,7 @@ HWTEST_F(TokenLibKitTest, GetAccessTokenId001, TestSize.Level1) */ HWTEST_F(TokenLibKitTest, GetAccessTokenId002, TestSize.Level1) { - const char **dcaps = (const char **)malloc(sizeof(char *) * 2); + const char **dcaps = (const char **)malloc(sizeof(char *) * 32); dcaps[0] = "AT_CAP"; dcaps[1] = "ST_CAP"; int dcapNum = -1; @@ -179,6 +139,21 @@ HWTEST_F(TokenLibKitTest, GetAccessTokenId002, TestSize.Level1) dcapNum = 33; tokenId = GetAccessTokenId("GetAccessTokenId002_00", dcaps, dcapNum, "system_core"); ASSERT_EQ(tokenId, 0); + + for (int32_t i = 0; i < 32; i++) { + dcaps[i] = "AT_CAP"; + } + /* 32 is valid dcapNum */ + dcapNum = 32; + tokenId = GetAccessTokenId("GetAccessTokenId002_01", dcaps, dcapNum, "system_core"); + ASSERT_NE(tokenId, 0); + + /* 31 is valid dcapNum */ + dcapNum = 31; + tokenId = GetAccessTokenId("GetAccessTokenId002_02", dcaps, dcapNum, "system_core"); + ASSERT_NE(tokenId, 0); + + free(dcaps); } /** @@ -219,6 +194,8 @@ HWTEST_F(TokenLibKitTest, GetAccessTokenId003, TestSize.Level1) dcaps[0] = validDcap02.c_str(); tokenId = GetAccessTokenId("GetAccessTokenId003_04", dcaps, dcapNum, "system_core"); ASSERT_NE(tokenId, 0); + + free(dcaps); } /** @@ -239,6 +216,8 @@ HWTEST_F(TokenLibKitTest, GetAccessTokenId004, TestSize.Level1) tokenId = GetAccessTokenId("GetAccessTokenId003", dcaps, dcapNum, "system_invalid"); ASSERT_EQ(tokenId, 0); + + free(dcaps); } /** @@ -258,132 +237,36 @@ HWTEST_F(TokenLibKitTest, GetAccessTokenId005, TestSize.Level1) } /** - * @tc.name: GetAccessTokenId007 - * @tc.desc: Get AccessTokenId before ATM is prepared with new processName. + * @tc.name: GetAccessTokenId006 + * @tc.desc: Get AccessTokenId with new processName and check g_tokenListHead. * @tc.type: FUNC * @tc.require:AR000GK6TD */ -HWTEST_F(TokenLibKitTest, GetAccessTokenId007, TestSize.Level1) +HWTEST_F(TokenLibKitTest, GetAccessTokenId006, TestSize.Level1) { uint64_t tokenID; NativeAtIdEx *tokenIdEx = (NativeAtIdEx *)(&tokenID); - tokenID = Start("GetAccessTokenId007"); + tokenID = Start("GetAccessTokenId006"); - int ret = strcmp("GetAccessTokenId007", g_tokenListHead->next->processName); + int ret = strcmp("GetAccessTokenId006", g_tokenListHead->next->processName); ASSERT_EQ(ret, 0); ASSERT_EQ(tokenIdEx->tokenId, g_tokenListHead->next->tokenId); - ret = strcmp("GetAccessTokenId007", g_tokenQueueHead->next->processName); - ASSERT_EQ(ret, 0); - ASSERT_EQ(tokenIdEx->tokenId, g_tokenQueueHead->next->tokenId); - char *fileBuff = nullptr; ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); ASSERT_EQ(ret, ATRET_SUCCESS); - string s = "GetAccessTokenId007"; + string s = "GetAccessTokenId006"; char *pos = strstr(fileBuff, s.c_str()); - ASSERT_EQ(pos, nullptr); -} - -/** - * @tc.name: GetAccessTokenId008 - * @tc.desc: Get AccessTokenId before ATM is prepared with processName which has existed. - * @tc.type: FUNC - * @tc.require:AR000GK6TD - */ -HWTEST_F(TokenLibKitTest, GetAccessTokenId008, TestSize.Level1) -{ - uint64_t tokenID; - NativeAtIdEx *tokenIdEx = (NativeAtIdEx *)(&tokenID); - tokenID = Start("GetAccessTokenId008"); - - string s = "GetAccessTokenId008"; - int ret = strcmp(s.c_str(), g_tokenQueueHead->next->processName); - ASSERT_EQ(ret, 0); - ASSERT_EQ(tokenIdEx->tokenId, g_tokenQueueHead->next->tokenId); -} - -/** - * @tc.name: GetAccessTokenId009 - * @tc.desc: Get AccessTokenId after ATM is prepared with new processName. - * @tc.type: FUNC - * @tc.require:AR000GK6TD - */ -HWTEST_F(TokenLibKitTest, GetAccessTokenId009, TestSize.Level1) -{ - char *fileBuffBefore = nullptr; - int32_t ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuffBefore); - ASSERT_EQ(ret, ATRET_SUCCESS); - char *posMatch = strstr(fileBuffBefore, "GetAccessTokenId009"); - ASSERT_NE(posMatch, nullptr); - free(fileBuffBefore); - - uint64_t tokenIdFoundation = Start("foundation"); - ASSERT_NE(tokenIdFoundation, 0); - sleep(DELAY_ONE_SECONDS); - uint64_t tokenID009 = Start("GetAccessTokenId009"); - ASSERT_NE(tokenID009, 0); - - tokenID009 = Start("GetAccessTokenId009_01"); - ASSERT_NE(tokenID009, 0); - - tokenID009 = Start("GetAccessTokenId009_02"); - ASSERT_NE(tokenID009, 0); - - sleep(DELAY_ONE_SECONDS); - char *fileBuff = nullptr; - ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); - ASSERT_EQ(ret, ATRET_SUCCESS); - char *pos = strstr(fileBuff, "GetAccessTokenId009"); - ASSERT_NE(pos, nullptr); - pos = strstr(fileBuff, "GetAccessTokenId009_01"); ASSERT_NE(pos, nullptr); - pos = strstr(fileBuff, "GetAccessTokenId009_02"); - ASSERT_NE(pos, nullptr); - free(fileBuff); - PthreadCloseTrigger(); } /** - * @tc.name: GetAccessTokenId010 - * @tc.desc: Get AccessTokenId after ATM is prepared with processName which has existed. - * @tc.type: FUNC - * @tc.require:AR000GK6TD - */ -HWTEST_F(TokenLibKitTest, GetAccessTokenId010, TestSize.Level1) -{ - char *fileBuffBefore = nullptr; - int ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuffBefore); - ASSERT_EQ(ret, ATRET_SUCCESS); - - char *posMatch = strstr(fileBuffBefore, "GetAccessTokenId010"); - ASSERT_EQ(posMatch, nullptr); - free(fileBuffBefore); - - uint64_t tokenIdFoundation = Start("foundation"); - ASSERT_NE(tokenIdFoundation, 0); - sleep(DELAY_ONE_SECONDS); - uint64_t tokenID010 = Start("GetAccessTokenId010"); - ASSERT_NE(tokenID010, 0); - - sleep(DELAY_ONE_SECONDS); - char *fileBuff = nullptr; - ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); - ASSERT_EQ(ret, ATRET_SUCCESS); - - char *pos = strstr(fileBuff, "GetAccessTokenId010"); - ASSERT_NE(pos, nullptr); - free(fileBuff); - - PthreadCloseTrigger(); -} -/** - * @tc.name: GetAccessTokenId011 - * @tc.desc: Get AccessTokenId after ATM is prepared with processName which has existed. + * @tc.name: GetAccessTokenId007 + * @tc.desc: Get a batch of AccessTokenId. * @tc.type: FUNC * @tc.require:AR000GK6TD */ -HWTEST_F(TokenLibKitTest, GetAccessTokenId011, TestSize.Level1) +HWTEST_F(TokenLibKitTest, GetAccessTokenId007, TestSize.Level1) { char processName[200][MAX_PROCESS_NAME_LEN]; /* enable 200 process before fondation is prepared */ @@ -394,48 +277,70 @@ HWTEST_F(TokenLibKitTest, GetAccessTokenId011, TestSize.Level1) uint64_t tokenId = Start(processName[i]); ASSERT_NE(tokenId, 0); } - uint64_t tokenId011 = Start("foundation"); - ASSERT_NE(tokenId011, 0); - sleep(5); - tokenId011 = Start("process"); - ASSERT_NE(tokenId011, 0); + char *fileBuff = nullptr; + int ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); + ASSERT_EQ(ret, 0); + for (int32_t i = 0; i < 200; i++) { + char *pos = strstr(fileBuff, processName[i]); + ASSERT_NE(pos, nullptr); + } + free(fileBuff); } /** - * @tc.name: GetAccessTokenId012 - * @tc.desc: Get AccessTokenId after ATM is prepared with processName which has existed. + * @tc.name: GetAccessTokenId008 + * @tc.desc: Get AccessTokenId and check the config file. * @tc.type: FUNC * @tc.require:AR000GK6TD */ -HWTEST_F(TokenLibKitTest, GetAccessTokenId012, TestSize.Level1) +HWTEST_F(TokenLibKitTest, GetAccessTokenId008, TestSize.Level1) { + char *fileBuff = nullptr; + int ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); + ASSERT_EQ(ret, 0); + char *pos = strstr(fileBuff, "process1"); + ASSERT_EQ(pos, nullptr); + pos = strstr(fileBuff, "process2"); + ASSERT_EQ(pos, nullptr); + pos = strstr(fileBuff, "process3"); + ASSERT_EQ(pos, nullptr); + pos = strstr(fileBuff, "process4"); + ASSERT_EQ(pos, nullptr); + pos = strstr(fileBuff, "process5"); + ASSERT_EQ(pos, nullptr); + pos = strstr(fileBuff, "process6"); + ASSERT_EQ(pos, nullptr); + pos = strstr(fileBuff, "process7"); + ASSERT_EQ(pos, nullptr); + pos = strstr(fileBuff, "process8"); + ASSERT_EQ(pos, nullptr); + pos = strstr(fileBuff, "process9"); + ASSERT_EQ(pos, nullptr); + pos = strstr(fileBuff, "foundation"); + ASSERT_EQ(pos, nullptr); + free(fileBuff); + Start("process1"); Start("process2"); Start("process3"); Start("process4"); Start("process5"); - sleep(5); - Start("foundation"); Start("process6"); Start("process7"); Start("process8"); Start("process9"); Start("process10"); - sleep(5); Start("process15"); Start("process16"); - sleep(5); Start("process17"); - sleep(5); Start("process18"); - sleep(5); Start("process19"); - sleep(5); - char *fileBuff = nullptr; - int ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); + + ret = GetFileBuff(TOKEN_ID_CFG_PATH, &fileBuff); ASSERT_EQ(ret, 0); - char *pos = strstr(fileBuff, "process1"); + GTEST_LOG_(INFO) << "fileBuff" << fileBuff; + pos = strstr(fileBuff, "process1"); ASSERT_NE(pos, nullptr); pos = strstr(fileBuff, "process2"); ASSERT_NE(pos, nullptr); @@ -456,33 +361,4 @@ HWTEST_F(TokenLibKitTest, GetAccessTokenId012, TestSize.Level1) pos = strstr(fileBuff, "foundation"); ASSERT_NE(pos, nullptr); free(fileBuff); - PthreadCloseTrigger(); -} - -/** - * @tc.name: GetAccessTokenId013 - * @tc.desc: Get AccessTokenId after ATM is prepared with processName which has existed. - * @tc.type: FUNC - * @tc.require:AR000GK6TD - */ -HWTEST_F(TokenLibKitTest, GetAccessTokenId013, TestSize.Level1) -{ - sleep(5); - Start("process1"); - Start("process2"); - Start("process3"); - Start("process4"); - Start("process5"); - sleep(5); - Start("foundation"); - Start("process6"); - sleep(5); - Start("process11"); - Start("process12"); - Start("process13"); - Start("process15"); - Start("process16"); - Start("process17"); - sleep(1); - PthreadCloseTrigger(); }