1 /*
2  * Copyright (c) 2021-2022 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 "common_event_control_manager.h"
17 
18 #include <cinttypes>
19 
20 #include "access_token_helper.h"
21 #include "bundle_manager_helper.h"
22 #include "common_event_constant.h"
23 #include "event_log_wrapper.h"
24 #include "event_report.h"
25 #include "hitrace_meter_adapter.h"
26 #include "ievent_receive.h"
27 #include "system_time.h"
28 #include "xcollie/watchdog.h"
29 
30 namespace OHOS {
31 namespace EventFwk {
32 constexpr int32_t LENGTH = 80;
33 constexpr int32_t DOUBLE = 2;
34 const std::string CONNECTOR = " or ";
35 static const int32_t TIME_UNIT_SIZE = 1000;
36 
CommonEventControlManager()37 CommonEventControlManager::CommonEventControlManager()
38     : handler_(nullptr), handlerOrdered_(nullptr), pendingTimeoutMessage_(false), scheduled_(false)
39 {
40     EVENT_LOGD("enter");
41 }
42 
~CommonEventControlManager()43 CommonEventControlManager::~CommonEventControlManager()
44 {
45     EVENT_LOGD("enter");
46 }
47 
PublishCommonEvent(const CommonEventRecord & eventRecord,const sptr<IRemoteObject> & commonEventListener)48 bool CommonEventControlManager::PublishCommonEvent(
49     const CommonEventRecord &eventRecord, const sptr<IRemoteObject> &commonEventListener)
50 {
51     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
52     EVENT_LOGD("enter");
53 
54     bool ret = false;
55 
56     if (!eventRecord.publishInfo->IsOrdered()) {
57         ret = ProcessUnorderedEvent(eventRecord);
58     } else {
59         ret = ProcessOrderedEvent(eventRecord, commonEventListener);
60     }
61 
62     return ret;
63 }
64 
PublishStickyCommonEvent(const CommonEventRecord & eventRecord,const std::shared_ptr<EventSubscriberRecord> & subscriberRecord)65 bool CommonEventControlManager::PublishStickyCommonEvent(
66     const CommonEventRecord &eventRecord, const std::shared_ptr<EventSubscriberRecord> &subscriberRecord)
67 {
68     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
69     EVENT_LOGD("enter");
70 
71     if (!subscriberRecord) {
72         EVENT_LOGE("subscriberRecord is null");
73         return false;
74     }
75     return ProcessUnorderedEvent(eventRecord, subscriberRecord);
76 }
77 
PublishFreezeCommonEvent(const uid_t & uid)78 bool CommonEventControlManager::PublishFreezeCommonEvent(const uid_t &uid)
79 {
80     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
81     EVENT_LOGD("enter");
82 
83     if (!GetUnorderedEventHandler()) {
84         EVENT_LOGE("failed to get eventhandler");
85         return false;
86     }
87     PublishFrozenEventsInner(DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->GetFrozenEvents(uid));
88     return true;
89 }
90 
PublishFreezeCommonEvent(std::set<int> pidList)91 bool CommonEventControlManager::PublishFreezeCommonEvent(std::set<int> pidList)
92 {
93     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
94     EVENT_LOGD("enter");
95 
96     if (!GetUnorderedEventHandler()) {
97         EVENT_LOGE("failed to get eventhandler");
98         return false;
99     }
100     for (auto it = pidList.begin(); it != pidList.end(); it++) {
101         PublishFrozenEventsInner(
102             DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->GetFrozenEventsMapByPid(*it));
103     }
104     return true;
105 }
106 
PublishAllFreezeCommonEvents()107 bool CommonEventControlManager::PublishAllFreezeCommonEvents()
108 {
109     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
110     EVENT_LOGD("enter");
111 
112     if (!GetUnorderedEventHandler()) {
113         EVENT_LOGE("failed to get eventhandler");
114         return false;
115     }
116 
117     std::map<uid_t, FrozenRecords> frozenEventRecords =
118         DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->GetAllFrozenEvents();
119     for (auto record : frozenEventRecords) {
120         PublishFrozenEventsInner(record.second);
121     }
122 
123     std::map<pid_t, FrozenRecords> frozenEventRecordsMap =
124         DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->GetAllFrozenEventsMap();
125     for (auto record : frozenEventRecordsMap) {
126         PublishFrozenEventsInner(record.second);
127     }
128     return true;
129 }
130 
PublishFrozenEventsInner(const FrozenRecords & frozenRecords)131 void CommonEventControlManager::PublishFrozenEventsInner(const FrozenRecords &frozenRecords)
132 {
133     for (auto record : frozenRecords) {
134         for (auto vec : record.second) {
135             if (!vec) {
136                 EVENT_LOGW("failed to find record");
137                 continue;
138             }
139 
140             EventSubscriberRecord subscriberRecord = record.first;
141             CommonEventRecord eventRecord = *vec;
142             std::weak_ptr<CommonEventControlManager> weak = shared_from_this();
143             auto innerCallback = [weak, subscriberRecord, eventRecord]() {
144                 auto control = weak.lock();
145                 if (control == nullptr) {
146                     EVENT_LOGE("CommonEventControlManager is null");
147                     return;
148                 }
149                 control->NotifyFreezeEvents(subscriberRecord, eventRecord);
150             };
151             unorderedImmediateQueue_->submit(innerCallback);
152         }
153     }
154 }
155 
NotifyFreezeEvents(const EventSubscriberRecord & subscriberRecord,const CommonEventRecord & eventRecord)156 bool CommonEventControlManager::NotifyFreezeEvents(
157     const EventSubscriberRecord &subscriberRecord, const CommonEventRecord &eventRecord)
158 {
159     EVENT_LOGD("enter");
160 
161     sptr<IEventReceive> commonEventListenerProxy = iface_cast<IEventReceive>(subscriberRecord.commonEventListener);
162     if (!commonEventListenerProxy) {
163         EVENT_LOGE("Fail to get IEventReceive proxy");
164         return false;
165     }
166 
167     int8_t ret = CheckPermission(subscriberRecord, eventRecord);
168     if (ret != OrderedEventRecord::DELIVERED) {
169         EVENT_LOGE("check permission is failed");
170         return false;
171     }
172     if (eventRecord.commonEventData == nullptr) {
173         EVENT_LOGE("commonEventData == nullptr");
174         return false;
175     }
176     EVENT_LOGI("Send common event %{public}s to subscriber %{public}s (pid = %{public}d, uid = %{public}d) "
177                 "when unfreezed",
178         eventRecord.commonEventData->GetWant().GetAction().c_str(),
179         subscriberRecord.eventRecordInfo.bundleName.c_str(),
180         subscriberRecord.eventRecordInfo.pid,
181         subscriberRecord.eventRecordInfo.uid);
182     commonEventListenerProxy->NotifyEvent(*(eventRecord.commonEventData),
183         false, eventRecord.publishInfo->IsSticky());
184     AccessTokenHelper::RecordSensitivePermissionUsage(subscriberRecord.eventRecordInfo.callerToken,
185         eventRecord.commonEventData->GetWant().GetAction());
186     return true;
187 }
188 
GetUnorderedEventHandler()189 bool CommonEventControlManager::GetUnorderedEventHandler()
190 {
191     if (!unorderedQueue_) {
192         unorderedQueue_ = std::make_shared<ffrt::queue>("unordered_common_event");
193     }
194 
195     if (!unorderedImmediateQueue_) {
196         unorderedImmediateQueue_ = std::make_shared<ffrt::queue>("unordered_immediate_common_event",
197             ffrt::queue_attr().qos(ffrt::qos_utility));
198     }
199 
200     return true;
201 }
202 
NotifyUnorderedEventLocked(std::shared_ptr<OrderedEventRecord> & eventRecord)203 void CommonEventControlManager::NotifyUnorderedEventLocked(std::shared_ptr<OrderedEventRecord> &eventRecord)
204 {
205     int32_t succCnt = 0;
206     int32_t failCnt = 0;
207     int32_t freezeCnt = 0;
208     for (auto vec : eventRecord->receivers) {
209         if (vec == nullptr) {
210             EVENT_LOGE("invalid vec");
211             failCnt++;
212             continue;
213         }
214         size_t index = eventRecord->nextReceiver++;
215         if (vec->isFreeze) {
216             eventRecord->deliveryState[index] = OrderedEventRecord::SKIPPED;
217             DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->InsertFrozenEvents(vec, *eventRecord);
218             DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->InsertFrozenEventsMap(
219                 vec, *eventRecord);
220             EVENT_LOGE("NotifyUnorderedEvent = %{public}s freeze, suscriberID = %{public}s",
221                 eventRecord->commonEventData->GetWant().GetAction().c_str(), vec->eventRecordInfo.subId.c_str());
222             freezeCnt++;
223         } else {
224             sptr<IEventReceive> commonEventListenerProxy = iface_cast<IEventReceive>(vec->commonEventListener);
225             if (!commonEventListenerProxy) {
226                 eventRecord->deliveryState[index] = OrderedEventRecord::SKIPPED;
227                 EVENT_LOGE("Failed to get IEventReceive proxy, suscriberID = %{public}s",
228                     vec->eventRecordInfo.subId.c_str());
229                 failCnt++;
230                 continue;
231             }
232             int8_t ret = CheckPermission(*vec, *eventRecord);
233             eventRecord->deliveryState[index] = ret;
234             if (ret == OrderedEventRecord::DELIVERED) {
235                 eventRecord->state = OrderedEventRecord::RECEIVING;
236                 commonEventListenerProxy->NotifyEvent(
237                     *(eventRecord->commonEventData), false, eventRecord->publishInfo->IsSticky());
238                 eventRecord->state = OrderedEventRecord::RECEIVED;
239                 succCnt++;
240                 AccessTokenHelper::RecordSensitivePermissionUsage(vec->eventRecordInfo.callerToken,
241                     eventRecord->commonEventData->GetWant().GetAction());
242             } else {
243                 failCnt++;
244                 EVENT_LOGE("NotifyUnorderedEvent = %{public}s fail, suscriberID = %{public}s",
245                     eventRecord->commonEventData->GetWant().GetAction().c_str(), vec->eventRecordInfo.subId.c_str());
246             }
247         }
248     }
249     EVENT_LOGI("NotifyUnorderedEvent = %{public}s end, subscriberCnt = %{public}zu, succCnt = %{public}d,"
250         "failCnt = %{public}d, freezeCnt = %{public}d", eventRecord->commonEventData->GetWant().GetAction().c_str(),
251         eventRecord->receivers.size(), succCnt, failCnt, freezeCnt);
252 }
253 
NotifyUnorderedEvent(std::shared_ptr<OrderedEventRecord> & eventRecord)254 bool CommonEventControlManager::NotifyUnorderedEvent(std::shared_ptr<OrderedEventRecord> &eventRecord)
255 {
256     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
257     if (!eventRecord) {
258         EVENT_LOGD("Invalid event record.");
259         return false;
260     }
261 
262     std::lock_guard<std::mutex> lock(unorderedMutex_);
263     NotifyUnorderedEventLocked(eventRecord);
264 
265     EnqueueHistoryEventRecord(eventRecord, false);
266 
267     auto it = std::find(unorderedEventQueue_.begin(), unorderedEventQueue_.end(), eventRecord);
268     if (it != unorderedEventQueue_.end()) {
269         unorderedEventQueue_.erase(it);
270     }
271     return true;
272 }
273 
ProcessUnorderedEvent(const CommonEventRecord & eventRecord,const std::shared_ptr<EventSubscriberRecord> & subscriberRecord)274 bool CommonEventControlManager::ProcessUnorderedEvent(
275     const CommonEventRecord &eventRecord, const std::shared_ptr<EventSubscriberRecord> &subscriberRecord)
276 {
277     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
278     EVENT_LOGD("enter");
279 
280     bool ret = false;
281 
282     if (!GetUnorderedEventHandler()) {
283         EVENT_LOGE("failed to get eventhandler");
284         return ret;
285     }
286 
287     std::shared_ptr<OrderedEventRecord> eventRecordPtr = std::make_shared<OrderedEventRecord>();
288     if (eventRecordPtr == nullptr) {
289         EVENT_LOGE("eventRecordPtr is null");
290         return ret;
291     }
292 
293     std::shared_ptr<CommonEventSubscriberManager> spinstance =
294         DelayedSingleton<CommonEventSubscriberManager>::GetInstance();
295 
296     eventRecordPtr->FillCommonEventRecord(eventRecord);
297     if (subscriberRecord) {
298         eventRecordPtr->receivers.emplace_back(subscriberRecord);
299     } else {
300         eventRecordPtr->receivers = spinstance->GetSubscriberRecords(eventRecord);
301     }
302 
303     for (auto vec : eventRecordPtr->receivers) {
304         eventRecordPtr->deliveryState.emplace_back(OrderedEventRecord::PENDING);
305     }
306 
307     EnqueueUnorderedRecord(eventRecordPtr);
308 
309     std::weak_ptr<CommonEventControlManager> weak = shared_from_this();
310     auto innerCallback = [weak, eventRecordPtr]() {
311         auto manager = weak.lock();
312         if (manager == nullptr) {
313             EVENT_LOGE("CommonEventControlManager is null");
314             return;
315         }
316         std::shared_ptr<OrderedEventRecord> ordered = eventRecordPtr;
317         manager->NotifyUnorderedEvent(ordered);
318     };
319 
320     if (eventRecord.isSystemEvent) {
321         unorderedImmediateQueue_->submit(innerCallback);
322     } else {
323         unorderedQueue_->submit(innerCallback);
324     }
325 
326     return ret;
327 }
328 
GetMatchingOrderedReceiver(const sptr<IRemoteObject> & proxy)329 std::shared_ptr<OrderedEventRecord> CommonEventControlManager::GetMatchingOrderedReceiver(
330     const sptr<IRemoteObject> &proxy)
331 {
332     EVENT_LOGD("enter");
333 
334     std::lock_guard<std::mutex> lock(orderedMutex_);
335 
336     if (!orderedEventQueue_.empty()) {
337         std::shared_ptr<OrderedEventRecord> firstRecord = orderedEventQueue_.front();
338         if ((firstRecord != nullptr) && (firstRecord->curReceiver == proxy)) {
339             return firstRecord;
340         }
341     }
342 
343     return nullptr;
344 }
345 
GetOrderedEventHandler()346 bool CommonEventControlManager::GetOrderedEventHandler()
347 {
348     if (!orderedQueue_) {
349         orderedQueue_ = std::make_shared<ffrt::queue>("ordered_common_event");
350     }
351     return true;
352 }
353 
ProcessOrderedEvent(const CommonEventRecord & eventRecord,const sptr<IRemoteObject> & commonEventListener)354 bool CommonEventControlManager::ProcessOrderedEvent(
355     const CommonEventRecord &eventRecord, const sptr<IRemoteObject> &commonEventListener)
356 {
357     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
358     EVENT_LOGD("enter");
359 
360     bool ret = false;
361 
362     if (!GetOrderedEventHandler()) {
363         EVENT_LOGE("failed to get eventhandler");
364         return ret;
365     }
366 
367     std::shared_ptr<OrderedEventRecord> eventRecordPtr = std::make_shared<OrderedEventRecord>();
368     if (eventRecordPtr == nullptr) {
369         EVENT_LOGE("eventRecordPtr is null");
370         return ret;
371     }
372 
373     std::shared_ptr<CommonEventSubscriberManager> spinstance =
374         DelayedSingleton<CommonEventSubscriberManager>::GetInstance();
375     auto subscribers = spinstance->GetSubscriberRecords(eventRecord);
376     auto OrderedSubscriberCompareFunc = [] (
377         std::shared_ptr<EventSubscriberRecord> fist,
378         std::shared_ptr<EventSubscriberRecord> second) {
379         return fist->eventSubscribeInfo->GetPriority() > second->eventSubscribeInfo->GetPriority();
380     };
381     std::sort(subscribers.begin(), subscribers.end(), OrderedSubscriberCompareFunc);
382     eventRecordPtr->FillCommonEventRecord(eventRecord);
383     eventRecordPtr->resultTo = commonEventListener;
384     eventRecordPtr->state = OrderedEventRecord::IDLE;
385     eventRecordPtr->nextReceiver = 0;
386     eventRecordPtr->receivers = subscribers;
387     for (auto vec : eventRecordPtr->receivers) {
388         eventRecordPtr->deliveryState.emplace_back(OrderedEventRecord::PENDING);
389     }
390 
391     EnqueueOrderedRecord(eventRecordPtr);
392 
393     ret = ScheduleOrderedCommonEvent();
394 
395     return ret;
396 }
397 
EnqueueUnorderedRecord(const std::shared_ptr<OrderedEventRecord> & eventRecordPtr)398 bool CommonEventControlManager::EnqueueUnorderedRecord(const std::shared_ptr<OrderedEventRecord> &eventRecordPtr)
399 {
400     if (eventRecordPtr == nullptr) {
401         EVENT_LOGE("eventRecordPtr is null");
402         return false;
403     }
404 
405     std::lock_guard<std::mutex> lock(unorderedMutex_);
406 
407     unorderedEventQueue_.emplace_back(eventRecordPtr);
408 
409     return true;
410 }
411 
EnqueueOrderedRecord(const std::shared_ptr<OrderedEventRecord> & eventRecordPtr)412 bool CommonEventControlManager::EnqueueOrderedRecord(const std::shared_ptr<OrderedEventRecord> &eventRecordPtr)
413 {
414     if (eventRecordPtr == nullptr) {
415         EVENT_LOGE("eventRecordPtr is null");
416         return false;
417     }
418 
419     std::lock_guard<std::mutex> lock(orderedMutex_);
420 
421     orderedEventQueue_.emplace_back(eventRecordPtr);
422 
423     return true;
424 }
425 
EnqueueHistoryEventRecord(const std::shared_ptr<OrderedEventRecord> & eventRecordPtr,bool hasLastSubscribe)426 void CommonEventControlManager::EnqueueHistoryEventRecord(
427     const std::shared_ptr<OrderedEventRecord> &eventRecordPtr, bool hasLastSubscribe)
428 {
429     #ifdef BUILD_VARIANT_USER
430         EVENT_LOGD("User version don't record history");
431         return;
432     #endif
433     if (eventRecordPtr == nullptr) {
434         EVENT_LOGE("eventRecordPtr is nullptr");
435         return;
436     }
437 
438     HistoryEventRecord record;
439     record.want = eventRecordPtr->commonEventData->GetWant();
440     record.code = eventRecordPtr->commonEventData->GetCode();
441     record.data = eventRecordPtr->commonEventData->GetData();
442     record.sticky = eventRecordPtr->publishInfo->IsSticky();
443     record.ordered = eventRecordPtr->publishInfo->IsOrdered();
444     record.subscriberPermissions = eventRecordPtr->publishInfo->GetSubscriberPermissions();
445     record.recordTime = eventRecordPtr->recordTime;
446     record.pid = eventRecordPtr->eventRecordInfo.pid;
447     record.uid = eventRecordPtr->eventRecordInfo.uid;
448     record.userId = eventRecordPtr->userId;
449     record.bundleName = eventRecordPtr->eventRecordInfo.bundleName;
450     record.isSystemApp = eventRecordPtr->eventRecordInfo.isSystemApp;
451     record.isSystemEvent = eventRecordPtr->isSystemEvent;
452 
453     for (auto vec : eventRecordPtr->receivers) {
454         if (vec == nullptr) {
455             continue;
456         }
457         HistorySubscriberRecord receiver;
458         receiver.recordTime = vec->recordTime;
459         receiver.bundleName = vec->eventRecordInfo.bundleName;
460         receiver.priority = vec->eventSubscribeInfo->GetPriority();
461         receiver.userId = vec->eventSubscribeInfo->GetUserId();
462         receiver.permission = vec->eventSubscribeInfo->GetPermission();
463         receiver.deviceId = vec->eventSubscribeInfo->GetDeviceId();
464         receiver.isFreeze = vec->isFreeze;
465         receiver.freezeTime = vec->freezeTime;
466         record.receivers.emplace_back(receiver);
467     }
468 
469     record.hasLastSubscribe = hasLastSubscribe;
470     record.deliveryState = eventRecordPtr->deliveryState;
471     record.dispatchTime = eventRecordPtr->dispatchTime;
472     record.receiverTime = eventRecordPtr->receiverTime;
473     record.state = eventRecordPtr->state;
474     record.resultAbort = eventRecordPtr->resultAbort;
475     std::lock_guard<std::mutex> lock(historyMutex_);
476     if (historyEventRecords_.size() == HISTORY_MAX_SIZE) {
477         historyEventRecords_.pop_front();
478     }
479     historyEventRecords_.emplace_back(record);
480 }
481 
ScheduleOrderedCommonEvent()482 bool CommonEventControlManager::ScheduleOrderedCommonEvent()
483 {
484     EVENT_LOGD("enter");
485 
486     if (scheduled_) {
487         return true;
488     }
489 
490     scheduled_ = true;
491 
492     std::weak_ptr<CommonEventControlManager> weak = shared_from_this();
493     orderedQueue_->submit([weak]() {
494         auto manager = weak.lock();
495         if (manager == nullptr) {
496             EVENT_LOGE("CommonEventControlManager is null");
497             return;
498         }
499         manager->ProcessNextOrderedEvent(true);
500     });
501     return true;
502 }
503 
NotifyOrderedEvent(std::shared_ptr<OrderedEventRecord> & eventRecordPtr,size_t index)504 bool CommonEventControlManager::NotifyOrderedEvent(std::shared_ptr<OrderedEventRecord> &eventRecordPtr, size_t index)
505 {
506     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
507     EVENT_LOGD("enter with index %{public}zu", index);
508     if (eventRecordPtr == nullptr) {
509         EVENT_LOGE("eventRecordPtr = nullptr");
510         return false;
511     }
512     size_t receiverNum = eventRecordPtr->receivers.size();
513     if ((index < 0) || (index >= receiverNum)) {
514         EVENT_LOGE("Invalid index (= %{public}zu)", index);
515         return false;
516     }
517     int8_t ret = CheckPermission(*(eventRecordPtr->receivers[index]), *eventRecordPtr);
518     if (ret == OrderedEventRecord::SKIPPED) {
519         eventRecordPtr->deliveryState[index] = ret;
520         return true;
521     }
522     if (ret == OrderedEventRecord::DELIVERED) {
523         if (eventRecordPtr->receivers[index]->isFreeze) {
524             EVENT_LOGD("vec isFreeze: %{public}d", eventRecordPtr->receivers[index]->isFreeze);
525             DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->InsertFrozenEvents(
526                 eventRecordPtr->receivers[index], *eventRecordPtr);
527             DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->InsertFrozenEventsMap(
528                 eventRecordPtr->receivers[index], *eventRecordPtr);
529             eventRecordPtr->deliveryState[index] = OrderedEventRecord::SKIPPED;
530             eventRecordPtr->curReceiver = nullptr;
531             return true;
532         }
533         eventRecordPtr->deliveryState[index] = ret;
534         eventRecordPtr->curReceiver = eventRecordPtr->receivers[index]->commonEventListener;
535         eventRecordPtr->state = OrderedEventRecord::RECEIVING;
536         sptr<IEventReceive> receiver = iface_cast<IEventReceive>(eventRecordPtr->curReceiver);
537         if (!receiver) {
538             EVENT_LOGE("Failed to get IEventReceive proxy");
539             eventRecordPtr->curReceiver = nullptr;
540             return false;
541         }
542         eventRecordPtr->state = OrderedEventRecord::RECEIVED;
543         receiver->NotifyEvent(*(eventRecordPtr->commonEventData), true, eventRecordPtr->publishInfo->IsSticky());
544         EVENT_LOGD("NotifyOrderedEvent index = %{public}zu event = %{public}s success, subId = %{public}s", index,
545             eventRecordPtr->commonEventData->GetWant().GetAction().c_str(),
546             eventRecordPtr->receivers[index]->eventRecordInfo.subId.c_str());
547         AccessTokenHelper::RecordSensitivePermissionUsage(
548             eventRecordPtr->receivers[index]->eventRecordInfo.callerToken,
549             eventRecordPtr->commonEventData->GetWant().GetAction());
550     }
551     return true;
552 }
553 
ProcessNextOrderedEvent(bool isSendMsg)554 void CommonEventControlManager::ProcessNextOrderedEvent(bool isSendMsg)
555 {
556     HITRACE_METER_NAME(HITRACE_TAG_NOTIFICATION, __PRETTY_FUNCTION__);
557     EVENT_LOGD("enter");
558 
559     if (isSendMsg) {
560         scheduled_ = false;
561     }
562 
563     std::shared_ptr<OrderedEventRecord> sp = nullptr;
564 
565     std::lock_guard<std::mutex> lock(orderedMutex_);
566 
567     do {
568         if (orderedEventQueue_.empty()) {
569             EVENT_LOGD("orderedEventQueue_ is empty");
570             return;
571         }
572 
573         sp = orderedEventQueue_.front();
574         bool forceReceive = false;
575         size_t numReceivers = sp->receivers.size();
576         uint64_t nowSysTime = static_cast<uint64_t>(SystemTime::GetNowSysTime());
577 
578         if (sp->dispatchTime > 0) {
579             if ((numReceivers > 0) && (nowSysTime > static_cast<uint64_t>(sp->dispatchTime) +
580                 (DOUBLE * TIMEOUT * numReceivers))) {
581                 CurrentOrderedEventTimeout(false);
582                 forceReceive = true;
583                 sp->state = OrderedEventRecord::IDLE;
584             }
585         }
586 
587         if (sp->state != OrderedEventRecord::IDLE) {
588             return;
589         }
590 
591         if ((sp->receivers.empty()) || (sp->nextReceiver >= numReceivers) || sp->resultAbort || forceReceive) {
592             // No more receivers for this ordered common event, then process the final result receiver
593             bool hasLastSubscribe = (sp->resultTo != nullptr) ? true : false;
594             if (sp->resultTo != nullptr) {
595                 EVENT_LOGD("Process the final subscriber");
596                 sptr<IEventReceive> receiver = iface_cast<IEventReceive>(sp->resultTo);
597                 if (!receiver) {
598                     EVENT_LOGE("Failed to get IEventReceive proxy");
599                     return;
600                 }
601                 receiver->NotifyEvent(*(sp->commonEventData), true, sp->publishInfo->IsSticky());
602                 sp->resultTo = nullptr;
603             }
604             EVENT_LOGI("NotifyOrderedEvent = %{public}s end, success: %{public}zu, total: %{public}zu",
605                 sp->commonEventData->GetWant().GetAction().c_str(), sp->nextReceiver, numReceivers);
606             CancelTimeout();
607 
608             EnqueueHistoryEventRecord(sp, hasLastSubscribe);
609 
610             orderedEventQueue_.erase(orderedEventQueue_.begin());
611 
612             sp = nullptr;
613         }
614     } while (sp == nullptr);
615 
616     size_t recIdx = sp->nextReceiver++;
617     SetTime(recIdx, sp, pendingTimeoutMessage_);
618 
619     NotifyOrderedEvent(sp, recIdx);
620     if (sp->curReceiver == nullptr) {
621         sp->state = OrderedEventRecord::IDLE;
622         ScheduleOrderedCommonEvent();
623     }
624 }
625 
SetTime(size_t recIdx,std::shared_ptr<OrderedEventRecord> & sp,bool timeoutMessage)626 void CommonEventControlManager::SetTime(size_t recIdx, std::shared_ptr<OrderedEventRecord> &sp, bool timeoutMessage)
627 {
628     EVENT_LOGD("enter");
629 
630     sp->receiverTime = SystemTime::GetNowSysTime();
631 
632     if (recIdx == 0) {
633         sp->dispatchTime = sp->receiverTime;
634     }
635 
636     if (!timeoutMessage) {
637         SetTimeout();
638     }
639 }
640 
SetTimeout()641 bool CommonEventControlManager::SetTimeout()
642 {
643     EVENT_LOGD("enter");
644 
645     bool ret = true;
646 
647     if (!pendingTimeoutMessage_) {
648         pendingTimeoutMessage_ = true;
649         std::weak_ptr<CommonEventControlManager> weak = shared_from_this();
650         orderedHandler = orderedQueue_->submit_h([weak]() {
651             auto manager = weak.lock();
652             if (manager == nullptr) {
653                 EVENT_LOGE("CommonEventControlManager is null");
654                 return;
655             }
656             manager->CurrentOrderedEventTimeout(true);
657         }, ffrt::task_attr().delay(TIMEOUT * TIME_UNIT_SIZE));
658     }
659 
660     return ret;
661 }
662 
CancelTimeout()663 bool CommonEventControlManager::CancelTimeout()
664 {
665     EVENT_LOGD("enter");
666 
667     if (pendingTimeoutMessage_) {
668         pendingTimeoutMessage_ = false;
669         orderedQueue_->cancel(orderedHandler);
670     }
671 
672     return true;
673 }
674 
CurrentOrderedEventTimeout(bool isFromMsg)675 void CommonEventControlManager::CurrentOrderedEventTimeout(bool isFromMsg)
676 {
677     EVENT_LOGD("enter");
678 
679     if (isFromMsg) {
680         pendingTimeoutMessage_ = false;
681     }
682 
683     if (orderedEventQueue_.empty()) {
684         EVENT_LOGE("empty orderedEventQueue_");
685         return;
686     }
687 
688     int64_t nowSysTime = SystemTime::GetNowSysTime();
689     std::shared_ptr<OrderedEventRecord> sp = orderedEventQueue_.front();
690 
691     if (isFromMsg) {
692         int64_t timeoutTime = sp->receiverTime + TIMEOUT;
693         if (timeoutTime > nowSysTime) {
694             SetTimeout();
695             return;
696         }
697     }
698 
699     // The processing of current receiver has timeout
700     sp->receiverTime = nowSysTime;
701 
702     if (sp->nextReceiver > 0) {
703         std::shared_ptr<EventSubscriberRecord> subscriberRecord = sp->receivers[sp->nextReceiver - 1];
704         EVENT_LOGW("Timeout: When %{public}s (pid = %{public}d, uid = %{public}d) process common event %{public}s",
705             subscriberRecord->eventRecordInfo.bundleName.c_str(),
706             subscriberRecord->eventRecordInfo.pid,
707             subscriberRecord->eventRecordInfo.uid,
708             sp->commonEventData->GetWant().GetAction().c_str());
709         SendOrderedEventProcTimeoutHiSysEvent(subscriberRecord, sp->commonEventData->GetWant().GetAction());
710 
711         sp->deliveryState[sp->nextReceiver - 1] = OrderedEventRecord::TIMEOUT;
712     }
713 
714     // Forced to finish the current receiver to process the next receiver
715     int32_t code = sp->commonEventData->GetCode();
716     const std::string &strRef = sp->commonEventData->GetData();
717     bool abort = sp->resultAbort;
718     FinishReceiver(sp, code, strRef, abort);
719 
720     ScheduleOrderedCommonEvent();
721 
722     return;
723 }
724 
FinishReceiver(std::shared_ptr<OrderedEventRecord> recordPtr,const int32_t & code,const std::string & receiverData,const bool & abortEvent)725 bool CommonEventControlManager::FinishReceiver(std::shared_ptr<OrderedEventRecord> recordPtr, const int32_t &code,
726     const std::string &receiverData, const bool &abortEvent)
727 {
728     EVENT_LOGD("enter");
729 
730     if (recordPtr == nullptr) {
731         EVENT_LOGE("recordPtr is null");
732         return false;
733     }
734 
735     EVENT_LOGD("enter recordPtr->state=%{public}d", recordPtr->state);
736 
737     int8_t state = recordPtr->state;
738     recordPtr->state = OrderedEventRecord::IDLE;
739     recordPtr->curReceiver = nullptr;
740     recordPtr->commonEventData->SetCode(code);
741     recordPtr->commonEventData->SetData(receiverData);
742     recordPtr->resultAbort = abortEvent;
743 
744     return state == OrderedEventRecord::RECEIVED;
745 }
746 
FinishReceiverAction(std::shared_ptr<OrderedEventRecord> recordPtr,const int32_t & code,const std::string & receiverData,const bool & abortEvent)747 bool CommonEventControlManager::FinishReceiverAction(std::shared_ptr<OrderedEventRecord> recordPtr, const int32_t &code,
748     const std::string &receiverData, const bool &abortEvent)
749 {
750     EVENT_LOGD("enter");
751 
752     if (recordPtr == nullptr) {
753         EVENT_LOGE("recordPtr is nullptr");
754         return false;
755     }
756 
757     bool doNext = false;
758     doNext = FinishReceiver(recordPtr, code, receiverData, abortEvent);
759     if (doNext) {
760         ProcessNextOrderedEvent(false);
761     }
762 
763     return true;
764 }
765 
CheckPermission(const EventSubscriberRecord & subscriberRecord,const CommonEventRecord & eventRecord)766 int8_t CommonEventControlManager::CheckPermission(
767     const EventSubscriberRecord &subscriberRecord, const CommonEventRecord &eventRecord)
768 {
769     EVENT_LOGD("enter");
770     if (subscriberRecord.eventRecordInfo.uid == eventRecord.eventRecordInfo.uid) {
771         EVENT_LOGD("CheckPermission subscribe uid = %{public}d, publish uid = %{public}d",
772             subscriberRecord.eventRecordInfo.uid, eventRecord.eventRecordInfo.uid);
773         return OrderedEventRecord::DELIVERED;
774     }
775     bool ret = false;
776     ret = CheckSubscriberPermission(subscriberRecord, eventRecord);
777     if (!ret) {
778         return OrderedEventRecord::SKIPPED;
779     }
780 
781     std::string subscriberRequiredPermission = subscriberRecord.eventSubscribeInfo->GetPermission();
782     ret = CheckSubscriberRequiredPermission(subscriberRequiredPermission, eventRecord, subscriberRecord);
783     if (!ret) {
784         return OrderedEventRecord::SKIPPED;
785     }
786 
787     std::vector<std::string> publisherRequiredPermissions = eventRecord.publishInfo->GetSubscriberPermissions();
788     ret = CheckPublisherRequiredPermissions(publisherRequiredPermissions, subscriberRecord, eventRecord);
789     if (!ret) {
790         return OrderedEventRecord::SKIPPED;
791     }
792 
793     return OrderedEventRecord::DELIVERED;
794 }
795 
CheckSubscriberPermission(const EventSubscriberRecord & subscriberRecord,const CommonEventRecord & eventRecord)796 bool CommonEventControlManager::CheckSubscriberPermission(
797     const EventSubscriberRecord &subscriberRecord, const CommonEventRecord &eventRecord)
798 {
799     EVENT_LOGD("enter");
800     bool ret = false;
801     std::string lackPermission {};
802     std::string event = eventRecord.commonEventData->GetWant().GetAction();
803     bool isSystemAPIEvent = DelayedSingleton<CommonEventPermissionManager>::GetInstance()->IsSystemAPIEvent(event);
804     if (isSystemAPIEvent && !(subscriberRecord.eventRecordInfo.isSubsystem
805         || subscriberRecord.eventRecordInfo.isSystemApp)) {
806         EVENT_LOGW("Invalid permission for system api event.");
807         return false;
808     }
809     Permission permission = DelayedSingleton<CommonEventPermissionManager>::GetInstance()->GetEventPermission(event);
810     if (permission.names.empty()) {
811         return true;
812     }
813 
814     if (permission.names.size() == 1) {
815         ret = AccessTokenHelper::VerifyAccessToken(subscriberRecord.eventRecordInfo.callerToken, permission.names[0]);
816         lackPermission = permission.names[0];
817     } else if (permission.state == PermissionState::AND) {
818         for (auto vec : permission.names) {
819             ret = AccessTokenHelper::VerifyAccessToken(subscriberRecord.eventRecordInfo.callerToken, vec);
820             if (!ret) {
821                 lackPermission = vec;
822                 break;
823             }
824         }
825     } else if (permission.state == PermissionState::OR) {
826         for (auto vec : permission.names) {
827             ret = AccessTokenHelper::VerifyAccessToken(subscriberRecord.eventRecordInfo.callerToken, vec);
828             lackPermission += vec + CONNECTOR;
829             if (ret) {
830                 break;
831             }
832         }
833         lackPermission = lackPermission.substr(0, lackPermission.length() - CONNECTOR.length());
834     } else {
835         EVENT_LOGW("Invalid Permission.");
836         return false;
837     }
838     if (!ret) {
839         EVENT_LOGW("No permission to receive common event %{public}s, "
840                     "due to subscriber %{public}s (pid = %{public}d, uid = %{public}d) lacks "
841                     "the %{public}s permission.",
842             event.c_str(), subscriberRecord.eventRecordInfo.bundleName.c_str(),
843             subscriberRecord.eventRecordInfo.pid, subscriberRecord.eventRecordInfo.uid, lackPermission.c_str());
844     }
845 
846     return ret;
847 }
848 
CheckSubscriberRequiredPermission(const std::string & subscriberRequiredPermission,const CommonEventRecord & eventRecord,const EventSubscriberRecord & subscriberRecord)849 bool CommonEventControlManager::CheckSubscriberRequiredPermission(const std::string &subscriberRequiredPermission,
850     const CommonEventRecord &eventRecord, const EventSubscriberRecord &subscriberRecord)
851 {
852     bool ret = false;
853 
854     if (subscriberRequiredPermission.empty()) {
855         return true;
856     }
857 
858     ret = AccessTokenHelper::VerifyAccessToken(eventRecord.eventRecordInfo.callerToken, subscriberRequiredPermission);
859     if (!ret) {
860         EVENT_LOGW("No permission to send common event %{public}s "
861                     "from %{public}s (pid = %{public}d, uid = %{public}d), userId = %{public}d "
862                     "to %{public}s (pid = %{public}d, uid = %{public}d), userId = %{public}d "
863                     "due to registered subscriber requires the %{public}s permission.",
864             eventRecord.commonEventData->GetWant().GetAction().c_str(),
865             eventRecord.eventRecordInfo.bundleName.c_str(),
866             eventRecord.eventRecordInfo.pid,
867             eventRecord.eventRecordInfo.uid,
868             eventRecord.userId,
869             subscriberRecord.eventRecordInfo.bundleName.c_str(),
870             subscriberRecord.eventRecordInfo.pid,
871             subscriberRecord.eventRecordInfo.uid,
872             subscriberRecord.eventSubscribeInfo->GetUserId(),
873             subscriberRequiredPermission.c_str());
874     }
875 
876     return ret;
877 }
878 
CheckPublisherRequiredPermissions(const std::vector<std::string> & publisherRequiredPermissions,const EventSubscriberRecord & subscriberRecord,const CommonEventRecord & eventRecord)879 bool CommonEventControlManager::CheckPublisherRequiredPermissions(
880     const std::vector<std::string> &publisherRequiredPermissions, const EventSubscriberRecord &subscriberRecord,
881     const CommonEventRecord &eventRecord)
882 {
883     bool ret = false;
884 
885     if (publisherRequiredPermissions.empty()) {
886         return true;
887     }
888 
889     for (auto publisherRequiredPermission : publisherRequiredPermissions) {
890         ret = AccessTokenHelper::VerifyAccessToken(
891             subscriberRecord.eventRecordInfo.callerToken, publisherRequiredPermission);
892         if (!ret) {
893             EVENT_LOGW("No permission to receive common event %{public}s "
894                         "to %{public}s (pid = %{public}d, uid = %{public}d), userId = %{public}d "
895                         "due to publisher %{public}s (pid = %{public}d, uid = %{public}d),"
896                         " userId = %{public}d requires the %{public}s permission.",
897                 eventRecord.commonEventData->GetWant().GetAction().c_str(),
898                 subscriberRecord.eventRecordInfo.bundleName.c_str(),
899                 subscriberRecord.eventRecordInfo.pid,
900                 subscriberRecord.eventRecordInfo.uid,
901                 subscriberRecord.eventSubscribeInfo->GetUserId(),
902                 eventRecord.eventRecordInfo.bundleName.c_str(),
903                 eventRecord.eventRecordInfo.pid,
904                 eventRecord.eventRecordInfo.uid,
905                 eventRecord.userId,
906                 publisherRequiredPermission.c_str());
907             break;
908         }
909     }
910 
911     return ret;
912 }
913 
GetUnorderedEventRecords(const std::string & event,const int32_t & userId,std::vector<std::shared_ptr<OrderedEventRecord>> & records)914 void CommonEventControlManager::GetUnorderedEventRecords(
915     const std::string &event, const int32_t &userId, std::vector<std::shared_ptr<OrderedEventRecord>> &records)
916 {
917     EVENT_LOGD("enter");
918     if (event.empty() && userId == ALL_USER) {
919         records = unorderedEventQueue_;
920     } else if (event.empty()) {
921         for (auto vec : unorderedEventQueue_) {
922             if (vec->userId == userId) {
923                 records.emplace_back(vec);
924             }
925         }
926     } else if (userId == ALL_USER) {
927         for (auto vec : unorderedEventQueue_) {
928             if (vec->commonEventData->GetWant().GetAction() == event) {
929                 records.emplace_back(vec);
930             }
931         }
932     } else {
933         for (auto vec : unorderedEventQueue_) {
934             if (vec->commonEventData->GetWant().GetAction() == event && vec->userId == userId) {
935                 records.emplace_back(vec);
936             }
937         }
938     }
939 }
940 
GetOrderedEventRecords(const std::string & event,const int32_t & userId,std::vector<std::shared_ptr<OrderedEventRecord>> & records)941 void CommonEventControlManager::GetOrderedEventRecords(
942     const std::string &event, const int32_t &userId, std::vector<std::shared_ptr<OrderedEventRecord>> &records)
943 {
944     EVENT_LOGD("enter");
945     if (event.empty() && userId == ALL_USER) {
946         records = orderedEventQueue_;
947     } else if (event.empty()) {
948         for (auto vec : orderedEventQueue_) {
949             if (vec->userId == userId) {
950                 records.emplace_back(vec);
951             }
952         }
953     } else if (userId == ALL_USER) {
954         for (auto vec : orderedEventQueue_) {
955             if (vec->commonEventData->GetWant().GetAction() == event) {
956                 records.emplace_back(vec);
957             }
958         }
959     } else {
960         for (auto vec : orderedEventQueue_) {
961             if (vec->commonEventData->GetWant().GetAction() == event && vec->userId == userId) {
962                 records.emplace_back(vec);
963             }
964         }
965     }
966 }
967 
GetHistoryEventRecords(const std::string & event,const int32_t & userId,std::list<HistoryEventRecord> & records)968 void CommonEventControlManager::GetHistoryEventRecords(
969     const std::string &event, const int32_t &userId, std::list<HistoryEventRecord> &records)
970 {
971     EVENT_LOGD("enter");
972     if (event.empty() && userId == ALL_USER) {
973         records = historyEventRecords_;
974     } else if (event.empty()) {
975         for (auto vec : historyEventRecords_) {
976             if (vec.userId == userId) {
977                 records.push_back(vec);
978             }
979         }
980     } else if (userId == ALL_USER) {
981         for (auto vec : historyEventRecords_) {
982             if (vec.want.GetAction() == event) {
983                 records.push_back(vec);
984             }
985         }
986     } else {
987         for (auto vec : historyEventRecords_) {
988             if (vec.want.GetAction() == event && vec.userId == userId) {
989                 records.push_back(vec);
990             }
991         }
992     }
993 }
994 
DumpStateByCommonEventRecord(const std::shared_ptr<OrderedEventRecord> & record,std::string & dumpInfo)995 void CommonEventControlManager::DumpStateByCommonEventRecord(
996     const std::shared_ptr<OrderedEventRecord> &record, std::string &dumpInfo)
997 {
998     EVENT_LOGD("enter");
999 
1000     char systime[LENGTH];
1001     strftime(systime, sizeof(char) * LENGTH, "%Y%m%d %I:%M %p", &record->recordTime);
1002 
1003     std::string recordTime = "\tTime: " + std::string(systime) + "\n";
1004     std::string pid = "\tPID: " + std::to_string(record->eventRecordInfo.pid) + "\n";
1005     std::string uid = "\tUID: " + std::to_string(record->eventRecordInfo.uid) + "\n";
1006     std::string userId;
1007     switch (record->userId) {
1008         case UNDEFINED_USER:
1009             userId = "UNDEFINED_USER";
1010             break;
1011         case ALL_USER:
1012             userId = "ALL_USER";
1013             break;
1014         default:
1015             userId = std::to_string(record->userId);
1016             break;
1017     }
1018     userId = "\tUSERID: " + userId + "\n";
1019     std::string bundleName = "\tBundleName: " + record->eventRecordInfo.bundleName + "\n";
1020 
1021     std::string permission = "\tRequiredPermission: ";
1022     std::string separator;
1023     size_t permissionNum = 0;
1024     for (auto permissionVec : record->publishInfo->GetSubscriberPermissions()) {
1025         if (permissionNum == 0) {
1026             separator = "";
1027         } else {
1028             separator = ", ";
1029         }
1030         permission = permission + separator + permissionVec;
1031         permissionNum++;
1032     }
1033     permission = permission + "\n";
1034 
1035     std::string isSticky;
1036     if (record->publishInfo->IsSticky()) {
1037         isSticky = "\tIsSticky: true\n";
1038     } else {
1039         isSticky = "\tIsSticky: false\n";
1040     }
1041 
1042     std::string isOrdered;
1043     if (record->publishInfo->IsOrdered()) {
1044         isOrdered = "\tIsOrdered: true\n";
1045     } else {
1046         isOrdered = "\tIsOrdered: false\n";
1047     }
1048     std::string isSystemApp = record->eventRecordInfo.isSystemApp ? "true" : "false";
1049     isSystemApp = "\tIsSystemApp: " + isSystemApp + "\n";
1050     std::string isSystemEvent = record->isSystemEvent ? "true" : "false";
1051     isSystemEvent = "\tIsSystemEvent: " + isSystemEvent + "\n";
1052 
1053     std::string action = "\t\tAction: " + record->commonEventData->GetWant().GetAction() + "\n";
1054 
1055     std::string entities = "\t\tEntity: ";
1056     size_t entityNum = 0;
1057     for (auto entitiesVec : record->commonEventData->GetWant().GetEntities()) {
1058         if (entityNum == 0) {
1059             separator = "";
1060         } else {
1061             separator = ", ";
1062         }
1063         entities = entities + separator + entitiesVec;
1064         entityNum++;
1065     }
1066     entities = entities + "\n";
1067 
1068     std::string scheme = "\t\tScheme: " + record->commonEventData->GetWant().GetScheme() + "\n";
1069     std::string uri = "\t\tUri: " + record->commonEventData->GetWant().GetUriString() + "\n";
1070     std::string flags = "\t\tFlags: " + std::to_string(record->commonEventData->GetWant().GetFlags()) + "\n";
1071     std::string type = "\t\tType: " + record->commonEventData->GetWant().GetType() + "\n";
1072     std::string bundle = "\t\tBundleName: " + record->commonEventData->GetWant().GetBundle() + "\n";
1073     std::string ability = "\t\tAbilityName: " + record->commonEventData->GetWant().GetElement().GetAbilityName() + "\n";
1074     std::string deviced = "\t\tDevicedID: " + record->commonEventData->GetWant().GetElement().GetDeviceID() + "\n";
1075 
1076     std::string want = "\tWant:\n" + action + entities + scheme + uri + flags + type + bundle + ability + deviced;
1077     std::string code = "\tCode: " + std::to_string(record->commonEventData->GetCode()) + "\n";
1078     std::string data = "\tData: " + record->commonEventData->GetData() + "\n";
1079 
1080     std::string lastSubscriber;
1081     if (record->resultTo) {
1082         lastSubscriber = "\tHasLastSubscriber: true\n";
1083     } else {
1084         lastSubscriber = "\tHasLastSubscriber: false\n";
1085     }
1086 
1087     std::string state;
1088     switch (record->state) {
1089         case OrderedEventRecord::IDLE:
1090             state = "\tEventState: IDLE\n";
1091             break;
1092         case OrderedEventRecord::RECEIVING:
1093             state = "\tEventState: RECEIVING\n";
1094             break;
1095         case OrderedEventRecord::RECEIVED:
1096             state = "\tEventState: RECEIVED\n";
1097             break;
1098     }
1099 
1100     std::string dispatchTime = "\tDispatchTime: " + std::to_string(record->dispatchTime) + "\n";
1101     std::string receiverTime = "\tReceiverTime: " + std::to_string(record->receiverTime) + "\n";
1102     std::string resultAbort = record->resultAbort ? "true" : "false";
1103     resultAbort = "\tResultAbort: " + resultAbort + "\n";
1104 
1105     dumpInfo = recordTime + pid + uid + userId + bundleName + permission + isSticky + isOrdered + isSystemApp +
1106                isSystemEvent + want + code + data + lastSubscriber + state + receiverTime + dispatchTime + resultAbort;
1107 }
1108 
DumpHistoryStateByCommonEventRecord(const HistoryEventRecord & record,std::string & dumpInfo)1109 void CommonEventControlManager::DumpHistoryStateByCommonEventRecord(
1110     const HistoryEventRecord &record, std::string &dumpInfo)
1111 {
1112     EVENT_LOGD("enter");
1113 
1114     char systime[LENGTH];
1115     strftime(systime, sizeof(char) * LENGTH, "%Y%m%d %I:%M %p", &record.recordTime);
1116 
1117     std::string recordTime = "\tTime: " + std::string(systime) + "\n";
1118     std::string pid = "\tPID: " + std::to_string(record.pid) + "\n";
1119     std::string uid = "\tUID: " + std::to_string(record.uid) + "\n";
1120     std::string userId;
1121     switch (record.userId) {
1122         case UNDEFINED_USER:
1123             userId = "UNDEFINED_USER";
1124             break;
1125         case ALL_USER:
1126             userId = "ALL_USER";
1127             break;
1128         default:
1129             userId = std::to_string(record.userId);
1130             break;
1131     }
1132     userId = "\tUSERID: " + userId + "\n";
1133     std::string bundleName = "\tBundleName: " + record.bundleName + "\n";
1134 
1135     std::string permission = "\tRequiredPermission: ";
1136     std::string separator;
1137     size_t permissionNum = 0;
1138     for (auto permissionVec : record.subscriberPermissions) {
1139         if (permissionNum == 0) {
1140             separator = "";
1141         } else {
1142             separator = ", ";
1143         }
1144         permission = permission + separator + permissionVec;
1145         permissionNum++;
1146     }
1147     permission = permission + "\n";
1148 
1149     std::string isSticky;
1150     if (record.sticky) {
1151         isSticky = "\tIsSticky: true\n";
1152     } else {
1153         isSticky = "\tIsSticky: false\n";
1154     }
1155 
1156     std::string isOrdered;
1157     if (record.ordered) {
1158         isOrdered = "\tIsOrdered: true\n";
1159     } else {
1160         isOrdered = "\tIsOrdered: false\n";
1161     }
1162     std::string isSystemApp = record.isSystemApp ? "true" : "false";
1163     isSystemApp = "\tIsSystemApp: " + isSystemApp + "\n";
1164     std::string isSystemEvent = record.isSystemEvent ? "true" : "false";
1165     isSystemEvent = "\tIsSystemEvent: " + isSystemEvent + "\n";
1166 
1167     std::string action = "\t\tAction: " + record.want.GetAction() + "\n";
1168 
1169     std::string entities = "\t\tEntity: ";
1170     size_t entityNum = 0;
1171     for (auto entitiesVec : record.want.GetEntities()) {
1172         if (entityNum == 0) {
1173             separator = "";
1174         } else {
1175             separator = ", ";
1176         }
1177         entities = entities + separator + entitiesVec;
1178         entityNum++;
1179     }
1180     entities = entities + "\n";
1181 
1182     std::string scheme = "\t\tScheme: " + record.want.GetScheme() + "\n";
1183     std::string uri = "\t\tUri: " + record.want.GetUriString() + "\n";
1184     std::string flags = "\t\tFlags: " + std::to_string(record.want.GetFlags()) + "\n";
1185     std::string type = "\t\tType: " + record.want.GetType() + "\n";
1186     std::string bundle = "\t\tBundleName: " + record.want.GetBundle() + "\n";
1187     std::string ability = "\t\tAbilityName: " + record.want.GetElement().GetAbilityName() + "\n";
1188     std::string deviced = "\t\tDevicedID: " + record.want.GetElement().GetDeviceID() + "\n";
1189 
1190     std::string want = "\tWant:\n" + action + entities + scheme + uri + flags + type + bundle + ability + deviced;
1191     std::string code = "\tCode: " + std::to_string(record.code) + "\n";
1192     std::string data = "\tData: " + record.data + "\n";
1193 
1194     std::string lastSubscriber;
1195     if (record.hasLastSubscribe) {
1196         lastSubscriber = "\tHasLastSubscriber: true\n";
1197     } else {
1198         lastSubscriber = "\tHasLastSubscriber: false\n";
1199     }
1200 
1201     std::string state;
1202     switch (record.state) {
1203         case OrderedEventRecord::IDLE:
1204             state = "\tEventState: IDLE\n";
1205             break;
1206         case OrderedEventRecord::RECEIVING:
1207             state = "\tEventState: RECEIVING\n";
1208             break;
1209         case OrderedEventRecord::RECEIVED:
1210             state = "\tEventState: RECEIVED\n";
1211             break;
1212     }
1213 
1214     std::string dispatchTime = "\tDispatchTime: " + std::to_string(record.dispatchTime) + "\n";
1215     std::string receiverTime = "\tReceiverTime: " + std::to_string(record.receiverTime) + "\n";
1216     std::string resultAbort = record.resultAbort ? "true" : "false";
1217     resultAbort = "\tResultAbort: " + resultAbort + "\n";
1218 
1219     dumpInfo = recordTime + pid + uid + userId + bundleName + permission + isSticky + isOrdered + isSystemApp +
1220                isSystemEvent + want + code + data + lastSubscriber + state + receiverTime + dispatchTime + resultAbort;
1221 }
1222 
DumpStateBySubscriberRecord(const std::shared_ptr<OrderedEventRecord> & record,std::string & dumpInfo)1223 void CommonEventControlManager::DumpStateBySubscriberRecord(
1224     const std::shared_ptr<OrderedEventRecord> &record, std::string &dumpInfo)
1225 {
1226     EVENT_LOGD("enter");
1227 
1228     if (record->receivers.empty()) {
1229         dumpInfo = "\tSubscribers:\tNo information";
1230         return;
1231     }
1232 
1233     size_t num = 0;
1234     for (auto receiver : record->receivers) {
1235         num++;
1236 
1237         std::string title = std::to_string(num);
1238         if (num == 1) {
1239             title = "\tSubscribers:\tTotal " + std::to_string(record->receivers.size()) + " subscribers\n\tNO " +
1240                     title + "\n";
1241         } else {
1242             title = "\tNO " + title + "\n";
1243         }
1244 
1245         std::string dumpInfoBySubscriber;
1246         DelayedSingleton<CommonEventSubscriberManager>::GetInstance()->DumpDetailed(
1247             title, receiver, "\t\t", dumpInfoBySubscriber);
1248 
1249         std::string deliveryState;
1250         switch (record->deliveryState[num - 1]) {
1251             case OrderedEventRecord::PENDING:
1252                 deliveryState = "\t\tEventState: PENDING\n";
1253                 break;
1254             case OrderedEventRecord::DELIVERED:
1255                 deliveryState = "\t\tEventState: DELIVERED\n";
1256                 break;
1257             case OrderedEventRecord::SKIPPED:
1258                 deliveryState = "\t\tEventState: SKIPPED\n";
1259                 break;
1260             case OrderedEventRecord::TIMEOUT:
1261                 deliveryState = "\t\tEventState: TIMEOUT\n";
1262                 break;
1263         }
1264         dumpInfo = dumpInfo + dumpInfoBySubscriber + deliveryState;
1265     }
1266 }
1267 
DumpHistoryStateBySubscriberRecord(const HistoryEventRecord & record,std::string & dumpInfo)1268 void CommonEventControlManager::DumpHistoryStateBySubscriberRecord(
1269     const HistoryEventRecord &record, std::string &dumpInfo)
1270 {
1271     EVENT_LOGD("enter");
1272 
1273     if (record.receivers.empty()) {
1274         dumpInfo = "\tSubscribers:\tNo information";
1275         return;
1276     }
1277 
1278     size_t num = 0;
1279     for (auto receiver : record.receivers) {
1280         num++;
1281 
1282         std::string title = std::to_string(num);
1283         if (num == 1) {
1284             title = "\tSubscribers:\tTotal " + std::to_string(record.receivers.size()) +
1285                 " subscribers\n\tNO " + title + "\n";
1286         } else {
1287             title = "\tNO " + title + "\n";
1288         }
1289 
1290         char systime[LENGTH];
1291         strftime(systime, sizeof(char) * LENGTH, "%Y%m%d %I:%M %p", &receiver.recordTime);
1292         std::string format = "\t\t";
1293         std::string recordTime = format + "Time: " + std::string(systime) + "\n";
1294 
1295         std::string bundleName = format + "BundleName: " + receiver.bundleName + "\n";
1296         std::string priority = format + "Priority: " + std::to_string(receiver.priority) + "\n";
1297         std::string userId;
1298         switch (receiver.userId) {
1299             case UNDEFINED_USER:
1300                 userId = "UNDEFINED_USER";
1301                 break;
1302             case ALL_USER:
1303                 userId = "ALL_USER";
1304                 break;
1305             default:
1306                 userId = std::to_string(receiver.userId);
1307                 break;
1308         }
1309         userId = format + "USERID: " + userId + "\n";
1310         std::string permission = format + "Permission: " + receiver.permission + "\n";
1311         std::string deviceId = format + "DevicedID: " + receiver.deviceId + "\n";
1312 
1313         std::string isFreeze = receiver.isFreeze ? "true" : "false";
1314         isFreeze = format + "IsFreeze: " + isFreeze + "\n";
1315 
1316         std::string freezeTime;
1317         if (receiver.freezeTime == 0) {
1318             freezeTime = format + "FreezeTime:  -\n";
1319         } else {
1320             freezeTime = format + "FreezeTime: " + std::to_string(receiver.freezeTime) + "\n";
1321         }
1322 
1323         std::string deliveryState;
1324         switch (record.deliveryState[num - 1]) {
1325             case OrderedEventRecord::PENDING:
1326                 deliveryState = "\t\tEventState: PENDING\n";
1327                 break;
1328             case OrderedEventRecord::DELIVERED:
1329                 deliveryState = "\t\tEventState: DELIVERED\n";
1330                 break;
1331             case OrderedEventRecord::SKIPPED:
1332                 deliveryState = "\t\tEventState: SKIPPED\n";
1333                 break;
1334             case OrderedEventRecord::TIMEOUT:
1335                 deliveryState = "\t\tEventState: TIMEOUT\n";
1336                 break;
1337         }
1338         dumpInfo = dumpInfo + title + recordTime + bundleName + priority + userId + permission + deviceId + isFreeze +
1339                    freezeTime + deliveryState;
1340     }
1341 }
1342 
DumpState(const std::string & event,const int32_t & userId,std::vector<std::string> & state)1343 void CommonEventControlManager::DumpState(
1344     const std::string &event, const int32_t &userId, std::vector<std::string> &state)
1345 {
1346     EVENT_LOGD("enter");
1347 
1348     std::vector<std::shared_ptr<OrderedEventRecord>> records;
1349     std::vector<std::shared_ptr<OrderedEventRecord>> unorderedRecords;
1350     std::vector<std::shared_ptr<OrderedEventRecord>> orderedRecords;
1351     std::lock_guard<std::mutex> orderedLock(orderedMutex_);
1352     std::lock_guard<std::mutex> unorderedLock(unorderedMutex_);
1353     GetUnorderedEventRecords(event, userId, unorderedRecords);
1354     GetOrderedEventRecords(event, userId, orderedRecords);
1355     records.insert(records.end(), unorderedRecords.begin(), unorderedRecords.end());
1356     records.insert(records.end(), orderedRecords.begin(), orderedRecords.end());
1357 
1358     if (records.empty()) {
1359         state.emplace_back("Pending Events:\tNo information");
1360         return;
1361     }
1362 
1363     size_t num = 0;
1364     for (auto record : records) {
1365         num++;
1366 
1367         std::string no = std::to_string(num);
1368         if (num == 1) {
1369             no = "Pending Events:\tTotal " + std::to_string(records.size()) + " information\nNO " + no + "\n";
1370         } else {
1371             no = "NO " + no + "\n";
1372         }
1373         std::string commonEventRecord;
1374         DumpStateByCommonEventRecord(record, commonEventRecord);
1375         std::string subscriberRecord;
1376         DumpStateBySubscriberRecord(record, subscriberRecord);
1377         std::string stateInfo = no + commonEventRecord + subscriberRecord;
1378         state.emplace_back(stateInfo);
1379     }
1380 }
1381 
DumpHistoryState(const std::string & event,const int32_t & userId,std::vector<std::string> & state)1382 void CommonEventControlManager::DumpHistoryState(
1383     const std::string &event, const int32_t &userId, std::vector<std::string> &state)
1384 {
1385     EVENT_LOGD("enter");
1386 
1387     std::list<HistoryEventRecord> records;
1388     std::lock_guard<std::mutex> lock(historyMutex_);
1389     GetHistoryEventRecords(event, userId, records);
1390 
1391     if (records.empty()) {
1392         state.emplace_back("History Events:\tNo information");
1393         return;
1394     }
1395 
1396     size_t num = 0;
1397     for (auto record : records) {
1398         num++;
1399 
1400         std::string no = std::to_string(num);
1401         if (num == 1) {
1402             no = "History Events:\tTotal " + std::to_string(records.size()) + " information\nNO " + no + "\n";
1403         } else {
1404             no = "NO " + no + "\n";
1405         }
1406         std::string commonEventRecord;
1407         DumpHistoryStateByCommonEventRecord(record, commonEventRecord);
1408         std::string subscriberRecord;
1409         DumpHistoryStateBySubscriberRecord(record, subscriberRecord);
1410         std::string stateInfo = no + commonEventRecord + subscriberRecord;
1411         state.emplace_back(stateInfo);
1412     }
1413 }
1414 
SendOrderedEventProcTimeoutHiSysEvent(const std::shared_ptr<EventSubscriberRecord> & subscriberRecord,const std::string & eventName)1415 void CommonEventControlManager::SendOrderedEventProcTimeoutHiSysEvent(
1416     const std::shared_ptr<EventSubscriberRecord> &subscriberRecord, const std::string &eventName)
1417 {
1418     if (subscriberRecord == nullptr) {
1419         return;
1420     }
1421 
1422     EventInfo eventInfo;
1423     if (subscriberRecord->eventSubscribeInfo != nullptr) {
1424         eventInfo.userId = subscriberRecord->eventSubscribeInfo->GetUserId();
1425     }
1426     eventInfo.subscriberName = subscriberRecord->eventRecordInfo.bundleName;
1427     eventInfo.pid = subscriberRecord->eventRecordInfo.pid;
1428     eventInfo.uid = static_cast<int32_t>(subscriberRecord->eventRecordInfo.uid);
1429     eventInfo.eventName = eventName;
1430     EventReport::SendHiSysEvent(ORDERED_EVENT_PROC_TIMEOUT, eventInfo);
1431 }
1432 }  // namespace EventFwk
1433 }  // namespace OHOS