• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }