1 /*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <dlfcn.h>
17 #include <string>
18 #include <typeinfo>
19 #include "app_domain_verify_extension_mgr.h"
20 #include "app_domain_verify_hilog.h"
21 #include "app_domain_verify_extension_register.h"
22 #include "app_domain_verify_agent_ext.h"
23
24 namespace OHOS {
25 namespace AppDomainVerify {
26
27 #ifdef APP_USE_ARM64
28 const std::string EXTENSION_LIB_PATH = "/system/lib64/libapp_domain_verify_extension.z.so";
29 #elif defined(APP_USE_X86_64)
30 const std::string EXTENSION_LIB_PATH = "/system/lib64/libapp_domain_verify_extension.z.so";
31 #else
32 const std::string EXTENSION_LIB_PATH = "/system/lib/libapp_domain_verify_extension.z.so";
33 #endif
34
35 std::mutex AppDomainVerifyExtensionMgr::sHandlerMutex;
36 void* AppDomainVerifyExtensionMgr::sHandler = nullptr;
37
AppDomainVerifyExtensionMgr()38 AppDomainVerifyExtensionMgr::AppDomainVerifyExtensionMgr()
39 {
40 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MODULE_EXTENSION, "new instance create.");
41 }
42
~AppDomainVerifyExtensionMgr()43 AppDomainVerifyExtensionMgr::~AppDomainVerifyExtensionMgr()
44 {
45 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MODULE_EXTENSION, "instance dead.");
46 }
47
Init()48 bool AppDomainVerifyExtensionMgr::Init()
49 {
50 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MODULE_EXTENSION, "%{public}s called.", __func__);
51 std::lock_guard<std::mutex> lock(sHandlerMutex);
52 auto handle = &sHandler;
53 if (*handle == nullptr) {
54 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MODULE_EXTENSION, "dlopen extension lib");
55 *handle = OpenLib();
56 if (*handle == nullptr) {
57 APP_DOMAIN_VERIFY_HILOGW(APP_DOMAIN_VERIFY_MODULE_EXTENSION, "failed to open %{public}s, err:%{public}s",
58 EXTENSION_LIB_PATH.c_str(), dlerror());
59 return false;
60 }
61 }
62 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MODULE_EXTENSION, "%{public}s call end.", __func__);
63 return true;
64 }
65
CompleteVerifyRefresh(const BundleVerifyStatusInfo & bundleVerifyStatusInfo,TaskType type)66 ErrorCode AppDomainVerifyExtensionMgr::CompleteVerifyRefresh(
67 const BundleVerifyStatusInfo& bundleVerifyStatusInfo, TaskType type)
68 {
69 if (Init()) {
70 std::string verifierExtName = APP_DOMAIN_VERIFY_AGENT_EXT_NAME;
71 auto appDomainVerifierExt = GetAppDomainVerifyExt(verifierExtName);
72 if (appDomainVerifierExt == nullptr) {
73 APP_DOMAIN_VERIFY_HILOGW(
74 APP_DOMAIN_VERIFY_MODULE_EXTENSION, "get verifierExt: %{public}s failed.", verifierExtName.c_str());
75 return ErrorCode::E_EXTENSIONS_INTERNAL_ERROR;
76 }
77 return std::static_pointer_cast<AppDomainVerifyAgentExt>(appDomainVerifierExt)
78 ->CompleteVerifyRefresh(bundleVerifyStatusInfo, type);
79 }
80 return ErrorCode::E_EXTENSIONS_LIB_NOT_FOUND;
81 }
82
SingleVerify(const AppVerifyBaseInfo & appVerifyBaseInfo,const VerifyResultInfo & verifyResultInfo)83 ErrorCode AppDomainVerifyExtensionMgr::SingleVerify(
84 const AppVerifyBaseInfo& appVerifyBaseInfo, const VerifyResultInfo& verifyResultInfo)
85 {
86 if (Init()) {
87 std::string verifierExtName = APP_DOMAIN_VERIFY_AGENT_EXT_NAME;
88 auto appDomainVerifierExt = GetAppDomainVerifyExt(verifierExtName);
89 if (appDomainVerifierExt != nullptr) {
90 return std::static_pointer_cast<AppDomainVerifyAgentExt>(appDomainVerifierExt)
91 ->SingleVerify(appVerifyBaseInfo, verifyResultInfo);
92 }
93 APP_DOMAIN_VERIFY_HILOGE(
94 APP_DOMAIN_VERIFY_MODULE_EXTENSION, "get verifierExt: %{public}s failed.", verifierExtName.c_str());
95 return ErrorCode::E_EXTENSIONS_INTERNAL_ERROR;
96 }
97 return ErrorCode::E_EXTENSIONS_LIB_NOT_FOUND;
98 }
GetAppDomainVerifyExt(const std::string & extName)99 std::shared_ptr<AppDomainVerifyAgentExt> AppDomainVerifyExtensionMgr::GetAppDomainVerifyExt(const std::string& extName)
100 {
101 return AppDomainVerifyExtensionRegister::GetInstance().GetAppDomainVerifyExt(extName);
102 }
OpenLib()103 void* AppDomainVerifyExtensionMgr::OpenLib()
104 {
105 return dlopen(EXTENSION_LIB_PATH.c_str(), RTLD_NOW | RTLD_GLOBAL);
106 }
ConvertToExplicitWant(AAFwk::Want & implicitWant,sptr<IConvertCallback> & callback)107 ErrorCode AppDomainVerifyExtensionMgr::ConvertToExplicitWant(
108 AAFwk::Want& implicitWant, sptr<IConvertCallback>& callback)
109 {
110 if (Init()) {
111 std::string verifierExtName = APP_DOMAIN_VERIFY_AGENT_EXT_NAME;
112 auto appDomainVerifierExt = GetAppDomainVerifyExt(verifierExtName);
113 if (appDomainVerifierExt != nullptr) {
114 return std::static_pointer_cast<AppDomainVerifyAgentExt>(appDomainVerifierExt)
115 ->ConvertToExplicitWant(implicitWant, callback);
116 }
117 APP_DOMAIN_VERIFY_HILOGE(
118 APP_DOMAIN_VERIFY_MODULE_EXTENSION, "get verifierExt: %{public}s failed.", verifierExtName.c_str());
119 return ErrorCode::E_EXTENSIONS_INTERNAL_ERROR;
120 }
121 return ErrorCode::E_EXTENSIONS_LIB_NOT_FOUND;
122 }
UpdateWhiteList()123 ErrorCode AppDomainVerifyExtensionMgr::UpdateWhiteList()
124 {
125 if (Init()) {
126 std::string verifierExtName = APP_DOMAIN_VERIFY_AGENT_EXT_NAME;
127 auto appDomainVerifierExt = GetAppDomainVerifyExt(verifierExtName);
128 if (appDomainVerifierExt != nullptr) {
129 return std::static_pointer_cast<AppDomainVerifyAgentExt>(appDomainVerifierExt)
130 ->UpdateWhiteList();
131 }
132 APP_DOMAIN_VERIFY_HILOGE(
133 APP_DOMAIN_VERIFY_MODULE_EXTENSION, "get verifierExt: %{public}s failed.", verifierExtName.c_str());
134 return ErrorCode::E_EXTENSIONS_INTERNAL_ERROR;
135 }
136 return ErrorCode::E_EXTENSIONS_LIB_NOT_FOUND;
137 }
138 }
139 }