1 /*
2 * Copyright (c) 2022-2025 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 "static_subscriber_manager.h"
17
18 #include <fstream>
19 #include <mutex>
20 #include <set>
21
22 #include "ability_manager_helper.h"
23 #include "access_token_helper.h"
24 #include "bool_wrapper.h"
25 #include "bundle_manager_helper.h"
26 #include "ces_inner_error_code.h"
27 #include "common_event_constant.h"
28 #include "common_event_support.h"
29 #include "double_wrapper.h"
30 #include "event_log_wrapper.h"
31 #include "event_trace_wrapper.h"
32 #include "event_report.h"
33 #include "int_wrapper.h"
34 #include "ipc_skeleton.h"
35 #include "os_account_manager_helper.h"
36 #include "static_subscriber_data_manager.h"
37 #include "string_wrapper.h"
38 #include "parameters.h"
39
40 namespace OHOS {
41 namespace EventFwk {
42 namespace {
43 const std::string CONFIG_APPS = "apps";
44 constexpr static char JSON_KEY_COMMON_EVENTS[] = "commonEvents";
45 constexpr static char JSON_KEY_NAME[] = "name";
46 constexpr static char JSON_KEY_PERMISSION[] = "permission";
47 constexpr static char JSON_KEY_EVENTS[] = "events";
48 constexpr static const char* JSON_KEY_FILTER = "filter";
49 constexpr static const char* JSON_KEY_FILTER_EVENT = "event";
50 constexpr static const char* JSON_KEY_FILTER_CONDITIONS = "conditions";
51 constexpr static const char* JSON_KEY_FILTER_CONDITIONS_CODE = "code";
52 constexpr static const char* JSON_KEY_FILTER_CONDITIONS_DATA = "data";
53 constexpr static const char* JSON_KEY_FILTER_CONDITIONS_PARAMETERS = "parameters";
54 static int32_t g_bootDelayTime = OHOS::system::GetIntParameter("bootevent.boot.completed.delay", 0);
55 constexpr int32_t TIME_UNIT_SIZE = 1000;
56 }
57
StaticSubscriberManager()58 StaticSubscriberManager::StaticSubscriberManager() {}
59
~StaticSubscriberManager()60 StaticSubscriberManager::~StaticSubscriberManager() {}
61
InitAllowList()62 bool StaticSubscriberManager::InitAllowList()
63 {
64 EVENT_LOGD("enter");
65
66 std::vector<AppExecFwk::ApplicationInfo> appInfos {};
67 if (!DelayedSingleton<BundleManagerHelper>::GetInstance()
68 ->GetApplicationInfos(AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO, appInfos)) {
69 EVENT_LOGE_LIMIT("GetApplicationInfos failed");
70 return false;
71 }
72
73 for (auto const &appInfo : appInfos) {
74 std::vector<std::string> allowCommonEvents = appInfo.allowCommonEvent;
75 std::string bundleName = appInfo.bundleName;
76 for (auto e : allowCommonEvents) {
77 if (staticSubscribers_.find(bundleName) == staticSubscribers_.end()) {
78 std::set<std::string> s = {};
79 s.emplace(e);
80 StaticSubscriber subscriber = { .events = s};
81 staticSubscribers_.insert(std::make_pair(bundleName, subscriber));
82 } else {
83 staticSubscribers_[bundleName].events.emplace(e);
84 }
85 }
86 }
87
88 hasInitAllowList_ = true;
89 return true;
90 }
91
InitValidSubscribers()92 bool StaticSubscriberManager::InitValidSubscribers()
93 {
94 EVENT_LOGD("enter");
95
96 if (!validSubscribers_.empty()) {
97 validSubscribers_.clear();
98 }
99 if (!InitAllowList()) {
100 EVENT_LOGE("Failed to init AllowList");
101 return false;
102 }
103 std::set<std::string> bundleList;
104 DelayedSingleton<StaticSubscriberDataManager>::GetInstance()->
105 QueryStaticSubscriberStateData(disableEvents_, bundleList);
106
107 std::vector<AppExecFwk::ExtensionAbilityInfo> extensions;
108 // get all static subscriber type extensions
109 if (!DelayedSingleton<BundleManagerHelper>::GetInstance()->QueryExtensionInfos(extensions)) {
110 EVENT_LOGE("QueryExtensionInfos failed");
111 return false;
112 }
113 // filter legal extensions and add them to valid map
114 for (auto extension : extensions) {
115 if (staticSubscribers_.find(extension.bundleName) == staticSubscribers_.end()) {
116 EVENT_LOGI("StaticExtension exists, but allowCommonEvent not found, bundlename = %{public}s",
117 extension.bundleName.c_str());
118 continue;
119 }
120 EVENT_LOGI("StaticExtension exists, bundlename = %{public}s", extension.bundleName.c_str());
121 AddSubscriber(extension);
122 }
123
124 if (bundleList.empty()) {
125 hasInitValidSubscribers_ = true;
126 return true;
127 }
128 std::lock_guard<ffrt::mutex> lock(disableEventsMutex_);
129 if (!disableEvents_.empty()) {
130 disableEvents_.clear();
131 }
132 for (auto bundleName : bundleList) {
133 auto finder = staticSubscribers_.find(bundleName);
134 if (finder != staticSubscribers_.end()) {
135 std::vector<std::string> events;
136 for (auto &event : finder->second.events) {
137 events.emplace_back(event);
138 }
139 disableEvents_.emplace(bundleName, events);
140 }
141 }
142 DelayedSingleton<StaticSubscriberDataManager>::GetInstance()->UpdateStaticSubscriberState(disableEvents_);
143 hasInitValidSubscribers_ = true;
144 return true;
145 }
146
IsDisableEvent(const std::string & bundleName,const std::string & event)147 bool StaticSubscriberManager::IsDisableEvent(const std::string &bundleName, const std::string &event)
148 {
149 EVENT_LOGD("Called.");
150 std::lock_guard<ffrt::mutex> lock(disableEventsMutex_);
151 auto bundleIt = disableEvents_.find(bundleName);
152 if (bundleIt == disableEvents_.end()) {
153 return false;
154 }
155 auto eventIt = std::find(bundleIt->second.begin(), bundleIt->second.end(), event);
156 if (eventIt != bundleIt->second.end()) {
157 return true;
158 }
159 return false;
160 }
161
PublishCommonEventConnecAbility(const CommonEventData & data,const sptr<IRemoteObject> & service,const int32_t & userId,const std::string & bundleName,const std::string & abilityName)162 void StaticSubscriberManager::PublishCommonEventConnecAbility(const CommonEventData &data,
163 const sptr<IRemoteObject> &service, const int32_t &userId,
164 const std::string &bundleName, const std::string &abilityName)
165 {
166 AAFwk::Want want;
167 want.SetElementName(bundleName, abilityName);
168 EVENT_LOGD("Ready to connect to subscriber %{public}s in bundle %{public}s",
169 abilityName.c_str(), bundleName.c_str());
170 DelayedSingleton<AbilityManagerHelper>::GetInstance()->ConnectAbility(want, data, service, userId);
171 }
172
PublishCommonEventInner(const CommonEventData & data,const CommonEventPublishInfo & publishInfo,const Security::AccessToken::AccessTokenID & callerToken,const int32_t & userId,const sptr<IRemoteObject> & service,const std::string & bundleName)173 void StaticSubscriberManager::PublishCommonEventInner(const CommonEventData &data,
174 const CommonEventPublishInfo &publishInfo, const Security::AccessToken::AccessTokenID &callerToken,
175 const int32_t &userId, const sptr<IRemoteObject> &service, const std::string &bundleName)
176 {
177 auto targetSubscribers = validSubscribers_.find(data.GetWant().GetAction());
178 if (targetSubscribers == validSubscribers_.end()) {
179 return;
180 }
181 std::vector<StaticSubscriberInfo> bootStartHaps {};
182 for (auto subscriber : targetSubscribers->second) {
183 if (IsDisableEvent(subscriber.bundleName, targetSubscribers->first)) {
184 EVENT_LOGW("subscriber %{public}s is disable.", subscriber.bundleName.c_str());
185 SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
186 continue;
187 }
188 if (subscriber.userId < SUBSCRIBE_USER_SYSTEM_BEGIN) {
189 EVENT_LOGW("subscriber %{public}s userId is invalid, subscriber.userId = %{public}d",
190 subscriber.bundleName.c_str(), subscriber.userId);
191 SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
192 continue;
193 }
194 if ((subscriber.userId > SUBSCRIBE_USER_SYSTEM_END) && (userId != ALL_USER)
195 && (subscriber.userId != userId)) {
196 EVENT_LOGW("subscriber %{public}s userId is not match, subscriber.userId = %{public}d,"
197 "userId = %{public}d", subscriber.bundleName.c_str(), subscriber.userId, userId);
198 SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
199 continue;
200 }
201 if (!CheckSubscriberWhetherMatched(subscriber, publishInfo)) {
202 SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
203 continue;
204 }
205 if (!VerifyPublisherPermission(callerToken, subscriber.permission)) {
206 EVENT_LOGW("publisher does not have required permission %{public}s", subscriber.permission.c_str());
207 SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
208 continue;
209 }
210 if (!IsFilterParameters(subscriber, data)) {
211 EVENT_LOGW("subscriber filter parameters is not match, subscriber.bundleName = %{public}s",
212 subscriber.bundleName.c_str());
213 continue;
214 }
215 #ifdef WATCH_EVENT_BOOT_COMPLETED_DELAY
216 if (data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED) {
217 bootStartHaps.push_back(subscriber);
218 } else {
219 PublishCommonEventConnecAbility(data, service, subscriber.userId, subscriber.bundleName, subscriber.name);
220 EVENT_LOGI("ConnectAbility %{public}s end, Subscriber = %{public}s",
221 data.GetWant().GetAction().c_str(), subscriber.bundleName.c_str());
222 }
223 #else
224 PublishCommonEventConnecAbility(data, service, subscriber.userId, subscriber.bundleName, subscriber.name);
225 EVENT_LOGI("ConnectAbility %{public}s end, Subscriber = %{public}s", data.GetWant().GetAction().c_str(),
226 subscriber.bundleName.c_str());
227 #endif
228 }
229 #ifdef WATCH_EVENT_BOOT_COMPLETED_DELAY
230 if (!bootStartHaps.empty()) {
231 if (!ffrt_) {
232 EVENT_LOGD("ready to create ffrt");
233 ffrt_ = std::make_shared<ffrt::queue>("StaticSubscriberManager");
234 }
235
236 std::function<void()> task = [bootStartHaps, data, service]() {
237 for (auto subscriber : bootStartHaps) {
238 StaticSubscriberManager::GetInstance()->PublishCommonEventConnecAbility(data, service,
239 subscriber.userId, subscriber.bundleName, subscriber.name);
240 EVENT_LOGI("ConnectAbility %{public}s end, Subscriber = %{public}s",
241 data.GetWant().GetAction().c_str(), subscriber.bundleName.c_str());
242 }
243 };
244 ffrt_->submit(task, ffrt::task_attr().delay(g_bootDelayTime * TIME_UNIT_SIZE));
245 }
246 #endif
247 }
248
CheckSubscriberBySpecifiedUids(const int32_t & subscriberUid,const std::vector<int32_t> & specifiedSubscriberUids)249 bool StaticSubscriberManager::CheckSubscriberBySpecifiedUids(
250 const int32_t &subscriberUid, const std::vector<int32_t> &specifiedSubscriberUids)
251 {
252 for (auto it = specifiedSubscriberUids.begin(); it != specifiedSubscriberUids.end(); ++it) {
253 if (*it == subscriberUid) {
254 return true;
255 }
256 }
257 return false;
258 }
259
CheckSubscriberWhetherMatched(const StaticSubscriberInfo & subscriber,const CommonEventPublishInfo & publishInfo)260 bool StaticSubscriberManager::CheckSubscriberWhetherMatched(
261 const StaticSubscriberInfo &subscriber, const CommonEventPublishInfo &publishInfo)
262 {
263 auto specifiedSubscriberUids = publishInfo.GetSubscriberUid();
264 auto specifiedSubscriberType = publishInfo.GetSubscriberType();
265 uint16_t filterSettings = publishInfo.GetFilterSettings();
266 if (filterSettings == 0) {
267 return true;
268 }
269 uint16_t checkResult = 0;
270 if (!publishInfo.GetBundleName().empty() &&
271 publishInfo.GetBundleName() == subscriber.bundleName) {
272 checkResult |= SUBSCRIBER_FILTER_BUNDLE_INDEX;
273 }
274 auto isSystemApp = DelayedSingleton<BundleManagerHelper>::GetInstance()->
275 CheckIsSystemAppByBundleName(subscriber.bundleName, subscriber.userId);
276 bool isTypeMatched = specifiedSubscriberType == static_cast<int32_t>(SubscriberType::ALL_SUBSCRIBER_TYPE) ||
277 (specifiedSubscriberType == static_cast<int32_t>(SubscriberType::SYSTEM_SUBSCRIBER_TYPE) && isSystemApp);
278 if (specifiedSubscriberType != UNINITIALIZATED_SUBSCRIBER_TYPE && isTypeMatched) {
279 checkResult |= SUBSCRIBER_FILTER_SUBSCRIBER_TYPE_INDEX;
280 }
281
282 auto subscriberUid = DelayedSingleton<BundleManagerHelper>::GetInstance()->
283 GetDefaultUidByBundleName(subscriber.bundleName, subscriber.userId);
284 if (!specifiedSubscriberUids.empty() &&
285 CheckSubscriberBySpecifiedUids(static_cast<int32_t>(subscriberUid), specifiedSubscriberUids)) {
286 checkResult |= SUBSCRIBER_FILTER_SUBSCRIBER_UID_INDEX;
287 }
288 std::vector<std::string> publisherRequiredPermissions = publishInfo.GetSubscriberPermissions();
289 if (!publisherRequiredPermissions.empty() &&
290 VerifySubscriberPermission(subscriber.bundleName, subscriber.userId, publisherRequiredPermissions)) {
291 checkResult |= SUBSCRIBER_FILTER_PERMISSION_INDEX;
292 }
293 bool result = false;
294 if (publishInfo.GetValidationRule() == ValidationRule::AND) {
295 result = (checkResult == filterSettings);
296 } else {
297 result = ((checkResult & filterSettings) != 0);
298 }
299 if (!result) {
300 EVENT_LOGW("%{public}s not matched,%{public}d_%{public}u_%{public}u", subscriber.bundleName.c_str(),
301 static_cast<int32_t>(publishInfo.GetValidationRule()),
302 static_cast<uint32_t>(checkResult), static_cast<uint32_t>(filterSettings));
303 }
304 return result;
305 }
306
PublishCommonEvent(const CommonEventData & data,const CommonEventPublishInfo & publishInfo,const Security::AccessToken::AccessTokenID & callerToken,const int32_t & userId,const sptr<IRemoteObject> & service,const std::string & bundleName)307 void StaticSubscriberManager::PublishCommonEvent(const CommonEventData &data,
308 const CommonEventPublishInfo &publishInfo, const Security::AccessToken::AccessTokenID &callerToken,
309 const int32_t &userId, const sptr<IRemoteObject> &service, const std::string &bundleName)
310 {
311 NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
312 EVENT_LOGD("enter, event = %{public}s, userId = %{public}d", data.GetWant().GetAction().c_str(), userId);
313
314 std::lock_guard<ffrt::mutex> lock(subscriberMutex_);
315 if ((!hasInitValidSubscribers_ ||
316 data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED ||
317 data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_LOCKED_BOOT_COMPLETED ||
318 data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_USER_FOREGROUND) &&
319 !InitValidSubscribers()) {
320 EVENT_LOGE("Failed to init subscribers");
321 return;
322 }
323
324 UpdateSubscriber(data);
325
326 PublishCommonEventInner(data, publishInfo, callerToken, userId, service, bundleName);
327 }
328
VerifyPublisherPermission(const Security::AccessToken::AccessTokenID & callerToken,const std::string & permission)329 bool StaticSubscriberManager::VerifyPublisherPermission(const Security::AccessToken::AccessTokenID &callerToken,
330 const std::string &permission)
331 {
332 EVENT_LOGD("enter");
333 if (permission.empty()) {
334 EVENT_LOGD("no need permission");
335 return true;
336 }
337 return AccessTokenHelper::VerifyAccessToken(callerToken, permission);
338 }
339
VerifySubscriberPermission(const std::string & bundleName,const int32_t & userId,const std::vector<std::string> & permissions)340 bool StaticSubscriberManager::VerifySubscriberPermission(const std::string &bundleName, const int32_t &userId,
341 const std::vector<std::string> &permissions)
342 {
343 // get hap tokenid with default instindex(0), this should be modified later.
344 Security::AccessToken::AccessTokenID tokenId = AccessTokenHelper::GetHapTokenID(userId, bundleName, 0);
345 for (auto permission : permissions) {
346 if (permission.empty()) {
347 continue;
348 }
349 if (!AccessTokenHelper::VerifyAccessToken(tokenId, permission)) {
350 EVENT_LOGW("subscriber does not have required permission : %{public}s", permission.c_str());
351 return false;
352 }
353 }
354 return true;
355 }
356
ParseEvents(const std::string & extensionName,const std::string & extensionBundleName,const int32_t & extensionUserId,const std::string & profile,bool enable)357 void StaticSubscriberManager::ParseEvents(const std::string &extensionName, const std::string &extensionBundleName,
358 const int32_t &extensionUserId, const std::string &profile, bool enable)
359 {
360 EVENT_LOGD("enter, subscriber name = %{public}s, bundle name = %{public}s, userId = %{public}d",
361 extensionName.c_str(), extensionBundleName.c_str(), extensionUserId);
362
363 if (profile.empty()) {
364 EVENT_LOGE("invalid profile");
365 return;
366 }
367 if (!nlohmann::json::accept(profile.c_str())) {
368 EVENT_LOGE("invalid format profile");
369 return;
370 }
371
372 nlohmann::json jsonObj = nlohmann::json::parse(profile, nullptr, false);
373 if (jsonObj.is_null() || jsonObj.empty() || !jsonObj.is_object()) {
374 EVENT_LOGE("invalid jsonObj");
375 return;
376 }
377 nlohmann::json commonEventsObj = jsonObj[JSON_KEY_COMMON_EVENTS];
378 if (commonEventsObj.is_null() || !commonEventsObj.is_array() || commonEventsObj.empty()) {
379 EVENT_LOGE("invalid common event obj size");
380 return;
381 }
382 for (auto commonEventObj : commonEventsObj) {
383 if (commonEventObj.is_null() || !commonEventObj.is_object()) {
384 EVENT_LOGW("invalid common event obj");
385 continue;
386 }
387 if (commonEventObj[JSON_KEY_NAME].is_null() || !commonEventObj[JSON_KEY_NAME].is_string()) {
388 EVENT_LOGW("invalid common event ability name obj");
389 continue;
390 }
391 if (commonEventObj[JSON_KEY_NAME].get<std::string>() != extensionName) {
392 EVENT_LOGW("extensionName is not match");
393 continue;
394 }
395 if (commonEventObj[JSON_KEY_PERMISSION].is_null() || !commonEventObj[JSON_KEY_PERMISSION].is_string()) {
396 EVENT_LOGW("invalid permission obj");
397 continue;
398 }
399 if (commonEventObj[JSON_KEY_EVENTS].is_null() || !commonEventObj[JSON_KEY_EVENTS].is_array() ||
400 commonEventObj[JSON_KEY_EVENTS].empty()) {
401 EVENT_LOGW("invalid events obj");
402 continue;
403 }
404
405 for (auto e : commonEventObj[JSON_KEY_EVENTS]) {
406 if (e.is_null() || !e.is_string() ||
407 (staticSubscribers_[extensionBundleName].events.find(e) ==
408 staticSubscribers_[extensionBundleName].events.end())) {
409 EVENT_LOGW("invalid event obj");
410 continue;
411 }
412 StaticSubscriberInfo subscriber = { .name = extensionName,
413 .bundleName = extensionBundleName,
414 .userId = extensionUserId,
415 .permission = commonEventObj[JSON_KEY_PERMISSION].get<std::string>()};
416 ParseFilterObject(commonEventObj[JSON_KEY_FILTER], e.get<std::string>(), subscriber);
417 AddToValidSubscribers(e.get<std::string>(), subscriber);
418 }
419 }
420 }
421
AddSubscriber(const AppExecFwk::ExtensionAbilityInfo & extension)422 void StaticSubscriberManager::AddSubscriber(const AppExecFwk::ExtensionAbilityInfo &extension)
423 {
424 EVENT_LOGD("enter, subscriber bundlename = %{public}s", extension.bundleName.c_str());
425
426 std::vector<std::string> profileInfos;
427 if (!DelayedSingleton<BundleManagerHelper>::GetInstance()->GetResConfigFile(extension, profileInfos)) {
428 EVENT_LOGE("GetProfile failed");
429 return;
430 }
431 for (auto profile : profileInfos) {
432 int32_t userId = -1;
433 if (DelayedSingleton<OsAccountManagerHelper>::GetInstance()->GetOsAccountLocalIdFromUid(
434 extension.applicationInfo.uid, userId) != ERR_OK) {
435 EVENT_LOGE("Get userId failed, uid = %{public}d", extension.applicationInfo.uid);
436 return;
437 }
438 ParseEvents(extension.name, extension.bundleName, userId, profile);
439 }
440 }
441
AddToValidSubscribers(const std::string & eventName,const StaticSubscriberInfo & subscriber)442 void StaticSubscriberManager::AddToValidSubscribers(const std::string &eventName,
443 const StaticSubscriberInfo &subscriber)
444 {
445 if (validSubscribers_.find(eventName) != validSubscribers_.end()) {
446 for (auto sub : validSubscribers_[eventName]) {
447 if ((sub.name == subscriber.name) &&
448 (sub.bundleName == subscriber.bundleName) &&
449 (sub.userId == subscriber.userId)) {
450 EVENT_LOGD("subscriber already exist, event = %{public}s, bundlename = %{public}s, name = %{public}s,"
451 "userId = %{public}d", eventName.c_str(), subscriber.bundleName.c_str(), subscriber.name.c_str(),
452 subscriber.userId);
453 return;
454 }
455 }
456 }
457 validSubscribers_[eventName].emplace_back(subscriber);
458 EVENT_LOGD("subscriber added, event = %{public}s, bundlename = %{public}s, name = %{public}s, userId = %{public}d",
459 eventName.c_str(), subscriber.bundleName.c_str(), subscriber.name.c_str(), subscriber.userId);
460 }
461
AddSubscriberWithBundleName(const std::string & bundleName,const int32_t & userId)462 void StaticSubscriberManager::AddSubscriberWithBundleName(const std::string &bundleName, const int32_t &userId)
463 {
464 EVENT_LOGD("enter, bundleName = %{public}s, userId = %{public}d", bundleName.c_str(), userId);
465
466 std::vector<AppExecFwk::ExtensionAbilityInfo> extensions;
467 if (!DelayedSingleton<BundleManagerHelper>::GetInstance()->QueryExtensionInfos(extensions, userId)) {
468 EVENT_LOGE("QueryExtensionInfos failed");
469 return;
470 }
471
472 for (auto extension : extensions) {
473 if ((extension.bundleName == bundleName) &&
474 staticSubscribers_.find(extension.bundleName) != staticSubscribers_.end()) {
475 AddSubscriber(extension);
476 }
477 }
478 }
479
RemoveSubscriberWithBundleName(const std::string & bundleName,const int32_t & userId)480 void StaticSubscriberManager::RemoveSubscriberWithBundleName(const std::string &bundleName, const int32_t &userId)
481 {
482 EVENT_LOGD("enter, bundleName = %{public}s, userId = %{public}d", bundleName.c_str(), userId);
483 std::lock_guard<ffrt::mutex> lock(disableEventsMutex_);
484 for (auto it = validSubscribers_.begin(); it != validSubscribers_.end();) {
485 auto subIt = it->second.begin();
486 while (subIt != it->second.end()) {
487 if ((subIt->bundleName == bundleName) && (subIt->userId == userId)) {
488 EVENT_LOGD("remove subscriber, event = %{public}s, bundlename = %{public}s, userId = %{public}d",
489 it->first.c_str(), bundleName.c_str(), userId);
490 subIt = it->second.erase(subIt);
491 } else {
492 subIt++;
493 }
494 }
495 if (it->second.empty()) {
496 validSubscribers_.erase(it++);
497 } else {
498 it++;
499 }
500 }
501
502 auto bundleIt = disableEvents_.find(bundleName);
503 if (bundleIt == disableEvents_.end()) {
504 EVENT_LOGD("Bundle name is not existed.");
505 return;
506 }
507 disableEvents_.erase(bundleIt);
508 auto result =
509 DelayedSingleton<StaticSubscriberDataManager>::GetInstance()->DeleteDisableEventElementByBundleName(bundleName);
510 if (result != ERR_OK) {
511 EVENT_LOGE("Remove disable event by bundle name failed.");
512 }
513 }
514
UpdateSubscriber(const CommonEventData & data)515 void StaticSubscriberManager::UpdateSubscriber(const CommonEventData &data)
516 {
517 NOTIFICATION_HITRACE(HITRACE_TAG_NOTIFICATION);
518 EVENT_LOGD("enter");
519
520 if ((data.GetWant().GetAction() != CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED) &&
521 (data.GetWant().GetAction() != CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED) &&
522 (data.GetWant().GetAction() != CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED)) {
523 EVENT_LOGD("no need to update map");
524 return;
525 }
526
527 std::string bundleName = data.GetWant().GetElement().GetBundleName();
528 int32_t uid = data.GetWant().GetIntParam(AppExecFwk::Constants::UID, -1);
529 int32_t userId = -1;
530 if (DelayedSingleton<OsAccountManagerHelper>::GetInstance()->GetOsAccountLocalIdFromUid(uid, userId) != ERR_OK) {
531 EVENT_LOGW("GetOsAccountLocalIdFromUid failed, uid = %{public}d", uid);
532 return;
533 }
534 std::vector<int> osAccountIds;
535 if (DelayedSingleton<OsAccountManagerHelper>::GetInstance()->QueryActiveOsAccountIds(osAccountIds) != ERR_OK) {
536 EVENT_LOGW("failed to QueryActiveOsAccountIds!");
537 return;
538 }
539 if (find(osAccountIds.begin(), osAccountIds.end(), userId) == osAccountIds.end()) {
540 EVENT_LOGW_LIMIT("userId is not active, no need to update.");
541 return;
542 }
543 EVENT_LOGD("active uid = %{public}d, userId = %{public}d", uid, userId);
544 if (data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED) {
545 EVENT_LOGD("UpdateSubscribersMap bundle %{public}s ready to add", bundleName.c_str());
546 AddSubscriberWithBundleName(bundleName, userId);
547 } else if (data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED) {
548 EVENT_LOGD("UpdateSubscribersMap bundle %{public}s ready to remove", bundleName.c_str());
549 RemoveSubscriberWithBundleName(bundleName, userId);
550 } else {
551 EVENT_LOGD("UpdateSubscribersMap bundle %{public}s ready to update", bundleName.c_str());
552 RemoveSubscriberWithBundleName(bundleName, userId);
553 AddSubscriberWithBundleName(bundleName, userId);
554 }
555 }
556
SendStaticEventProcErrHiSysEvent(int32_t userId,const std::string & publisherName,const std::string & subscriberName,const std::string & eventName)557 void StaticSubscriberManager::SendStaticEventProcErrHiSysEvent(int32_t userId, const std::string &publisherName,
558 const std::string &subscriberName, const std::string &eventName)
559 {
560 EventInfo eventInfo;
561 eventInfo.userId = userId;
562 eventInfo.publisherName = publisherName;
563 eventInfo.subscriberName = subscriberName;
564 eventInfo.eventName = eventName;
565 EventReport::SendHiSysEvent(STATIC_EVENT_PROC_ERROR, eventInfo);
566 }
567
UpdateDisableEvents(const std::string & bundleName,const std::vector<std::string> & events,bool enable)568 int32_t StaticSubscriberManager::UpdateDisableEvents(
569 const std::string &bundleName, const std::vector<std::string> &events, bool enable)
570 {
571 EVENT_LOGD("Called.");
572 std::lock_guard<ffrt::mutex> lock(disableEventsMutex_);
573 auto finder = disableEvents_.find(bundleName);
574 if (finder == disableEvents_.end()) {
575 if (!enable) {
576 disableEvents_.emplace(bundleName, events);
577 }
578 return DelayedSingleton<StaticSubscriberDataManager>::GetInstance()->
579 UpdateStaticSubscriberState(disableEvents_);
580 }
581
582 for (auto &event : events) {
583 auto ¤tEvents = finder->second;
584 auto iter = std::find(currentEvents.begin(), currentEvents.end(), event);
585 if (enable) {
586 if (iter == currentEvents.end()) {
587 continue;
588 }
589 if (iter != currentEvents.end()) {
590 currentEvents.erase(iter);
591 }
592 } else {
593 if (iter == currentEvents.end()) {
594 currentEvents.emplace_back(event);
595 }
596 }
597 }
598
599 if (finder->second.empty()) {
600 disableEvents_.erase(finder);
601 }
602
603 return DelayedSingleton<StaticSubscriberDataManager>::GetInstance()->UpdateStaticSubscriberState(disableEvents_);
604 }
605
SetStaticSubscriberState(bool enable)606 int32_t StaticSubscriberManager::SetStaticSubscriberState(bool enable)
607 {
608 EVENT_LOGD("Called.");
609 auto bundleName =
610 DelayedSingleton<BundleManagerHelper>::GetInstance()->GetBundleName(IPCSkeleton::GetCallingUid());
611 auto staticSubscriberEvent = staticSubscribers_.find(bundleName);
612 if (staticSubscriberEvent == staticSubscribers_.end()) {
613 EVENT_LOGE("Cannot find static subscriber bundle name.");
614 return ERR_INVALID_OPERATION;
615 }
616 std::vector<std::string> events;
617 for (const auto &event : staticSubscriberEvent->second.events) {
618 events.emplace_back(event);
619 }
620 return UpdateDisableEvents(bundleName, events, enable);
621 }
622
SetStaticSubscriberState(const std::vector<std::string> & events,bool enable)623 int32_t StaticSubscriberManager::SetStaticSubscriberState(const std::vector<std::string> &events, bool enable)
624 {
625 EVENT_LOGD("Called.");
626 auto bundleName =
627 DelayedSingleton<BundleManagerHelper>::GetInstance()->GetBundleName(IPCSkeleton::GetCallingUid());
628 return UpdateDisableEvents(bundleName, events, enable);
629 }
630
ParseFilterObject(const nlohmann::json & filterObj,const std::string & eventName,StaticSubscriberInfo & subscriber)631 void StaticSubscriberManager::ParseFilterObject(
632 const nlohmann::json &filterObj, const std::string &eventName, StaticSubscriberInfo &subscriber)
633 {
634 if (filterObj.is_null() || !filterObj.is_array() || filterObj.empty()) {
635 EVENT_LOGD("invalid filterObj size");
636 return;
637 }
638 for (auto filter : filterObj) {
639 if (filter.is_null() || !filter.is_object()) {
640 EVENT_LOGD("invalid filter");
641 continue;
642 }
643 if (filter[JSON_KEY_FILTER_EVENT].is_null() || !filter[JSON_KEY_FILTER_EVENT].is_string()) {
644 EVENT_LOGD("invalid common event ability name obj");
645 continue;
646 }
647 if (filter[JSON_KEY_FILTER_EVENT].get<std::string>() != eventName) {
648 EVENT_LOGD("eventName is not match");
649 continue;
650 }
651 const auto &conditions = filter.find(JSON_KEY_FILTER_CONDITIONS);
652 if (conditions == filter.end() || conditions->is_null() || !conditions->is_object()) {
653 EVENT_LOGD("conditions null");
654 continue;
655 }
656 ParseConditions(*conditions, eventName, subscriber);
657 return;
658 }
659 }
660
ParseConditions(const nlohmann::json & conditions,const std::string & eventName,StaticSubscriberInfo & subscriber)661 void StaticSubscriberManager::ParseConditions(
662 const nlohmann::json &conditions, const std::string &eventName, StaticSubscriberInfo &subscriber)
663 {
664 const auto &code = conditions.find(JSON_KEY_FILTER_CONDITIONS_CODE);
665 if (code != conditions.end()) {
666 if (code->is_number_integer()) {
667 subscriber.filterCode = code->get<int32_t>();
668 } else {
669 EVENT_LOGW("event: %{public}s, the filter code only supports int32", eventName.c_str());
670 }
671 }
672
673 const auto &data = conditions.find(JSON_KEY_FILTER_CONDITIONS_DATA);
674 if (data != conditions.end()) {
675 if (data->is_string()) {
676 subscriber.filterData = data->get<std::string>();
677 } else {
678 EVENT_LOGW("event: %{public}s, the filter data only supports string", eventName.c_str());
679 }
680 }
681
682 const auto ¶meters = conditions.find(JSON_KEY_FILTER_CONDITIONS_PARAMETERS);
683 if (parameters != conditions.end() && parameters->is_object()) {
684 for (const auto &[paramName, paramValue] : parameters->items()) {
685 AddFilterParameter(paramName, paramValue, subscriber.filterParameters);
686 }
687 }
688 }
689
AddFilterParameter(const std::string & paramName,const nlohmann::json & paramValue,std::map<std::string,ParameterType> & filterParameters)690 void StaticSubscriberManager::AddFilterParameter(const std::string ¶mName, const nlohmann::json ¶mValue,
691 std::map<std::string, ParameterType> &filterParameters)
692 {
693 if (paramValue.is_null()) {
694 EVENT_LOGW("invalid parameter: %{public}s, parameter value is null", paramName.c_str());
695 return;
696 }
697 ParameterType parameter;
698 if (paramValue.is_boolean()) {
699 parameter = paramValue.get<bool>();
700 } else if (paramValue.is_number_integer()) {
701 parameter = paramValue.get<int32_t>();
702 } else if (paramValue.is_number_float()) {
703 parameter = paramValue.get<double>();
704 } else if (paramValue.is_string()) {
705 parameter = paramValue.get<std::string>();
706 } else {
707 EVENT_LOGW("invalid parameter: %{public}s. supported types are bool, number, and string", paramName.c_str());
708 return;
709 }
710 filterParameters.insert({ paramName, parameter });
711 }
712
IsFilterParameters(const StaticSubscriberInfo & staticSubscriberInfo,const CommonEventData & data) const713 bool StaticSubscriberManager::IsFilterParameters(
714 const StaticSubscriberInfo &staticSubscriberInfo, const CommonEventData &data) const
715 {
716 Want want = data.GetWant();
717 if (!CheckFilterCodeAndData(staticSubscriberInfo, data)) {
718 return false;
719 }
720 if (!CheckFilterParameters(staticSubscriberInfo.filterParameters, want)) {
721 return false;
722 }
723 return true;
724 }
725
CheckFilterCodeAndData(const StaticSubscriberInfo & staticSubscriberInfo,const CommonEventData & data) const726 bool StaticSubscriberManager::CheckFilterCodeAndData(
727 const StaticSubscriberInfo &staticSubscriberInfo, const CommonEventData &data) const
728 {
729 if (staticSubscriberInfo.filterCode.has_value()) {
730 auto filterCode = staticSubscriberInfo.filterCode.value();
731 if (filterCode != data.GetCode()) {
732 EVENT_LOGW("filter code:%{public}d not equal event code:%{public}d", filterCode, data.GetCode());
733 return false;
734 }
735 }
736 if (staticSubscriberInfo.filterData.has_value()) {
737 auto filterData = staticSubscriberInfo.filterData.value();
738 if (filterData != data.GetData()) {
739 EVENT_LOGW(
740 "filter data:%{public}s not equal event data:%{public}s", filterData.c_str(), data.GetData().c_str());
741 return false;
742 }
743 }
744 return true;
745 }
746
CheckFilterParameters(const std::map<std::string,ParameterType> & filterParameters,const Want & want) const747 bool StaticSubscriberManager::CheckFilterParameters(
748 const std::map<std::string, ParameterType> &filterParameters, const Want &want) const
749 {
750 for (const auto &[paramName, paramValue] : filterParameters) {
751 if (!want.HasParameter(paramName)) {
752 EVENT_LOGW("filter parameter: %{public}s is missing", paramName.c_str());
753 return false;
754 }
755 if (std::holds_alternative<bool>(paramValue)) {
756 if (!CheckSpecificParam(
757 paramName, std::get<bool>(paramValue), want, AAFwk::IBoolean::Query, AAFwk::Boolean::Unbox)) {
758 return false;
759 }
760 } else if (std::holds_alternative<int32_t>(paramValue)) {
761 if (!CheckSpecificParam(
762 paramName, std::get<int32_t>(paramValue), want, AAFwk::IInteger::Query, AAFwk::Integer::Unbox)) {
763 return false;
764 }
765 } else if (std::holds_alternative<double>(paramValue)) {
766 if (!CheckSpecificParam(
767 paramName, std::get<double>(paramValue), want, AAFwk::IDouble::Query, AAFwk::Double::Unbox)) {
768 return false;
769 }
770 } else if (std::holds_alternative<std::string>(paramValue)) {
771 if (!CheckSpecificParam(
772 paramName, std::get<std::string>(paramValue), want, AAFwk::IString::Query, AAFwk::String::Unbox)) {
773 return false;
774 }
775 } else {
776 EVENT_LOGW(
777 "invalid parameter: %{public}s. supported types are bool, number, and string", paramName.c_str());
778 return false;
779 }
780 }
781 return true;
782 }
783
784 template<typename T, typename QueryFunc, typename UnboxFunc>
CheckSpecificParam(const std::string & paramName,const T & paramValue,const Want & want,QueryFunc queryFunc,UnboxFunc unboxFunc) const785 bool StaticSubscriberManager::CheckSpecificParam(
786 const std::string ¶mName, const T ¶mValue, const Want &want, QueryFunc queryFunc, UnboxFunc unboxFunc) const
787 {
788 auto* ao = queryFunc(want.GetParams().GetParam(paramName));
789 if (ao == nullptr) {
790 EVENT_LOGW("%{public}s ao null", paramName.c_str());
791 return false;
792 }
793 auto wantValue = unboxFunc(ao);
794 if (wantValue != paramValue) {
795 EVENT_LOGW("key:%{public}s not equal want", paramName.c_str());
796 return false;
797 }
798 return true;
799 }
800 } // namespace EventFwk
801 } // namespace OHOS
802