From 1b6b9661ddb61a4128f62907b1941110c70e433a Mon Sep 17 00:00:00 2001 From: hhhhs9527 Date: Wed, 29 Jun 2022 11:16:16 +0800 Subject: [PATCH] 2022/06/29 Signed-off-by:hanshu5 Signed-off-by: hhhhs9527 --- frameworks/common/include/common_constant.h | 96 ++ frameworks/common/src/common_constant.cpp | 47 + .../accesstoken/src/accesstoken_kit.cpp | 738 ++++++++-------- .../innerkits/privacy/src/privacy_kit.cpp | 5 +- interfaces/innerkits/tokensync/BUILD.gn | 1 + .../tokensync/src/token_sync_kit.cpp | 107 +-- .../service/accesstoken_manager_service.cpp | 19 +- .../src/token/accesstoken_info_manager.cpp | 67 +- .../accesstoken_remote_token_manager.cpp | 23 +- .../src/device/device_info_manager.cpp | 9 +- .../src/remote/soft_bus_manager.cpp | 819 +++++++++--------- 11 files changed, 1042 insertions(+), 889 deletions(-) create mode 100644 frameworks/common/include/common_constant.h create mode 100644 frameworks/common/src/common_constant.cpp diff --git a/frameworks/common/include/common_constant.h b/frameworks/common/include/common_constant.h new file mode 100644 index 000000000..6ff46bc79 --- /dev/null +++ b/frameworks/common/include/common_constant.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMON_CONSTANT_H +#define COMMON_CONSTANT_H + +#include +#include + +namespace OHOS { +namespace Security { +namespace AccessToken { + +class CommonConstant { +public: + /** + * Indicates message format version, should be compatible. + */ + const static int32_t DISTRIBUTED_ACCESS_TOKEN_SERVICE_VERSION = 2; + + /** + * Status code, indicates general success. + */ + const static int32_t SUCCESS = 0; + + /** + * Status code, indicates general failure. + */ + const static int32_t FAILURE = -1; + + /** + * Status code, indicates failure but can retry. + */ + const static int32_t FAILURE_BUT_CAN_RETRY = -2; + + /** + * Status Code, indicates invalid command. + */ + const static int32_t INVALID_COMMAND = -14; + + /** + * Session Id, indicates invalid session. + */ + const static int32_t INVALID_SESSION = -1; + + /** + * Command status code, indicate a status of command before RPC call. + */ + const static int32_t STATUS_CODE_BEFORE_RPC = 100001; + + /** + * Command result string, indicates success. + */ + static const std::string COMMAND_RESULT_SUCCESS; + + /** + * Command result string, indicates failed. + */ + static const std::string COMMAND_RESULT_FAILED; + + /** + * Device id length. + */ + const static int32_t DEVICE_UUID_LENGTH = 65; + + /** + * Command status code, indicate a status of command before RPC call. + */ + const static int32_t DELAY_SYNC_TOKEN_MS = 3000; + + static constexpr int32_t ENCRYPTLEN = 4; + static constexpr int32_t ENCRYPTBEGIN = 0; + static constexpr int32_t ENCRYPTEND = 3; + static std::string EncryptDevId(std::string deviceId); + + /** + * GetLocalDeviceId + */ + static std::string GetLocalDeviceId(); +}; +} // namespace AccessToken +} // namespace Security +} // namespace OHOS +#endif // COMMON_CONSTANT_H diff --git a/frameworks/common/src/common_constant.cpp b/frameworks/common/src/common_constant.cpp new file mode 100644 index 000000000..fe259f210 --- /dev/null +++ b/frameworks/common/src/common_constant.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "common_constant.h" +#include "parameter.h" + +namespace OHOS { +namespace Security { +namespace AccessToken { + +namespace { +static const std::string REPLACE_TARGET = "****"; +} // namespace +const std::string CommonConstant::COMMAND_RESULT_SUCCESS = "success"; +const std::string CommonConstant::COMMAND_RESULT_FAILED = "execute command failed"; + +std::string CommonConstant::EncryptDevId(std::string deviceId) +{ + std::string result=deviceId; + if (deviceId.size() > 2*ENCRYPTLEN) { + result.replace(ENCRYPTBEGIN + ENCRYPTLEN, deviceId.size() - 2 * ENCRYPTLEN, REPLACE_TARGET); + } else { + result.replace(ENCRYPTBEGIN, deviceId.size(), REPLACE_TARGET); + } + return result; +} + +std::string CommonConstant::GetLocalDeviceId() +{ + char deviceIdCharArray[CommonConstant::DEVICE_UUID_LENGTH] = {0}; + GetDevUdid(deviceIdCharArray, CommonConstant::DEVICE_UUID_LENGTH); + return deviceIdCharArray; +} +} // namespace AccessToken +} // namespace Security +} // namespace OHOS diff --git a/interfaces/innerkits/accesstoken/src/accesstoken_kit.cpp b/interfaces/innerkits/accesstoken/src/accesstoken_kit.cpp index 66ca1dadc..d5638c81f 100644 --- a/interfaces/innerkits/accesstoken/src/accesstoken_kit.cpp +++ b/interfaces/innerkits/accesstoken/src/accesstoken_kit.cpp @@ -1,368 +1,370 @@ -/* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "accesstoken_kit.h" - -#include -#include - -#include "accesstoken_log.h" -#include "accesstoken_manager_client.h" -#include "data_validator.h" - -namespace OHOS { -namespace Security { -namespace AccessToken { -namespace { -static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "AccessTokenKit"}; -} // namespace - -AccessTokenIDEx AccessTokenKit::AllocHapToken(const HapInfoParams& info, const HapPolicyParams& policy) -{ - AccessTokenIDEx res = {0}; - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if ((!DataValidator::IsUserIdValid(info.userID)) || !DataValidator::IsAppIDDescValid(info.appIDDesc) || - !DataValidator::IsBundleNameValid(info.bundleName) || !DataValidator::IsAplNumValid(policy.apl) || - !DataValidator::IsDomainValid(policy.domain) || !DataValidator::IsDlpTypeValid(info.dlpType)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "input param failed"); - return res; - } - - return AccessTokenManagerClient::GetInstance().AllocHapToken(info, policy); -} - -AccessTokenID AccessTokenKit::AllocLocalTokenID(const std::string& remoteDeviceID, AccessTokenID remoteTokenID) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{private}s tokenID=%{public}d", - __func__, remoteDeviceID.c_str(), remoteTokenID); -#ifdef DEBUG_API_PERFORMANCE - ACCESSTOKEN_LOG_INFO(LABEL, "api_performance:start call"); - AccessTokenID resID = AccessTokenManagerClient::GetInstance().AllocLocalTokenID(remoteDeviceID, remoteTokenID); - ACCESSTOKEN_LOG_INFO(LABEL, "api_performance:end call"); - return resID; -#else - return AccessTokenManagerClient::GetInstance().AllocLocalTokenID(remoteDeviceID, remoteTokenID); -#endif -} - -int AccessTokenKit::UpdateHapToken(AccessTokenID tokenID, const std::string& appIDDesc, const HapPolicyParams& policy) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if ((tokenID == 0) || (!DataValidator::IsAppIDDescValid(appIDDesc)) || - (!DataValidator::IsAplNumValid(policy.apl))) { - ACCESSTOKEN_LOG_ERROR(LABEL, "input param failed"); - return RET_FAILED; - } - return AccessTokenManagerClient::GetInstance().UpdateHapToken(tokenID, appIDDesc, policy); -} - -int AccessTokenKit::DeleteToken(AccessTokenID tokenID) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); - return AccessTokenManagerClient::GetInstance().DeleteToken(tokenID); -} - -ATokenTypeEnum AccessTokenKit::GetTokenType(AccessTokenID tokenID) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return TOKEN_INVALID; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); - return AccessTokenManagerClient::GetInstance().GetTokenType(tokenID); -} - -ATokenTypeEnum AccessTokenKit::GetTokenTypeFlag(AccessTokenID tokenID) -{ - if (tokenID == 0) { - return TOKEN_INVALID; - } - AccessTokenIDInner *idInner = reinterpret_cast(&tokenID); - return (ATokenTypeEnum)(idInner->type); -} - -int AccessTokenKit::CheckNativeDCap(AccessTokenID tokenID, const std::string& dcap) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return RET_FAILED; - } - if (!DataValidator::IsDcapValid(dcap)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "dcap is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, dcap=%{public}s", tokenID, dcap.c_str()); - return AccessTokenManagerClient::GetInstance().CheckNativeDCap(tokenID, dcap); -} - -AccessTokenID AccessTokenKit::GetHapTokenID(int userID, const std::string& bundleName, int instIndex) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (!DataValidator::IsUserIdValid(userID) || !DataValidator::IsBundleNameValid(bundleName)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "hap token param failed"); - return 0; - } - ACCESSTOKEN_LOG_INFO(LABEL, "int userID=%{public}d, bundleName=%{public}s, instIndex=%{public}d", - userID, bundleName.c_str(), instIndex); - return AccessTokenManagerClient::GetInstance().GetHapTokenID(userID, bundleName, instIndex); -} - -int AccessTokenKit::GetHapTokenInfo(AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); - - return AccessTokenManagerClient::GetInstance().GetHapTokenInfo(tokenID, hapTokenInfoRes); -} - -int AccessTokenKit::GetNativeTokenInfo(AccessTokenID tokenID, NativeTokenInfo& nativeTokenInfoRes) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); - - return AccessTokenManagerClient::GetInstance().GetNativeTokenInfo(tokenID, nativeTokenInfoRes); -} - -PermissionOper AccessTokenKit::GetSelfPermissionsState(std::vector& permList) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "called."); - return AccessTokenManagerClient::GetInstance().GetSelfPermissionsState(permList); -} - -int AccessTokenKit::VerifyAccessToken(AccessTokenID tokenID, const std::string& permissionName) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return PERMISSION_DENIED; - } - if (!DataValidator::IsPermissionNameValid(permissionName)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); - return PERMISSION_DENIED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s", tokenID, permissionName.c_str()); - return AccessTokenManagerClient::GetInstance().VerifyAccessToken(tokenID, permissionName); -} - -int AccessTokenKit::VerifyAccessToken( - AccessTokenID callerTokenID, AccessTokenID firstTokenID, const std::string& permissionName) -{ - int ret = AccessTokenKit::VerifyAccessToken(callerTokenID, permissionName); - if (ret != PERMISSION_GRANTED) { - return ret; - } - if (firstTokenID == FIRSTCALLER_TOKENID_DEFAULT) { - return ret; - } - return AccessTokenKit::VerifyAccessToken(firstTokenID, permissionName); -} - -int AccessTokenKit::VerifyNativeToken(AccessTokenID tokenID, const std::string& permissionName) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID=%{public}d is invalid", tokenID); - return PERMISSION_DENIED; - } - if (!DataValidator::IsPermissionNameValid(permissionName)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); - return PERMISSION_DENIED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s", tokenID, permissionName.c_str()); - return AccessTokenManagerClient::GetInstance().VerifyNativeToken(tokenID, permissionName); -} - -int AccessTokenKit::GetDefPermission(const std::string& permissionName, PermissionDef& permissionDefResult) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (!DataValidator::IsPermissionNameValid(permissionName)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "permissionName=%{public}s", permissionName.c_str()); - - int ret = AccessTokenManagerClient::GetInstance().GetDefPermission(permissionName, permissionDefResult); - ACCESSTOKEN_LOG_INFO(LABEL, "GetDefPermission bundleName = %{public}s", permissionDefResult.bundleName.c_str()); - - return ret; -} - -int AccessTokenKit::GetDefPermissions(AccessTokenID tokenID, std::vector& permDefList) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); - - return AccessTokenManagerClient::GetInstance().GetDefPermissions(tokenID, permDefList); -} - -int AccessTokenKit::GetReqPermissions( - AccessTokenID tokenID, std::vector& reqPermList, bool isSystemGrant) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, isSystemGrant=%{public}d", tokenID, isSystemGrant); - - return AccessTokenManagerClient::GetInstance().GetReqPermissions(tokenID, reqPermList, isSystemGrant); -} - -int AccessTokenKit::GetPermissionFlag(AccessTokenID tokenID, const std::string& permissionName) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return PERMISSION_DEFAULT_FLAG; - } - if (!DataValidator::IsPermissionNameValid(permissionName)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); - return PERMISSION_DEFAULT_FLAG; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s", tokenID, permissionName.c_str()); - return AccessTokenManagerClient::GetInstance().GetPermissionFlag(tokenID, permissionName); -} - -int AccessTokenKit::GrantPermission(AccessTokenID tokenID, const std::string& permissionName, int flag) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return RET_FAILED; - } - if (!DataValidator::IsPermissionNameValid(permissionName)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); - return RET_FAILED; - } - if (!DataValidator::IsPermissionFlagValid(flag)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "flag is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s, flag=%{public}d", - tokenID, permissionName.c_str(), flag); - return AccessTokenManagerClient::GetInstance().GrantPermission(tokenID, permissionName, flag); -} - -int AccessTokenKit::RevokePermission(AccessTokenID tokenID, const std::string& permissionName, int flag) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return RET_FAILED; - } - if (!DataValidator::IsPermissionNameValid(permissionName)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); - return RET_FAILED; - } - if (!DataValidator::IsPermissionFlagValid(flag)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "flag is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s, flag=%{public}d", - tokenID, permissionName.c_str(), flag); - return AccessTokenManagerClient::GetInstance().RevokePermission(tokenID, permissionName, flag); -} - -int AccessTokenKit::ClearUserGrantedPermissionState(AccessTokenID tokenID) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); - return AccessTokenManagerClient::GetInstance().ClearUserGrantedPermissionState(tokenID); -} - -#ifdef TOKEN_SYNC_ENABLE -int AccessTokenKit::GetHapTokenInfoFromRemote(AccessTokenID tokenID, HapTokenInfoForSync& hapSync) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - if (tokenID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); - return RET_FAILED; - } - ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); - - return AccessTokenManagerClient::GetInstance().GetHapTokenInfoFromRemote(tokenID, hapSync); -} - -int AccessTokenKit::GetAllNativeTokenInfo(std::vector& nativeTokenInfosRes) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - - return AccessTokenManagerClient::GetInstance().GetAllNativeTokenInfo(nativeTokenInfosRes); -} - -int AccessTokenKit::SetRemoteHapTokenInfo(const std::string& deviceID, - const HapTokenInfoForSync& hapSync) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{private}s tokenID=%{public}d", - __func__, deviceID.c_str(), hapSync.baseInfo.tokenID); - return AccessTokenManagerClient::GetInstance().SetRemoteHapTokenInfo(deviceID, hapSync); -} - -int AccessTokenKit::SetRemoteNativeTokenInfo(const std::string& deviceID, - std::vector& nativeTokenInfoList) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{private}s", __func__, deviceID.c_str()); - return AccessTokenManagerClient::GetInstance() - .SetRemoteNativeTokenInfo(deviceID, nativeTokenInfoList); -} - -int AccessTokenKit::DeleteRemoteToken(const std::string& deviceID, AccessTokenID tokenID) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{private}s tokenID=%{public}d", - __func__, deviceID.c_str(), tokenID); - return AccessTokenManagerClient::GetInstance().DeleteRemoteToken(deviceID, tokenID); -} - -int AccessTokenKit::DeleteRemoteDeviceTokens(const std::string& deviceID) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{private}s", __func__, deviceID.c_str()); - return AccessTokenManagerClient::GetInstance().DeleteRemoteDeviceTokens(deviceID); -} - -AccessTokenID AccessTokenKit::GetRemoteNativeTokenID(const std::string& deviceID, AccessTokenID tokenID) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{private}s tokenID=%{public}d", - __func__, deviceID.c_str(), tokenID); - return AccessTokenManagerClient::GetInstance().GetRemoteNativeTokenID(deviceID, tokenID); -} -#endif - -void AccessTokenKit::DumpTokenInfo(std::string& dumpInfo) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); - AccessTokenManagerClient::GetInstance().DumpTokenInfo(dumpInfo); -} -} // namespace AccessToken -} // namespace Security -} // namespace OHOS +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "accesstoken_kit.h" + +#include +#include + +#include "accesstoken_log.h" +#include "accesstoken_manager_client.h" +#include "data_validator.h" + +#include "common_constant.h" + +namespace OHOS { +namespace Security { +namespace AccessToken { +namespace { +static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "AccessTokenKit"}; +} // namespace + +AccessTokenIDEx AccessTokenKit::AllocHapToken(const HapInfoParams& info, const HapPolicyParams& policy) +{ + AccessTokenIDEx res = {0}; + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if ((!DataValidator::IsUserIdValid(info.userID)) || !DataValidator::IsAppIDDescValid(info.appIDDesc) || + !DataValidator::IsBundleNameValid(info.bundleName) || !DataValidator::IsAplNumValid(policy.apl) || + !DataValidator::IsDomainValid(policy.domain) || !DataValidator::IsDlpTypeValid(info.dlpType)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "input param failed"); + return res; + } + + return AccessTokenManagerClient::GetInstance().AllocHapToken(info, policy); +} + +AccessTokenID AccessTokenKit::AllocLocalTokenID(const std::string& remoteDeviceID, AccessTokenID remoteTokenID) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{public}s tokenID=%{public}d", + __func__, CommonConstant::EncryptDevId(remoteDeviceID).c_str(), remoteTokenID); +#ifdef DEBUG_API_PERFORMANCE + ACCESSTOKEN_LOG_INFO(LABEL, "api_performance:start call"); + AccessTokenID resID = AccessTokenManagerClient::GetInstance().AllocLocalTokenID(remoteDeviceID, remoteTokenID); + ACCESSTOKEN_LOG_INFO(LABEL, "api_performance:end call"); + return resID; +#else + return AccessTokenManagerClient::GetInstance().AllocLocalTokenID(remoteDeviceID, remoteTokenID); +#endif +} + +int AccessTokenKit::UpdateHapToken(AccessTokenID tokenID, const std::string& appIDDesc, const HapPolicyParams& policy) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if ((tokenID == 0) || (!DataValidator::IsAppIDDescValid(appIDDesc)) || + (!DataValidator::IsAplNumValid(policy.apl))) { + ACCESSTOKEN_LOG_ERROR(LABEL, "input param failed"); + return RET_FAILED; + } + return AccessTokenManagerClient::GetInstance().UpdateHapToken(tokenID, appIDDesc, policy); +} + +int AccessTokenKit::DeleteToken(AccessTokenID tokenID) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); + return AccessTokenManagerClient::GetInstance().DeleteToken(tokenID); +} + +ATokenTypeEnum AccessTokenKit::GetTokenType(AccessTokenID tokenID) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return TOKEN_INVALID; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); + return AccessTokenManagerClient::GetInstance().GetTokenType(tokenID); +} + +ATokenTypeEnum AccessTokenKit::GetTokenTypeFlag(AccessTokenID tokenID) +{ + if (tokenID == 0) { + return TOKEN_INVALID; + } + AccessTokenIDInner *idInner = reinterpret_cast(&tokenID); + return (ATokenTypeEnum)(idInner->type); +} + +int AccessTokenKit::CheckNativeDCap(AccessTokenID tokenID, const std::string& dcap) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return RET_FAILED; + } + if (!DataValidator::IsDcapValid(dcap)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "dcap is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, dcap=%{public}s", tokenID, dcap.c_str()); + return AccessTokenManagerClient::GetInstance().CheckNativeDCap(tokenID, dcap); +} + +AccessTokenID AccessTokenKit::GetHapTokenID(int userID, const std::string& bundleName, int instIndex) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (!DataValidator::IsUserIdValid(userID) || !DataValidator::IsBundleNameValid(bundleName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "hap token param failed"); + return 0; + } + ACCESSTOKEN_LOG_INFO(LABEL, "int userID=%{public}d, bundleName=%{public}s, instIndex=%{public}d", + userID, bundleName.c_str(), instIndex); + return AccessTokenManagerClient::GetInstance().GetHapTokenID(userID, bundleName, instIndex); +} + +int AccessTokenKit::GetHapTokenInfo(AccessTokenID tokenID, HapTokenInfo& hapTokenInfoRes) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); + + return AccessTokenManagerClient::GetInstance().GetHapTokenInfo(tokenID, hapTokenInfoRes); +} + +int AccessTokenKit::GetNativeTokenInfo(AccessTokenID tokenID, NativeTokenInfo& nativeTokenInfoRes) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); + + return AccessTokenManagerClient::GetInstance().GetNativeTokenInfo(tokenID, nativeTokenInfoRes); +} + +PermissionOper AccessTokenKit::GetSelfPermissionsState(std::vector& permList) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "called."); + return AccessTokenManagerClient::GetInstance().GetSelfPermissionsState(permList); +} + +int AccessTokenKit::VerifyAccessToken(AccessTokenID tokenID, const std::string& permissionName) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return PERMISSION_DENIED; + } + if (!DataValidator::IsPermissionNameValid(permissionName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); + return PERMISSION_DENIED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s", tokenID, permissionName.c_str()); + return AccessTokenManagerClient::GetInstance().VerifyAccessToken(tokenID, permissionName); +} + +int AccessTokenKit::VerifyAccessToken( + AccessTokenID callerTokenID, AccessTokenID firstTokenID, const std::string& permissionName) +{ + int ret = AccessTokenKit::VerifyAccessToken(callerTokenID, permissionName); + if (ret != PERMISSION_GRANTED) { + return ret; + } + if (firstTokenID == FIRSTCALLER_TOKENID_DEFAULT) { + return ret; + } + return AccessTokenKit::VerifyAccessToken(firstTokenID, permissionName); +} + +int AccessTokenKit::VerifyNativeToken(AccessTokenID tokenID, const std::string& permissionName) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID=%{public}d is invalid", tokenID); + return PERMISSION_DENIED; + } + if (!DataValidator::IsPermissionNameValid(permissionName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); + return PERMISSION_DENIED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s", tokenID, permissionName.c_str()); + return AccessTokenManagerClient::GetInstance().VerifyNativeToken(tokenID, permissionName); +} + +int AccessTokenKit::GetDefPermission(const std::string& permissionName, PermissionDef& permissionDefResult) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (!DataValidator::IsPermissionNameValid(permissionName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "permissionName=%{public}s", permissionName.c_str()); + + int ret = AccessTokenManagerClient::GetInstance().GetDefPermission(permissionName, permissionDefResult); + ACCESSTOKEN_LOG_INFO(LABEL, "GetDefPermission bundleName = %{public}s", permissionDefResult.bundleName.c_str()); + + return ret; +} + +int AccessTokenKit::GetDefPermissions(AccessTokenID tokenID, std::vector& permDefList) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); + + return AccessTokenManagerClient::GetInstance().GetDefPermissions(tokenID, permDefList); +} + +int AccessTokenKit::GetReqPermissions( + AccessTokenID tokenID, std::vector& reqPermList, bool isSystemGrant) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, isSystemGrant=%{public}d", tokenID, isSystemGrant); + + return AccessTokenManagerClient::GetInstance().GetReqPermissions(tokenID, reqPermList, isSystemGrant); +} + +int AccessTokenKit::GetPermissionFlag(AccessTokenID tokenID, const std::string& permissionName) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return PERMISSION_DEFAULT_FLAG; + } + if (!DataValidator::IsPermissionNameValid(permissionName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); + return PERMISSION_DEFAULT_FLAG; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s", tokenID, permissionName.c_str()); + return AccessTokenManagerClient::GetInstance().GetPermissionFlag(tokenID, permissionName); +} + +int AccessTokenKit::GrantPermission(AccessTokenID tokenID, const std::string& permissionName, int flag) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return RET_FAILED; + } + if (!DataValidator::IsPermissionNameValid(permissionName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); + return RET_FAILED; + } + if (!DataValidator::IsPermissionFlagValid(flag)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "flag is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s, flag=%{public}d", + tokenID, permissionName.c_str(), flag); + return AccessTokenManagerClient::GetInstance().GrantPermission(tokenID, permissionName, flag); +} + +int AccessTokenKit::RevokePermission(AccessTokenID tokenID, const std::string& permissionName, int flag) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return RET_FAILED; + } + if (!DataValidator::IsPermissionNameValid(permissionName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "permissionName is invalid"); + return RET_FAILED; + } + if (!DataValidator::IsPermissionFlagValid(flag)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "flag is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d, permissionName=%{public}s, flag=%{public}d", + tokenID, permissionName.c_str(), flag); + return AccessTokenManagerClient::GetInstance().RevokePermission(tokenID, permissionName, flag); +} + +int AccessTokenKit::ClearUserGrantedPermissionState(AccessTokenID tokenID) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); + return AccessTokenManagerClient::GetInstance().ClearUserGrantedPermissionState(tokenID); +} + +#ifdef TOKEN_SYNC_ENABLE +int AccessTokenKit::GetHapTokenInfoFromRemote(AccessTokenID tokenID, HapTokenInfoForSync& hapSync) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + if (tokenID == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenID is invalid"); + return RET_FAILED; + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokenID=%{public}d", tokenID); + + return AccessTokenManagerClient::GetInstance().GetHapTokenInfoFromRemote(tokenID, hapSync); +} + +int AccessTokenKit::GetAllNativeTokenInfo(std::vector& nativeTokenInfosRes) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + + return AccessTokenManagerClient::GetInstance().GetAllNativeTokenInfo(nativeTokenInfosRes); +} + +int AccessTokenKit::SetRemoteHapTokenInfo(const std::string& deviceID, + const HapTokenInfoForSync& hapSync) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{public}s tokenID=%{public}d", + __func__, CommonConstant::EncryptDevId(deviceID).c_str(), hapSync.baseInfo.tokenID); + return AccessTokenManagerClient::GetInstance().SetRemoteHapTokenInfo(deviceID, hapSync); +} + +int AccessTokenKit::SetRemoteNativeTokenInfo(const std::string& deviceID, + std::vector& nativeTokenInfoList) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{public}s", __func__, CommonConstant::EncryptDevId(deviceID).c_str()); + return AccessTokenManagerClient::GetInstance() + .SetRemoteNativeTokenInfo(deviceID, nativeTokenInfoList); +} + +int AccessTokenKit::DeleteRemoteToken(const std::string& deviceID, AccessTokenID tokenID) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{public}s tokenID=%{public}d", + __func__, CommonConstant::EncryptDevId(deviceID).c_str(), tokenID); + return AccessTokenManagerClient::GetInstance().DeleteRemoteToken(deviceID, tokenID); +} + +int AccessTokenKit::DeleteRemoteDeviceTokens(const std::string& deviceID) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{public}s", __func__, CommonConstant::EncryptDevId(deviceID).c_str()); + return AccessTokenManagerClient::GetInstance().DeleteRemoteDeviceTokens(deviceID); +} + +AccessTokenID AccessTokenKit::GetRemoteNativeTokenID(const std::string& deviceID, AccessTokenID tokenID) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{public}s tokenID=%{public}d", + __func__, CommonConstant::EncryptDevId(deviceID).c_str(), tokenID); + return AccessTokenManagerClient::GetInstance().GetRemoteNativeTokenID(deviceID, tokenID); +} +#endif + +void AccessTokenKit::DumpTokenInfo(std::string& dumpInfo) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called", __func__); + AccessTokenManagerClient::GetInstance().DumpTokenInfo(dumpInfo); +} +} // namespace AccessToken +} // namespace Security +} // namespace OHOS diff --git a/interfaces/innerkits/privacy/src/privacy_kit.cpp b/interfaces/innerkits/privacy/src/privacy_kit.cpp index 75ef66a5f..d333cd661 100644 --- a/interfaces/innerkits/privacy/src/privacy_kit.cpp +++ b/interfaces/innerkits/privacy/src/privacy_kit.cpp @@ -20,6 +20,7 @@ #include "accesstoken_log.h" #include "privacy_manager_client.h" +#include "common_constant.h" namespace OHOS { namespace Security { @@ -53,8 +54,8 @@ int32_t PrivacyKit::StopUsingPermission(AccessTokenID tokenID, const std::string int32_t PrivacyKit::RemovePermissionUsedRecords(AccessTokenID tokenID, const std::string& deviceID) { - ACCESSTOKEN_LOG_DEBUG(LABEL, "Entry, tokenID=0x%{public}x, deviceID=%{private}s", - tokenID, deviceID.c_str()); + ACCESSTOKEN_LOG_DEBUG(LABEL, "Entry, tokenID=0x%{public}x, deviceID=%{public}s", + tokenID, CommonConstant::EncryptDevId(deviceID).c_str()); return PrivacyManagerClient::GetInstance().RemovePermissionUsedRecords(tokenID, deviceID); } diff --git a/interfaces/innerkits/tokensync/BUILD.gn b/interfaces/innerkits/tokensync/BUILD.gn index 991849b9f..c5cc535ce 100644 --- a/interfaces/innerkits/tokensync/BUILD.gn +++ b/interfaces/innerkits/tokensync/BUILD.gn @@ -50,6 +50,7 @@ ohos_shared_library("libtokensync_sdk") { deps = [ "//base/security/access_token/frameworks/accesstoken:accesstoken_communication_adapter_cxx", "//utils/native/base:utils", + "//base/security/access_token/frameworks/common:accesstoken_common_cxx", #ÐÂ¼ÓµÄ ] external_deps = [ diff --git a/interfaces/innerkits/tokensync/src/token_sync_kit.cpp b/interfaces/innerkits/tokensync/src/token_sync_kit.cpp index 415cf1f0f..e82ed289f 100644 --- a/interfaces/innerkits/tokensync/src/token_sync_kit.cpp +++ b/interfaces/innerkits/tokensync/src/token_sync_kit.cpp @@ -1,53 +1,54 @@ -/* - * Copyright (c) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "token_sync_kit.h" - -#include -#include - -#include "accesstoken_log.h" -#include "token_sync_manager_client.h" - -namespace OHOS { -namespace Security { -namespace AccessToken { -using namespace std; - -namespace { -static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "TokenSyncKit"}; -} // namespace - -int TokenSyncKit::GetRemoteHapTokenInfo(const std::string& deviceID, AccessTokenID tokenID) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{private}s tokenID=%{public}d", - __func__, deviceID.c_str(), tokenID); - return TokenSyncManagerClient::GetInstance().GetRemoteHapTokenInfo(deviceID, tokenID); -} - -int TokenSyncKit::DeleteRemoteHapTokenInfo(AccessTokenID tokenID) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, tokenID=%{public}d", __func__, tokenID); - return TokenSyncManagerClient::GetInstance().DeleteRemoteHapTokenInfo(tokenID); -} - -int TokenSyncKit::UpdateRemoteHapTokenInfo(const HapTokenInfoForSync& tokenInfo) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called tokenID=%{public}d", __func__, tokenInfo.baseInfo.tokenID); - return TokenSyncManagerClient::GetInstance().UpdateRemoteHapTokenInfo(tokenInfo); -} -} // namespace AccessToken -} // namespace Security -} // namespace OHOS +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "token_sync_kit.h" + +#include +#include + +#include "accesstoken_log.h" +#include "token_sync_manager_client.h" +#include "common_constant.h" + +namespace OHOS { +namespace Security { +namespace AccessToken { +using namespace std; + +namespace { +static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "TokenSyncKit"}; +} // namespace + +int TokenSyncKit::GetRemoteHapTokenInfo(const std::string& deviceID, AccessTokenID tokenID) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, deviceID=%{public}s tokenID=%{public}d", + __func__, CommonConstant::EncryptDevId(deviceID).c_str(), tokenID); + return TokenSyncManagerClient::GetInstance().GetRemoteHapTokenInfo(deviceID, tokenID); +} + +int TokenSyncKit::DeleteRemoteHapTokenInfo(AccessTokenID tokenID) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, tokenID=%{public}d", __func__, tokenID); + return TokenSyncManagerClient::GetInstance().DeleteRemoteHapTokenInfo(tokenID); +} + +int TokenSyncKit::UpdateRemoteHapTokenInfo(const HapTokenInfoForSync& tokenInfo) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called tokenID=%{public}d", __func__, tokenInfo.baseInfo.tokenID); + return TokenSyncManagerClient::GetInstance().UpdateRemoteHapTokenInfo(tokenInfo); +} +} // namespace AccessToken +} // namespace Security +} // namespace OHOS 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 24fcdf6aa..c083c37bf 100644 --- a/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp +++ b/services/accesstokenmanager/main/cpp/src/service/accesstoken_manager_service.cpp @@ -33,6 +33,7 @@ #include "permission_list_state.h" #include "permission_manager.h" #include "privacy_kit.h" +#include "common_constant.h" namespace OHOS { namespace Security { @@ -247,8 +248,8 @@ AccessTokenID AccessTokenManagerService::GetHapTokenID(int userID, const std::st AccessTokenID AccessTokenManagerService::AllocLocalTokenID( const std::string& remoteDeviceID, AccessTokenID remoteTokenID) { - ACCESSTOKEN_LOG_INFO(LABEL, "called, remoteDeviceID: %{private}s, remoteTokenID: %{public}d", - remoteDeviceID.c_str(), remoteTokenID); + ACCESSTOKEN_LOG_INFO(LABEL, "called, remoteDeviceID: %{public}s, remoteTokenID: %{public}d", + CommonConstant::EncryptDevId(remoteDeviceID).c_str(), remoteTokenID); return AccessTokenInfoManager::GetInstance().AllocLocalTokenID(remoteDeviceID, remoteTokenID); } @@ -303,7 +304,7 @@ int AccessTokenManagerService::GetAllNativeTokenInfo(std::vector& nativeTokenInfoForSyncParcel) { - ACCESSTOKEN_LOG_INFO(LABEL, "called, deviceID: %{private}s", deviceID.c_str()); + ACCESSTOKEN_LOG_INFO(LABEL, "called, deviceID: %{public}s", CommonConstant::EncryptDevId(deviceID).c_str()); std::vector nativeList; @@ -325,8 +326,8 @@ int AccessTokenManagerService::SetRemoteNativeTokenInfo(const std::string& devic int AccessTokenManagerService::DeleteRemoteToken(const std::string& deviceID, AccessTokenID tokenID) { - ACCESSTOKEN_LOG_INFO(LABEL, "called, deviceID: %{private}s, token id %{public}d", - deviceID.c_str(), tokenID); + ACCESSTOKEN_LOG_INFO(LABEL, "called, deviceID: %{public}s, token id %{public}d", + CommonConstant::EncryptDevId(deviceID).c_str(), tokenID); return AccessTokenInfoManager::GetInstance().DeleteRemoteToken(deviceID, tokenID); } @@ -334,15 +335,15 @@ int AccessTokenManagerService::DeleteRemoteToken(const std::string& deviceID, Ac AccessTokenID AccessTokenManagerService::GetRemoteNativeTokenID(const std::string& deviceID, AccessTokenID tokenID) { - ACCESSTOKEN_LOG_INFO(LABEL, "called, deviceID: %{private}s, token id %{public}d", - deviceID.c_str(), tokenID); + ACCESSTOKEN_LOG_INFO(LABEL, "called, deviceID: %{public}s, token id %{public}d", + CommonConstant::EncryptDevId(deviceID).c_str(), tokenID); return AccessTokenInfoManager::GetInstance().GetRemoteNativeTokenID(deviceID, tokenID); } int AccessTokenManagerService::DeleteRemoteDeviceTokens(const std::string& deviceID) { - ACCESSTOKEN_LOG_INFO(LABEL, "called, deviceID: %{private}s", deviceID.c_str()); + ACCESSTOKEN_LOG_INFO(LABEL, "called, deviceID: %{public}s", CommonConstant::EncryptDevId(deviceID).c_str()); return AccessTokenInfoManager::GetInstance().DeleteRemoteDeviceTokens(deviceID); } 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 e8f8a0366..2e80ec86f 100644 --- a/services/accesstokenmanager/main/cpp/src/token/accesstoken_info_manager.cpp +++ b/services/accesstokenmanager/main/cpp/src/token/accesstoken_info_manager.cpp @@ -28,6 +28,7 @@ #include "permission_definition_cache.h" #include "permission_manager.h" #include "softbus_bus_center.h" +#include "common_constant.h" #ifdef TOKEN_SYNC_ENABLE #include "token_modify_notifier.h" @@ -647,15 +648,15 @@ int AccessTokenInfoManager::SetRemoteHapTokenInfo(const std::string& deviceID, H || !DataValidator::IsDlpTypeValid(hapSync.baseInfo.dlpType) || hapSync.baseInfo.ver != DEFAULT_TOKEN_VERSION || AccessTokenIDManager::GetInstance().GetTokenIdTypeEnum(hapSync.baseInfo.tokenID) != TOKEN_HAP) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s parms invalid", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s parms invalid", CommonConstant::EncryptDevId(deviceID).c_str()); return RET_FAILED; } AccessTokenID remoteID = hapSync.baseInfo.tokenID; AccessTokenID mapID = AccessTokenRemoteTokenManager::GetInstance().GetDeviceMappingTokenID(deviceID, remoteID); if (mapID != 0) { - ACCESSTOKEN_LOG_INFO(LABEL, "device %{private}s token %{public}u update exist remote hap token %{public}u.", - deviceID.c_str(), remoteID, mapID); + ACCESSTOKEN_LOG_INFO(LABEL, "device %{public}s token %{public}u update exist remote hap token %{public}u.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID, mapID); // update remote token mapping id hapSync.baseInfo.tokenID = mapID; hapSync.baseInfo.deviceID = deviceID; @@ -665,7 +666,7 @@ int AccessTokenInfoManager::SetRemoteHapTokenInfo(const std::string& deviceID, H mapID = AccessTokenRemoteTokenManager::GetInstance().MapRemoteDeviceTokenToLocal(deviceID, remoteID); if (mapID == 0) { ACCESSTOKEN_LOG_ERROR( - LABEL, "device %{private}s token %{public}u map failed.", deviceID.c_str(), remoteID); + LABEL, "device %{public}s token %{public}u map failed.", CommonConstant::EncryptDevId(deviceID).c_str(), remoteID); return RET_FAILED; } @@ -675,12 +676,12 @@ int AccessTokenInfoManager::SetRemoteHapTokenInfo(const std::string& deviceID, H if (CreateRemoteHapTokenInfo(mapID, hapSync) == RET_FAILED) { AccessTokenRemoteTokenManager::GetInstance().RemoveDeviceMappingTokenID(deviceID, mapID); - ACCESSTOKEN_LOG_INFO(LABEL, "device %{private}s token %{public}u map to local token %{public}u failed.", - deviceID.c_str(), remoteID, mapID); + ACCESSTOKEN_LOG_INFO(LABEL, "device %{public}s token %{public}u map to local token %{public}u failed.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID, mapID); return RET_FAILED; } - ACCESSTOKEN_LOG_INFO(LABEL, "device %{private}s token %{public}u map to local token %{public}u success.", - deviceID.c_str(), remoteID, mapID); + ACCESSTOKEN_LOG_INFO(LABEL, "device %{public}s token %{public}u map to local token %{public}u success.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID, mapID); return RET_SUCCESS; } @@ -688,7 +689,7 @@ int AccessTokenInfoManager::SetRemoteNativeTokenInfo(const std::string& deviceID std::vector& nativeTokenInfoList) { if (!DataValidator::IsDeviceIdValid(deviceID)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s parms invalid", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s parms invalid", CommonConstant::EncryptDevId(deviceID).c_str()); return RET_FAILED; } @@ -699,8 +700,8 @@ int AccessTokenInfoManager::SetRemoteNativeTokenInfo(const std::string& deviceID nativeToken.baseInfo.dcap.size() <= 0 || AccessTokenIDManager::GetInstance().GetTokenIdTypeEnum(nativeToken.baseInfo.tokenID) != TOKEN_NATIVE) { ACCESSTOKEN_LOG_ERROR( - LABEL, "device %{private}s token %{public}u is invalid.", - deviceID.c_str(), nativeToken.baseInfo.tokenID); + LABEL, "device %{public}s token %{public}u is invalid.", + CommonConstant::EncryptDevId(deviceID).c_str(), nativeToken.baseInfo.tokenID); continue; } @@ -708,8 +709,8 @@ int AccessTokenInfoManager::SetRemoteNativeTokenInfo(const std::string& deviceID AccessTokenID mapID = AccessTokenRemoteTokenManager::GetInstance().GetDeviceMappingTokenID(deviceID, remoteID); if (mapID != 0) { ACCESSTOKEN_LOG_ERROR( - LABEL, "device %{private}s token %{public}u has maped, no need update it.", - deviceID.c_str(), nativeToken.baseInfo.tokenID); + LABEL, "device %{public}s token %{public}u has maped, no need update it.", + CommonConstant::EncryptDevId(deviceID).c_str(), nativeToken.baseInfo.tokenID); continue; } @@ -717,32 +718,32 @@ int AccessTokenInfoManager::SetRemoteNativeTokenInfo(const std::string& deviceID if (mapID == 0) { AccessTokenRemoteTokenManager::GetInstance().RemoveDeviceMappingTokenID(deviceID, mapID); ACCESSTOKEN_LOG_ERROR( - LABEL, "device %{private}s token %{public}u map failed.", - deviceID.c_str(), remoteID); + LABEL, "device %{public}s token %{public}u map failed.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID); continue; } nativeToken.baseInfo.tokenID = mapID; - ACCESSTOKEN_LOG_INFO(LABEL, "device %{private}s token %{public}u map to local token %{public}u.", - deviceID.c_str(), remoteID, mapID); + ACCESSTOKEN_LOG_INFO(LABEL, "device %{public}s token %{public}u map to local token %{public}u.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID, mapID); std::shared_ptr nativePtr = std::make_shared(nativeToken.baseInfo, nativeToken.permStateList); if (nativePtr == nullptr) { AccessTokenRemoteTokenManager::GetInstance().RemoveDeviceMappingTokenID(deviceID, mapID); - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s tokenId %{public}u alloc local token failed.", - deviceID.c_str(), remoteID); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s tokenId %{public}u alloc local token failed.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID); continue; } nativePtr->SetRemote(true); int ret = AddNativeTokenInfo(nativePtr); if (ret != RET_SUCCESS) { AccessTokenRemoteTokenManager::GetInstance().RemoveDeviceMappingTokenID(deviceID, mapID); - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s tokenId %{public}u add local token failed.", - deviceID.c_str(), remoteID); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s tokenId %{public}u add local token failed.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID); continue; } - ACCESSTOKEN_LOG_INFO(LABEL, "device %{private}s token %{public}u map token %{public}u add success.", - deviceID.c_str(), remoteID, mapID); + ACCESSTOKEN_LOG_INFO(LABEL, "device %{public}s token %{public}u map token %{public}u add success.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID, mapID); } return RET_SUCCESS; @@ -751,13 +752,13 @@ int AccessTokenInfoManager::SetRemoteNativeTokenInfo(const std::string& deviceID int AccessTokenInfoManager::DeleteRemoteToken(const std::string& deviceID, AccessTokenID tokenID) { if (!DataValidator::IsDeviceIdValid(deviceID)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s parms invalid", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s parms invalid", CommonConstant::EncryptDevId(deviceID).c_str()); return RET_FAILED; } AccessTokenID mapID = AccessTokenRemoteTokenManager::GetInstance().GetDeviceMappingTokenID(deviceID, tokenID); if (mapID == 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s tokenId %{public}u is not mapped", - deviceID.c_str(), tokenID); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s tokenId %{public}u is not mapped", + CommonConstant::EncryptDevId(deviceID).c_str(), tokenID); return RET_FAILED; } @@ -788,7 +789,7 @@ AccessTokenID AccessTokenInfoManager::GetRemoteNativeTokenID(const std::string& { if (!DataValidator::IsDeviceIdValid(deviceID) || AccessTokenIDManager::GetInstance().GetTokenIdTypeEnum(tokenID) != TOKEN_NATIVE) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s parms invalid", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s parms invalid", CommonConstant::EncryptDevId(deviceID).c_str()); return 0; } return AccessTokenRemoteTokenManager::GetInstance().GetDeviceMappingTokenID(deviceID, tokenID); @@ -797,13 +798,13 @@ AccessTokenID AccessTokenInfoManager::GetRemoteNativeTokenID(const std::string& int AccessTokenInfoManager::DeleteRemoteDeviceTokens(const std::string& deviceID) { if (!DataValidator::IsDeviceIdValid(deviceID)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s parms invalid", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s parms invalid", CommonConstant::EncryptDevId(deviceID).c_str()); return RET_FAILED; } std::vector remoteTokens; int ret = AccessTokenRemoteTokenManager::GetInstance().GetDeviceAllRemoteTokenID(deviceID, remoteTokens); if (ret == RET_FAILED) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s have no remote token", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s have no remote token", CommonConstant::EncryptDevId(deviceID).c_str()); return RET_FAILED; } for (AccessTokenID remoteID : remoteTokens) { @@ -830,11 +831,11 @@ AccessTokenID AccessTokenInfoManager::AllocLocalTokenID(const std::string& remot AccessTokenID remoteTokenID) { if (!DataValidator::IsDeviceIdValid(remoteDeviceID)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s parms invalid", remoteDeviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s parms invalid", CommonConstant::EncryptDevId(remoteDeviceID).c_str()); return 0; } std::string remoteUdid = GetUdidByNodeId(remoteDeviceID); - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s remoteUdid", remoteUdid.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s remoteUdid", CommonConstant::EncryptDevId(remoteUdid).c_str()); AccessTokenID mapID = AccessTokenRemoteTokenManager::GetInstance().GetDeviceMappingTokenID(remoteUdid, remoteTokenID); if (mapID != 0) { @@ -842,8 +843,8 @@ AccessTokenID AccessTokenInfoManager::AllocLocalTokenID(const std::string& remot } int ret = TokenSyncKit::GetRemoteHapTokenInfo(remoteUdid, remoteTokenID); if (ret != RET_SUCCESS) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s token %{public}u sync failed", - remoteUdid.c_str(), remoteTokenID); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s token %{public}u sync failed", + CommonConstant::EncryptDevId(remoteUdid).c_str(), remoteTokenID); return 0; } diff --git a/services/accesstokenmanager/main/cpp/src/token/accesstoken_remote_token_manager.cpp b/services/accesstokenmanager/main/cpp/src/token/accesstoken_remote_token_manager.cpp index 6f5b1e567..2d2075cde 100644 --- a/services/accesstokenmanager/main/cpp/src/token/accesstoken_remote_token_manager.cpp +++ b/services/accesstokenmanager/main/cpp/src/token/accesstoken_remote_token_manager.cpp @@ -18,6 +18,7 @@ #include "accesstoken_id_manager.h" #include "accesstoken_log.h" #include "data_validator.h" +#include "common_constant.h" namespace OHOS { namespace Security { @@ -44,7 +45,7 @@ AccessTokenID AccessTokenRemoteTokenManager::MapRemoteDeviceTokenToLocal(const s { if (!DataValidator::IsDeviceIdValid(deviceID) || !DataValidator::IsTokenIDValid(remoteID)) { ACCESSTOKEN_LOG_ERROR( - LABEL, "device %{private}s or token %{public}x is invalid.", deviceID.c_str(), remoteID); + LABEL, "device %{public}s or token %{public}x is invalid.", CommonConstant::EncryptDevId(deviceID).c_str(), remoteID); return 0; } ATokenTypeEnum tokeType = AccessTokenIDManager::GetInstance().GetTokenIdTypeEnum(remoteID); @@ -63,8 +64,8 @@ AccessTokenID AccessTokenRemoteTokenManager::MapRemoteDeviceTokenToLocal(const s if (device.MappingTokenIDPairMap_.count(remoteID) > 0) { mapID = device.MappingTokenIDPairMap_[remoteID]; ACCESSTOKEN_LOG_ERROR( - LABEL, "device %{private}s token %{public}x has already mapped, maptokenID is %{public}x.", - deviceID.c_str(), remoteID, mapID); + LABEL, "device %{public}s token %{public}x has already mapped, maptokenID is %{public}x.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID, mapID); return mapID; } mapPtr = &device.MappingTokenIDPairMap_; @@ -78,8 +79,8 @@ AccessTokenID AccessTokenRemoteTokenManager::MapRemoteDeviceTokenToLocal(const s mapID = AccessTokenIDManager::GetInstance().CreateAndRegisterTokenId(tokeType, dlpType); if (mapID == 0) { ACCESSTOKEN_LOG_ERROR( - LABEL, "device %{private}s token %{public}x map local Token failed.", - deviceID.c_str(), remoteID); + LABEL, "device %{public}s token %{public}x map local Token failed.", + CommonConstant::EncryptDevId(deviceID).c_str(), remoteID); return 0; } mapPtr->insert(std::pair(remoteID, mapID)); @@ -90,12 +91,12 @@ int AccessTokenRemoteTokenManager::GetDeviceAllRemoteTokenID(const std::string& std::vector& remoteIDs) { if (!DataValidator::IsDeviceIdValid(deviceID)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s is valid.", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s is valid.", CommonConstant::EncryptDevId(deviceID).c_str()); return RET_FAILED; } Utils::UniqueReadGuard infoGuard(this->remoteDeviceLock_); if (remoteDeviceMap_.count(deviceID) < 1) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s has not mapping.", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s has not mapping.", CommonConstant::EncryptDevId(deviceID).c_str()); return RET_FAILED; } @@ -110,14 +111,14 @@ AccessTokenID AccessTokenRemoteTokenManager::GetDeviceMappingTokenID(const std:: { if (!DataValidator::IsDeviceIdValid(deviceID) || !DataValidator::IsTokenIDValid(remoteID)) { ACCESSTOKEN_LOG_ERROR( - LABEL, "device %{private}s or token %{public}x is invalid.", deviceID.c_str(), remoteID); + LABEL, "device %{public}s or token %{public}x is invalid.", CommonConstant::EncryptDevId(deviceID).c_str(), remoteID); return 0; } Utils::UniqueReadGuard infoGuard(this->remoteDeviceLock_); if (remoteDeviceMap_.count(deviceID) < 1 || remoteDeviceMap_[deviceID].MappingTokenIDPairMap_.count(remoteID) < 1) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s has not mapping.", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s has not mapping.", CommonConstant::EncryptDevId(deviceID).c_str()); return 0; } @@ -129,14 +130,14 @@ int AccessTokenRemoteTokenManager::RemoveDeviceMappingTokenID(const std::string& { if (!DataValidator::IsDeviceIdValid(deviceID) || !DataValidator::IsTokenIDValid(remoteID)) { ACCESSTOKEN_LOG_ERROR( - LABEL, "device %{private}s or token %{public}x is invalid.", deviceID.c_str(), remoteID); + LABEL, "device %{public}s or token %{public}x is invalid.", CommonConstant::EncryptDevId(deviceID).c_str(), remoteID); return RET_FAILED; } Utils::UniqueWriteGuard infoGuard(this->remoteDeviceLock_); if (remoteDeviceMap_.count(deviceID) < 1 || remoteDeviceMap_[deviceID].MappingTokenIDPairMap_.count(remoteID) < 1) { - ACCESSTOKEN_LOG_ERROR(LABEL, "device %{private}s has not mapping.", deviceID.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "device %{public}s has not mapping.", CommonConstant::EncryptDevId(deviceID).c_str()); return RET_FAILED; } diff --git a/services/tokensyncmanager/src/device/device_info_manager.cpp b/services/tokensyncmanager/src/device/device_info_manager.cpp index dfe35aa9a..9a781f92d 100644 --- a/services/tokensyncmanager/src/device/device_info_manager.cpp +++ b/services/tokensyncmanager/src/device/device_info_manager.cpp @@ -14,6 +14,7 @@ */ #include "device_info_manager.h" +#include "common_constant.h" namespace OHOS { namespace Security { @@ -119,17 +120,17 @@ std::string DeviceInfoManager::ConvertToUniqueDeviceIdOrFetch(const std::string } else { ACCESSTOKEN_LOG_DEBUG(LABEL, "FindDeviceInfo succeed, udid and local udid is empty, nodeId(%{public}s)", - Constant::EncryptDevId(nodeId).c_str()); + nodeId.c_str()); } } else { ACCESSTOKEN_LOG_DEBUG(LABEL, "FindDeviceInfo succeed, udid is empty, nodeId(%{public}s) ", - Constant::EncryptDevId(nodeId).c_str()); + nodeId.c_str()); result = uniqueDeviceId; } } else { ACCESSTOKEN_LOG_DEBUG( - LABEL, "FindDeviceInfo failed, nodeId(%{public}s)", Constant::EncryptDevId(nodeId).c_str()); + LABEL, "FindDeviceInfo failed, nodeId(%{public}s)", nodeId.c_str()); auto list = DeviceInfoRepository::GetInstance().ListDeviceInfo(); auto iter = list.begin(); for (; iter != list.end(); iter++) { @@ -140,7 +141,7 @@ std::string DeviceInfoManager::ConvertToUniqueDeviceIdOrFetch(const std::string LABEL, ">>> DeviceInfoRepository device type: %{public}s", info.deviceType.c_str()); ACCESSTOKEN_LOG_DEBUG(LABEL, ">>> DeviceInfoRepository device network id: %{public}s", - Constant::EncryptDevId(info.deviceId.networkId).c_str()); + info.deviceId.networkId.c_str()); } } return result; diff --git a/services/tokensyncmanager/src/remote/soft_bus_manager.cpp b/services/tokensyncmanager/src/remote/soft_bus_manager.cpp index 8fe5de825..cb4bf655c 100644 --- a/services/tokensyncmanager/src/remote/soft_bus_manager.cpp +++ b/services/tokensyncmanager/src/remote/soft_bus_manager.cpp @@ -1,409 +1,410 @@ -/* - * Copyright (c) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include "soft_bus_manager.h" - -#include - -#include "device_info_manager.h" -#include "parameter.h" -#include "softbus_bus_center.h" -#include "dm_device_info.h" -#include "remote_command_manager.h" - -namespace OHOS { -namespace Security { -namespace AccessToken { -namespace { -static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "SoftBusManager"}; -} -namespace { -static const std::string SESSION_GROUP_ID = "atm_dsoftbus_session_group_id"; -static const SessionAttribute SESSION_ATTR = {.dataType = TYPE_BYTES}; - -static const int REASON_EXIST = -3; -static const int OPENSESSION_RETRY_TIMES = 10 * 3; -static const int OPENSESSION_RETRY_INTERVAL_MS = 100; -static const int UDID_MAX_LENGTH = 128; // udid/uuid max length -} // namespace - -const std::string SoftBusManager::TOKEN_SYNC_PACKAGE_NAME = "ohos.security.distributed_access_token"; -const std::string SoftBusManager::SESSION_NAME = "ohos.security.atm_channel"; - -SoftBusManager::SoftBusManager() : isSoftBusServiceBindSuccess_(false), inited_(false), mutex_(), fulfillMutex_() -{ - ACCESSTOKEN_LOG_DEBUG(LABEL, "SoftBusManager()"); -} - -SoftBusManager::~SoftBusManager() -{ - ACCESSTOKEN_LOG_DEBUG(LABEL, "~SoftBusManager()"); -} - -SoftBusManager &SoftBusManager::GetInstance() -{ - static SoftBusManager instance; - return instance; -} - -int SoftBusManager::AddTrustedDeviceInfo() -{ - std::string packageName = TOKEN_SYNC_PACKAGE_NAME; - std::string extra = ""; - std::vector deviceList; - - int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetTrustedDeviceList(packageName, - extra, deviceList); - if (ret != Constant::SUCCESS) { - ACCESSTOKEN_LOG_ERROR(LABEL, "AddTrustedDeviceInfo: GetTrustedDeviceList error, result: %{public}d", ret); - return Constant::FAILURE; - } - - for (DistributedHardware::DmDeviceInfo device : deviceList) { - std::string uuid = GetUuidByNodeId(device.networkId); - std::string udid = GetUdidByNodeId(device.networkId); - if (uuid.empty() || udid.empty()) { - ACCESSTOKEN_LOG_ERROR(LABEL, "uuid = %{public}s, udid = %{public}s, uuid or udid is empty, abort.", - uuid.c_str(), udid.c_str()); - continue; - } - - DeviceInfoManager::GetInstance().AddDeviceInfo(device.networkId, uuid, udid, device.deviceName, - std::to_string(device.deviceTypeId)); - RemoteCommandManager::GetInstance().NotifyDeviceOnline(udid); - } - - return Constant::SUCCESS; -} - -int SoftBusManager::DeviceInit() -{ - std::string packageName = TOKEN_SYNC_PACKAGE_NAME; - std::shared_ptr ptrDmInitCallback = std::make_shared(); - - int ret = DistributedHardware::DeviceManager::GetInstance().InitDeviceManager(packageName, ptrDmInitCallback); - if (ret != ERR_OK) { - ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: InitDeviceManager error, result: %{public}d", ret); - return ret; - } - - ret = AddTrustedDeviceInfo(); - if (ret != ERR_OK) { - ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: AddTrustedDeviceInfo error, result: %{public}d", ret); - return ret; - } - - std::string extra = ""; - std::shared_ptr ptrDeviceStateCallback = - std::make_shared(); - ret = DistributedHardware::DeviceManager::GetInstance().RegisterDevStateCallback(packageName, extra, - ptrDeviceStateCallback); - if (ret != ERR_OK) { - ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: RegisterDevStateCallback error, result: %{public}d", ret); - return ret; - } - - return ERR_OK; -} - -int SoftBusManager::SessionInit() -{ - // register session listener - ISessionListener sessionListener; - sessionListener.OnSessionOpened = SoftBusSessionListener::OnSessionOpened; - sessionListener.OnSessionClosed = SoftBusSessionListener::OnSessionClosed; - sessionListener.OnBytesReceived = SoftBusSessionListener::OnBytesReceived; - sessionListener.OnMessageReceived = SoftBusSessionListener::OnMessageReceived; - - int ret = ::CreateSessionServer(TOKEN_SYNC_PACKAGE_NAME.c_str(), SESSION_NAME.c_str(), &sessionListener); - ACCESSTOKEN_LOG_INFO(LABEL, "Initialize: createSessionServer, result: %{public}d", ret); - // REASON_EXIST - if ((ret != Constant::SUCCESS) && (ret != REASON_EXIST)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: CreateSessionServer error, result: %{public}d", ret); - return ret; - } - - return ERR_OK; -} - -void SoftBusManager::Initialize() -{ - bool inited = false; - // cas failed means already inited. - if (!inited_.compare_exchange_strong(inited, true)) { - ACCESSTOKEN_LOG_DEBUG(LABEL, "already initialized, skip"); - return; - } - - std::function runner = [&]() { - auto sleepTime = std::chrono::milliseconds(1000); - while (1) { - std::unique_lock lock(mutex_); - - int ret = DeviceInit(); - if (ret != ERR_OK) { - std::this_thread::sleep_for(sleepTime); - continue; - } - - ret = SessionInit(); - if (ret != ERR_OK) { - std::this_thread::sleep_for(sleepTime); - continue; - } - - isSoftBusServiceBindSuccess_ = true; - this->FulfillLocalDeviceInfo(); - return; - } - }; - - std::thread initThread(runner); - initThread.detach(); - ACCESSTOKEN_LOG_DEBUG(LABEL, "Initialize thread started"); -} - -void SoftBusManager::Destroy() -{ - ACCESSTOKEN_LOG_DEBUG(LABEL, "destroy, init: %{public}d, isSoftBusServiceBindSuccess: %{public}d", inited_.load(), - isSoftBusServiceBindSuccess_); - - if (!inited_.load()) { - ACCESSTOKEN_LOG_DEBUG(LABEL, "not inited, skip"); - return; - } - - std::unique_lock lock(mutex_); - if (!inited_.load()) { - ACCESSTOKEN_LOG_DEBUG(LABEL, "not inited, skip"); - return; - } - - if (isSoftBusServiceBindSuccess_) { - int32_t ret = ::RemoveSessionServer(TOKEN_SYNC_PACKAGE_NAME.c_str(), SESSION_NAME.c_str()); - ACCESSTOKEN_LOG_DEBUG(LABEL, "destroy, RemoveSessionServer: %{public}d", ret); - isSoftBusServiceBindSuccess_ = false; - } - - std::string packageName = TOKEN_SYNC_PACKAGE_NAME; - int ret = DistributedHardware::DeviceManager::GetInstance().UnRegisterDevStateCallback(packageName); - if (ret != ERR_OK) { - ACCESSTOKEN_LOG_ERROR(LABEL, "UnRegisterDevStateCallback failed, code: %{public}d", ret); - } - ret = DistributedHardware::DeviceManager::GetInstance().UnInitDeviceManager(packageName); - if (ret != ERR_OK) { - ACCESSTOKEN_LOG_ERROR(LABEL, "UnInitDeviceManager failed, code: %{public}d", ret); - } - - inited_.store(false); - - ACCESSTOKEN_LOG_DEBUG(LABEL, "destroy, done"); -} - -int32_t SoftBusManager::OpenSession(const std::string &deviceId) -{ -#ifdef DEBUG_API_PERFORMANCE - ACCESSTOKEN_LOG_INFO(LABEL, "api_performance:start open session"); -#endif - - DeviceInfo info; - bool result = DeviceInfoManager::GetInstance().GetDeviceInfo(deviceId, DeviceIdType::UNKNOWN, info); - if (!result) { - ACCESSTOKEN_LOG_WARN(LABEL, "device info notfound for deviceId %{private}s", deviceId.c_str()); - return Constant::FAILURE; - } - std::string networkId = info.deviceId.networkId; - ACCESSTOKEN_LOG_INFO(LABEL, "openSession, networkId: %{public}s", networkId.c_str()); - - // async open session, should waitting for OnSessionOpened event. - int sessionId = ::OpenSession(SESSION_NAME.c_str(), SESSION_NAME.c_str(), networkId.c_str(), - SESSION_GROUP_ID.c_str(), &SESSION_ATTR); - - ACCESSTOKEN_LOG_DEBUG(LABEL, "async open session"); - - // wait session opening - int retryTimes = 0; - int logSpan = 10; - auto sleepTime = std::chrono::milliseconds(OPENSESSION_RETRY_INTERVAL_MS); - while (retryTimes++ < OPENSESSION_RETRY_TIMES) { - if (SoftBusSessionListener::GetSessionState(sessionId) < 0) { - std::this_thread::sleep_for(sleepTime); - if (retryTimes % logSpan == 0) { - ACCESSTOKEN_LOG_INFO(LABEL, "openSession, waitting for: %{public}d ms", - retryTimes * OPENSESSION_RETRY_INTERVAL_MS); - } - continue; - } - break; - } -#ifdef DEBUG_API_PERFORMANCE - ACCESSTOKEN_LOG_INFO(LABEL, "api_performance:start open session success"); -#endif - int64_t state = SoftBusSessionListener::GetSessionState(sessionId); - if (state < 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "openSession, timeout, session: %{public}" PRId64, state); - return Constant::FAILURE; - } - - SoftBusSessionListener::DeleteSessionIdFromMap(sessionId); - - ACCESSTOKEN_LOG_DEBUG(LABEL, "openSession, succeed, session: %{public}" PRId64, state); - return sessionId; -} - -int SoftBusManager::CloseSession(int sessionId) -{ - if (sessionId < 0) { - ACCESSTOKEN_LOG_INFO(LABEL, "closeSession: session is invalid"); - return Constant::FAILURE; - } - - ::CloseSession(sessionId); - ACCESSTOKEN_LOG_INFO(LABEL, "closeSession "); - return Constant::SUCCESS; -} - -std::string SoftBusManager::GetUniversallyUniqueIdByNodeId(const std::string &nodeId) -{ - if (!DataValidator::IsDeviceIdValid(nodeId)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "invalid nodeId: %{public}s", nodeId.c_str()); - return ""; - } - - std::string uuid = GetUuidByNodeId(nodeId); - if (uuid.empty()) { - ACCESSTOKEN_LOG_ERROR(LABEL, "softbus return null or empty string [%{public}s]", uuid.c_str()); - return ""; - } - - DeviceInfo info; - bool result = DeviceInfoManager::GetInstance().GetDeviceInfo(uuid, DeviceIdType::UNIVERSALLY_UNIQUE_ID, info); - if (!result) { - ACCESSTOKEN_LOG_DEBUG(LABEL, "local device info not found for uuid %{public}s", uuid.c_str()); - } else { - std::string dimUuid = info.deviceId.universallyUniqueId; - if (uuid == dimUuid) { - // refresh cache - std::function fulfillDeviceInfo = std::bind(&SoftBusManager::FulfillLocalDeviceInfo, this); - std::thread fulfill(fulfillDeviceInfo); - fulfill.detach(); - } - } - - return uuid; -} - -std::string SoftBusManager::GetUniqueDeviceIdByNodeId(const std::string &nodeId) -{ - if (!DataValidator::IsDeviceIdValid(nodeId)) { - ACCESSTOKEN_LOG_ERROR(LABEL, "invalid nodeId: %{public}s", nodeId.c_str()); - return ""; - } - std::string udid = GetUdidByNodeId(nodeId); - if (udid.empty()) { - ACCESSTOKEN_LOG_ERROR(LABEL, "softbus return null or empty string: %{public}s", udid.c_str()); - return ""; - } - char localUdid[Constant::DEVICE_UUID_LENGTH] = {0}; - ::GetDevUdid(localUdid, Constant::DEVICE_UUID_LENGTH); - if (udid == localUdid) { - // refresh cache - std::function fulfillDeviceInfo = std::bind(&SoftBusManager::FulfillLocalDeviceInfo, this); - std::thread fulfill(fulfillDeviceInfo); - fulfill.detach(); - } - return udid; -} - -std::string SoftBusManager::GetUuidByNodeId(const std::string &nodeId) const -{ - uint8_t *info = new uint8_t[UDID_MAX_LENGTH + 1]; - if (info == nullptr) { - ACCESSTOKEN_LOG_ERROR(LABEL, "no enough memory: %{public}d", UDID_MAX_LENGTH); - return ""; - } - (void)memset_s(info, UDID_MAX_LENGTH + 1, 0, UDID_MAX_LENGTH + 1); - int32_t ret = ::GetNodeKeyInfo(TOKEN_SYNC_PACKAGE_NAME.c_str(), nodeId.c_str(), - NodeDeviceInfoKey::NODE_KEY_UUID, info, UDID_MAX_LENGTH); - if (ret != Constant::SUCCESS) { - delete[] info; - ACCESSTOKEN_LOG_WARN(LABEL, "GetNodeKeyInfo error, return code: %{public}d", ret); - return ""; - } - std::string uuid(reinterpret_cast(info)); - delete[] info; - ACCESSTOKEN_LOG_DEBUG(LABEL, "call softbus finished. nodeId(in): %{public}s, uuid: %{public}s", nodeId.c_str(), - uuid.c_str()); - return uuid; -} - -std::string SoftBusManager::GetUdidByNodeId(const std::string &nodeId) const -{ - uint8_t *info = new uint8_t[UDID_MAX_LENGTH + 1]; - if (info == nullptr) { - ACCESSTOKEN_LOG_ERROR(LABEL, "no enough memory: %{public}d", UDID_MAX_LENGTH); - return ""; - } - (void)memset_s(info, UDID_MAX_LENGTH + 1, 0, UDID_MAX_LENGTH + 1); - int32_t ret = ::GetNodeKeyInfo(TOKEN_SYNC_PACKAGE_NAME.c_str(), nodeId.c_str(), - NodeDeviceInfoKey::NODE_KEY_UDID, info, UDID_MAX_LENGTH); - if (ret != Constant::SUCCESS) { - delete[] info; - ACCESSTOKEN_LOG_WARN(LABEL, "GetNodeKeyInfo error, code: %{public}d", ret); - return ""; - } - std::string udid(reinterpret_cast(info)); - delete[] info; - ACCESSTOKEN_LOG_DEBUG(LABEL, "call softbus finished: nodeId(in): %{public}s", nodeId.c_str()); - return udid; -} - -int SoftBusManager::FulfillLocalDeviceInfo() -{ - // repeated task will just skip - if (!fulfillMutex_.try_lock()) { - ACCESSTOKEN_LOG_INFO(LABEL, "FulfillLocalDeviceInfo already running, skip."); - return Constant::SUCCESS; - } - - NodeBasicInfo info; - int32_t ret = ::GetLocalNodeDeviceInfo(TOKEN_SYNC_PACKAGE_NAME.c_str(), &info); - if (ret != Constant::SUCCESS) { - ACCESSTOKEN_LOG_ERROR(LABEL, "GetLocalNodeDeviceInfo error"); - fulfillMutex_.unlock(); - return Constant::FAILURE; - } - - ACCESSTOKEN_LOG_DEBUG(LABEL, "call softbus finished, networkId:%{public}s, name:%{public}s, type:%{public}d", - info.networkId, info.deviceName, info.deviceTypeId); - - std::string uuid = GetUuidByNodeId(info.networkId); - std::string udid = GetUdidByNodeId(info.networkId); - if (uuid.empty() || udid.empty()) { - ACCESSTOKEN_LOG_ERROR(LABEL, "FulfillLocalDeviceInfo: uuid or udid is empty, abort."); - fulfillMutex_.unlock(); - return Constant::FAILURE; - } - - DeviceInfoManager::GetInstance().AddDeviceInfo(info.networkId, uuid, udid, info.deviceName, - std::to_string(info.deviceTypeId)); - ACCESSTOKEN_LOG_DEBUG(LABEL, "AddDeviceInfo finished, networkId:%{public}s", - info.networkId); - - fulfillMutex_.unlock(); - return Constant::SUCCESS; -} -} // namespace AccessToken -} // namespace Security -} // namespace OHOS +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "soft_bus_manager.h" + +#include + +#include "device_info_manager.h" +#include "parameter.h" +#include "softbus_bus_center.h" +#include "dm_device_info.h" +#include "remote_command_manager.h" +#include "common_constant.h" + +namespace OHOS { +namespace Security { +namespace AccessToken { +namespace { +static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "SoftBusManager"}; +} +namespace { +static const std::string SESSION_GROUP_ID = "atm_dsoftbus_session_group_id"; +static const SessionAttribute SESSION_ATTR = {.dataType = TYPE_BYTES}; + +static const int REASON_EXIST = -3; +static const int OPENSESSION_RETRY_TIMES = 10 * 3; +static const int OPENSESSION_RETRY_INTERVAL_MS = 100; +static const int UDID_MAX_LENGTH = 128; // udid/uuid max length +} // namespace + +const std::string SoftBusManager::TOKEN_SYNC_PACKAGE_NAME = "ohos.security.distributed_access_token"; +const std::string SoftBusManager::SESSION_NAME = "ohos.security.atm_channel"; + +SoftBusManager::SoftBusManager() : isSoftBusServiceBindSuccess_(false), inited_(false), mutex_(), fulfillMutex_() +{ + ACCESSTOKEN_LOG_DEBUG(LABEL, "SoftBusManager()"); +} + +SoftBusManager::~SoftBusManager() +{ + ACCESSTOKEN_LOG_DEBUG(LABEL, "~SoftBusManager()"); +} + +SoftBusManager &SoftBusManager::GetInstance() +{ + static SoftBusManager instance; + return instance; +} + +int SoftBusManager::AddTrustedDeviceInfo() +{ + std::string packageName = TOKEN_SYNC_PACKAGE_NAME; + std::string extra = ""; + std::vector deviceList; + + int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetTrustedDeviceList(packageName, + extra, deviceList); + if (ret != Constant::SUCCESS) { + ACCESSTOKEN_LOG_ERROR(LABEL, "AddTrustedDeviceInfo: GetTrustedDeviceList error, result: %{public}d", ret); + return Constant::FAILURE; + } + + for (DistributedHardware::DmDeviceInfo device : deviceList) { + std::string uuid = GetUuidByNodeId(device.networkId); + std::string udid = GetUdidByNodeId(device.networkId); + if (uuid.empty() || udid.empty()) { + ACCESSTOKEN_LOG_ERROR(LABEL, "uuid = %{public}s, udid = %{public}s, uuid or udid is empty, abort.", + uuid.c_str(), CommonConstant::EncryptDevId(udid).c_str()); + continue; + } + + DeviceInfoManager::GetInstance().AddDeviceInfo(device.networkId, uuid, udid, device.deviceName, + std::to_string(device.deviceTypeId)); + RemoteCommandManager::GetInstance().NotifyDeviceOnline(udid); + } + + return Constant::SUCCESS; +} + +int SoftBusManager::DeviceInit() +{ + std::string packageName = TOKEN_SYNC_PACKAGE_NAME; + std::shared_ptr ptrDmInitCallback = std::make_shared(); + + int ret = DistributedHardware::DeviceManager::GetInstance().InitDeviceManager(packageName, ptrDmInitCallback); + if (ret != ERR_OK) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: InitDeviceManager error, result: %{public}d", ret); + return ret; + } + + ret = AddTrustedDeviceInfo(); + if (ret != ERR_OK) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: AddTrustedDeviceInfo error, result: %{public}d", ret); + return ret; + } + + std::string extra = ""; + std::shared_ptr ptrDeviceStateCallback = + std::make_shared(); + ret = DistributedHardware::DeviceManager::GetInstance().RegisterDevStateCallback(packageName, extra, + ptrDeviceStateCallback); + if (ret != ERR_OK) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: RegisterDevStateCallback error, result: %{public}d", ret); + return ret; + } + + return ERR_OK; +} + +int SoftBusManager::SessionInit() +{ + // register session listener + ISessionListener sessionListener; + sessionListener.OnSessionOpened = SoftBusSessionListener::OnSessionOpened; + sessionListener.OnSessionClosed = SoftBusSessionListener::OnSessionClosed; + sessionListener.OnBytesReceived = SoftBusSessionListener::OnBytesReceived; + sessionListener.OnMessageReceived = SoftBusSessionListener::OnMessageReceived; + + int ret = ::CreateSessionServer(TOKEN_SYNC_PACKAGE_NAME.c_str(), SESSION_NAME.c_str(), &sessionListener); + ACCESSTOKEN_LOG_INFO(LABEL, "Initialize: createSessionServer, result: %{public}d", ret); + // REASON_EXIST + if ((ret != Constant::SUCCESS) && (ret != REASON_EXIST)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Initialize: CreateSessionServer error, result: %{public}d", ret); + return ret; + } + + return ERR_OK; +} + +void SoftBusManager::Initialize() +{ + bool inited = false; + // cas failed means already inited. + if (!inited_.compare_exchange_strong(inited, true)) { + ACCESSTOKEN_LOG_DEBUG(LABEL, "already initialized, skip"); + return; + } + + std::function runner = [&]() { + auto sleepTime = std::chrono::milliseconds(1000); + while (1) { + std::unique_lock lock(mutex_); + + int ret = DeviceInit(); + if (ret != ERR_OK) { + std::this_thread::sleep_for(sleepTime); + continue; + } + + ret = SessionInit(); + if (ret != ERR_OK) { + std::this_thread::sleep_for(sleepTime); + continue; + } + + isSoftBusServiceBindSuccess_ = true; + this->FulfillLocalDeviceInfo(); + return; + } + }; + + std::thread initThread(runner); + initThread.detach(); + ACCESSTOKEN_LOG_DEBUG(LABEL, "Initialize thread started"); +} + +void SoftBusManager::Destroy() +{ + ACCESSTOKEN_LOG_DEBUG(LABEL, "destroy, init: %{public}d, isSoftBusServiceBindSuccess: %{public}d", inited_.load(), + isSoftBusServiceBindSuccess_); + + if (!inited_.load()) { + ACCESSTOKEN_LOG_DEBUG(LABEL, "not inited, skip"); + return; + } + + std::unique_lock lock(mutex_); + if (!inited_.load()) { + ACCESSTOKEN_LOG_DEBUG(LABEL, "not inited, skip"); + return; + } + + if (isSoftBusServiceBindSuccess_) { + int32_t ret = ::RemoveSessionServer(TOKEN_SYNC_PACKAGE_NAME.c_str(), SESSION_NAME.c_str()); + ACCESSTOKEN_LOG_DEBUG(LABEL, "destroy, RemoveSessionServer: %{public}d", ret); + isSoftBusServiceBindSuccess_ = false; + } + + std::string packageName = TOKEN_SYNC_PACKAGE_NAME; + int ret = DistributedHardware::DeviceManager::GetInstance().UnRegisterDevStateCallback(packageName); + if (ret != ERR_OK) { + ACCESSTOKEN_LOG_ERROR(LABEL, "UnRegisterDevStateCallback failed, code: %{public}d", ret); + } + ret = DistributedHardware::DeviceManager::GetInstance().UnInitDeviceManager(packageName); + if (ret != ERR_OK) { + ACCESSTOKEN_LOG_ERROR(LABEL, "UnInitDeviceManager failed, code: %{public}d", ret); + } + + inited_.store(false); + + ACCESSTOKEN_LOG_DEBUG(LABEL, "destroy, done"); +} + +int32_t SoftBusManager::OpenSession(const std::string &deviceId) +{ +#ifdef DEBUG_API_PERFORMANCE + ACCESSTOKEN_LOG_INFO(LABEL, "api_performance:start open session"); +#endif + + DeviceInfo info; + bool result = DeviceInfoManager::GetInstance().GetDeviceInfo(deviceId, DeviceIdType::UNKNOWN, info); + if (!result) { + ACCESSTOKEN_LOG_WARN(LABEL, "device info notfound for deviceId %{public}s", CommonConstant::EncryptDevId(deviceId).c_str()); + return Constant::FAILURE; + } + std::string networkId = info.deviceId.networkId; + ACCESSTOKEN_LOG_INFO(LABEL, "openSession, networkId: %{public}s", networkId.c_str()); + + // async open session, should waitting for OnSessionOpened event. + int sessionId = ::OpenSession(SESSION_NAME.c_str(), SESSION_NAME.c_str(), networkId.c_str(), + SESSION_GROUP_ID.c_str(), &SESSION_ATTR); + + ACCESSTOKEN_LOG_DEBUG(LABEL, "async open session"); + + // wait session opening + int retryTimes = 0; + int logSpan = 10; + auto sleepTime = std::chrono::milliseconds(OPENSESSION_RETRY_INTERVAL_MS); + while (retryTimes++ < OPENSESSION_RETRY_TIMES) { + if (SoftBusSessionListener::GetSessionState(sessionId) < 0) { + std::this_thread::sleep_for(sleepTime); + if (retryTimes % logSpan == 0) { + ACCESSTOKEN_LOG_INFO(LABEL, "openSession, waitting for: %{public}d ms", + retryTimes * OPENSESSION_RETRY_INTERVAL_MS); + } + continue; + } + break; + } +#ifdef DEBUG_API_PERFORMANCE + ACCESSTOKEN_LOG_INFO(LABEL, "api_performance:start open session success"); +#endif + int64_t state = SoftBusSessionListener::GetSessionState(sessionId); + if (state < 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "openSession, timeout, session: %{public}" PRId64, state); + return Constant::FAILURE; + } + + SoftBusSessionListener::DeleteSessionIdFromMap(sessionId); + + ACCESSTOKEN_LOG_DEBUG(LABEL, "openSession, succeed, session: %{public}" PRId64, state); + return sessionId; +} + +int SoftBusManager::CloseSession(int sessionId) +{ + if (sessionId < 0) { + ACCESSTOKEN_LOG_INFO(LABEL, "closeSession: session is invalid"); + return Constant::FAILURE; + } + + ::CloseSession(sessionId); + ACCESSTOKEN_LOG_INFO(LABEL, "closeSession "); + return Constant::SUCCESS; +} + +std::string SoftBusManager::GetUniversallyUniqueIdByNodeId(const std::string &nodeId) +{ + if (!DataValidator::IsDeviceIdValid(nodeId)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "invalid nodeId: %{public}s", nodeId.c_str()); + return ""; + } + + std::string uuid = GetUuidByNodeId(nodeId); + if (uuid.empty()) { + ACCESSTOKEN_LOG_ERROR(LABEL, "softbus return null or empty string [%{public}s]", uuid.c_str()); + return ""; + } + + DeviceInfo info; + bool result = DeviceInfoManager::GetInstance().GetDeviceInfo(uuid, DeviceIdType::UNIVERSALLY_UNIQUE_ID, info); + if (!result) { + ACCESSTOKEN_LOG_DEBUG(LABEL, "local device info not found for uuid %{public}s", uuid.c_str()); + } else { + std::string dimUuid = info.deviceId.universallyUniqueId; + if (uuid == dimUuid) { + // refresh cache + std::function fulfillDeviceInfo = std::bind(&SoftBusManager::FulfillLocalDeviceInfo, this); + std::thread fulfill(fulfillDeviceInfo); + fulfill.detach(); + } + } + + return uuid; +} + +std::string SoftBusManager::GetUniqueDeviceIdByNodeId(const std::string &nodeId) +{ + if (!DataValidator::IsDeviceIdValid(nodeId)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "invalid nodeId: %{public}s", nodeId.c_str()); + return ""; + } + std::string udid = GetUdidByNodeId(nodeId); + if (udid.empty()) { + ACCESSTOKEN_LOG_ERROR(LABEL, "softbus return null or empty string: %{public}s", CommonConstant::EncryptDevId(udid).c_str()); + return ""; + } + char localUdid[Constant::DEVICE_UUID_LENGTH] = {0}; + ::GetDevUdid(localUdid, Constant::DEVICE_UUID_LENGTH); + if (udid == localUdid) { + // refresh cache + std::function fulfillDeviceInfo = std::bind(&SoftBusManager::FulfillLocalDeviceInfo, this); + std::thread fulfill(fulfillDeviceInfo); + fulfill.detach(); + } + return udid; +} + +std::string SoftBusManager::GetUuidByNodeId(const std::string &nodeId) const +{ + uint8_t *info = new uint8_t[UDID_MAX_LENGTH + 1]; + if (info == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "no enough memory: %{public}d", UDID_MAX_LENGTH); + return ""; + } + (void)memset_s(info, UDID_MAX_LENGTH + 1, 0, UDID_MAX_LENGTH + 1); + int32_t ret = ::GetNodeKeyInfo(TOKEN_SYNC_PACKAGE_NAME.c_str(), nodeId.c_str(), + NodeDeviceInfoKey::NODE_KEY_UUID, info, UDID_MAX_LENGTH); + if (ret != Constant::SUCCESS) { + delete[] info; + ACCESSTOKEN_LOG_WARN(LABEL, "GetNodeKeyInfo error, return code: %{public}d", ret); + return ""; + } + std::string uuid(reinterpret_cast(info)); + delete[] info; + ACCESSTOKEN_LOG_DEBUG(LABEL, "call softbus finished. nodeId(in): %{public}s, uuid: %{public}s", nodeId.c_str(), + uuid.c_str()); + return uuid; +} + +std::string SoftBusManager::GetUdidByNodeId(const std::string &nodeId) const +{ + uint8_t *info = new uint8_t[UDID_MAX_LENGTH + 1]; + if (info == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "no enough memory: %{public}d", UDID_MAX_LENGTH); + return ""; + } + (void)memset_s(info, UDID_MAX_LENGTH + 1, 0, UDID_MAX_LENGTH + 1); + int32_t ret = ::GetNodeKeyInfo(TOKEN_SYNC_PACKAGE_NAME.c_str(), nodeId.c_str(), + NodeDeviceInfoKey::NODE_KEY_UDID, info, UDID_MAX_LENGTH); + if (ret != Constant::SUCCESS) { + delete[] info; + ACCESSTOKEN_LOG_WARN(LABEL, "GetNodeKeyInfo error, code: %{public}d", ret); + return ""; + } + std::string udid(reinterpret_cast(info)); + delete[] info; + ACCESSTOKEN_LOG_DEBUG(LABEL, "call softbus finished: nodeId(in): %{public}s", nodeId.c_str()); + return udid; +} + +int SoftBusManager::FulfillLocalDeviceInfo() +{ + // repeated task will just skip + if (!fulfillMutex_.try_lock()) { + ACCESSTOKEN_LOG_INFO(LABEL, "FulfillLocalDeviceInfo already running, skip."); + return Constant::SUCCESS; + } + + NodeBasicInfo info; + int32_t ret = ::GetLocalNodeDeviceInfo(TOKEN_SYNC_PACKAGE_NAME.c_str(), &info); + if (ret != Constant::SUCCESS) { + ACCESSTOKEN_LOG_ERROR(LABEL, "GetLocalNodeDeviceInfo error"); + fulfillMutex_.unlock(); + return Constant::FAILURE; + } + + ACCESSTOKEN_LOG_DEBUG(LABEL, "call softbus finished, networkId:%{public}s, name:%{public}s, type:%{public}d", + info.networkId, info.deviceName, info.deviceTypeId); + + std::string uuid = GetUuidByNodeId(info.networkId); + std::string udid = GetUdidByNodeId(info.networkId); + if (uuid.empty() || udid.empty()) { + ACCESSTOKEN_LOG_ERROR(LABEL, "FulfillLocalDeviceInfo: uuid or udid is empty, abort."); + fulfillMutex_.unlock(); + return Constant::FAILURE; + } + + DeviceInfoManager::GetInstance().AddDeviceInfo(info.networkId, uuid, udid, info.deviceName, + std::to_string(info.deviceTypeId)); + ACCESSTOKEN_LOG_DEBUG(LABEL, "AddDeviceInfo finished, networkId:%{public}s", + info.networkId); + + fulfillMutex_.unlock(); + return Constant::SUCCESS; +} +} // namespace AccessToken +} // namespace Security +} // namespace OHOS -- Gitee