• 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_report.h"
32 #include "hitrace_meter_adapter.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_LIMIT("Failed to init allowCommonEvent list");
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<std::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<std::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     SendStaticSubscriberStartHiSysEvent(userId, abilityName, bundleName, data.GetWant().GetAction());
172 }
173 
PublishCommonEventInner(const CommonEventData & data,const CommonEventPublishInfo & publishInfo,const Security::AccessToken::AccessTokenID & callerToken,const int32_t & userId,const sptr<IRemoteObject> & service,const std::string & bundleName)174 void StaticSubscriberManager::PublishCommonEventInner(const CommonEventData &data,
175     const CommonEventPublishInfo &publishInfo, const Security::AccessToken::AccessTokenID &callerToken,
176     const int32_t &userId, const sptr<IRemoteObject> &service, const std::string &bundleName)
177 {
178     auto targetSubscribers = validSubscribers_.find(data.GetWant().GetAction());
179     if (targetSubscribers == validSubscribers_.end()) {
180         return;
181     }
182     std::vector<StaticSubscriberInfo> bootStartHaps {};
183     for (auto subscriber : targetSubscribers->second) {
184         if (IsDisableEvent(subscriber.bundleName, targetSubscribers->first)) {
185             EVENT_LOGW("subscriber %{public}s is disable.", subscriber.bundleName.c_str());
186             SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
187             continue;
188         }
189         if (subscriber.userId < SUBSCRIBE_USER_SYSTEM_BEGIN) {
190             EVENT_LOGW("subscriber %{public}s userId is invalid, subscriber.userId = %{public}d",
191                 subscriber.bundleName.c_str(), subscriber.userId);
192             SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
193             continue;
194         }
195         if ((subscriber.userId > SUBSCRIBE_USER_SYSTEM_END) && (userId != ALL_USER)
196             && (subscriber.userId != userId)) {
197             EVENT_LOGW("subscriber %{public}s userId is not match, subscriber.userId = %{public}d,"
198                 "userId = %{public}d", subscriber.bundleName.c_str(), subscriber.userId, userId);
199             SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
200             continue;
201         }
202         if (!DelayedSingleton<BundleManagerHelper>::GetInstance()->
203             CheckIsSystemAppByBundleName(subscriber.bundleName, subscriber.userId)) {
204             EVENT_LOGW("subscriber %{public}s is not system app, not allow.", subscriber.bundleName.c_str());
205             continue;
206         }
207         if (!VerifyPublisherPermission(callerToken, subscriber.permission)) {
208             EVENT_LOGW("publisher does not have required permission %{public}s", subscriber.permission.c_str());
209             SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
210             continue;
211         }
212         if (!VerifySubscriberPermission(subscriber.bundleName, subscriber.userId,
213             publishInfo.GetSubscriberPermissions())) {
214             EVENT_LOGW("subscriber %{public}s does not have required permissions", subscriber.bundleName.c_str());
215             SendStaticEventProcErrHiSysEvent(userId, bundleName, subscriber.bundleName, data.GetWant().GetAction());
216             continue;
217         }
218         if (!publishInfo.GetBundleName().empty() && subscriber.bundleName != publishInfo.GetBundleName()) {
219             EVENT_LOGW("subscriber bundleName is not match, subscriber.bundleName = %{public}s, "
220                 "bundleName = %{public}s", subscriber.bundleName.c_str(), publishInfo.GetBundleName().c_str());
221             continue;
222         }
223         if (!IsFilterParameters(subscriber, data)) {
224             EVENT_LOGW("subscriber filter parameters is not match, subscriber.bundleName = %{public}s",
225                 subscriber.bundleName.c_str());
226             continue;
227         }
228 #ifdef WATCH_EVENT_BOOT_COMPLETED_DELAY
229         if (data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED) {
230             bootStartHaps.push_back(subscriber);
231         } else {
232             PublishCommonEventConnecAbility(data, service, subscriber.userId, subscriber.bundleName, subscriber.name);
233             EVENT_LOGI("ConnectAbility %{public}s end, StaticSubscriber = %{public}s",
234                 data.GetWant().GetAction().c_str(), subscriber.bundleName.c_str());
235         }
236 #else
237         PublishCommonEventConnecAbility(data, service, subscriber.userId, subscriber.bundleName, subscriber.name);
238         EVENT_LOGI("ConnectAbility %{public}s end, StaticSubscriber = %{public}s", data.GetWant().GetAction().c_str(),
239                    subscriber.bundleName.c_str());
240 #endif
241     }
242 #ifdef WATCH_EVENT_BOOT_COMPLETED_DELAY
243     if (!bootStartHaps.empty()) {
244         if (!ffrt_) {
245             EVENT_LOGD("ready to create ffrt");
246             ffrt_ = std::make_shared<ffrt::queue>("StaticSubscriberManager");
247         }
248 
249         std::function<void()> task = [bootStartHaps, data, service]() {
250             for (auto subscriber : bootStartHaps) {
251                 StaticSubscriberManager::GetInstance()->PublishCommonEventConnecAbility(data, service,
252                     subscriber.userId, subscriber.bundleName, subscriber.name);
253                 EVENT_LOGI("ConnectAbility %{public}s end,send StaticSubscriber = %{public}s",
254                     data.GetWant().GetAction().c_str(), subscriber.bundleName.c_str());
255             }
256         };
257         ffrt_->submit(task, ffrt::task_attr().delay(g_bootDelayTime * TIME_UNIT_SIZE));
258     }
259 #endif
260 }
261 
PublishCommonEvent(const CommonEventData & data,const CommonEventPublishInfo & publishInfo,const Security::AccessToken::AccessTokenID & callerToken,const int32_t & userId,const sptr<IRemoteObject> & service,const std::string & bundleName)262 void StaticSubscriberManager::PublishCommonEvent(const CommonEventData &data,
263     const CommonEventPublishInfo &publishInfo, const Security::AccessToken::AccessTokenID &callerToken,
264     const int32_t &userId, const sptr<IRemoteObject> &service, const std::string &bundleName)
265 {
266     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
267     EVENT_LOGD("enter, event = %{public}s, userId = %{public}d", data.GetWant().GetAction().c_str(), userId);
268 
269     std::lock_guard<std::mutex> lock(subscriberMutex_);
270     if ((!hasInitValidSubscribers_ ||
271         data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED ||
272         data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_LOCKED_BOOT_COMPLETED ||
273         data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_USER_SWITCHED ||
274         data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_UID_REMOVED ||
275         data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_USER_STARTED ||
276         data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_USER_FOREGROUND) &&
277         !InitValidSubscribers()) {
278         EVENT_LOGE("Failed to init subscribers map");
279         return;
280     }
281 
282     UpdateSubscriber(data);
283 
284     PublishCommonEventInner(data, publishInfo, callerToken, userId, service, bundleName);
285 }
286 
VerifyPublisherPermission(const Security::AccessToken::AccessTokenID & callerToken,const std::string & permission)287 bool StaticSubscriberManager::VerifyPublisherPermission(const Security::AccessToken::AccessTokenID &callerToken,
288     const std::string &permission)
289 {
290     EVENT_LOGD("enter");
291     if (permission.empty()) {
292         EVENT_LOGD("no need permission");
293         return true;
294     }
295     return AccessTokenHelper::VerifyAccessToken(callerToken, permission);
296 }
297 
VerifySubscriberPermission(const std::string & bundleName,const int32_t & userId,const std::vector<std::string> & permissions)298 bool StaticSubscriberManager::VerifySubscriberPermission(const std::string &bundleName, const int32_t &userId,
299     const std::vector<std::string> &permissions)
300 {
301     // get hap tokenid with default instindex(0), this should be modified later.
302     Security::AccessToken::AccessTokenID tokenId = AccessTokenHelper::GetHapTokenID(userId, bundleName, 0);
303     for (auto permission : permissions) {
304         if (permission.empty()) {
305             continue;
306         }
307         if (!AccessTokenHelper::VerifyAccessToken(tokenId, permission)) {
308             EVENT_LOGW("subscriber does not have required permission : %{public}s", permission.c_str());
309             return false;
310         }
311     }
312     return true;
313 }
314 
ParseEvents(const std::string & extensionName,const std::string & extensionBundleName,const int32_t & extensionUserId,const std::string & profile,bool enable)315 void StaticSubscriberManager::ParseEvents(const std::string &extensionName, const std::string &extensionBundleName,
316     const int32_t &extensionUserId, const std::string &profile, bool enable)
317 {
318     EVENT_LOGD("enter, subscriber name = %{public}s, bundle name = %{public}s, userId = %{public}d",
319         extensionName.c_str(), extensionBundleName.c_str(), extensionUserId);
320 
321     if (profile.empty()) {
322         EVENT_LOGE("invalid profile");
323         return;
324     }
325     if (!nlohmann::json::accept(profile.c_str())) {
326         EVENT_LOGE("invalid format profile");
327         return;
328     }
329 
330     nlohmann::json jsonObj = nlohmann::json::parse(profile, nullptr, false);
331     if (jsonObj.is_null() || jsonObj.empty() || !jsonObj.is_object()) {
332         EVENT_LOGE("invalid jsonObj");
333         return;
334     }
335     nlohmann::json commonEventsObj = jsonObj[JSON_KEY_COMMON_EVENTS];
336     if (commonEventsObj.is_null() || !commonEventsObj.is_array() || commonEventsObj.empty()) {
337         EVENT_LOGE("invalid common event obj size");
338         return;
339     }
340     for (auto commonEventObj : commonEventsObj) {
341         if (commonEventObj.is_null() || !commonEventObj.is_object()) {
342             EVENT_LOGW("invalid common event obj");
343             continue;
344         }
345         if (commonEventObj[JSON_KEY_NAME].is_null() || !commonEventObj[JSON_KEY_NAME].is_string()) {
346             EVENT_LOGW("invalid common event ability name obj");
347             continue;
348         }
349         if (commonEventObj[JSON_KEY_NAME].get<std::string>() != extensionName) {
350             EVENT_LOGW("extensionName is not match");
351             continue;
352         }
353         if (commonEventObj[JSON_KEY_PERMISSION].is_null() || !commonEventObj[JSON_KEY_PERMISSION].is_string()) {
354             EVENT_LOGW("invalid permission obj");
355             continue;
356         }
357         if (commonEventObj[JSON_KEY_EVENTS].is_null() || !commonEventObj[JSON_KEY_EVENTS].is_array() ||
358             commonEventObj[JSON_KEY_EVENTS].empty()) {
359             EVENT_LOGW("invalid events obj");
360             continue;
361         }
362 
363         for (auto e : commonEventObj[JSON_KEY_EVENTS]) {
364             if (e.is_null() || !e.is_string() ||
365                 (staticSubscribers_[extensionBundleName].events.find(e) ==
366                     staticSubscribers_[extensionBundleName].events.end())) {
367                 EVENT_LOGW("invalid event obj");
368                 continue;
369             }
370             StaticSubscriberInfo subscriber = { .name = extensionName,
371                 .bundleName = extensionBundleName,
372                 .userId = extensionUserId,
373                 .permission = commonEventObj[JSON_KEY_PERMISSION].get<std::string>()};
374             ParseFilterObject(commonEventObj[JSON_KEY_FILTER], e.get<std::string>(), subscriber);
375             AddToValidSubscribers(e.get<std::string>(), subscriber);
376         }
377     }
378 }
379 
AddSubscriber(const AppExecFwk::ExtensionAbilityInfo & extension)380 void StaticSubscriberManager::AddSubscriber(const AppExecFwk::ExtensionAbilityInfo &extension)
381 {
382     EVENT_LOGD("enter, subscriber bundlename = %{public}s", extension.bundleName.c_str());
383 
384     std::vector<std::string> profileInfos;
385     if (!DelayedSingleton<BundleManagerHelper>::GetInstance()->GetResConfigFile(extension, profileInfos)) {
386         EVENT_LOGE("GetProfile failed");
387         return;
388     }
389     for (auto profile : profileInfos) {
390         int32_t userId = -1;
391         if (DelayedSingleton<OsAccountManagerHelper>::GetInstance()->GetOsAccountLocalIdFromUid(
392             extension.applicationInfo.uid, userId) != ERR_OK) {
393             EVENT_LOGE("Get userId failed, uid = %{public}d", extension.applicationInfo.uid);
394             return;
395         }
396         ParseEvents(extension.name, extension.bundleName, userId, profile);
397     }
398 }
399 
AddToValidSubscribers(const std::string & eventName,const StaticSubscriberInfo & subscriber)400 void StaticSubscriberManager::AddToValidSubscribers(const std::string &eventName,
401     const StaticSubscriberInfo &subscriber)
402 {
403     if (validSubscribers_.find(eventName) != validSubscribers_.end()) {
404         for (auto sub : validSubscribers_[eventName]) {
405             if ((sub.name == subscriber.name) &&
406                 (sub.bundleName == subscriber.bundleName) &&
407                 (sub.userId == subscriber.userId)) {
408                 EVENT_LOGD("subscriber already exist, event = %{public}s, bundlename = %{public}s, name = %{public}s,"
409                     "userId = %{public}d", eventName.c_str(), subscriber.bundleName.c_str(), subscriber.name.c_str(),
410                     subscriber.userId);
411                 return;
412             }
413         }
414     }
415     validSubscribers_[eventName].emplace_back(subscriber);
416     EVENT_LOGD("subscriber added, event = %{public}s, bundlename = %{public}s, name = %{public}s, userId = %{public}d",
417         eventName.c_str(), subscriber.bundleName.c_str(), subscriber.name.c_str(), subscriber.userId);
418 }
419 
AddSubscriberWithBundleName(const std::string & bundleName,const int32_t & userId)420 void StaticSubscriberManager::AddSubscriberWithBundleName(const std::string &bundleName, const int32_t &userId)
421 {
422     EVENT_LOGD("enter, bundleName = %{public}s, userId = %{public}d", bundleName.c_str(), userId);
423 
424     std::vector<AppExecFwk::ExtensionAbilityInfo> extensions;
425     if (!DelayedSingleton<BundleManagerHelper>::GetInstance()->QueryExtensionInfos(extensions, userId)) {
426         EVENT_LOGE("QueryExtensionInfos failed");
427         return;
428     }
429 
430     for (auto extension : extensions) {
431         if ((extension.bundleName == bundleName) &&
432             staticSubscribers_.find(extension.bundleName) != staticSubscribers_.end()) {
433             AddSubscriber(extension);
434         }
435     }
436 }
437 
RemoveSubscriberWithBundleName(const std::string & bundleName,const int32_t & userId)438 void StaticSubscriberManager::RemoveSubscriberWithBundleName(const std::string &bundleName, const int32_t &userId)
439 {
440     EVENT_LOGD("enter, bundleName = %{public}s, userId = %{public}d", bundleName.c_str(), userId);
441     std::lock_guard<std::mutex> lock(disableEventsMutex_);
442     for (auto it = validSubscribers_.begin(); it != validSubscribers_.end();) {
443         auto subIt = it->second.begin();
444         while (subIt != it->second.end()) {
445             if ((subIt->bundleName == bundleName) && (subIt->userId == userId)) {
446                 EVENT_LOGD("remove subscriber, event = %{public}s, bundlename = %{public}s, userId = %{public}d",
447                     it->first.c_str(), bundleName.c_str(), userId);
448                 subIt = it->second.erase(subIt);
449             } else {
450                 subIt++;
451             }
452         }
453         if (it->second.empty()) {
454             validSubscribers_.erase(it++);
455         } else {
456             it++;
457         }
458     }
459 
460     auto bundleIt = disableEvents_.find(bundleName);
461     if (bundleIt == disableEvents_.end()) {
462         EVENT_LOGD("Bundle name is not existed.");
463         return;
464     }
465     disableEvents_.erase(bundleIt);
466     auto result =
467         DelayedSingleton<StaticSubscriberDataManager>::GetInstance()->DeleteDisableEventElementByBundleName(bundleName);
468     if (result != ERR_OK) {
469         EVENT_LOGE("Remove disable event by bundle name failed.");
470     }
471 }
472 
UpdateSubscriber(const CommonEventData & data)473 void StaticSubscriberManager::UpdateSubscriber(const CommonEventData &data)
474 {
475     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
476     EVENT_LOGD("enter");
477 
478     if ((data.GetWant().GetAction() != CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED) &&
479         (data.GetWant().GetAction() != CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED) &&
480         (data.GetWant().GetAction() != CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED)) {
481         EVENT_LOGD("no need to update map");
482         return;
483     }
484 
485     std::string bundleName = data.GetWant().GetElement().GetBundleName();
486     int32_t uid = data.GetWant().GetIntParam(AppExecFwk::Constants::UID, -1);
487     int32_t userId = -1;
488     if (DelayedSingleton<OsAccountManagerHelper>::GetInstance()->GetOsAccountLocalIdFromUid(uid, userId) != ERR_OK) {
489         EVENT_LOGW("GetOsAccountLocalIdFromUid failed, uid = %{public}d", uid);
490         return;
491     }
492     std::vector<int> osAccountIds;
493     if (DelayedSingleton<OsAccountManagerHelper>::GetInstance()->QueryActiveOsAccountIds(osAccountIds) != ERR_OK) {
494         EVENT_LOGW("failed to QueryActiveOsAccountIds!");
495         return;
496     }
497     if (find(osAccountIds.begin(), osAccountIds.end(), userId) == osAccountIds.end()) {
498         EVENT_LOGW("userId is not active, no need to update.");
499         return;
500     }
501     EVENT_LOGD("active uid = %{public}d, userId = %{public}d", uid, userId);
502     if (data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED) {
503         EVENT_LOGD("UpdateSubscribersMap bundle %{public}s ready to add", bundleName.c_str());
504         AddSubscriberWithBundleName(bundleName, userId);
505     } else if (data.GetWant().GetAction() == CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED) {
506         EVENT_LOGD("UpdateSubscribersMap bundle %{public}s ready to remove", bundleName.c_str());
507         RemoveSubscriberWithBundleName(bundleName, userId);
508     } else {
509         EVENT_LOGD("UpdateSubscribersMap bundle %{public}s ready to update", bundleName.c_str());
510         RemoveSubscriberWithBundleName(bundleName, userId);
511         AddSubscriberWithBundleName(bundleName, userId);
512     }
513 }
514 
SendStaticEventProcErrHiSysEvent(int32_t userId,const std::string & publisherName,const std::string & subscriberName,const std::string & eventName)515 void StaticSubscriberManager::SendStaticEventProcErrHiSysEvent(int32_t userId, const std::string &publisherName,
516     const std::string &subscriberName, const std::string &eventName)
517 {
518     EventInfo eventInfo;
519     eventInfo.userId = userId;
520     eventInfo.publisherName = publisherName;
521     eventInfo.subscriberName = subscriberName;
522     eventInfo.eventName = eventName;
523     EventReport::SendHiSysEvent(STATIC_EVENT_PROC_ERROR, eventInfo);
524 }
525 
SendStaticSubscriberStartHiSysEvent(int32_t userId,const std::string & publisherName,const std::string & subscriberName,const std::string & eventName)526 void StaticSubscriberManager::SendStaticSubscriberStartHiSysEvent(int32_t userId, const std::string &publisherName,
527     const std::string &subscriberName, const std::string &eventName)
528 {
529     EventInfo eventInfo;
530     eventInfo.userId = userId;
531     eventInfo.publisherName = publisherName;
532     eventInfo.subscriberName = subscriberName;
533     eventInfo.eventName = eventName;
534     EventReport::SendHiSysEvent(STATIC_SUBSCRIBER_START, eventInfo);
535 }
536 
UpdateDisableEvents(const std::string & bundleName,const std::vector<std::string> & events,bool enable)537 int32_t StaticSubscriberManager::UpdateDisableEvents(
538     const std::string &bundleName, const std::vector<std::string> &events, bool enable)
539 {
540     EVENT_LOGD("Called.");
541     std::lock_guard<std::mutex> lock(disableEventsMutex_);
542     auto finder = disableEvents_.find(bundleName);
543     if (finder == disableEvents_.end()) {
544         if (!enable) {
545             disableEvents_.emplace(bundleName, events);
546         }
547         return DelayedSingleton<StaticSubscriberDataManager>::GetInstance()->
548             UpdateStaticSubscriberState(disableEvents_);
549     }
550 
551     for (auto &event : events) {
552         auto &currentEvents = finder->second;
553         auto iter = std::find(currentEvents.begin(), currentEvents.end(), event);
554         if (enable) {
555             if (iter == currentEvents.end()) {
556                 continue;
557             }
558             if (iter != currentEvents.end()) {
559                 currentEvents.erase(iter);
560             }
561         } else {
562             if (iter == currentEvents.end()) {
563                 currentEvents.emplace_back(event);
564             }
565         }
566     }
567 
568     if (finder->second.empty()) {
569         disableEvents_.erase(finder);
570     }
571 
572     return DelayedSingleton<StaticSubscriberDataManager>::GetInstance()->UpdateStaticSubscriberState(disableEvents_);
573 }
574 
SetStaticSubscriberState(bool enable)575 int32_t StaticSubscriberManager::SetStaticSubscriberState(bool enable)
576 {
577     EVENT_LOGD("Called.");
578     auto bundleName =
579         DelayedSingleton<BundleManagerHelper>::GetInstance()->GetBundleName(IPCSkeleton::GetCallingUid());
580     auto staticSubscriberEvent = staticSubscribers_.find(bundleName);
581     if (staticSubscriberEvent == staticSubscribers_.end()) {
582         EVENT_LOGE("Cannot find static subscriber bundle name.");
583         return ERR_INVALID_OPERATION;
584     }
585     std::vector<std::string> events;
586     for (const auto &event : staticSubscriberEvent->second.events) {
587         events.emplace_back(event);
588     }
589     return UpdateDisableEvents(bundleName, events, enable);
590 }
591 
SetStaticSubscriberState(const std::vector<std::string> & events,bool enable)592 int32_t StaticSubscriberManager::SetStaticSubscriberState(const std::vector<std::string> &events, bool enable)
593 {
594     EVENT_LOGD("Called.");
595     auto bundleName =
596         DelayedSingleton<BundleManagerHelper>::GetInstance()->GetBundleName(IPCSkeleton::GetCallingUid());
597     return UpdateDisableEvents(bundleName, events, enable);
598 }
599 
ParseFilterObject(const nlohmann::json & filterObj,const std::string & eventName,StaticSubscriberInfo & subscriber)600 void StaticSubscriberManager::ParseFilterObject(
601     const nlohmann::json &filterObj, const std::string &eventName, StaticSubscriberInfo &subscriber)
602 {
603     if (filterObj.is_null() || !filterObj.is_array() || filterObj.empty()) {
604         EVENT_LOGD("invalid filterObj size");
605         return;
606     }
607     for (auto filter : filterObj) {
608         if (filter.is_null() || !filter.is_object()) {
609             EVENT_LOGD("invalid filter");
610             continue;
611         }
612         if (filter[JSON_KEY_FILTER_EVENT].is_null() || !filter[JSON_KEY_FILTER_EVENT].is_string()) {
613             EVENT_LOGD("invalid common event ability name obj");
614             continue;
615         }
616         if (filter[JSON_KEY_FILTER_EVENT].get<std::string>() != eventName) {
617             EVENT_LOGD("eventName is not match");
618             continue;
619         }
620         const auto &conditions = filter.find(JSON_KEY_FILTER_CONDITIONS);
621         if (conditions == filter.end() || conditions->is_null() || !conditions->is_object()) {
622             EVENT_LOGD("conditions null");
623             continue;
624         }
625         ParseConditions(*conditions, eventName, subscriber);
626         return;
627     }
628 }
629 
ParseConditions(const nlohmann::json & conditions,const std::string & eventName,StaticSubscriberInfo & subscriber)630 void StaticSubscriberManager::ParseConditions(
631     const nlohmann::json &conditions, const std::string &eventName, StaticSubscriberInfo &subscriber)
632 {
633     const auto &code = conditions.find(JSON_KEY_FILTER_CONDITIONS_CODE);
634     if (code != conditions.end()) {
635         if (code->is_number_integer()) {
636             subscriber.filterCode = code->get<int32_t>();
637         } else {
638             EVENT_LOGW("event: %{public}s, the filter code only supports int32", eventName.c_str());
639         }
640     }
641 
642     const auto &data = conditions.find(JSON_KEY_FILTER_CONDITIONS_DATA);
643     if (data != conditions.end()) {
644         if (data->is_string()) {
645             subscriber.filterData = data->get<std::string>();
646         } else {
647             EVENT_LOGW("event: %{public}s, the filter data only supports string", eventName.c_str());
648         }
649     }
650 
651     const auto &parameters = conditions.find(JSON_KEY_FILTER_CONDITIONS_PARAMETERS);
652     if (parameters != conditions.end() && parameters->is_object()) {
653         for (const auto &[paramName, paramValue] : parameters->items()) {
654             AddFilterParameter(paramName, paramValue, subscriber.filterParameters);
655         }
656     }
657 }
658 
AddFilterParameter(const std::string & paramName,const nlohmann::json & paramValue,std::map<std::string,ParameterType> & filterParameters)659 void StaticSubscriberManager::AddFilterParameter(const std::string &paramName, const nlohmann::json &paramValue,
660     std::map<std::string, ParameterType> &filterParameters)
661 {
662     if (paramValue.is_null()) {
663         EVENT_LOGW("invalid parameter: %{public}s, parameter value is null", paramName.c_str());
664         return;
665     }
666     ParameterType parameter;
667     if (paramValue.is_boolean()) {
668         parameter = paramValue.get<bool>();
669     } else if (paramValue.is_number_integer()) {
670         parameter = paramValue.get<int32_t>();
671     } else if (paramValue.is_number_float()) {
672         parameter = paramValue.get<double>();
673     } else if (paramValue.is_string()) {
674         parameter = paramValue.get<std::string>();
675     } else {
676         EVENT_LOGW("invalid parameter: %{public}s. supported types are bool, number, and string", paramName.c_str());
677         return;
678     }
679     filterParameters.insert({ paramName, parameter });
680 }
681 
IsFilterParameters(const StaticSubscriberInfo & staticSubscriberInfo,const CommonEventData & data) const682 bool StaticSubscriberManager::IsFilterParameters(
683     const StaticSubscriberInfo &staticSubscriberInfo, const CommonEventData &data) const
684 {
685     Want want = data.GetWant();
686     if (!CheckFilterCodeAndData(staticSubscriberInfo, data)) {
687         return false;
688     }
689     if (!CheckFilterParameters(staticSubscriberInfo.filterParameters, want)) {
690         return false;
691     }
692     return true;
693 }
694 
CheckFilterCodeAndData(const StaticSubscriberInfo & staticSubscriberInfo,const CommonEventData & data) const695 bool StaticSubscriberManager::CheckFilterCodeAndData(
696     const StaticSubscriberInfo &staticSubscriberInfo, const CommonEventData &data) const
697 {
698     if (staticSubscriberInfo.filterCode.has_value()) {
699         auto filterCode = staticSubscriberInfo.filterCode.value();
700         if (filterCode != data.GetCode()) {
701             EVENT_LOGW("filter code:%{public}d not equal event code:%{public}d", filterCode, data.GetCode());
702             return false;
703         }
704     }
705     if (staticSubscriberInfo.filterData.has_value()) {
706         auto filterData = staticSubscriberInfo.filterData.value();
707         if (filterData != data.GetData()) {
708             EVENT_LOGW(
709                 "filter data:%{public}s not equal event data:%{public}s", filterData.c_str(), data.GetData().c_str());
710             return false;
711         }
712     }
713     return true;
714 }
715 
CheckFilterParameters(const std::map<std::string,ParameterType> & filterParameters,const Want & want) const716 bool StaticSubscriberManager::CheckFilterParameters(
717     const std::map<std::string, ParameterType> &filterParameters, const Want &want) const
718 {
719     for (const auto &[paramName, paramValue] : filterParameters) {
720         if (!want.HasParameter(paramName)) {
721             EVENT_LOGW("filter parameter: %{public}s is missing", paramName.c_str());
722             return false;
723         }
724         if (std::holds_alternative<bool>(paramValue)) {
725             if (!CheckSpecificParam(
726                 paramName, std::get<bool>(paramValue), want, AAFwk::IBoolean::Query, AAFwk::Boolean::Unbox)) {
727                 return false;
728             }
729         } else if (std::holds_alternative<int32_t>(paramValue)) {
730             if (!CheckSpecificParam(
731                 paramName, std::get<int32_t>(paramValue), want, AAFwk::IInteger::Query, AAFwk::Integer::Unbox)) {
732                 return false;
733             }
734         } else if (std::holds_alternative<double>(paramValue)) {
735             if (!CheckSpecificParam(
736                 paramName, std::get<double>(paramValue), want, AAFwk::IDouble::Query, AAFwk::Double::Unbox)) {
737                 return false;
738             }
739         } else if (std::holds_alternative<std::string>(paramValue)) {
740             if (!CheckSpecificParam(
741                 paramName, std::get<std::string>(paramValue), want, AAFwk::IString::Query, AAFwk::String::Unbox)) {
742                 return false;
743             }
744         } else {
745             EVENT_LOGW(
746                 "invalid parameter: %{public}s. supported types are bool, number, and string", paramName.c_str());
747             return false;
748         }
749     }
750     return true;
751 }
752 
753 template<typename T, typename QueryFunc, typename UnboxFunc>
CheckSpecificParam(const std::string & paramName,const T & paramValue,const Want & want,QueryFunc queryFunc,UnboxFunc unboxFunc) const754 bool StaticSubscriberManager::CheckSpecificParam(
755     const std::string &paramName, const T &paramValue, const Want &want, QueryFunc queryFunc, UnboxFunc unboxFunc) const
756 {
757     auto* ao = queryFunc(want.GetParams().GetParam(paramName));
758     if (ao == nullptr) {
759         EVENT_LOGW("%{public}s ao null", paramName.c_str());
760         return false;
761     }
762     auto wantValue = unboxFunc(ao);
763     if (wantValue != paramValue) {
764         EVENT_LOGW("key:%{public}s not equal want", paramName.c_str());
765         return false;
766     }
767     return true;
768 }
769 }  // namespace EventFwk
770 }  // namespace OHOS
771