1 /*
2 * Copyright (C) 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 #include "screenlock_system_ability.h"
16
17 #include <fcntl.h>
18 #include <sys/time.h>
19 #include <unistd.h>
20
21 #include <cerrno>
22 #include <ctime>
23 #include <functional>
24 #include <iostream>
25 #include <string>
26
27 #include "ability_manager_client.h"
28 #include "bundle_mgr_proxy.h"
29 #include "command.h"
30 #include "core_service_client.h"
31 #include "display_manager.h"
32 #include "dump_helper.h"
33 #include "hitrace_meter.h"
34 #include "ipc_skeleton.h"
35 #include "iservice_registry.h"
36 #include "os_account_manager.h"
37 #include "parameter.h"
38 #include "sclock_log.h"
39 #include "screenlock_appinfo.h"
40 #include "screenlock_common.h"
41 #include "screenlock_get_info_callback.h"
42 #include "system_ability.h"
43 #include "system_ability_definition.h"
44 #include "user_idm_client.h"
45
46 namespace OHOS {
47 namespace ScreenLock {
48 using namespace std;
49 using namespace OHOS::HiviewDFX;
50 using namespace OHOS::Rosen;
51 using namespace OHOS::UserIam::UserAuth;
52 using namespace OHOS::Telephony;
53 REGISTER_SYSTEM_ABILITY_BY_ID(ScreenLockSystemAbility, SCREENLOCK_SERVICE_ID, true);
54 const std::int64_t INIT_INTERVAL = 5000L;
55 const std::int64_t DELAY_TIME = 1000L;
56 const std::int64_t INTERVAL_ZERO = 0L;
57 std::mutex ScreenLockSystemAbility::instanceLock_;
58 sptr<ScreenLockSystemAbility> ScreenLockSystemAbility::instance_;
59 std::shared_ptr<AppExecFwk::EventHandler> ScreenLockSystemAbility::serviceHandler_;
60 constexpr const char *THEME_SCREENLOCK_WHITEAPP = "const.theme.screenlockWhiteApp";
61 constexpr const char *THEME_SCREENLOCK_APP = "const.theme.screenlockApp";
62 constexpr const char *CANCEL_UNLOCK_OPENATION = "The user canceled the unlock openation.";
63 static constexpr const int CONFIG_LEN = 128;
64 constexpr int32_t HANDLE_OK = 0;
65 constexpr int32_t MAX_RETRY_TIMES = 20;
66
ScreenLockSystemAbility(int32_t systemAbilityId,bool runOnCreate)67 ScreenLockSystemAbility::ScreenLockSystemAbility(int32_t systemAbilityId, bool runOnCreate)
68 : SystemAbility(systemAbilityId, runOnCreate), state_(ServiceRunningState::STATE_NOT_START)
69 {
70 }
71
~ScreenLockSystemAbility()72 ScreenLockSystemAbility::~ScreenLockSystemAbility()
73 {
74 SCLOCK_HILOGI("~ScreenLockSystemAbility state_ is %{public}d.", static_cast<int>(state_));
75 }
76
GetInstance()77 sptr<ScreenLockSystemAbility> ScreenLockSystemAbility::GetInstance()
78 {
79 if (instance_ == nullptr) {
80 std::lock_guard<std::mutex> autoLock(instanceLock_);
81 if (instance_ == nullptr) {
82 instance_ = new ScreenLockSystemAbility(SCREENLOCK_SERVICE_ID, true);
83 SCLOCK_HILOGE("ScreenLockSystemAbility create instance.");
84 }
85 }
86 return instance_;
87 }
88
Init()89 int32_t ScreenLockSystemAbility::Init()
90 {
91 bool ret = Publish(ScreenLockSystemAbility::GetInstance());
92 if (!ret) {
93 SCLOCK_HILOGE("Publish ScreenLockSystemAbility failed.");
94 return E_SCREENLOCK_PUBLISH_FAIL;
95 }
96 SCLOCK_HILOGD("state_ is %{public}d.", static_cast<int>(state_));
97 stateValue_.Reset();
98 SCLOCK_HILOGI("Init ScreenLockSystemAbility success.");
99 return ERR_OK;
100 }
101
OnStart()102 void ScreenLockSystemAbility::OnStart()
103 {
104 SCLOCK_HILOGI("ScreenLockSystemAbility::Enter OnStart.");
105 if (instance_ == nullptr) {
106 instance_ = this;
107 }
108 if (state_ == ServiceRunningState::STATE_RUNNING) {
109 SCLOCK_HILOGI("ScreenLockSystemAbility is already running.");
110 return;
111 }
112 InitServiceHandler();
113 if (Init() != ERR_OK) {
114 auto callback = [=]() { Init(); };
115 serviceHandler_->PostTask(callback, INIT_INTERVAL);
116 SCLOCK_HILOGE("ScreenLockSystemAbility Init failed. Try again 5s later");
117 return;
118 }
119 AddSystemAbilityListener(DISPLAY_MANAGER_SERVICE_SA_ID);
120 RegisterDumpCommand();
121 return;
122 }
123
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)124 void ScreenLockSystemAbility::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
125 {
126 SCLOCK_HILOGI("OnAddSystemAbility systemAbilityId:%{public}d added!", systemAbilityId);
127 if (systemAbilityId == DISPLAY_MANAGER_SERVICE_SA_ID) {
128 int times = 0;
129 if (displayPowerEventListener_ == nullptr) {
130 displayPowerEventListener_ = new ScreenLockSystemAbility::ScreenLockDisplayPowerEventListener();
131 }
132 RegisterDisplayPowerEventListener(times);
133 if (flag_) {
134 state_ = ServiceRunningState::STATE_RUNNING;
135 auto callback = [=]() { OnSystemReady(); };
136 serviceHandler_->PostTask(callback, INTERVAL_ZERO);
137 }
138 }
139 }
140
RegisterDisplayPowerEventListener(int32_t times)141 void ScreenLockSystemAbility::RegisterDisplayPowerEventListener(int32_t times)
142 {
143 times++;
144 flag_ = DisplayManager::GetInstance().RegisterDisplayPowerEventListener(displayPowerEventListener_);
145 if (flag_ == false && times <= MAX_RETRY_TIMES) {
146 SCLOCK_HILOGE("ScreenLockSystemAbility RegisterDisplayPowerEventListener failed");
147 auto callback = [this, times]() { RegisterDisplayPowerEventListener(times); };
148 serviceHandler_->PostTask(callback, DELAY_TIME);
149 }
150 SCLOCK_HILOGI("ScreenLockSystemAbility RegisterDisplayPowerEventListener end, flag_:%{public}d, times:%{public}d",
151 flag_, times);
152 }
153
InitServiceHandler()154 void ScreenLockSystemAbility::InitServiceHandler()
155 {
156 SCLOCK_HILOGI("InitServiceHandler started.");
157 if (serviceHandler_ != nullptr) {
158 SCLOCK_HILOGI("InitServiceHandler already init.");
159 return;
160 }
161 std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create("ScreenLockSystemAbility");
162 serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
163 SCLOCK_HILOGI("InitServiceHandler succeeded.");
164 }
165
OnStop()166 void ScreenLockSystemAbility::OnStop()
167 {
168 SCLOCK_HILOGI("OnStop started.");
169 if (state_ != ServiceRunningState::STATE_RUNNING) {
170 return;
171 }
172 serviceHandler_ = nullptr;
173 instance_ = nullptr;
174 state_ = ServiceRunningState::STATE_NOT_START;
175 DisplayManager::GetInstance().UnregisterDisplayPowerEventListener(displayPowerEventListener_);
176 SCLOCK_HILOGI("OnStop end.");
177 }
178
OnDisplayPowerEvent(DisplayPowerEvent event,EventStatus status)179 void ScreenLockSystemAbility::ScreenLockDisplayPowerEventListener::OnDisplayPowerEvent(
180 DisplayPowerEvent event, EventStatus status)
181 {
182 SCLOCK_HILOGI("OnDisplayPowerEvent event=%{public}d", static_cast<int>(event));
183 SCLOCK_HILOGI("OnDisplayPowerEvent status= %{public}d", static_cast<int>(status));
184 if (status == EventStatus::BEGIN) {
185 if (event == DisplayPowerEvent::WAKE_UP) {
186 instance_->OnBeginWakeUp();
187 } else if (event == DisplayPowerEvent::SLEEP) {
188 instance_->OnBeginSleep(0);
189 } else if (event == DisplayPowerEvent::DISPLAY_ON) {
190 instance_->OnBeginScreenOn();
191 } else if (event == DisplayPowerEvent::DISPLAY_OFF) {
192 instance_->OnBeginScreenOff();
193 } else if (event == DisplayPowerEvent::DESKTOP_READY) {
194 instance_->OnExitAnimation();
195 }
196 } else if (status == EventStatus::END) {
197 if (event == DisplayPowerEvent::WAKE_UP) {
198 instance_->OnEndWakeUp();
199 } else if (event == DisplayPowerEvent::SLEEP) {
200 instance_->OnEndSleep(0, 0);
201 } else if (event == DisplayPowerEvent::DISPLAY_ON) {
202 instance_->OnEndScreenOn();
203 } else if (event == DisplayPowerEvent::DISPLAY_OFF) {
204 instance_->OnEndScreenOff();
205 }
206 }
207 }
208
OnBeginScreenOff()209 void ScreenLockSystemAbility::OnBeginScreenOff()
210 {
211 SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginScreenOff started.");
212 stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_BEGIN_OFF));
213 SystemEvent systemEvent(BEGIN_SCREEN_OFF);
214 SystemEventCallBack(systemEvent);
215 }
216
OnEndScreenOff()217 void ScreenLockSystemAbility::OnEndScreenOff()
218 {
219 SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOff started.");
220 stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_END_OFF));
221 SystemEvent systemEvent(END_SCREEN_OFF);
222 SystemEventCallBack(systemEvent);
223 }
224
OnBeginScreenOn()225 void ScreenLockSystemAbility::OnBeginScreenOn()
226 {
227 SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginScreenOn started.");
228 stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_BEGIN_ON));
229 SystemEvent systemEvent(BEGIN_SCREEN_ON);
230 SystemEventCallBack(systemEvent);
231 }
232
OnSystemReady()233 void ScreenLockSystemAbility::OnSystemReady()
234 {
235 SCLOCK_HILOGI("ScreenLockSystemAbility OnSystemReady started.");
236 bool isExitFlag = false;
237 int tryTime = 20;
238 int minTryTime = 0;
239 while (!isExitFlag && (tryTime > minTryTime)) {
240 if (systemEventListener_ != nullptr) {
241 SCLOCK_HILOGI("ScreenLockSystemAbility OnSystemReady started1.");
242 std::lock_guard<std::mutex> lck(listenerMutex_);
243 SystemEvent systemEvent(SYSTEM_READY);
244 systemEventListener_->OnCallBack(systemEvent);
245 isExitFlag = true;
246 } else {
247 SCLOCK_HILOGE("ScreenLockSystemAbility OnSystemReady type not found., flag_ = %{public}d", flag_);
248 sleep(1);
249 }
250 --tryTime;
251 }
252 }
253
OnEndScreenOn()254 void ScreenLockSystemAbility::OnEndScreenOn()
255 {
256 SCLOCK_HILOGI("ScreenLockSystemAbility OnEndScreenOn started.");
257 stateValue_.SetScreenState(static_cast<int>(ScreenState::SCREEN_STATE_END_ON));
258 SystemEvent systemEvent(END_SCREEN_ON);
259 SystemEventCallBack(systemEvent);
260 }
261
OnBeginWakeUp()262 void ScreenLockSystemAbility::OnBeginWakeUp()
263 {
264 SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginWakeUp started.");
265 stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_BEGIN_WAKEUP));
266 SystemEvent systemEvent(BEGIN_WAKEUP);
267 SystemEventCallBack(systemEvent);
268 }
269
OnEndWakeUp()270 void ScreenLockSystemAbility::OnEndWakeUp()
271 {
272 SCLOCK_HILOGI("ScreenLockSystemAbility OnEndWakeUp started.");
273 stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_END_WAKEUP));
274 SystemEvent systemEvent(END_WAKEUP);
275 SystemEventCallBack(systemEvent);
276 }
277
OnBeginSleep(const int why)278 void ScreenLockSystemAbility::OnBeginSleep(const int why)
279 {
280 SCLOCK_HILOGI("ScreenLockSystemAbility OnBeginSleep started.");
281 stateValue_.SetOffReason(why);
282 stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_BEGIN_SLEEP));
283 SystemEvent systemEvent(BEGIN_SLEEP, std::to_string(why));
284 SystemEventCallBack(systemEvent);
285 }
286
OnEndSleep(const int why,const int isTriggered)287 void ScreenLockSystemAbility::OnEndSleep(const int why, const int isTriggered)
288 {
289 SCLOCK_HILOGI("ScreenLockSystemAbility OnEndSleep started.");
290 stateValue_.SetInteractiveState(static_cast<int>(InteractiveState::INTERACTIVE_STATE_END_SLEEP));
291 SystemEvent systemEvent(END_SLEEP, std::to_string(why));
292 SystemEventCallBack(systemEvent);
293 }
294
OnChangeUser(const int newUserId)295 void ScreenLockSystemAbility::OnChangeUser(const int newUserId)
296 {
297 SCLOCK_HILOGI("ScreenLockSystemAbility OnChangeUser started. newUserId %{public}d", newUserId);
298 const int minUserId = 0;
299 const int maxUserID = 999999999;
300 if (newUserId < minUserId || newUserId >= maxUserID) {
301 SCLOCK_HILOGI("ScreenLockSystemAbility newUserId invalid.");
302 return;
303 }
304 stateValue_.SetCurrentUser(newUserId);
305 SystemEvent systemEvent(CHANGE_USER, std::to_string(newUserId));
306 SystemEventCallBack(systemEvent);
307 }
308
OnScreenlockEnabled(bool enabled)309 void ScreenLockSystemAbility::OnScreenlockEnabled(bool enabled)
310 {
311 SCLOCK_HILOGI("ScreenLockSystemAbility OnScreenlockEnabled started.");
312 stateValue_.SetScreenlockEnabled(enabled);
313 SystemEvent systemEvent(SCREENLOCK_ENABLED, std::to_string(enabled));
314 SystemEventCallBack(systemEvent);
315 }
316
OnExitAnimation()317 void ScreenLockSystemAbility::OnExitAnimation()
318 {
319 SCLOCK_HILOGI("ScreenLockSystemAbility OnExitAnimation started.");
320 SystemEvent systemEvent(EXIT_ANIMATION);
321 SystemEventCallBack(systemEvent);
322 }
323
UnlockScreen(const sptr<ScreenLockSystemAbilityInterface> & listener)324 int32_t ScreenLockSystemAbility::UnlockScreen(const sptr<ScreenLockSystemAbilityInterface> &listener)
325 {
326 return UnlockInner(listener);
327 }
328
Unlock(const sptr<ScreenLockSystemAbilityInterface> & listener)329 int32_t ScreenLockSystemAbility::Unlock(const sptr<ScreenLockSystemAbilityInterface> &listener)
330 {
331 StartAsyncTrace(HITRACE_TAG_MISC, "ScreenLockSystemAbility::RequestUnlock begin", HITRACE_UNLOCKSCREEN);
332 if (!IsSystemApp()) {
333 SCLOCK_HILOGE("Calling app is not system app");
334 return E_SCREENLOCK_NOT_SYSTEM_APP;
335 }
336 return UnlockInner(listener);
337 }
338
UnlockInner(const sptr<ScreenLockSystemAbilityInterface> & listener)339 int32_t ScreenLockSystemAbility::UnlockInner(const sptr<ScreenLockSystemAbilityInterface> &listener)
340 {
341 if (state_ != ServiceRunningState::STATE_RUNNING) {
342 SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock restart.");
343 OnStart();
344 }
345 SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock started.");
346
347 // check whether the page of app request unlock is the focus page
348 std::lock_guard<std::mutex> guard(lock_);
349 if (!IsAppInForeground(IPCSkeleton::GetCallingTokenID())) {
350 FinishAsyncTrace(
351 HITRACE_TAG_MISC, "ScreenLockSystemAbility::RequestUnlock finish by foucus", HITRACE_UNLOCKSCREEN);
352 SCLOCK_HILOGI("ScreenLockSystemAbility RequestUnlock Unfocused.");
353 return E_SCREENLOCK_NO_PERMISSION;
354 }
355 unlockVecListeners_.push_back(listener);
356 SystemEvent systemEvent(UNLOCKSCREEN);
357 SystemEventCallBack(systemEvent, HITRACE_UNLOCKSCREEN);
358 return E_SCREENLOCK_OK;
359 }
360
Lock(const sptr<ScreenLockSystemAbilityInterface> & listener)361 int32_t ScreenLockSystemAbility::Lock(const sptr<ScreenLockSystemAbilityInterface> &listener)
362 {
363 SCLOCK_HILOGI("ScreenLockSystemAbility RequestLock started.");
364 if (!IsAppInForeground(IPCSkeleton::GetCallingTokenID())) {
365 SCLOCK_HILOGE("Calling app is not Unfocused.");
366 return E_SCREENLOCK_NO_PERMISSION;
367 }
368 if (!IsWhiteListApp(IPCSkeleton::GetCallingTokenID(), THEME_SCREENLOCK_WHITEAPP)) {
369 SCLOCK_HILOGE("Calling app is not whitelist app");
370 return E_SCREENLOCK_NO_PERMISSION;
371 }
372 if (IsScreenLocked()) {
373 return E_SCREENLOCK_NO_PERMISSION;
374 }
375 lock_.lock();
376 lockVecListeners_.push_back(listener);
377 lock_.unlock();
378
379 SystemEvent systemEvent(LOCKSCREEN);
380 SystemEventCallBack(systemEvent, HITRACE_LOCKSCREEN);
381 return E_SCREENLOCK_OK;
382 }
383
IsLocked(bool & isLocked)384 int32_t ScreenLockSystemAbility::IsLocked(bool &isLocked)
385 {
386 if (!IsSystemApp()) {
387 SCLOCK_HILOGE("Calling app is not system app");
388 return E_SCREENLOCK_NOT_SYSTEM_APP;
389 }
390 isLocked = IsScreenLocked();
391 return E_SCREENLOCK_OK;
392 }
393
IsScreenLocked()394 bool ScreenLockSystemAbility::IsScreenLocked()
395 {
396 if (state_ != ServiceRunningState::STATE_RUNNING) {
397 SCLOCK_HILOGI("IsScreenLocked restart.");
398 OnStart();
399 }
400 SCLOCK_HILOGI("ScreenLockSystemAbility IsScreenLocked started.");
401 std::lock_guard<std::mutex> guard(lock_);
402 bool screnLockState = stateValue_.GetScreenlockedState();
403 SCLOCK_HILOGI("IsScreenLocked screnLockState = %{public}d", screnLockState);
404 return screnLockState;
405 }
406
GetSecure()407 bool ScreenLockSystemAbility::GetSecure()
408 {
409 if (state_ != ServiceRunningState::STATE_RUNNING) {
410 SCLOCK_HILOGI("ScreenLockSystemAbility GetSecure restart.");
411 OnStart();
412 }
413 SCLOCK_HILOGI("ScreenLockSystemAbility GetSecure started.");
414 int callingUid = IPCSkeleton::GetCallingUid();
415 SCLOCK_HILOGD("ScreenLockSystemAbility::GetSecure callingUid=%{public}d", callingUid);
416 int userId = 0;
417 AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(callingUid, userId);
418 SCLOCK_HILOGD("userId=%{public}d", userId);
419 auto getInfoCallback = std::make_shared<ScreenLockGetInfoCallback>();
420 int32_t result = UserIdmClient::GetInstance().GetCredentialInfo(userId, AuthType::PIN, getInfoCallback);
421 SCLOCK_HILOGI("GetCredentialInfo AuthType::PIN result = %{public}d", result);
422 if (result == static_cast<int32_t>(ResultCode::SUCCESS) && getInfoCallback->IsSecure()) {
423 return true;
424 }
425 result = UserIdmClient::GetInstance().GetCredentialInfo(userId, AuthType::FACE, getInfoCallback);
426 SCLOCK_HILOGI("GetCredentialInfo AuthType::FACE result = %{public}d", result);
427 if (result == static_cast<int32_t>(ResultCode::SUCCESS) && getInfoCallback->IsSecure()) {
428 return true;
429 }
430 return false;
431 }
432
OnSystemEvent(const sptr<ScreenLockSystemAbilityInterface> & listener)433 int32_t ScreenLockSystemAbility::OnSystemEvent(const sptr<ScreenLockSystemAbilityInterface> &listener)
434 {
435 SCLOCK_HILOGI("ScreenLockSystemAbility::OnSystemEvent started.");
436 if (!IsWhiteListApp(IPCSkeleton::GetCallingTokenID(), THEME_SCREENLOCK_APP)) {
437 SCLOCK_HILOGE("Calling app is not whitelist app");
438 return E_SCREENLOCK_NO_PERMISSION;
439 }
440
441 std::lock_guard<std::mutex> lck(listenerMutex_);
442 systemEventListener_ = listener;
443 SCLOCK_HILOGI("ScreenLockSystemAbility::OnSystemEvent end.");
444 return E_SCREENLOCK_OK;
445 }
446
SendScreenLockEvent(const std::string & event,int param)447 int32_t ScreenLockSystemAbility::SendScreenLockEvent(const std::string &event, int param)
448 {
449 SCLOCK_HILOGI("ScreenLockSystemAbility SendScreenLockEvent started.");
450 if (!IsWhiteListApp(IPCSkeleton::GetCallingTokenID(), THEME_SCREENLOCK_APP)) {
451 SCLOCK_HILOGE("Calling app is not whitelist app");
452 return E_SCREENLOCK_NO_PERMISSION;
453 }
454 SCLOCK_HILOGD("event=%{public}s ,param=%{public}d", event.c_str(), param);
455 int stateResult = param;
456 if (event == UNLOCK_SCREEN_RESULT) {
457 UnlockScreenEvent(stateResult);
458 } else if (event == SCREEN_DRAWDONE) {
459 SetScreenlocked(true);
460 DisplayManager::GetInstance().NotifyDisplayEvent(DisplayEvent::KEYGUARD_DRAWN);
461 } else if (event == LOCK_SCREEN_RESULT) {
462 LockScreenEvent(stateResult);
463 }
464 return E_SCREENLOCK_OK;
465 }
466
SetScreenlocked(bool isScreenlocked)467 void ScreenLockSystemAbility::SetScreenlocked(bool isScreenlocked)
468 {
469 SCLOCK_HILOGI("ScreenLockSystemAbility SetScreenlocked started.");
470 std::lock_guard<std::mutex> guard(lock_);
471 stateValue_.SetScreenlocked(isScreenlocked);
472 }
473
Reset()474 void StateValue::Reset()
475 {
476 isScreenlocked_ = true;
477 screenlockEnabled_ = true;
478 currentUser_ = USER_NULL;
479 }
480
OnDump()481 void ScreenLockSystemAbility::OnDump()
482 {
483 std::lock_guard<std::mutex> guard(lock_);
484 struct tm *timeNow = nullptr;
485 time_t second = time(0);
486 if (second > 0) {
487 timeNow = localtime(&second);
488 if (timeNow != nullptr) {
489 SCLOCK_HILOGI(
490 "ScreenLockSystemAbility dump time:%{public}d-%{public}d-%{public}d %{public}d:%{public}d:%{public}d",
491 timeNow->tm_year + startTime_, timeNow->tm_mon + extraMonth_, timeNow->tm_mday, timeNow->tm_hour,
492 timeNow->tm_min, timeNow->tm_sec);
493 }
494 } else {
495 SCLOCK_HILOGI("ScreenLockSystemAbility dump, time(0) is nullptr");
496 }
497 }
498
Dump(int fd,const std::vector<std::u16string> & args)499 int ScreenLockSystemAbility::Dump(int fd, const std::vector<std::u16string> &args)
500 {
501 int uid = static_cast<int>(IPCSkeleton::GetCallingUid());
502 const int maxUid = 10000;
503 if (uid > maxUid) {
504 return 0;
505 }
506
507 std::vector<std::string> argsStr;
508 for (auto item : args) {
509 argsStr.emplace_back(Str16ToStr8(item));
510 }
511
512 DumpHelper::GetInstance().Dispatch(fd, argsStr);
513 return ERR_OK;
514 }
515
RegisterDumpCommand()516 void ScreenLockSystemAbility::RegisterDumpCommand()
517 {
518 auto cmd = std::make_shared<Command>(std::vector<std::string>{ "-all" }, "dump all screenlock information",
519 [this](const std::vector<std::string> &input, std::string &output) -> bool {
520 bool screenLocked = stateValue_.GetScreenlockedState();
521 bool screenState = stateValue_.GetScreenState();
522 int32_t offReason = stateValue_.GetOffReason();
523 int32_t interactiveState = stateValue_.GetInteractiveState();
524 string temp_screenLocked = "";
525 screenLocked ? temp_screenLocked = "true" : temp_screenLocked = "false";
526 string temp_screenState = "";
527 screenState ? temp_screenState = "true" : temp_screenState = "false";
528 output.append("\n Screenlock system state\\tValue\\t\\tDescription\n")
529 .append(" * screenLocked \t\t" + temp_screenLocked + "\t\twhether there is lock screen status\n")
530 .append(" * screenState \t\t" + temp_screenState + "\t\tscreen on / off status\n")
531 .append(" * offReason \t\t\t" + std::to_string(offReason) + "\t\tscreen failure reason\n")
532 .append(" * interactiveState \t\t" + std::to_string(interactiveState) +
533 "\t\tscreen interaction status\n");
534 return true;
535 });
536 DumpHelper::GetInstance().RegisterCommand(cmd);
537 }
538
539 #ifdef OHOS_TEST_FLAG
IsAppInForeground(uint32_t tokenId)540 bool ScreenLockSystemAbility::IsAppInForeground(uint32_t tokenId)
541 {
542 return true;
543 }
544 #else
IsAppInForeground(uint32_t tokenId)545 bool ScreenLockSystemAbility::IsAppInForeground(uint32_t tokenId)
546 {
547 using namespace OHOS::AAFwk;
548 AppInfo appInfo;
549 auto ret = ScreenLockAppInfo::GetAppInfoByToken(tokenId, appInfo);
550 if (!ret || appInfo.bundleName.empty()) {
551 SCLOCK_HILOGI("get bundle name by token failed");
552 return false;
553 }
554 auto elementName = AbilityManagerClient::GetInstance()->GetTopAbility();
555 SCLOCK_HILOGD(" TopelementName:%{public}s, elementName.GetBundleName:%{public}s",
556 elementName.GetBundleName().c_str(), appInfo.bundleName.c_str());
557 return elementName.GetBundleName() == appInfo.bundleName;
558 }
559 #endif
560
LockScreenEvent(int stateResult)561 void ScreenLockSystemAbility::LockScreenEvent(int stateResult)
562 {
563 SCLOCK_HILOGD("ScreenLockSystemAbility LockScreenEvent stateResult:%{public}d", stateResult);
564 if (stateResult == ScreenChange::SCREEN_SUCC) {
565 SetScreenlocked(true);
566 DisplayManager::GetInstance().NotifyDisplayEvent(DisplayEvent::KEYGUARD_DRAWN);
567 } else if (stateResult == ScreenChange::SCREEN_FAIL || stateResult == ScreenChange::SCREEN_CANCEL) {
568 SetScreenlocked(false);
569 }
570 lock_.lock();
571 if (lockVecListeners_.size()) {
572 auto callback = [=]() {
573 for (size_t i = 0; i < lockVecListeners_.size(); i++) {
574 SystemEvent systemEvent("", std::to_string(stateResult));
575 lockVecListeners_[i]->OnCallBack(systemEvent);
576 }
577 lockVecListeners_.clear();
578 };
579 serviceHandler_->PostTask(callback, INTERVAL_ZERO);
580 }
581 lock_.unlock();
582 }
583
UnlockScreenEvent(int stateResult)584 void ScreenLockSystemAbility::UnlockScreenEvent(int stateResult)
585 {
586 SCLOCK_HILOGD("ScreenLockSystemAbility UnlockScreenEvent stateResult:%{public}d", stateResult);
587 if (stateResult == SCREEN_SUCC) {
588 SetScreenlocked(false);
589 DisplayManager::GetInstance().NotifyDisplayEvent(DisplayEvent::UNLOCK);
590 } else if (stateResult == SCREEN_FAIL || stateResult == SCREEN_CANCEL) {
591 SetScreenlocked(true);
592 }
593 std::lock_guard<std::mutex> autoLock(lock_);
594 if (unlockVecListeners_.size()) {
595 auto callback = [=]() {
596 for (size_t i = 0; i < unlockVecListeners_.size(); i++) {
597 if (stateResult == SCREEN_CANCEL) {
598 ErrorInfo errorInfo(JsErrorCode::ERR_CANCEL_UNLOCK, CANCEL_UNLOCK_OPENATION);
599 unlockVecListeners_[i]->SetErrorInfo(errorInfo);
600 }
601 SystemEvent systemEvent("", std::to_string(stateResult));
602 unlockVecListeners_[i]->OnCallBack(systemEvent);
603 }
604 unlockVecListeners_.clear();
605 };
606 serviceHandler_->PostTask(callback, INTERVAL_ZERO);
607 }
608 }
609
GetScreenlockParameter(const std::string & key) const610 std::string ScreenLockSystemAbility::GetScreenlockParameter(const std::string &key) const
611 {
612 char value[CONFIG_LEN] = { 0 };
613 auto errNo = GetParameter(key.c_str(), "", value, CONFIG_LEN);
614 if (errNo > HANDLE_OK) {
615 SCLOCK_HILOGD("GetParameter success, value = %{public}.5s.", value);
616 return value;
617 }
618 SCLOCK_HILOGE("GetParameter failed, errNo = %{public}d.", errNo);
619 return "";
620 }
621
622 #ifdef OHOS_TEST_FLAG
IsWhiteListApp(uint32_t callingTokenId,const std::string & key)623 bool ScreenLockSystemAbility::IsWhiteListApp(uint32_t callingTokenId, const std::string &key)
624 {
625 return true;
626 }
627
IsSystemApp()628 bool ScreenLockSystemAbility::IsSystemApp()
629 {
630 return true;
631 }
632 #else
IsWhiteListApp(uint32_t callingTokenId,const std::string & key)633 bool ScreenLockSystemAbility::IsWhiteListApp(uint32_t callingTokenId, const std::string &key)
634 {
635 std::string whiteListAppId = GetScreenlockParameter(key);
636 if (whiteListAppId.empty()) {
637 SCLOCK_HILOGE("ScreenLockSystemAbility::GetLockScreenWhiteApp is null");
638 return false;
639 }
640 AppInfo appInfo;
641 if (!ScreenLockAppInfo::GetAppInfoByToken(callingTokenId, appInfo)) {
642 SCLOCK_HILOGE("ScreenLockSystemAbility::IsWhiteListApp GetAppInfoByToken is failed");
643 return false;
644 }
645 if (appInfo.appId.empty()) {
646 SCLOCK_HILOGE("ScreenLockSystemAbility::IsWhiteListApp appInfo.appId is null");
647 return false;
648 }
649 if (whiteListAppId != appInfo.appId) {
650 SCLOCK_HILOGE("ScreenLockSystemAbility::IsWhiteListApp calling app is not Screenlock APP");
651 return false;
652 }
653 SCLOCK_HILOGI("ScreenLockSystemAbility::IsWhiteListApp callingAppid=%{public}.5s, whiteListAppId=%{public}.5s",
654 appInfo.appId.c_str(), whiteListAppId.c_str());
655 return true;
656 }
657
GetBundleMgr()658 static OHOS::sptr<OHOS::AppExecFwk::IBundleMgr> GetBundleMgr()
659 {
660 auto systemAbilityManager = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
661 if (systemAbilityManager == nullptr) {
662 return nullptr;
663 }
664 auto bundleMgrSa = systemAbilityManager->GetSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
665 if (bundleMgrSa == nullptr) {
666 return nullptr;
667 }
668 auto bundleMgr = OHOS::iface_cast<AppExecFwk::IBundleMgr>(bundleMgrSa);
669 if (bundleMgr == nullptr) {
670 SCLOCK_HILOGE("GetBundleMgr iface_cast get null");
671 }
672 return bundleMgr;
673 }
674
IsSystemApp()675 bool ScreenLockSystemAbility::IsSystemApp()
676 {
677 int32_t uid = IPCSkeleton::GetCallingUid();
678 auto bundleMgr = GetBundleMgr();
679 bool isSystemApplication = false;
680 if (bundleMgr != nullptr) {
681 isSystemApplication = bundleMgr->CheckIsSystemAppByUid(uid);
682 }
683 return isSystemApplication;
684 }
685 #endif
686
SystemEventCallBack(const SystemEvent & systemEvent,TraceTaskId traceTaskId)687 void ScreenLockSystemAbility::SystemEventCallBack(const SystemEvent &systemEvent, TraceTaskId traceTaskId)
688 {
689 SCLOCK_HILOGI("OnCallBack eventType is %{public}s, params is %{public}s", systemEvent.eventType_.c_str(),
690 systemEvent.params_.c_str());
691 if (systemEventListener_ == nullptr) {
692 SCLOCK_HILOGE("systemEventListener_ is nullptr.");
693 return;
694 }
695 auto callback = [=]() {
696 if (traceTaskId != HITRACE_BUTT) {
697 StartAsyncTrace(
698 HITRACE_TAG_MISC, "ScreenLockSystemAbility::" + systemEvent.eventType_ + "begin callback", traceTaskId);
699 }
700 std::lock_guard<std::mutex> lck(listenerMutex_);
701 systemEventListener_->OnCallBack(systemEvent);
702 if (traceTaskId != HITRACE_BUTT) {
703 FinishAsyncTrace(
704 HITRACE_TAG_MISC, "ScreenLockSystemAbility::" + systemEvent.eventType_ + "end callback", traceTaskId);
705 }
706 };
707 if (serviceHandler_ != nullptr) {
708 serviceHandler_->PostTask(callback, INTERVAL_ZERO);
709 }
710 }
711 } // namespace ScreenLock
712 } // namespace OHOS
713