diff --git a/README.md b/README.md index c2099d6..b1aeb89 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Timing and Time +# Timing and Time - [Introduction](#section11660541593) - [Directory Structure](#section161941989596) @@ -28,6 +28,7 @@ The timing and time module provides APIs for managing the system time. └── services # Service implementation ``` + ## Usage ### Available JS APIs diff --git a/bundle.json b/bundle.json index 95d5d9e..a570cf1 100644 --- a/bundle.json +++ b/bundle.json @@ -13,7 +13,7 @@ "name": "time_native", "subsystem": "miscservices", "syscap": [ - "SystemCapability.MiscServices.Time" + "SystemCapability.Miscservices.Time" ], "features": [ ], diff --git a/services/time_manager/src/time_tick_notify.cpp b/services/time_manager/src/time_tick_notify.cpp index 666db42..6c9fa9b 100644 --- a/services/time_manager/src/time_tick_notify.cpp +++ b/services/time_manager/src/time_tick_notify.cpp @@ -73,7 +73,7 @@ void TimeTickNotify::RefreshNextTriggerTime() struct tm *tblock = localtime(&t); TIME_HILOGI(TIME_MODULE_SERVICE, "Time now: %{public}s", asctime(tblock)); auto UTCTimeMicro = duration_cast(system_clock::now().time_since_epoch()).count(); - TIME_HILOGD(TIME_MODULE_SERVICE, "Time Now Mirc: %{public}lld", UTCTimeMicro); + TIME_HILOGI(TIME_MODULE_SERVICE, "Time Now Mirc"); auto timeMilliseconds = GetMillisecondsFromUTC(UTCTimeMicro); nextTriggerTime_ = MINUTE_TO_MILLISECOND - timeMilliseconds; } diff --git a/services/time_manager/test/BUILD.gn b/services/time_manager/test/BUILD.gn index 763ca84..edd70ed 100644 --- a/services/time_manager/test/BUILD.gn +++ b/services/time_manager/test/BUILD.gn @@ -38,6 +38,7 @@ ohos_unittest("TimeServiceTest") { "//foundation/aafwk/standard/interfaces/innerkits/intent:intent", "//foundation/aafwk/standard/interfaces/innerkits/want:want", "//foundation/appexecfwk/standard/interfaces/innerkits/appexecfwk_core:appexecfwk_core", + "//foundation/distributedschedule/dmsfwk/services/dtbschedmgr:distributedschedsvr", "//foundation/distributedschedule/safwk/interfaces/innerkits/safwk:system_ability_fwk", "//foundation/distributedschedule/samgr/interfaces/innerkits/samgr_proxy:samgr_proxy", "//third_party/googletest:gtest_main", diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index 871e3cb..68b4250 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -182,6 +182,10 @@ void TimerManager::SetHandler(uint64_t id, auto nowElapsed = steady_clock::now(); auto nominalTrigger = ConvertToElapsed(milliseconds(triggerAtTime), type); + if (nominalTrigger < nowElapsed) { + TIME_HILOGI(TIME_MODULE_SERVICE, "invalid trigger time end."); + return; + } auto minTrigger = (IsSystemUid(uid)) ? (nowElapsed + ZERO_FUTURITY) : (nowElapsed + MIN_FUTURITY); auto triggerElapsed = (nominalTrigger > minTrigger) ? nominalTrigger : minTrigger; @@ -302,6 +306,10 @@ void TimerManager::ReAddTimerLocked(std::shared_ptr timer, TIME_HILOGI(TIME_MODULE_SERVICE, "start"); timer->when = timer->origWhen; auto whenElapsed = ConvertToElapsed(timer->when, timer->type); + if (whenElapsed < nowElapsed) { + TIME_HILOGI(TIME_MODULE_SERVICE, "invalid timer end."); + return; + } steady_clock::time_point maxElapsed; if (timer->windowLength == milliseconds::zero()) { maxElapsed = whenElapsed; @@ -319,10 +327,16 @@ std::chrono::steady_clock::time_point TimerManager::ConvertToElapsed(std::chrono { TIME_HILOGI(TIME_MODULE_SERVICE, "start"); if (type == RTC || type == RTC_WAKEUP) { - auto offset = when - system_clock::now().time_since_epoch(); + auto systemTimeNow = system_clock::now().time_since_epoch(); + auto offset = when - systemTimeNow; + TIME_HILOGI(TIME_MODULE_SERVICE, "systemTimeNow : %{public}lld", systemTimeNow.count()); + TIME_HILOGI(TIME_MODULE_SERVICE, "offset : %{public}lld", offset.count()); return steady_clock::now() + offset; } - auto offset = when - steady_clock::now().time_since_epoch(); + auto bootTimeNow = steady_clock::now().time_since_epoch(); + auto offset = when - bootTimeNow; + TIME_HILOGI(TIME_MODULE_SERVICE, "bootTimeNow : %{public}lld", bootTimeNow.count()); + TIME_HILOGI(TIME_MODULE_SERVICE, "offset : %{public}lld", offset.count()); TIME_HILOGI(TIME_MODULE_SERVICE, "end"); return steady_clock::now() + offset; } @@ -439,9 +453,17 @@ void TimerManager::RescheduleKernelTimerLocked() auto firstWakeup = FindFirstWakeupBatchLocked(); auto firstBatch = alarmBatches_.front(); if (firstWakeup != nullptr) { + auto alarmPtr = firstWakeup->Get(0); + if (alarmPtr != nullptr) { + TIME_HILOGI(TIME_MODULE_SERVICE, "wake up alarm id :%{public}" PRId64 "", alarmPtr->id); + } SetLocked(ELAPSED_REALTIME_WAKEUP, firstWakeup->GetStart().time_since_epoch()); } if (firstBatch != firstWakeup) { + auto alarmPtr = firstBatch->Get(0); + if (alarmPtr != nullptr) { + TIME_HILOGI(TIME_MODULE_SERVICE, "nonwakeup alarm id :%{public}" PRId64 "", alarmPtr->id); + } nextNonWakeup = firstBatch->GetStart(); } } diff --git a/utils/native/src/time_permission.cpp b/utils/native/src/time_permission.cpp index c760b31..4a987c9 100644 --- a/utils/native/src/time_permission.cpp +++ b/utils/native/src/time_permission.cpp @@ -21,7 +21,7 @@ namespace OHOS { namespace MiscServices { namespace { constexpr int32_t SYSTEM_UID = 1000; -constexpr int32_t TEST_UID = 0; +constexpr int32_t ROOT_UID = 0; constexpr int32_t MIN_SYSTEM_UID = 2100; constexpr int32_t MAX_SYSTEM_UID = 2899; } @@ -37,8 +37,8 @@ bool TimePermission::CheckSelfPermission(std::string permName) bool TimePermission::CheckCallingPermission(int32_t uid, std::string permName) { - if ((uid == SYSTEM_UID) || (uid == TEST_UID)) { - TIME_HILOGD(TIME_MODULE_COMMON, "system uid return true"); + if ((uid == SYSTEM_UID) || (uid == ROOT_UID)) { + TIME_HILOGD(TIME_MODULE_COMMON, "root uid return true"); return true; } if (IsSystemUid(uid)) { @@ -46,6 +46,12 @@ bool TimePermission::CheckCallingPermission(int32_t uid, std::string permName) return true; } auto callingToken = IPCSkeleton::GetCallingTokenID(); + + auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callingToken); + if (tokenType == Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) { + TIME_HILOGD(TIME_MODULE_COMMON, "native token."); + return true; + } auto result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(callingToken, permName); if (result == Security::AccessToken::TypePermissionState::PERMISSION_DENIED) { return false;