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