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 }