From 888dcda47dca75e7a85c1f8d03ed65d525ac899f Mon Sep 17 00:00:00 2001 From: libing23 Date: Sat, 22 Jan 2022 11:03:03 +0800 Subject: [PATCH] add token sync and native receptor Signed-off-by: libing23 --- BUILD.gn | 4 +- .../tokensync/include/i_tokensync_manager.h | 4 +- .../tokensync/include/tokensync_kit.h | 4 +- .../innerkits/tokensync/src/tokensync_kit.cpp | 4 +- .../src/tokensync_manager_client.cpp | 4 +- .../tokensync/src/tokensync_manager_client.h | 4 +- .../tokensync/src/tokensync_manager_proxy.cpp | 4 +- .../tokensync/src/tokensync_manager_proxy.h | 4 +- .../test/unittest/src/tokensync_kit_test.cpp | 2 +- .../test/unittest/src/tokensync_kit_test.h | 4 +- services/accesstokenmanager/BUILD.gn | 2 - .../cpp/include/token/native_token_receptor.h | 25 +- .../cpp/src/token/hap_token_info_inner.cpp | 2 +- .../cpp/src/token/native_token_info_inner.cpp | 2 +- .../cpp/src/token/native_token_receptor.cpp | 186 +++++--------- services/accesstokenmanager/test/BUILD.gn | 5 +- .../cpp/src/native_token_receptor_test.cpp | 232 ++++-------------- services/tokensyncmanager/BUILD.gn | 27 +- .../include/remote/soft_bus_manager.h | 75 ++++++ .../{main => }/sa_profile/3504.xml | 4 +- .../{main => }/sa_profile/BUILD.gn | 4 +- .../src/remote/soft_bus_manager.cpp | 215 ++++++++++++++++ .../service}/tokensync_manager_service.cpp | 11 +- .../service}/tokensync_manager_service.h | 4 +- .../service}/tokensync_manager_stub.cpp | 4 +- .../service}/tokensync_manager_stub.h | 4 +- services/tokensyncmanager/token_sync.cfg | 17 ++ services/tokensyncmanager/token_sync.rc | 22 ++ 28 files changed, 493 insertions(+), 386 deletions(-) create mode 100644 services/tokensyncmanager/include/remote/soft_bus_manager.h rename services/tokensyncmanager/{main => }/sa_profile/3504.xml (89%) rename services/tokensyncmanager/{main => }/sa_profile/BUILD.gn (96%) create mode 100644 services/tokensyncmanager/src/remote/soft_bus_manager.cpp rename services/tokensyncmanager/{main/cpp => src/service}/tokensync_manager_service.cpp (89%) rename services/tokensyncmanager/{main/cpp => src/service}/tokensync_manager_service.h (96%) rename services/tokensyncmanager/{main/cpp => src/service}/tokensync_manager_stub.cpp (97%) rename services/tokensyncmanager/{main/cpp => src/service}/tokensync_manager_stub.h (96%) create mode 100644 services/tokensyncmanager/token_sync.cfg create mode 100644 services/tokensyncmanager/token_sync.rc diff --git a/BUILD.gn b/BUILD.gn index 97c62f984..f88c0ba9d 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -30,8 +30,8 @@ group("tokensync_build_module") { if (is_standard_system) { deps = [ "//base/security/access_token/interfaces/innerkits/tokensync:libtokensync_sdk", - "//base/security/access_token/services/tokensyncmanager:tokensync_manager_service", - "//base/security/access_token/services/tokensyncmanager/main/sa_profile:tokensync_sa_profile_standard", + "//base/security/access_token/services/tokensyncmanager:token_sync_manager_service", + "//base/security/access_token/services/tokensyncmanager/sa_profile:tokensync_sa_profile_standard", ] } } diff --git a/frameworks/tokensync/include/i_tokensync_manager.h b/frameworks/tokensync/include/i_tokensync_manager.h index 9a2769ee3..4555102b9 100644 --- a/frameworks/tokensync/include/i_tokensync_manager.h +++ b/frameworks/tokensync/include/i_tokensync_manager.h @@ -23,7 +23,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { class ITokenSyncManager : public IRemoteBroker { public: static const int SA_ID_TOKENSYNC_MANAGER_SERVICE = 3504; @@ -36,7 +36,7 @@ public: VERIFY_PERMISSION = 0xff01, }; }; -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/interfaces/innerkits/tokensync/include/tokensync_kit.h b/interfaces/innerkits/tokensync/include/tokensync_kit.h index c39e1a64a..3ac9d29ee 100644 --- a/interfaces/innerkits/tokensync/include/tokensync_kit.h +++ b/interfaces/innerkits/tokensync/include/tokensync_kit.h @@ -21,12 +21,12 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { class TokenSyncKit { public: static int VerifyPermission(const std::string& bundleName, const std::string& permissionName, int userId); }; -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/interfaces/innerkits/tokensync/src/tokensync_kit.cpp b/interfaces/innerkits/tokensync/src/tokensync_kit.cpp index 02a462ffb..2fbaee384 100644 --- a/interfaces/innerkits/tokensync/src/tokensync_kit.cpp +++ b/interfaces/innerkits/tokensync/src/tokensync_kit.cpp @@ -23,7 +23,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { using namespace std; namespace { @@ -37,6 +37,6 @@ int TokenSyncKit::VerifyPermission(const string& bundleName, const string& permi bundleName.c_str(), permissionName.c_str(), userId); return TokenSyncManagerClient::GetInstance().VerifyPermission(bundleName, permissionName, userId); } -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/interfaces/innerkits/tokensync/src/tokensync_manager_client.cpp b/interfaces/innerkits/tokensync/src/tokensync_manager_client.cpp index 98f658bc6..b63d0ab49 100644 --- a/interfaces/innerkits/tokensync/src/tokensync_manager_client.cpp +++ b/interfaces/innerkits/tokensync/src/tokensync_manager_client.cpp @@ -21,7 +21,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { namespace { static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "TokenSyncManagerClient"}; } // namespace @@ -71,6 +71,6 @@ sptr TokenSyncManagerClient::GetProxy() const } return proxy; } -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/interfaces/innerkits/tokensync/src/tokensync_manager_client.h b/interfaces/innerkits/tokensync/src/tokensync_manager_client.h index 06445abc5..a44602772 100644 --- a/interfaces/innerkits/tokensync/src/tokensync_manager_client.h +++ b/interfaces/innerkits/tokensync/src/tokensync_manager_client.h @@ -24,7 +24,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { class TokenSyncManagerClient final { public: static TokenSyncManagerClient& GetInstance(); @@ -40,7 +40,7 @@ private: sptr GetProxy() const; }; -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS #endif // ACCESSTOKEN_MANAGER_CLIENT_H diff --git a/interfaces/innerkits/tokensync/src/tokensync_manager_proxy.cpp b/interfaces/innerkits/tokensync/src/tokensync_manager_proxy.cpp index 4a0e9f830..f1988a60e 100644 --- a/interfaces/innerkits/tokensync/src/tokensync_manager_proxy.cpp +++ b/interfaces/innerkits/tokensync/src/tokensync_manager_proxy.cpp @@ -22,7 +22,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { namespace { static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "TokenSyncManagerProxy"}; } @@ -69,6 +69,6 @@ int TokenSyncManagerProxy::VerifyPermission( ACCESSTOKEN_LOG_DEBUG(LABEL, "%{public}s get result from server data = %{public}d", __func__, result); return result; } -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/interfaces/innerkits/tokensync/src/tokensync_manager_proxy.h b/interfaces/innerkits/tokensync/src/tokensync_manager_proxy.h index fc0dbc10d..c92e8be00 100644 --- a/interfaces/innerkits/tokensync/src/tokensync_manager_proxy.h +++ b/interfaces/innerkits/tokensync/src/tokensync_manager_proxy.h @@ -24,7 +24,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { class TokenSyncManagerProxy : public IRemoteProxy { public: explicit TokenSyncManagerProxy(const sptr& impl); @@ -35,7 +35,7 @@ public: private: static inline BrokerDelegator delegator_; }; -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS #endif // TOKENSYNC_MANAGER_PROXY_H diff --git a/interfaces/innerkits/tokensync/test/unittest/src/tokensync_kit_test.cpp b/interfaces/innerkits/tokensync/test/unittest/src/tokensync_kit_test.cpp index 800becd14..52b2489d3 100644 --- a/interfaces/innerkits/tokensync/test/unittest/src/tokensync_kit_test.cpp +++ b/interfaces/innerkits/tokensync/test/unittest/src/tokensync_kit_test.cpp @@ -18,7 +18,7 @@ #include "tokensync_kit.h" using namespace testing::ext; -using namespace OHOS::Security::TokenSync; +using namespace OHOS::Security::AccessToken; void TokenSyncKitTest::SetUpTestCase() {} diff --git a/interfaces/innerkits/tokensync/test/unittest/src/tokensync_kit_test.h b/interfaces/innerkits/tokensync/test/unittest/src/tokensync_kit_test.h index 4202bcd9b..1cb07f236 100644 --- a/interfaces/innerkits/tokensync/test/unittest/src/tokensync_kit_test.h +++ b/interfaces/innerkits/tokensync/test/unittest/src/tokensync_kit_test.h @@ -20,7 +20,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { class TokenSyncKitTest : public testing::Test { public: static void SetUpTestCase(); @@ -31,7 +31,7 @@ public: void TearDown(); }; -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS #endif // TOKENSYNC_KIT_TEST_H diff --git a/services/accesstokenmanager/BUILD.gn b/services/accesstokenmanager/BUILD.gn index fc866172a..a77a08994 100644 --- a/services/accesstokenmanager/BUILD.gn +++ b/services/accesstokenmanager/BUILD.gn @@ -34,7 +34,6 @@ ohos_shared_library("accesstoken_manager_service") { "//base/security/access_token/frameworks/accesstoken/include", "//base/security/access_token/interfaces/innerkits/accesstoken/include", "//third_party/json/include", - "//base/startup/syspara_lite/interfaces/innerkits/native/syspara/include/", ] sources = [ @@ -66,7 +65,6 @@ ohos_shared_library("accesstoken_manager_service") { "//base/security/access_token/frameworks/accesstoken:accesstoken_communication_adapter_cxx", "//base/security/access_token/frameworks/common:accesstoken_common_cxx", "//base/security/access_token/services/accesstokenmanager:access_token.rc", - "//base/startup/syspara_lite/interfaces/innerkits/native/syspara:syspara", "//third_party/sqlite:sqlite", "//utils/native/base:utils", ] diff --git a/services/accesstokenmanager/main/cpp/include/token/native_token_receptor.h b/services/accesstokenmanager/main/cpp/include/token/native_token_receptor.h index 2d3e6de45..491d09dc0 100644 --- a/services/accesstokenmanager/main/cpp/include/token/native_token_receptor.h +++ b/services/accesstokenmanager/main/cpp/include/token/native_token_receptor.h @@ -18,52 +18,37 @@ #include #include -#include -#include #include "access_token.h" #include "nlohmann/json.hpp" #include "native_token_info_inner.h" #include "nocopyable.h" -#include "parameter.h" namespace OHOS { namespace Security { namespace AccessToken { -const std::string JSON_KEY_NATIVE_TOKEN_INFO_JSON = "NativeTokenInfo"; -const std::string SOCKET_FILE = "/data/system/token_unix_socket.socket"; -constexpr int MAX_RECEPTOR_SIZE = 1024; -const std::string SYSTEM_PROP_NATIVE_RECEPTOR = "rw.nativetoken.receptor.startup"; +const std::string NATIVE_TOKEN_CONFIG_FILE = "/data/system/access_token/nativetoken.json"; +constexpr int MAX_NATIVE_CONFIG_FILE_SIZE = 5 * 1024 * 1024; // 5M +constexpr size_t BUFFER_SIZE = 1024; class NativeTokenReceptor final { public: static NativeTokenReceptor& GetInstance(); virtual ~NativeTokenReceptor() = default; int Init(); - void Release(); - void LoopHandler(); - static void ThreadFunc(NativeTokenReceptor *receptor); private: - NativeTokenReceptor() : receptorThread_(nullptr), listenSocket_(-1), - connectSocket_(-1), ready_(false), socketPath_(SOCKET_FILE) {}; + NativeTokenReceptor() : ready_(false) {}; DISALLOW_COPY_AND_MOVE(NativeTokenReceptor); - + int ReadCfgFile(std::string &nativeRawData); void FromJson(const nlohmann::json &jsonObject, std::vector>& tokenInfos); void ParserNativeRawData(const std::string& nativeRawData, std::vector>& tokenInfos); - int InitNativeTokenSocket(); void from_json(const nlohmann::json& j, NativeTokenInfo& p); - std::unique_ptr receptorThread_; - std::mutex receptorThreadMutex_; - int listenSocket_; - int connectSocket_; bool ready_; - std::string socketPath_; }; } // namespace AccessToken } // namespace Security } // namespace OHOS #endif // ACCESSTOKEN_NATIVE_TOKEN_RECEPTOR_H - diff --git a/services/accesstokenmanager/main/cpp/src/token/hap_token_info_inner.cpp b/services/accesstokenmanager/main/cpp/src/token/hap_token_info_inner.cpp index 34dd4f0c9..d603a133b 100644 --- a/services/accesstokenmanager/main/cpp/src/token/hap_token_info_inner.cpp +++ b/services/accesstokenmanager/main/cpp/src/token/hap_token_info_inner.cpp @@ -118,7 +118,7 @@ int HapTokenInfoInner::RestoreHapTokenBasicInfo(const GenericValues& inGenericVa "%{public}s called, tokenID: 0x%{public}x apl is error, value %{public}d", __func__, tokenID_, aplNum); return RET_FAILED; } - ver_ = inGenericValues.GetInt(FIELD_TOKEN_VERSION); + ver_ = (char)inGenericValues.GetInt(FIELD_TOKEN_VERSION); if (ver_ != DEFAULT_TOKEN_VERSION) { ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s called, tokenID: 0x%{public}x version is error, version %{public}d", __func__, tokenID_, ver_); diff --git a/services/accesstokenmanager/main/cpp/src/token/native_token_info_inner.cpp b/services/accesstokenmanager/main/cpp/src/token/native_token_info_inner.cpp index 62a4e8cac..ccdc9b415 100644 --- a/services/accesstokenmanager/main/cpp/src/token/native_token_info_inner.cpp +++ b/services/accesstokenmanager/main/cpp/src/token/native_token_info_inner.cpp @@ -101,7 +101,7 @@ int NativeTokenInfoInner::RestoreNativeTokenInfo(AccessTokenID tokenId, const Ge return RET_FAILED; } apl_ = (ATokenAplEnum)aplNum; - ver_ = inGenericValues.GetInt(FIELD_TOKEN_VERSION); + ver_ = (char)inGenericValues.GetInt(FIELD_TOKEN_VERSION); if (ver_ != DEFAULT_TOKEN_VERSION) { ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s called, tokenID: 0x%{public}x version is error, version %{public}d", __func__, tokenID_, ver_); diff --git a/services/accesstokenmanager/main/cpp/src/token/native_token_receptor.cpp b/services/accesstokenmanager/main/cpp/src/token/native_token_receptor.cpp index 63b66da54..8bb01fd82 100644 --- a/services/accesstokenmanager/main/cpp/src/token/native_token_receptor.cpp +++ b/services/accesstokenmanager/main/cpp/src/token/native_token_receptor.cpp @@ -12,12 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -#include +#include #include -#include +#include #include -#include #include #include "accesstoken_id_manager.h" @@ -25,7 +23,6 @@ #include "accesstoken_log.h" #include "data_validator.h" #include "native_token_receptor.h" -#include "parameter.h" #include "securec.h" namespace OHOS { @@ -92,158 +89,85 @@ void from_json(const nlohmann::json& j, std::shared_ptr& p p = std::make_shared(native); } -int NativeTokenReceptor::Init() -{ - std::lock_guard lock(receptorThreadMutex_); - if (ready_) { - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: receptor thread is already running.", __func__); - return RET_SUCCESS; - } - if (receptorThread_ != nullptr && receptorThread_->joinable()) { - receptorThread_->join(); - } - - receptorThread_ = std::make_unique(NativeTokenReceptor::ThreadFunc, this); - if (receptorThread_ == nullptr) { - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: receptor thread is nullptr.", __func__); - return RET_FAILED; - } - ready_ = true; - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s: init ok.", __func__); - return RET_SUCCESS; -} - -void NativeTokenReceptor::Release() -{ - std::lock_guard lock(receptorThreadMutex_); - ready_ = false; - if (listenSocket_ >= 0) { - close(listenSocket_); - listenSocket_ = -1; - } - - if (connectSocket_ >= 0) { - close(connectSocket_); - connectSocket_ = -1; - } - - int ret = SetParameter(SYSTEM_PROP_NATIVE_RECEPTOR.c_str(), "false"); - if (ret != 0) { - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s: set parameter failed.", __func__); - return; - } - - ACCESSTOKEN_LOG_INFO(LABEL, "Release ok."); -} - -NativeTokenReceptor& NativeTokenReceptor::GetInstance() -{ - static NativeTokenReceptor instance; - return instance; -} - void NativeTokenReceptor::ParserNativeRawData(const std::string& nativeRawData, std::vector>& tokenInfos) { nlohmann::json jsonRes = nlohmann::json::parse(nativeRawData, nullptr, false); - if (jsonRes.find(JSON_KEY_NATIVE_TOKEN_INFO_JSON) != jsonRes.end()) { - auto nativeTokenVect = - jsonRes.at(JSON_KEY_NATIVE_TOKEN_INFO_JSON).get>>(); - for (auto& token : nativeTokenVect) { - if (token != nullptr) { - tokenInfos.emplace_back(token); - } + for (auto it = jsonRes.begin(); it != jsonRes.end(); it++) { + auto token = it->get>(); + if (token != nullptr) { + tokenInfos.emplace_back(token); } } } -int NativeTokenReceptor::InitNativeTokenSocket() +int NativeTokenReceptor::ReadCfgFile(std::string& nativeRawData) { - struct sockaddr_un addr; - (void)memset_s(&addr, sizeof(addr), 0, sizeof(addr)); - addr.sun_family = AF_UNIX; - if (memcpy_s(addr.sun_path, sizeof(addr.sun_path), socketPath_.c_str(), sizeof(addr.sun_path) - 1) != EOK) { - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: init socket path failed.", __func__); - return -1; + int32_t fd = open(NATIVE_TOKEN_CONFIG_FILE.c_str(), O_RDONLY); + if (fd < 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: open failed.", __func__); + return RET_FAILED; } + struct stat statBuffer; - unlink(socketPath_.c_str()); - listenSocket_ = socket(AF_UNIX, SOCK_STREAM, 0); - if (listenSocket_ < 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: init socket failed.", __func__); - return -1; + if (fstat(fd, &statBuffer) != 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: fstat failed.", __func__); + close(fd); + return RET_FAILED; } - socklen_t len = sizeof(struct sockaddr_un); - int ret = bind(listenSocket_, (struct sockaddr *)(&addr), len); - if (ret == -1) { - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: bind socket failed.", __func__); - close(listenSocket_); - listenSocket_ = -1; - return -1; + if (statBuffer.st_size == 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: config file size is invalid.", __func__); + close(fd); + return RET_FAILED; } - ret = listen(listenSocket_, 1); - if (ret < 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: listen socket failed.", __func__); - remove(socketPath_.c_str()); - close(listenSocket_); - listenSocket_ = -1; - return -1; + if (statBuffer.st_size > MAX_NATIVE_CONFIG_FILE_SIZE) { + ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: config file size is too large.", __func__); + close(fd); + return RET_FAILED; } - return 0; -} + nativeRawData.reserve(statBuffer.st_size); -void NativeTokenReceptor::LoopHandler() -{ - int ret = InitNativeTokenSocket(); - if (ret < 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: InitNativeTokenSocket failed.", __func__); - return; + char buff[BUFFER_SIZE] = { 0 }; + ssize_t readLen = 0; + while ((readLen = read(fd, buff, BUFFER_SIZE)) > 0) { + nativeRawData.append(buff, readLen); } + close(fd); - ret = SetParameter(SYSTEM_PROP_NATIVE_RECEPTOR.c_str(), "true"); - if (ret != 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: set parameter failed.", __func__); - return; + if (readLen == 0) { + return RET_SUCCESS; } + return RET_FAILED; +} - while (true) { - socklen_t len = sizeof(struct sockaddr_un); - struct sockaddr_un clientAddr; - int connectSocket_ = accept(listenSocket_, (struct sockaddr *)(&clientAddr), &len); - if (connectSocket_ < 0) { - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: accept fail errno %{public}d.", __func__, errno); - continue; - } - std::string nativeRawData; - char buff[MAX_RECEPTOR_SIZE + 1]; - while (true) { - int readLen = read(connectSocket_, buff, MAX_RECEPTOR_SIZE); - if (readLen <= 0) { - break; - } - buff[readLen] = '\0'; - nativeRawData.append(buff); - } - close(connectSocket_); - connectSocket_ = -1; +int NativeTokenReceptor::Init() +{ + if (ready_) { + ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: native token has been inited.", __func__); + return RET_SUCCESS; + } - std::vector> tokenInfos; - ParserNativeRawData(nativeRawData, tokenInfos); - AccessTokenInfoManager::GetInstance().ProcessNativeTokenInfos(tokenInfos); + std::string nativeRawData; + int ret = ReadCfgFile(nativeRawData); + if (ret != RET_SUCCESS) { + ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: readCfgFile failed.", __func__); + return RET_FAILED; } + std::vector> tokenInfos; + ParserNativeRawData(nativeRawData, tokenInfos); + AccessTokenInfoManager::GetInstance().ProcessNativeTokenInfos(tokenInfos); + + ready_ = true; + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s: init ok.", __func__); + return RET_SUCCESS; } -void NativeTokenReceptor::ThreadFunc(NativeTokenReceptor *receptor) +NativeTokenReceptor& NativeTokenReceptor::GetInstance() { - if (receptor != nullptr) { - ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s: start handler loop.", __func__); - receptor->LoopHandler(); - ACCESSTOKEN_LOG_ERROR(LABEL, "%{public}s: native token loop end, native token can not sync.", __func__); - receptor->Release(); - } + static NativeTokenReceptor instance; + return instance; } } // namespace AccessToken } // namespace Security } // namespace OHOS - diff --git a/services/accesstokenmanager/test/BUILD.gn b/services/accesstokenmanager/test/BUILD.gn index be37ead41..208ff66dd 100644 --- a/services/accesstokenmanager/test/BUILD.gn +++ b/services/accesstokenmanager/test/BUILD.gn @@ -28,8 +28,9 @@ ohos_unittest("libaccesstoken_manager_service_standard_test") { "//base/security/access_token/frameworks/common/include", "//base/security/access_token/frameworks/accesstoken/include", "//base/security/access_token/interfaces/innerkits/accesstoken/main/cpp/include", + "//base/security/access_token/interfaces/innerkits/nativetoken/include", "//third_party/json/include", - "//base/startup/syspara_lite/interfaces/innerkits/native/syspara/include/", + "//third_party/cJSON", ] sources = [ @@ -42,8 +43,8 @@ ohos_unittest("libaccesstoken_manager_service_standard_test") { deps = [ "//base/security/access_token/frameworks/accesstoken:accesstoken_communication_adapter_cxx", "//base/security/access_token/frameworks/common:accesstoken_common_cxx", + "//base/security/access_token/interfaces/innerkits/nativetoken:libnativetoken", "//base/security/access_token/services/accesstokenmanager/:accesstoken_manager_service", - "//base/startup/syspara_lite/interfaces/innerkits/native/syspara:syspara", "//third_party/googletest:gtest_main", "//utils/native/base:utils", ] diff --git a/services/accesstokenmanager/test/unittest/cpp/src/native_token_receptor_test.cpp b/services/accesstokenmanager/test/unittest/cpp/src/native_token_receptor_test.cpp index 226415ee1..c1602a659 100644 --- a/services/accesstokenmanager/test/unittest/cpp/src/native_token_receptor_test.cpp +++ b/services/accesstokenmanager/test/unittest/cpp/src/native_token_receptor_test.cpp @@ -30,6 +30,7 @@ #include "data_storage.h" #include "field_const.h" #define private public +#include "nativetoken_kit.h" #include "native_token_receptor.h" #undef private #include "securec.h" @@ -60,26 +61,6 @@ void NativeTokenReceptorTest::TearDown() ACCESSTOKEN_LOG_INFO(LABEL, "test down!"); } -/** - * @tc.name: Init001 - * @tc.desc: Verify socket init result. - * @tc.type: FUNC - * @tc.require: Issue Number - */ -HWTEST_F(NativeTokenReceptorTest, Init001, TestSize.Level1) -{ - NativeTokenReceptor::GetInstance().socketPath_ = "/data/system/token_unix_socket.test.socket"; - NativeTokenReceptor::GetInstance().Init(); - NativeTokenReceptor::GetInstance().receptorThread_->detach(); - ASSERT_LT(NativeTokenReceptor::GetInstance().listenSocket_, 0); - sleep(3); - char buffer[128] = {0}; - int ret = GetParameter(SYSTEM_PROP_NATIVE_RECEPTOR.c_str(), "false", buffer, 127); - GTEST_LOG_(INFO) << "ret " << ret << " buffer " << buffer; - ASSERT_EQ(ret, strlen("true")); - ASSERT_EQ(strcmp(buffer, "true"), 0); -} - /** * @tc.name: ParserNativeRawData001 * @tc.desc: Verify processing right native token json. @@ -89,11 +70,11 @@ HWTEST_F(NativeTokenReceptorTest, Init001, TestSize.Level1) HWTEST_F(NativeTokenReceptorTest, ParserNativeRawData001, TestSize.Level1) { ACCESSTOKEN_LOG_INFO(LABEL, "test ParserNativeRawData001!"); - std::string testStr = R"({"NativeTokenInfo":[)"\ + std::string testStr = R"([)"\ R"({"processName":"process6","APL":3,"version":1,"tokenId":685266937,"tokenAttr":0,)"\ R"("dcaps":["AT_CAP","ST_CAP"]},)"\ R"({"processName":"process5","APL":3,"version":1,"tokenId":678065606,"tokenAttr":0,)"\ - R"("dcaps":["AT_CAP","ST_CAP"]}]})"; + R"("dcaps":["AT_CAP","ST_CAP"]}])"; NativeTokenReceptor& receptor = NativeTokenReceptor::GetInstance(); std::vector> tokenInfos; @@ -125,7 +106,7 @@ HWTEST_F(NativeTokenReceptorTest, ParserNativeRawData001, TestSize.Level1) HWTEST_F(NativeTokenReceptorTest, ParserNativeRawData002, TestSize.Level1) { ACCESSTOKEN_LOG_INFO(LABEL, "test ParserNativeRawData002!"); - std::string testStr = R"({"NativeTokenInfo":[{"processName":""}]})"; + std::string testStr = R"([{"processName":""}])"; std::vector> tokenInfos; NativeTokenReceptor& receptor = NativeTokenReceptor::GetInstance(); @@ -133,23 +114,39 @@ HWTEST_F(NativeTokenReceptorTest, ParserNativeRawData002, TestSize.Level1) receptor.ParserNativeRawData(testStr, tokenInfos); ASSERT_EQ(0, tokenInfos.size()); - testStr = R"({"NativeTokenInfo":[{"processName":"", }]})"; + testStr = R"([{"processName":"", }])"; + receptor.ParserNativeRawData(testStr, tokenInfos); + ASSERT_EQ(0, tokenInfos.size()); + + testStr = R"([{"processName":"process6"}, {}])"; + receptor.ParserNativeRawData(testStr, tokenInfos); + ASSERT_EQ(0, tokenInfos.size()); + + testStr = R"([{"processName":""}, {"":"", ""}])"; + receptor.ParserNativeRawData(testStr, tokenInfos); + ASSERT_EQ(0, tokenInfos.size()); + + testStr = R"([{"processName":"process6", "tokenId":685266937, "APL":3, "version":new}])"; receptor.ParserNativeRawData(testStr, tokenInfos); ASSERT_EQ(0, tokenInfos.size()); - testStr = R"({"NativeTokenInfo":[{"processName":"process6"}, {}]})"; + testStr = R"([{"processName":"process6", "tokenId":685266937, "APL":7, "version":1}])"; receptor.ParserNativeRawData(testStr, tokenInfos); ASSERT_EQ(0, tokenInfos.size()); - testStr = R"({"NativeTokenInfo":[{"processName":""}, {"":"", ""}]})"; + testStr = R"({"NativeToken":[{"processName":"process6", "tokenId":685266937, "APL":7, "version":1}]})"; receptor.ParserNativeRawData(testStr, tokenInfos); ASSERT_EQ(0, tokenInfos.size()); - testStr = R"({"NativeTokenInfo":[{"processName":"process6", "tokenId":685266937, "APL":3, "version":new}]})"; + testStr = R"({"NativeToken":[{"processName":"process6", "tokenId":685266937, "APL":7, "version":1}])"; receptor.ParserNativeRawData(testStr, tokenInfos); ASSERT_EQ(0, tokenInfos.size()); - testStr = R"({"NativeTokenInfo":[{"processName":"process6", "tokenId":685266937, "APL":7, "version":1}]})"; + testStr = R"(["NativeToken":])"; + receptor.ParserNativeRawData(testStr, tokenInfos); + ASSERT_EQ(0, tokenInfos.size()); + + testStr = R"([)"; receptor.ParserNativeRawData(testStr, tokenInfos); ASSERT_EQ(0, tokenInfos.size()); } @@ -542,175 +539,34 @@ HWTEST_F(NativeTokenReceptorTest, ProcessNativeTokenInfos006, TestSize.Level1) ASSERT_EQ(ret, RET_SUCCESS); } -static int initClientSocket() -{ - struct sockaddr_un addr; - int fd = -1; - - /* set socket */ - fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd < 0) { - return -1; - } - (void)memset_s(&addr, sizeof(struct sockaddr_un), 0, sizeof(struct sockaddr_un)); - addr.sun_family = AF_UNIX; - if (strncpy_s(addr.sun_path, sizeof(addr.sun_path), - "/data/system/token_unix_socket.test.socket", sizeof(addr.sun_path) - 1) != EOK) { - close(fd); - return -1; - } - int ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr)); - if (ret != 0) { - close(fd); - return -1; - } - return fd; -} - -void LibatConcurrencyTask(const char* syncMesg) -{ - int fd = initClientSocket(); - if (fd <= 0) { - GTEST_LOG_(INFO) << "initClientSocket failed"; - return; - } - int writtenSize; - int len = strlen(syncMesg); - - writtenSize = write(fd, syncMesg, len); - ASSERT_EQ(writtenSize, len); - if (writtenSize != len) { - GTEST_LOG_(INFO) << "send mesg failed"; - } - close(fd); -} - -/** - * @tc.name: ClientConnect001 - * @tc.desc: client connect and send a nativetoken, and close - * @tc.type: FUNC - * @tc.require: - */ -HWTEST_F(NativeTokenReceptorTest, ClientConnect001, TestSize.Level1) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "test ClientConnect001!"); - // 672137216 = 0x28100000 - std::string testStr = R"({"NativeTokenInfo":[)"\ - R"({"processName":"process6","APL":3,"version":1,"tokenId":672137216,"tokenAttr":0,)"\ - R"("dcaps":["AT_CAP","ST_CAP"]}]})"; - - LibatConcurrencyTask(testStr.c_str()); - sleep(5); - - NativeTokenInfo findInfo; - int ret = AccessTokenInfoManager::GetInstance().GetNativeTokenInfo(672137216, findInfo); - ASSERT_EQ(ret, RET_SUCCESS); - ASSERT_EQ(findInfo.apl, 3); - ASSERT_EQ(findInfo.ver, 1); - ASSERT_EQ(findInfo.processName, "process6"); - ASSERT_EQ(findInfo.tokenID, 672137216); - ASSERT_EQ(findInfo.tokenAttr, 0); - std::vector dcap = {"AT_CAP", "ST_CAP"}; - ASSERT_EQ(findInfo.dcap, dcap); - - ret = AccessTokenInfoManager::GetInstance().RemoveNativeTokenInfo(672137216); - ASSERT_EQ(ret, RET_SUCCESS); -} - -/** - * @tc.name: ClientConnect002 - * @tc.desc: client connect and send two nativetokens at same time by two threads - * @tc.type: FUNC - * @tc.require: - */ -HWTEST_F(NativeTokenReceptorTest, ClientConnect002, TestSize.Level1) -{ - ACCESSTOKEN_LOG_INFO(LABEL, "test ClientConnect002!"); - std::string testStr1 = R"({"NativeTokenInfo":[)"\ - R"({"processName":"process6","APL":3,"version":1,"tokenId":672137216,"tokenAttr":0,)"\ - R"("dcaps":["AT_CAP","ST_CAP"]}]})"; - - std::string testStr2 = R"({"NativeTokenInfo":[)"\ - R"({"processName":"process7","APL":3,"version":1,"tokenId":672137217,"tokenAttr":0,)"\ - R"("dcaps":["AT_CAP","ST_CAP"]}]})"; - - std::thread threadClient1(LibatConcurrencyTask, testStr1.c_str()); - - std::thread threadClient2(LibatConcurrencyTask, testStr2.c_str()); - threadClient1.join(); - threadClient2.join(); - - sleep(5); - - NativeTokenInfo findInfo; - int ret = AccessTokenInfoManager::GetInstance().GetNativeTokenInfo(672137216, findInfo); - ASSERT_EQ(ret, RET_SUCCESS); - ASSERT_EQ(findInfo.apl, 3); - ASSERT_EQ(findInfo.ver, 1); - ASSERT_EQ(findInfo.processName, "process6"); - ASSERT_EQ(findInfo.tokenID, 672137216); - ASSERT_EQ(findInfo.tokenAttr, 0); - std::vector dcap = {"AT_CAP", "ST_CAP"}; - ASSERT_EQ(findInfo.dcap, dcap); - - ret = AccessTokenInfoManager::GetInstance().RemoveNativeTokenInfo(672137216); - ASSERT_EQ(ret, RET_SUCCESS); - - ret = AccessTokenInfoManager::GetInstance().GetNativeTokenInfo(672137217, findInfo); - ASSERT_EQ(ret, RET_SUCCESS); - ASSERT_EQ(findInfo.apl, 3); - ASSERT_EQ(findInfo.ver, 1); - ASSERT_EQ(findInfo.processName, "process7"); - ASSERT_EQ(findInfo.tokenID, 672137217); - ASSERT_EQ(findInfo.tokenAttr, 0); - ASSERT_EQ(findInfo.dcap, dcap); - - ret = AccessTokenInfoManager::GetInstance().RemoveNativeTokenInfo(672137217); - ASSERT_EQ(ret, RET_SUCCESS); -} - /** - * @tc.name: ClientConnect003 - * @tc.desc: client connect and send two nativetokens at one time + * @tc.name: init001 + * @tc.desc: test get native cfg * @tc.type: FUNC - * @tc.require: + * @tc.require: Issue Number */ -HWTEST_F(NativeTokenReceptorTest, ClientConnect003, TestSize.Level1) +HWTEST_F(NativeTokenReceptorTest, init001, TestSize.Level1) { - ACCESSTOKEN_LOG_INFO(LABEL, "test ClientConnect003!"); - std::string testStr = R"({"NativeTokenInfo":[)"\ - R"({"processName":"process6","APL":3,"version":1,"tokenId":672137216,"tokenAttr":0,)"\ - R"("dcaps":["AT_CAP","ST_CAP"]},)"\ - R"({"processName":"process7","APL":3,"version":1,"tokenId":672137217,"tokenAttr":0,)"\ - R"("dcaps":["AT_CAP","ST_CAP"]}]})"; + ACCESSTOKEN_LOG_INFO(LABEL, "test init001!"); + std::vector> tokenInfos; - LibatConcurrencyTask(testStr.c_str()); + const char **dcaps = (const char **)malloc(sizeof(char *) * 1); + dcaps[0] = "AT_CAP_01"; + int dcapNum = 1; + char processName[32]; + strcpy(processName, "native_token_test7"); + char apl[32]; + strcpy(apl, "system_core"); - sleep(5); + uint64_t tokenId = ::GetAccessTokenId(processName, dcaps, dcapNum, apl); + ASSERT_NE(tokenId, 0); + NativeTokenReceptor::GetInstance().Init(); NativeTokenInfo findInfo; - int ret = AccessTokenInfoManager::GetInstance().GetNativeTokenInfo(672137216, findInfo); - ASSERT_EQ(ret, RET_SUCCESS); - ASSERT_EQ(findInfo.apl, 3); - ASSERT_EQ(findInfo.ver, 1); - ASSERT_EQ(findInfo.processName, "process6"); - ASSERT_EQ(findInfo.tokenID, 672137216); - ASSERT_EQ(findInfo.tokenAttr, 0); - std::vector dcap = {"AT_CAP", "ST_CAP"}; - ASSERT_EQ(findInfo.dcap, dcap); - - ret = AccessTokenInfoManager::GetInstance().RemoveNativeTokenInfo(672137216); + int ret = AccessTokenInfoManager::GetInstance().GetNativeTokenInfo(tokenId, findInfo); ASSERT_EQ(ret, RET_SUCCESS); + ASSERT_EQ(findInfo.processName, processName); - ret = AccessTokenInfoManager::GetInstance().GetNativeTokenInfo(672137217, findInfo); - ASSERT_EQ(ret, RET_SUCCESS); - ASSERT_EQ(findInfo.apl, 3); - ASSERT_EQ(findInfo.ver, 1); - ASSERT_EQ(findInfo.processName, "process7"); - ASSERT_EQ(findInfo.tokenID, 672137217); - ASSERT_EQ(findInfo.tokenAttr, 0); - ASSERT_EQ(findInfo.dcap, dcap); - - ret = AccessTokenInfoManager::GetInstance().RemoveNativeTokenInfo(672137217); + ret = AccessTokenInfoManager::GetInstance().RemoveNativeTokenInfo(tokenId); ASSERT_EQ(ret, RET_SUCCESS); } diff --git a/services/tokensyncmanager/BUILD.gn b/services/tokensyncmanager/BUILD.gn index 375cba960..42ca7f73b 100644 --- a/services/tokensyncmanager/BUILD.gn +++ b/services/tokensyncmanager/BUILD.gn @@ -13,33 +13,44 @@ import("//build/ohos.gni") -ohos_shared_library("tokensync_manager_service") { +ohos_prebuilt_etc("token_sync.rc") { + source = "token_sync.cfg" + relative_install_dir = "init" + subsystem_name = "security" + part_name = "access_token" +} + +ohos_shared_library("token_sync_manager_service") { subsystem_name = "security" part_name = "access_token" include_dirs = [ - "include", + "include/service", + "include/remote", "//utils/system/safwk/native/include", "//base/security/access_token/frameworks/common/include", "//base/security/access_token/frameworks/tokensync/include", - #"//base/security/permission/interfaces/innerkits/permission_standard/permissionsdk/main/cpp/include/permission", + "//base/security/access_token/interfaces/innerkits/accesstoken/include", + "//foundation/communication/dsoftbus/interfaces/kits/transport", + "//foundation/communication/dsoftbus/interfaces/kits/common", + "//foundation/communication/dsoftbus/interfaces/kits/bus_center", ] sources = [ - "main/cpp/tokensync_manager_service.cpp", - "main/cpp/tokensync_manager_stub.cpp", + "src/remote/soft_bus_manager.cpp", + "src/service/tokensync_manager_service.cpp", + "src/service/tokensync_manager_stub.cpp", ] cflags_cc = [ "-DHILOG_ENABLE" ] deps = [ - #"//base/security/accesstoken/frameworks/accesstooken/permissioncommunicationadapter:permission_standard_communication_adapter_cxx", - #"//base/security/accesstoken/frameworks/accesstooken/common:permission_standard_infrastructure_cxx", - #"//third_party/sqlite:sqlite", + "//base/security/access_token/services/tokensyncmanager:token_sync.rc", "//utils/native/base:utils", ] external_deps = [ + "dsoftbus_standard:softbus_client", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", "safwk:system_ability_fwk", diff --git a/services/tokensyncmanager/include/remote/soft_bus_manager.h b/services/tokensyncmanager/include/remote/soft_bus_manager.h new file mode 100644 index 000000000..d7ab6e7e3 --- /dev/null +++ b/services/tokensyncmanager/include/remote/soft_bus_manager.h @@ -0,0 +1,75 @@ +/* + * 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 SOFT_BUS_MANAGER_H +#define SOFT_BUS_MANAGER_H + +#include +#include +#include +#include +#include +#include + +#include "accesstoken_log.h" +#include "rwlock.h" +#include "session.h" + +namespace OHOS { +namespace Security { +namespace AccessToken { +class SoftBusManager final { +public: + virtual ~SoftBusManager(); + static SoftBusManager &GetInstance(); + void Initialize(); + void Destroy(); + + static int OnSessionOpend(int sessionId, int result); + static void OnSessionClosed(int sessionId); + static void OnBytesReceived(int sessionId, const void *data, unsigned int dataLen); + static void OnMessageReceived(int sessionId, const void *data, unsigned int dataLen); + static void isSessionRespond(int sessionId); + + void InsertSessionRespondStatus(int sessionId); + bool IsSessionRespond(int sessionId); + int32_t SendRequest(); + bool IsSessionWaitingOpen(int sessionId); + bool IsSessionOpen(int sessionId); + void ModifySessionStatus(int sessionId); + void SetSessionWaitingOpen(int sessionId); + +public: + static const std::string SESSION_NAME; + +private: + SoftBusManager(); + + static const std::string ACCESS_TOKEN_PACKAGE_NAME; + + // soft bus session server opened flag + bool isSoftBusServiceBindSuccess_; + std::atomic_bool inited_; + + // init mutex + std::mutex mutex_; + + OHOS::Utils::RWLock sessIdLock_; + std::set sessOpenSet_; +}; +} // namespace AccessToken +} // namespace Security +} // namespace OHOS +#endif // SOFT_BUS_MANAGER_H diff --git a/services/tokensyncmanager/main/sa_profile/3504.xml b/services/tokensyncmanager/sa_profile/3504.xml similarity index 89% rename from services/tokensyncmanager/main/sa_profile/3504.xml rename to services/tokensyncmanager/sa_profile/3504.xml index 3348d7156..c8ea08efd 100644 --- a/services/tokensyncmanager/main/sa_profile/3504.xml +++ b/services/tokensyncmanager/sa_profile/3504.xml @@ -13,10 +13,10 @@ limitations under the License. --> - foundation + token_sync_service 3504 - libtoken_manager_service.z.so + libtoken_sync_manager_service.z.so true true 1 diff --git a/services/tokensyncmanager/main/sa_profile/BUILD.gn b/services/tokensyncmanager/sa_profile/BUILD.gn similarity index 96% rename from services/tokensyncmanager/main/sa_profile/BUILD.gn rename to services/tokensyncmanager/sa_profile/BUILD.gn index 40f038f5a..4491128f6 100644 --- a/services/tokensyncmanager/main/sa_profile/BUILD.gn +++ b/services/tokensyncmanager/sa_profile/BUILD.gn @@ -14,9 +14,7 @@ import("//build/ohos/sa_profile/sa_profile.gni") ohos_sa_profile("tokensync_sa_profile_standard") { - part_name = "token_sync" + part_name = "access_token" sources = [ "3504.xml" ] } - - diff --git a/services/tokensyncmanager/src/remote/soft_bus_manager.cpp b/services/tokensyncmanager/src/remote/soft_bus_manager.cpp new file mode 100644 index 000000000..c0d294b9e --- /dev/null +++ b/services/tokensyncmanager/src/remote/soft_bus_manager.cpp @@ -0,0 +1,215 @@ +/* + * 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 "accesstoken.h" +#include "softbus_bus_center.h" + +namespace OHOS { +namespace Security { +namespace AccessToken { +namespace { +static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "SoftBusManager"}; +} + +namespace { +static const SessionAttribute SESSION_ATTR = {.dataType = TYPE_BYTES}; + +static const int REASON_EXIST = -3; +static const int OPENSESSION_RETRY_TIMES = 100; +static const int OPENSESSION_RETRY_INTERVAL_MS = 100; +static const int CREAT_SERVER_RETRY_INTERVAL_MS = 1000; +} // namespace + +const std::string SoftBusManager::ACCESS_TOKEN_PACKAGE_NAME = "ohos.security.distributed_access_token"; +const std::string SoftBusManager::SESSION_NAME = "ohos.security.atm_channel"; + +SoftBusManager::SoftBusManager() : isSoftBusServiceBindSuccess_(false), inited_(false), mutex_() +{ + ACCESSTOKEN_LOG_INFO(LABEL, "SoftBusManager()"); +} + +SoftBusManager::~SoftBusManager() +{ + ACCESSTOKEN_LOG_INFO(LABEL, "~SoftBusManager()"); +} + +SoftBusManager &SoftBusManager::GetInstance() +{ + static SoftBusManager instance; + return instance; +} + +int SoftBusManager::OnSessionOpend(int sessionId, int result) +{ + if (result != 0) { + ACCESSTOKEN_LOG_INFO(LABEL, "session is open failed, result %{public}d", result); + return RET_FAILED; + } + SoftBusManager::GetInstance().ModifySessionStatus(sessionId); + ACCESSTOKEN_LOG_INFO(LABEL, "session is open"); + return 0; +} + +void SoftBusManager::OnSessionClosed(int sessionId) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "session is closed"); +} + +void SoftBusManager::OnBytesReceived(int sessionId, const void *data, unsigned int dataLen) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "session receive data."); +} + +void SoftBusManager::OnMessageReceived(int sessionId, const void *data, unsigned int dataLen) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "session receive message."); +} + +bool SoftBusManager::IsSessionOpen(int sessionId) +{ + Utils::UniqueReadGuard idGuard(this->sessIdLock_); + if (sessOpenSet_.count(sessionId) == 0) { + return true; + } + return false; +} + +void SoftBusManager::ModifySessionStatus(int sessionId) +{ + Utils::UniqueWriteGuard idGuard(this->sessIdLock_); + if (sessOpenSet_.count(sessionId) > 0) { + sessOpenSet_.erase(sessionId); + } +} + +void SoftBusManager::SetSessionWaitingOpen(int sessionId) +{ + Utils::UniqueWriteGuard idGuard(this->sessIdLock_); + sessOpenSet_.insert(sessionId); +} + +void SoftBusManager::Initialize() +{ + bool inited = false; + // cas failed means already inited. + if (!inited_.compare_exchange_strong(inited, true)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "already initialized, skip"); + return; + } + + while (1) { + std::unique_lock lock(mutex_); + // register session listener + ISessionListener sessionListener; + sessionListener.OnSessionOpened = SoftBusManager::OnSessionOpend; + sessionListener.OnSessionClosed = SoftBusManager::OnSessionClosed; + sessionListener.OnBytesReceived = SoftBusManager::OnBytesReceived; + sessionListener.OnMessageReceived = SoftBusManager::OnMessageReceived; + + int ret = ::CreateSessionServer(ACCESS_TOKEN_PACKAGE_NAME.c_str(), SESSION_NAME.c_str(), &sessionListener); + ACCESSTOKEN_LOG_INFO(LABEL, "Initialize: createSessionServer, result: %{public}d", ret); + // REASON_EXIST + if ((ret != 0) && (ret != REASON_EXIST)) { + auto sleepTime = std::chrono::milliseconds(CREAT_SERVER_RETRY_INTERVAL_MS); + std::this_thread::sleep_for(sleepTime); + continue; + } + isSoftBusServiceBindSuccess_ = true; + break; + } + + 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() == false) { + ACCESSTOKEN_LOG_ERROR(LABEL, "not inited, skip"); + return; + } + + std::unique_lock lock(mutex_); + if (inited_.load() == false) { + ACCESSTOKEN_LOG_ERROR(LABEL, "not inited, skip"); + return; + } + + if (isSoftBusServiceBindSuccess_) { + int32_t ret = ::RemoveSessionServer(ACCESS_TOKEN_PACKAGE_NAME.c_str(), SESSION_NAME.c_str()); + ACCESSTOKEN_LOG_ERROR(LABEL, "destroy, RemoveSessionServer: %{public}d", ret); + isSoftBusServiceBindSuccess_ = false; + } + + inited_.store(false); + + ACCESSTOKEN_LOG_DEBUG(LABEL, "destroy, done"); +} + +int32_t SoftBusManager::SendRequest() +{ + NodeBasicInfo *info = nullptr; + int32_t infoNum; + int ret = GetAllNodeDeviceInfo(ACCESS_TOKEN_PACKAGE_NAME.c_str(), &info, &infoNum); + if (ret != 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "can not get node device"); + return RET_FAILED; + } + + // async open session, should waitting for OnSessionOpened event. + int sessionId = ::OpenSession(SESSION_NAME.c_str(), SESSION_NAME.c_str(), info[0].networkId, + "0", &SESSION_ATTR); + if (sessionId < 0) { + ACCESSTOKEN_LOG_ERROR(LABEL, "open session failed"); + return RET_FAILED; + } + + SetSessionWaitingOpen(sessionId); + + // wait session opening + int retryTimes = 0; + int logSpan = 10; + auto sleepTime = std::chrono::milliseconds(OPENSESSION_RETRY_INTERVAL_MS); + bool isOpen = false; + while (retryTimes++ < OPENSESSION_RETRY_TIMES) { + if (!IsSessionOpen(sessionId)) { + 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; + } + isOpen = true; + break; + } + int cmd = 0; + ret = ::SendBytes(sessionId, &cmd, sizeof(int)); + if (ret != 0) { + ::CloseSession(sessionId); + ACCESSTOKEN_LOG_ERROR(LABEL, "send cmd failed ret = %{public}d", ret); + return RET_FAILED; + } + ::CloseSession(sessionId); + return RET_SUCCESS; +} +} // namespace AccessToken +} // namespace Security +} // namespace OHOS diff --git a/services/tokensyncmanager/main/cpp/tokensync_manager_service.cpp b/services/tokensyncmanager/src/service/tokensync_manager_service.cpp similarity index 89% rename from services/tokensyncmanager/main/cpp/tokensync_manager_service.cpp rename to services/tokensyncmanager/src/service/tokensync_manager_service.cpp index eda9f78cc..c471fa466 100644 --- a/services/tokensyncmanager/main/cpp/tokensync_manager_service.cpp +++ b/services/tokensyncmanager/src/service/tokensync_manager_service.cpp @@ -15,11 +15,13 @@ #include "tokensync_manager_service.h" +#include #include "accesstoken_log.h" +#include "soft_bus_manager.h" namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { namespace { static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "TokenSyncManagerService"}; } @@ -70,13 +72,16 @@ int TokenSyncManagerService::VerifyPermission( ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, packageName: %{public}s, permissionName: %{public}s, userId: %{public}d", __func__, bundleName.c_str(), permissionName.c_str(), userId); - return 0; + int ret = SoftBusManager::GetInstance().SendRequest(); + ACCESSTOKEN_LOG_INFO(LABEL, "%{public}s called, ret %{public}d", __func__, ret); + return ret; } bool TokenSyncManagerService::Initialize() const { + SoftBusManager::GetInstance().Initialize(); return true; } -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } diff --git a/services/tokensyncmanager/main/cpp/tokensync_manager_service.h b/services/tokensyncmanager/src/service/tokensync_manager_service.h similarity index 96% rename from services/tokensyncmanager/main/cpp/tokensync_manager_service.h rename to services/tokensyncmanager/src/service/tokensync_manager_service.h index 076609994..9af5026e9 100644 --- a/services/tokensyncmanager/main/cpp/tokensync_manager_service.h +++ b/services/tokensyncmanager/src/service/tokensync_manager_service.h @@ -26,7 +26,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { enum class ServiceRunningState { STATE_NOT_START, STATE_RUNNING }; class TokenSyncManagerService final : public SystemAbility, public TokenSyncManagerStub { DECLARE_DELAYED_SINGLETON(TokenSyncManagerService); @@ -43,7 +43,7 @@ private: ServiceRunningState state_; }; -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS #endif // TOKENSYNC_MANAGER_SERVICE_H diff --git a/services/tokensyncmanager/main/cpp/tokensync_manager_stub.cpp b/services/tokensyncmanager/src/service/tokensync_manager_stub.cpp similarity index 97% rename from services/tokensyncmanager/main/cpp/tokensync_manager_stub.cpp rename to services/tokensyncmanager/src/service/tokensync_manager_stub.cpp index 21c222bd6..f6a3506f8 100644 --- a/services/tokensyncmanager/main/cpp/tokensync_manager_stub.cpp +++ b/services/tokensyncmanager/src/service/tokensync_manager_stub.cpp @@ -22,7 +22,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { namespace { static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "TokenSyncManagerStub"}; } @@ -54,6 +54,6 @@ void TokenSyncManagerStub::VerifyPermissionInner(MessageParcel& data, MessagePar int result = this->VerifyPermission(bundleName, permissionName, userId); reply.WriteInt32(result); } -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/services/tokensyncmanager/main/cpp/tokensync_manager_stub.h b/services/tokensyncmanager/src/service/tokensync_manager_stub.h similarity index 96% rename from services/tokensyncmanager/main/cpp/tokensync_manager_stub.h rename to services/tokensyncmanager/src/service/tokensync_manager_stub.h index 991e3947f..a8d530d2e 100644 --- a/services/tokensyncmanager/main/cpp/tokensync_manager_stub.h +++ b/services/tokensyncmanager/src/service/tokensync_manager_stub.h @@ -23,7 +23,7 @@ namespace OHOS { namespace Security { -namespace TokenSync { +namespace AccessToken { class TokenSyncManagerStub : public IRemoteStub { public: TokenSyncManagerStub() = default; @@ -34,7 +34,7 @@ public: private: void VerifyPermissionInner(MessageParcel& data, MessageParcel& reply); }; -} // namespace TokenSync +} // namespace AccessToken } // namespace Security } // namespace OHOS #endif // TOKENSYNC_MANAGER_STUB_H diff --git a/services/tokensyncmanager/token_sync.cfg b/services/tokensyncmanager/token_sync.cfg new file mode 100644 index 000000000..e8e2f4782 --- /dev/null +++ b/services/tokensyncmanager/token_sync.cfg @@ -0,0 +1,17 @@ +{ + "jobs" : [{ + "name" : "late-fs", + "cmds" : [ + "start token_sync_service" + ] + } + ], + "services" : [{ + "name" : "token_sync_service", + "path" : ["/system/bin/sa_main", "/system/profile/token_sync_service.xml"], + "importance" : -20, + "uid" : "system", + "gid" : ["system"] + } + ] +} \ No newline at end of file diff --git a/services/tokensyncmanager/token_sync.rc b/services/tokensyncmanager/token_sync.rc new file mode 100644 index 000000000..804c898ad --- /dev/null +++ b/services/tokensyncmanager/token_sync.rc @@ -0,0 +1,22 @@ +# 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. + +on late-fs + start token_sync_service + +service token_sync_service /system/bin/sa_main /system/profile/token_sync_service.xml + class token_sync_service + priority -20 + user system + group system + seclabel u:r:token_sync_service:s0 -- Gitee