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 "collector_manager.h"
16
17 #include "iservice_registry.h"
18 #include "security_collector_manager_proxy.h"
19 #include "security_collector_manager_callback_service.h"
20 #include "security_collector_define.h"
21 #include "security_collector_log.h"
22 #include "collector_service_loader.h"
23
24 namespace OHOS::Security::SecurityCollector {
Subscribe(const std::shared_ptr<ICollectorSubscriber> & subscriber)25 int32_t CollectorManager::Subscribe(const std::shared_ptr<ICollectorSubscriber> &subscriber)
26 {
27 LOGI("enter CollectorManager Subscribe");
28 if (subscriber == nullptr) {
29 LOGE("subscriber is null");
30 return BAD_PARAM;
31 }
32 std::lock_guard<std::mutex> lock(mutex_);
33 if (eventListeners_.find(subscriber) != eventListeners_.end()) {
34 LOGE("Already subscribed");
35 return BAD_PARAM;
36 }
37
38 auto object = CollectorServiceLoader::GetInstance().LoadCollectorService();
39 auto proxy = iface_cast<ISecurityCollectorManager>(object);
40 if (proxy == nullptr) {
41 LOGE("proxy is null");
42 return NULL_OBJECT;
43 }
44 if (deathRecipient_ == nullptr) {
45 deathRecipient_ = new (std::nothrow) DeathRecipient();
46 if (deathRecipient_ == nullptr) {
47 LOGE("deathRecipient_ is null");
48 return NULL_OBJECT;
49 }
50 }
51 if (!object->AddDeathRecipient(deathRecipient_)) {
52 LOGE("Failed to add death recipient");
53 return NULL_OBJECT;
54 }
55
56 sptr<SecurityCollectorManagerCallbackService> callback =
57 new (std::nothrow) SecurityCollectorManagerCallbackService(subscriber);
58 if (callback == nullptr) {
59 LOGE("callback is null");
60 return NULL_OBJECT;
61 }
62 int32_t ret = proxy->Subscribe(subscriber->GetSubscribeInfo(), callback);
63 if (ret == SUCCESS) {
64 eventListeners_[subscriber] = callback;
65 }
66 LOGI("Subscribe result, ret=%{public}d", ret);
67 return ret;
68 }
69
Unsubscribe(const std::shared_ptr<ICollectorSubscriber> & subscriber)70 int32_t CollectorManager::Unsubscribe(const std::shared_ptr<ICollectorSubscriber> &subscriber)
71 {
72 LOGI("enter CollectorManager Unsubscribe");
73 if (subscriber == nullptr) {
74 LOGE("subscriber is null");
75 return BAD_PARAM;
76 }
77
78 std::lock_guard<std::mutex> lock(mutex_);
79 if (eventListeners_.find(subscriber) == eventListeners_.end()) {
80 LOGE("Not subscribed");
81 return BAD_PARAM;
82 }
83 auto object = CollectorServiceLoader::GetInstance().LoadCollectorService();
84 auto proxy = iface_cast<ISecurityCollectorManager>(object);
85 if (proxy == nullptr) {
86 LOGE("Proxy is null");
87 return NULL_OBJECT;
88 }
89
90 int32_t ret = proxy->Unsubscribe(eventListeners_[subscriber]);
91 LOGI("Unsubscribe result, ret=%{public}d", ret);
92 eventListeners_.erase(subscriber);
93 return ret;
94 }
95
OnRemoteDied(const wptr<IRemoteObject> & remote)96 void CollectorManager::DeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
97 {
98 if (remote == nullptr) {
99 LOGE("remote object is nullptr");
100 return;
101 }
102 sptr<IRemoteObject> object = remote.promote();
103 if (object == nullptr) {
104 LOGE("object is nullptr");
105 return;
106 }
107 object->RemoveDeathRecipient(this);
108 CollectorManager::GetInstance().HandleDecipient();
109 }
110
HandleDecipient()111 void CollectorManager::HandleDecipient()
112 {
113 std::lock_guard<std::mutex> lock(mutex_);
114 eventListeners_.clear();
115 }
116
QuerySecurityEvent(const std::vector<SecurityEventRuler> rulers,std::vector<SecurityEvent> & events)117 int32_t CollectorManager::QuerySecurityEvent(const std::vector<SecurityEventRuler> rulers,
118 std::vector<SecurityEvent> &events)
119 {
120 LOGE("begin collector QuerySecurityEvent");
121 auto object = CollectorServiceLoader::GetInstance().LoadCollectorService();
122 auto proxy = iface_cast<ISecurityCollectorManager>(object);
123 if (proxy == nullptr) {
124 LOGE("proxy is null");
125 return NULL_OBJECT;
126 }
127
128 int32_t ret = proxy->QuerySecurityEvent(rulers, events);
129 if (ret != SUCCESS) {
130 LOGI("QuerySecurityEvent failed, ret=%{public}d", ret);
131 return ret;
132 }
133 LOGI("QuerySecurityEvent result, ret=%{public}d", ret);
134 return SUCCESS;
135 }
136
CollectorStart(const SecurityCollector::SecurityCollectorSubscribeInfo & subscriber)137 int32_t CollectorManager::CollectorStart(const SecurityCollector::SecurityCollectorSubscribeInfo &subscriber)
138 {
139 LOGI("enter CollectorManager CollectorStart");
140 auto object = CollectorServiceLoader::GetInstance().LoadCollectorService();
141 auto proxy = iface_cast<ISecurityCollectorManager>(object);
142 if (proxy == nullptr) {
143 LOGE("proxy is null");
144 return NULL_OBJECT;
145 }
146 sptr<SecurityCollector::SecurityCollectorManagerCallbackService> callback =
147 new (std::nothrow) SecurityCollector::SecurityCollectorManagerCallbackService(nullptr);
148 if (callback == nullptr) {
149 LOGE("callback is null");
150 return NULL_OBJECT;
151 }
152 int32_t ret = proxy->CollectorStart(subscriber, callback);
153 if (ret != SUCCESS) {
154 LOGI("CollectorStart failed, ret=%{public}d", ret);
155 return ret;
156 }
157 LOGI("CollectorStart result, ret=%{public}d", ret);
158 return SUCCESS;
159 }
160
CollectorStop(const SecurityCollector::SecurityCollectorSubscribeInfo & subscriber)161 int32_t CollectorManager::CollectorStop(const SecurityCollector::SecurityCollectorSubscribeInfo &subscriber)
162 {
163 LOGI("enter CollectorManager CollectorStart");
164 auto object = CollectorServiceLoader::GetInstance().LoadCollectorService();
165 auto proxy = iface_cast<ISecurityCollectorManager>(object);
166 if (proxy == nullptr) {
167 LOGE("proxy is null");
168 return NULL_OBJECT;
169 }
170 sptr<SecurityCollector::SecurityCollectorManagerCallbackService> callback =
171 new (std::nothrow) SecurityCollector::SecurityCollectorManagerCallbackService(nullptr);
172 if (callback == nullptr) {
173 LOGE("callback is null");
174 return NULL_OBJECT;
175 }
176 int32_t ret = proxy->CollectorStop(subscriber, callback);
177 if (ret != SUCCESS) {
178 LOGI("CollectorStop failed, ret=%{public}d", ret);
179 return ret;
180 }
181 LOGI("CollectorStop result, ret=%{public}d", ret);
182 return SUCCESS;
183 }
184
Mute(const SecurityCollectorEventFilter & subscribeMute,const std::string & callbackFlag)185 int32_t CollectorManager::Mute(const SecurityCollectorEventFilter &subscribeMute,
186 const std::string &callbackFlag)
187 {
188 LOGI("enter CollectorManager Mute");
189 auto object = CollectorServiceLoader::GetInstance().LoadCollectorService();
190 auto proxy = iface_cast<ISecurityCollectorManager>(object);
191 if (proxy == nullptr) {
192 LOGE("proxy is null");
193 return NULL_OBJECT;
194 }
195
196 int32_t ret = proxy->Mute(subscribeMute, callbackFlag);
197 if (ret != SUCCESS) {
198 LOGI("Mute failed, ret=%{public}d", ret);
199 return ret;
200 }
201 LOGI("Mute result, ret=%{public}d", ret);
202 return SUCCESS;
203 }
204
Unmute(const SecurityCollectorEventFilter & subscribeMute,const std::string & callbackFlag)205 int32_t CollectorManager::Unmute(const SecurityCollectorEventFilter &subscribeMute,
206 const std::string &callbackFlag)
207 {
208 LOGI("enter CollectorManager Unmute");
209 auto object = CollectorServiceLoader::GetInstance().LoadCollectorService();
210 auto proxy = iface_cast<ISecurityCollectorManager>(object);
211 if (proxy == nullptr) {
212 LOGE("proxy is null");
213 return NULL_OBJECT;
214 }
215
216 int32_t ret = proxy->Unmute(subscribeMute, callbackFlag);
217 if (ret != SUCCESS) {
218 LOGI("Unmute failed, ret=%{public}d", ret);
219 return ret;
220 }
221 LOGI("Unmute result, ret=%{public}d", ret);
222 return SUCCESS;
223 }
224 }