• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &currentEvents = 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 &parameters = 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 &paramName, const nlohmann::json &paramValue,
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 &paramName, const T &paramValue, 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