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 #include "app_domain_verify_hilog.h"
16 #include "if_system_ability_manager.h"
17 #include "iservice_registry.h"
18 #include "system_ability_definition.h"
19 #include "app_domain_verify_agent_client.h"
20 #include "app_domain_verify_hisysevent.h"
21
22 namespace OHOS {
23 namespace AppDomainVerify {
24 constexpr int32_t LOADSA_TIMEOUT_MS = 10000;
25 sptr<IAppDomainVerifyAgentService> AppDomainVerifyAgentClient::agentServiceProxy_;
26 AppDomainVerifyAgentClient::StaticDestoryMonitor AppDomainVerifyAgentClient::staticDestoryMonitor_;
27 std::mutex AppDomainVerifyAgentClient::proxyLock_;
28
AppDomainVerifyAgentClient()29 AppDomainVerifyAgentClient::AppDomainVerifyAgentClient()
30 {
31 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "new instance created.");
32 }
33
~AppDomainVerifyAgentClient()34 AppDomainVerifyAgentClient::~AppDomainVerifyAgentClient()
35 {
36 std::lock_guard<std::mutex> autoLock(proxyLock_);
37 if (agentServiceProxy_ != nullptr && !staticDestoryMonitor_.IsDestoryed()) {
38 auto remoteObject = agentServiceProxy_->AsObject();
39 if (remoteObject != nullptr) {
40 remoteObject->RemoveDeathRecipient(deathRecipient_);
41 }
42 }
43 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "instance dead.");
44 }
45
SingleVerify(const AppVerifyBaseInfo & appVerifyBaseInfo,const VerifyResultInfo & verifyResultInfo)46 void AppDomainVerifyAgentClient::SingleVerify(const AppVerifyBaseInfo &appVerifyBaseInfo,
47 const VerifyResultInfo &verifyResultInfo)
48 {
49 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "called");
50 std::lock_guard<std::mutex> autoLock(proxyLock_);
51 if (IsServiceAvailable()) {
52 agentServiceProxy_->SingleVerify(appVerifyBaseInfo, verifyResultInfo);
53 }
54 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "call end");
55 }
56
IsServiceAvailable()57 bool AppDomainVerifyAgentClient::IsServiceAvailable()
58 {
59 if (agentServiceProxy_ == nullptr) {
60 APP_DOMAIN_VERIFY_HILOGW(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "Redo ConnectService");
61 ConnectService();
62 }
63 if (agentServiceProxy_ == nullptr) {
64 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "Service proxy null.");
65 UNIVERSAL_ERROR_EVENT(CONNECT_AGENT_FAULT);
66 return false;
67 }
68 return true;
69 }
70
ConnectService()71 void AppDomainVerifyAgentClient::ConnectService()
72 {
73 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "ConnectService start.");
74 sptr<ISystemAbilityManager> samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
75 if (samgrProxy == nullptr) {
76 APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "GetDeferredLink SystemAbilityManager failed.");
77 agentServiceProxy_ = nullptr;
78 return;
79 }
80 sptr<IRemoteObject> remoteObject = samgrProxy->CheckSystemAbility(APP_DOMAIN_VERIFY_AGENT_SA_ID);
81 if (remoteObject == nullptr) {
82 remoteObject = samgrProxy->LoadSystemAbility(APP_DOMAIN_VERIFY_AGENT_SA_ID, LOADSA_TIMEOUT_MS);
83 }
84 if (remoteObject != nullptr) {
85 APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "GetDeferredLink AgentServiceProxy succeed.");
86 if (deathRecipient_ == nullptr) {
87 deathRecipient_ = sptr<IRemoteObject::DeathRecipient>(new AgentSaDeathRecipient());
88 }
89 remoteObject->AddDeathRecipient(deathRecipient_);
90 agentServiceProxy_ = iface_cast<IAppDomainVerifyAgentService>(remoteObject);
91 return;
92 }
93 APP_DOMAIN_VERIFY_HILOGW(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "Getting AgentServiceProxy failed.");
94 }
95
OnRemoteSaDied(const wptr<IRemoteObject> & object)96 void AppDomainVerifyAgentClient::OnRemoteSaDied(const wptr<IRemoteObject> &object)
97 {
98 APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "OnRemoteSaDied.");
99 std::lock_guard<std::mutex> autoLock(proxyLock_);
100 if (agentServiceProxy_ != nullptr) {
101 auto remoteObj = agentServiceProxy_->AsObject();
102 if (remoteObj != nullptr) {
103 remoteObj->RemoveDeathRecipient(deathRecipient_);
104 }
105 }
106 agentServiceProxy_ = nullptr;
107 }
108
ConvertToExplicitWant(AAFwk::Want & implicitWant,sptr<IConvertCallback> & callback)109 void AppDomainVerifyAgentClient::ConvertToExplicitWant(AAFwk::Want& implicitWant, sptr<IConvertCallback>& callback)
110 {
111 APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_CLIENT, "called");
112 std::lock_guard<std::mutex> autoLock(proxyLock_);
113 if (IsServiceAvailable()) {
114 agentServiceProxy_->ConvertToExplicitWant(implicitWant, callback);
115 }
116 APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_CLIENT, "call end");
117 }
118
AgentSaDeathRecipient()119 AgentSaDeathRecipient::AgentSaDeathRecipient()
120 {
121 }
122
~AgentSaDeathRecipient()123 AgentSaDeathRecipient::~AgentSaDeathRecipient()
124 {
125 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT, "deathRecipient dead.");
126 }
127
OnRemoteDied(const wptr<IRemoteObject> & object)128 void AgentSaDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
129 {
130 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_AGENT_MODULE_CLIENT,
131 "AppDomainVerifyMgrSaDeathRecipient on remote systemAbility died.");
132 AppDomainVerifyAgentClient::GetInstance()->OnRemoteSaDied(object);
133 }
134 }
135 }