diff --git a/frameworks/accesstoken/include/i_accesstoken_manager.h b/frameworks/accesstoken/include/i_accesstoken_manager.h index c06b98b6abc43841fce2cd48d4cbaf15a02d2e9e..53609ef7bb02e8fc5eab41455b0f529802a4b91d 100644 --- a/frameworks/accesstoken/include/i_accesstoken_manager.h +++ b/frameworks/accesstoken/include/i_accesstoken_manager.h @@ -67,6 +67,7 @@ public: const PermStateChangeScopeParcel& scope, const sptr& callback) = 0; virtual int32_t UnRegisterPermStateChangeCallback(const sptr& callback) = 0; virtual int32_t ReloadNativeTokenInfo() = 0; + virtual AccessTokenID GetNativeTokenId(const std::string& processName) = 0; #ifdef TOKEN_SYNC_ENABLE virtual int GetHapTokenInfoFromRemote(AccessTokenID tokenID, @@ -116,6 +117,7 @@ public: REGISTER_PERM_STATE_CHANGE_CALLBACK, UNREGISTER_PERM_STATE_CHANGE_CALLBACK, RELOAD_NATIVE_TOKEN_INFO, + GET_NATIVE_TOKEN_ID, }; }; } // namespace AccessToken diff --git a/interfaces/innerkits/accesstoken/include/accesstoken_kit.h b/interfaces/innerkits/accesstoken/include/accesstoken_kit.h index b5fef3e72b8141949d8c49ad01958e84dead64c3..ff0632e343c386ce412caddbbc78c2a8fb30a7a9 100644 --- a/interfaces/innerkits/accesstoken/include/accesstoken_kit.h +++ b/interfaces/innerkits/accesstoken/include/accesstoken_kit.h @@ -63,6 +63,7 @@ public: static int32_t UnRegisterPermStateChangeCallback(const std::shared_ptr& callback); static int32_t GetHapDlpFlag(AccessTokenID tokenID); static int32_t ReloadNativeTokenInfo(); + static AccessTokenID GetNativeTokenId(const std::string& processName); #ifdef TOKEN_SYNC_ENABLE static int GetHapTokenInfoFromRemote(AccessTokenID tokenID, HapTokenInfoForSync& hapSync); diff --git a/interfaces/innerkits/accesstoken/src/accesstoken_kit.cpp b/interfaces/innerkits/accesstoken/src/accesstoken_kit.cpp index f18c0837b660a77166ae88ee33d86f00c7e03cc8..6736123e156c460e76ed69c6110d0ba1541c73f0 100644 --- a/interfaces/innerkits/accesstoken/src/accesstoken_kit.cpp +++ b/interfaces/innerkits/accesstoken/src/accesstoken_kit.cpp @@ -317,6 +317,15 @@ int32_t AccessTokenKit::ReloadNativeTokenInfo() return AccessTokenManagerClient::GetInstance().ReloadNativeTokenInfo(); } +AccessTokenID AccessTokenKit::GetNativeTokenId(const std::string& processName) +{ + if (!DataValidator::IsProcessNameValid(processName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "processName is invalid"); + return INVALID_TOKENID; + } + return AccessTokenManagerClient::GetInstance().GetNativeTokenId(processName); +} + #ifdef TOKEN_SYNC_ENABLE int AccessTokenKit::GetHapTokenInfoFromRemote(AccessTokenID tokenID, HapTokenInfoForSync& hapSync) { diff --git a/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.cpp b/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.cpp index 5b4d29a637b3179a4623b779adb4fa9b99796071..4b2bbb3e49d17c9ca27847faf0f592beaede8fc0 100644 --- a/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.cpp +++ b/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.cpp @@ -370,6 +370,16 @@ int32_t AccessTokenManagerClient::ReloadNativeTokenInfo() return proxy->ReloadNativeTokenInfo(); } +AccessTokenID AccessTokenManagerClient::GetNativeTokenId(const std::string& processName) +{ + auto proxy = GetProxy(); + if (proxy == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "proxy is null"); + return INVALID_TOKENID; + } + return proxy->GetNativeTokenId(processName); +} + #ifdef TOKEN_SYNC_ENABLE int AccessTokenManagerClient::GetHapTokenInfoFromRemote(AccessTokenID tokenID, HapTokenInfoForSync& hapSync) { diff --git a/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.h b/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.h index 442d0c8b646fa26db6ef6fddcfb185b79303d621..7d5a2d44f0067ca075a58ce6add0312f53e1d897 100644 --- a/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.h +++ b/interfaces/innerkits/accesstoken/src/accesstoken_manager_client.h @@ -64,6 +64,7 @@ public: int GetHapTokenInfo(AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes); int GetNativeTokenInfo(AccessTokenID tokenID, NativeTokenInfo& nativeTokenInfoRes); int32_t ReloadNativeTokenInfo(); + AccessTokenID GetNativeTokenId(const std::string& processName); int32_t RegisterPermStateChangeCallback( const std::shared_ptr& customizedCallback); int32_t UnRegisterPermStateChangeCallback( diff --git a/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.cpp b/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.cpp index ab6abd8577ec01742eda9044902fd248d10285a8..2ae0493b6dffcc1ec268a32b7100de326ca4fe67 100644 --- a/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.cpp +++ b/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.cpp @@ -768,6 +768,40 @@ int32_t AccessTokenManagerProxy::ReloadNativeTokenInfo() return result; } +AccessTokenID AccessTokenManagerProxy::GetNativeTokenId(const std::string& processName) +{ + MessageParcel data; + if (!data.WriteInterfaceToken(IAccessTokenManager::GetDescriptor())) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Failed to write WriteInterfaceToken."); + return INVALID_TOKENID; + } + + if (!data.WriteString(processName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Failed to write processName"); + return INVALID_TOKENID; + } + MessageParcel reply; + MessageOption option(MessageOption::TF_SYNC); + sptr remote = Remote(); + if (remote == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "remote service null."); + return INVALID_TOKENID; + } + int32_t requestResult = remote->SendRequest( + static_cast(IAccessTokenManager::InterfaceCode::GET_NATIVE_TOKEN_ID), data, reply, option); + if (requestResult != NO_ERROR) { + ACCESSTOKEN_LOG_ERROR(LABEL, "request fail, result: %{public}d", requestResult); + return INVALID_TOKENID; + } + AccessTokenID result; + if (!reply.ReadUint32(result)) { + ACCESSTOKEN_LOG_INFO(LABEL, "readInt32 failed, result: %{public}d", result); + return INVALID_TOKENID; + } + ACCESSTOKEN_LOG_INFO(LABEL, "result from server data = %{public}d", result); + return result; +} + #ifdef TOKEN_SYNC_ENABLE int AccessTokenManagerProxy::GetHapTokenInfoFromRemote(AccessTokenID tokenID, HapTokenInfoForSyncParcel& hapSyncParcel) diff --git a/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.h b/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.h index 55dc477fbb0ec4a6b10fccd4910b8a379f7d535d..a5b53e08cca91a0bfe154f6dab623a15526d1ae7 100644 --- a/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.h +++ b/interfaces/innerkits/accesstoken/src/accesstoken_manager_proxy.h @@ -64,7 +64,8 @@ public: int32_t RegisterPermStateChangeCallback( const PermStateChangeScopeParcel& scope, const sptr& callback) override; int32_t UnRegisterPermStateChangeCallback(const sptr& callback) override; - + AccessTokenID GetNativeTokenId(const std::string& processName) override; + #ifdef TOKEN_SYNC_ENABLE int GetHapTokenInfoFromRemote(AccessTokenID tokenID, HapTokenInfoForSyncParcel& hapSyncParcel) override; int GetAllNativeTokenInfo(std::vector& nativeTokenInfoRes) override; 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 87e7c8a568f5ceb6d7099e024b69b4472a829070..7882c871f41acabb1f6871863ff5c234beb101b6 100644 --- a/interfaces/innerkits/accesstoken/test/unittest/src/accesstoken_kit_test.cpp +++ b/interfaces/innerkits/accesstoken/test/unittest/src/accesstoken_kit_test.cpp @@ -1341,6 +1341,35 @@ HWTEST_F(AccessTokenKitTest, ReloadNativeTokenInfo001, TestSize.Level1) ASSERT_EQ(RET_SUCCESS, ret); } +/** + * @tc.name: GetNativeTokenId001 + * @tc.desc: cannot get native tokenid with invalid processName. + * @tc.type: FUNC + * @tc.require:AR000GK6TH + */ +HWTEST_F(AccessTokenKitTest, GetNativeTokenId001, TestSize.Level1) +{ + std::string processName = "invalid processName"; + AccessTokenID tokenID = AccessTokenKit::GetNativeTokenId(processName); + ASSERT_EQ(0, tokenID); +} + +/** + * @tc.name: GetNativeTokenId002 + * @tc.desc: get native tokenid with processName. + * @tc.type: FUNC + * @tc.require:AR000GK6TH + */ +HWTEST_F(AccessTokenKitTest, GetNativeTokenId002, TestSize.Level1) +{ + std::string processName = "hdcd"; + AccessTokenID tokenID = AccessTokenKit::GetNativeTokenId(processName); + NativeTokenInfo tokenInfo; + AccessTokenID ret = AccessTokenKit::GetNativeTokenInfo(tokenID, tokenInfo); + ASSERT_EQ(RET_SUCCESS, ret); + ASSERT_EQ(true, tokenInfo.processName == processName); +} + /** * @tc.name: AllocHapToken001 * @tc.desc: alloc a tokenId successfully, delete it successfully the first time and fail to delte it again. diff --git a/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_service.h b/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_service.h index 927cad74748dcdf47bb8b83762094447ec616004..939b6ecc7c91f468096e1f47d85d3f36871a2da3 100644 --- a/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_service.h +++ b/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_service.h @@ -65,6 +65,7 @@ public: const PermStateChangeScopeParcel& scope, const sptr& callback) override; int32_t UnRegisterPermStateChangeCallback(const sptr& callback) override; int32_t ReloadNativeTokenInfo() override; + AccessTokenID GetNativeTokenId(const std::string& processName) override; #ifdef TOKEN_SYNC_ENABLE int GetHapTokenInfoFromRemote(AccessTokenID tokenID, HapTokenInfoForSyncParcel& hapSyncParcel) override; diff --git a/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_stub.h b/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_stub.h index 5ed1dfffcdeb21a412996e2fe853bcf98914d5f3..6fb115250644bf122d75fb13971fc53f09643fb6 100644 --- a/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_stub.h +++ b/services/accesstokenmanager/main/cpp/include/service/accesstoken_manager_stub.h @@ -56,7 +56,8 @@ private: void RegisterPermStateChangeCallbackInner(MessageParcel& data, MessageParcel& reply); void UnRegisterPermStateChangeCallbackInner(MessageParcel& data, MessageParcel& reply); void ReloadNativeTokenInfoInner(MessageParcel& data, MessageParcel& reply); - + void GetNativeTokenIdInner(MessageParcel& data, MessageParcel& reply); + #ifdef TOKEN_SYNC_ENABLE void GetHapTokenInfoFromRemoteInner(MessageParcel& data, MessageParcel& reply); void GetAllNativeTokenInfoInner(MessageParcel& data, MessageParcel& reply); diff --git a/services/accesstokenmanager/main/cpp/include/token/accesstoken_info_manager.h b/services/accesstokenmanager/main/cpp/include/token/accesstoken_info_manager.h index e48ec35a50a2f3ad84d285f0901c24a115bb92dd..3ce822d828384b0c19bb82f8d170af109853f59b 100644 --- a/services/accesstokenmanager/main/cpp/include/token/accesstoken_info_manager.h +++ b/services/accesstokenmanager/main/cpp/include/token/accesstoken_info_manager.h @@ -58,6 +58,7 @@ public: void DumpTokenInfo(AccessTokenID tokenID, std::string& dumpInfo); void RefreshTokenInfoIfNeeded(); bool IsTokenIdExist(AccessTokenID id); + AccessTokenID GetNativeTokenId(const std::string& processName); #ifdef TOKEN_SYNC_ENABLE /* tokensync needed */ diff --git a/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp b/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp index 192c9de550e18b8effc18d71ffa50f5d08fc9eb6..f51a99ec35d5e88824281d30cae5d457816f3095 100644 --- a/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp +++ b/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp @@ -327,6 +327,11 @@ int32_t AccessTokenManagerService::ReloadNativeTokenInfo() return NativeTokenReceptor::GetInstance().Init(); } +AccessTokenID AccessTokenManagerService::GetNativeTokenId(const std::string& processName) +{ + return AccessTokenInfoManager::GetInstance().GetNativeTokenId(processName); +} + #ifdef TOKEN_SYNC_ENABLE int AccessTokenManagerService::GetHapTokenInfoFromRemote(AccessTokenID tokenID, HapTokenInfoForSyncParcel& hapSyncParcel) diff --git a/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_stub.cpp b/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_stub.cpp index c86358030c1aa5664458f203f65a3e027ae83617..a678b578255ba731b6b6b74bd32be09edbd9e9d6 100644 --- a/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_stub.cpp +++ b/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_stub.cpp @@ -371,6 +371,22 @@ void AccessTokenManagerStub::ReloadNativeTokenInfoInner(MessageParcel& data, Mes reply.WriteInt32(result); } +void AccessTokenManagerStub::GetNativeTokenIdInner(MessageParcel& data, MessageParcel& reply) +{ + if (!IsNativeProcessCalling()) { + ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s called, permission denied", __func__); + reply.WriteUint32(INVALID_TOKENID); + return; + } + std::string processName; + if (!data.ReadString(processName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "readString fail, processName=%{public}s", processName.c_str()); + return; + } + AccessTokenID result = this->GetNativeTokenId(processName); + reply.WriteUint32(result); +} + #ifdef TOKEN_SYNC_ENABLE void AccessTokenManagerStub::GetHapTokenInfoFromRemoteInner(MessageParcel& data, MessageParcel& reply) { @@ -568,6 +584,8 @@ AccessTokenManagerStub::AccessTokenManagerStub() &AccessTokenManagerStub::UpdateHapTokenInner; requestFuncMap_[static_cast(IAccessTokenManager::InterfaceCode::RELOAD_NATIVE_TOKEN_INFO)] = &AccessTokenManagerStub::ReloadNativeTokenInfoInner; + requestFuncMap_[static_cast(IAccessTokenManager::InterfaceCode::GET_NATIVE_TOKEN_ID)] = + &AccessTokenManagerStub::GetNativeTokenIdInner; #ifdef TOKEN_SYNC_ENABLE requestFuncMap_[static_cast(IAccessTokenManager::InterfaceCode::GET_HAP_TOKEN_FROM_REMOTE)] = &AccessTokenManagerStub::GetHapTokenInfoFromRemoteInner; diff --git a/services/accesstokenmanager/main/cpp/src/token/accesstoken_info_manager.cpp b/services/accesstokenmanager/main/cpp/src/token/accesstoken_info_manager.cpp index 6ead354274811c337c6e749d93fe62dae93224cb..bc11ee317a186854d472e21287c5741022c9965d 100644 --- a/services/accesstokenmanager/main/cpp/src/token/accesstoken_info_manager.cpp +++ b/services/accesstokenmanager/main/cpp/src/token/accesstoken_info_manager.cpp @@ -1007,6 +1007,18 @@ void AccessTokenInfoManager::RefreshTokenInfoIfNeeded() }); } +AccessTokenID AccessTokenInfoManager::GetNativeTokenId(const std::string& processName) +{ + AccessTokenID tokenID = INVALID_TOKENID; + for (auto iter = nativeTokenInfoMap_.begin(); iter != nativeTokenInfoMap_.end(); iter++) { + if (iter->second != nullptr && iter->second->GetProcessName() == processName) { + tokenID = iter->first; + break; + } + } + return tokenID; +} + void AccessTokenInfoManager::DumpTokenInfo(AccessTokenID tokenID, std::string& dumpInfo) { ACCESSTOKEN_LOG_INFO(LABEL, "get hapTokenInfo");