1365d9939Sopenharmony_ci/* 2365d9939Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3365d9939Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4365d9939Sopenharmony_ci * you may not use this file except in compliance with the License. 5365d9939Sopenharmony_ci * You may obtain a copy of the License at 6365d9939Sopenharmony_ci * 7365d9939Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8365d9939Sopenharmony_ci * 9365d9939Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10365d9939Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11365d9939Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12365d9939Sopenharmony_ci * See the License for the specific language governing permissions and 13365d9939Sopenharmony_ci * limitations under the License. 14365d9939Sopenharmony_ci */ 15365d9939Sopenharmony_ci 16365d9939Sopenharmony_ci#include "screenlock_manager_stub.h" 17365d9939Sopenharmony_ci 18365d9939Sopenharmony_ci#include <string> 19365d9939Sopenharmony_ci 20365d9939Sopenharmony_ci#include "ipc_skeleton.h" 21365d9939Sopenharmony_ci#include "parcel.h" 22365d9939Sopenharmony_ci#include "sclock_log.h" 23365d9939Sopenharmony_ci#include "screenlock_callback_interface.h" 24365d9939Sopenharmony_ci#include "screenlock_common.h" 25365d9939Sopenharmony_ci#include "screenlock_server_ipc_interface_code.h" 26365d9939Sopenharmony_ci#include "screenlock_system_ability_interface.h" 27365d9939Sopenharmony_ci 28365d9939Sopenharmony_cinamespace OHOS { 29365d9939Sopenharmony_cinamespace ScreenLock { 30365d9939Sopenharmony_ciusing namespace OHOS::HiviewDFX; 31365d9939Sopenharmony_ciScreenLockManagerStub::ScreenLockManagerStub() 32365d9939Sopenharmony_ci{ 33365d9939Sopenharmony_ci InitHandleMap(); 34365d9939Sopenharmony_ci} 35365d9939Sopenharmony_ci 36365d9939Sopenharmony_civoid ScreenLockManagerStub::InitHandleMap() 37365d9939Sopenharmony_ci{ 38365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::IS_LOCKED)] = 39365d9939Sopenharmony_ci &ScreenLockManagerStub::OnIsLocked; 40365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::IS_SCREEN_LOCKED)] = 41365d9939Sopenharmony_ci &ScreenLockManagerStub::OnIsScreenLocked; 42365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::IS_SECURE_MODE)] = 43365d9939Sopenharmony_ci &ScreenLockManagerStub::OnGetSecure; 44365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::UNLOCK)] = &ScreenLockManagerStub::OnUnlock; 45365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::UNLOCK_SCREEN)] = 46365d9939Sopenharmony_ci &ScreenLockManagerStub::OnUnlockScreen; 47365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::LOCK)] = &ScreenLockManagerStub::OnLock; 48365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::SEND_SCREENLOCK_EVENT)] = 49365d9939Sopenharmony_ci &ScreenLockManagerStub::OnSendScreenLockEvent; 50365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::ONSYSTEMEVENT)] = 51365d9939Sopenharmony_ci &ScreenLockManagerStub::OnScreenLockOn; 52365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::LOCK_SCREEN)] = 53365d9939Sopenharmony_ci &ScreenLockManagerStub::OnLockScreen; 54365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::IS_SCREENLOCK_DISABLED)] = 55365d9939Sopenharmony_ci &ScreenLockManagerStub::OnIsScreenLockDisabled; 56365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::SET_SCREENLOCK_DISABLED)] = 57365d9939Sopenharmony_ci &ScreenLockManagerStub::OnSetScreenLockDisabled; 58365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::SET_SCREENLOCK_AUTHSTATE)] = 59365d9939Sopenharmony_ci &ScreenLockManagerStub::OnSetScreenLockAuthState; 60365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::GET_SCREENLOCK_AUTHSTATE)] = 61365d9939Sopenharmony_ci &ScreenLockManagerStub::OnGetScreenLockAuthState; 62365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::REQUEST_STRONG_AUTHSTATE)] = 63365d9939Sopenharmony_ci &ScreenLockManagerStub::OnRequestStrongAuth; 64365d9939Sopenharmony_ci handleFuncMap[static_cast<uint32_t>(ScreenLockServerIpcInterfaceCode::GET_STRONG_AUTHSTATE)] = 65365d9939Sopenharmony_ci &ScreenLockManagerStub::OnGetStrongAuth; 66365d9939Sopenharmony_ci} 67365d9939Sopenharmony_ci 68365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, 69365d9939Sopenharmony_ci MessageOption &option) __attribute__((no_sanitize("cfi"))) 70365d9939Sopenharmony_ci{ 71365d9939Sopenharmony_ci SCLOCK_HILOGD("OnRemoteRequest started, code = %{public}d", code); 72365d9939Sopenharmony_ci auto descriptorToken = data.ReadInterfaceToken(); 73365d9939Sopenharmony_ci if (descriptorToken != GetDescriptor()) { 74365d9939Sopenharmony_ci SCLOCK_HILOGE("Remote descriptor not the same as local descriptor."); 75365d9939Sopenharmony_ci return IPCObjectStub::OnRemoteRequest(code, data, reply, option); 76365d9939Sopenharmony_ci } 77365d9939Sopenharmony_ci 78365d9939Sopenharmony_ci auto itFunc = handleFuncMap.find(code); 79365d9939Sopenharmony_ci if (itFunc != handleFuncMap.end()) { 80365d9939Sopenharmony_ci auto requestFunc = itFunc->second; 81365d9939Sopenharmony_ci if (requestFunc != nullptr) { 82365d9939Sopenharmony_ci (this->*requestFunc)(data, reply); 83365d9939Sopenharmony_ci return ERR_NONE; 84365d9939Sopenharmony_ci } 85365d9939Sopenharmony_ci } 86365d9939Sopenharmony_ci 87365d9939Sopenharmony_ci SCLOCK_HILOGI("Default value received, check needed."); 88365d9939Sopenharmony_ci return IPCObjectStub::OnRemoteRequest(code, data, reply, option); 89365d9939Sopenharmony_ci} 90365d9939Sopenharmony_ci 91365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnIsLocked(MessageParcel &data, MessageParcel &reply) 92365d9939Sopenharmony_ci{ 93365d9939Sopenharmony_ci bool isLocked = false; 94365d9939Sopenharmony_ci int32_t ret = IsLocked(isLocked); 95365d9939Sopenharmony_ci reply.WriteInt32(ret); 96365d9939Sopenharmony_ci if (ret == E_SCREENLOCK_OK) { 97365d9939Sopenharmony_ci reply.WriteBool(isLocked); 98365d9939Sopenharmony_ci } 99365d9939Sopenharmony_ci return ERR_NONE; 100365d9939Sopenharmony_ci} 101365d9939Sopenharmony_ci 102365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnIsScreenLocked(MessageParcel &data, MessageParcel &reply) 103365d9939Sopenharmony_ci{ 104365d9939Sopenharmony_ci bool isScreenLocked = IsScreenLocked(); 105365d9939Sopenharmony_ci reply.WriteBool(isScreenLocked); 106365d9939Sopenharmony_ci return ERR_NONE; 107365d9939Sopenharmony_ci} 108365d9939Sopenharmony_ci 109365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnGetSecure(MessageParcel &data, MessageParcel &reply) 110365d9939Sopenharmony_ci{ 111365d9939Sopenharmony_ci bool result = GetSecure(); 112365d9939Sopenharmony_ci reply.WriteBool(result); 113365d9939Sopenharmony_ci SCLOCK_HILOGD("GetSecure result = %{public}d", result); 114365d9939Sopenharmony_ci return ERR_NONE; 115365d9939Sopenharmony_ci} 116365d9939Sopenharmony_ci 117365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnUnlock(MessageParcel &data, MessageParcel &reply) 118365d9939Sopenharmony_ci{ 119365d9939Sopenharmony_ci sptr<IRemoteObject> remote = data.ReadRemoteObject(); 120365d9939Sopenharmony_ci if (remote == nullptr) { 121365d9939Sopenharmony_ci SCLOCK_HILOGE("remote is nullptr"); 122365d9939Sopenharmony_ci return ERR_INVALID_DATA; 123365d9939Sopenharmony_ci } 124365d9939Sopenharmony_ci sptr<ScreenLockCallbackInterface> listener = iface_cast<ScreenLockCallbackInterface>(remote); 125365d9939Sopenharmony_ci if (listener.GetRefPtr() == nullptr) { 126365d9939Sopenharmony_ci SCLOCK_HILOGE("listener is null"); 127365d9939Sopenharmony_ci return ERR_INVALID_DATA; 128365d9939Sopenharmony_ci } 129365d9939Sopenharmony_ci int32_t ret = Unlock(listener); 130365d9939Sopenharmony_ci reply.WriteInt32(ret); 131365d9939Sopenharmony_ci return ERR_NONE; 132365d9939Sopenharmony_ci} 133365d9939Sopenharmony_ci 134365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnUnlockScreen(MessageParcel &data, MessageParcel &reply) 135365d9939Sopenharmony_ci{ 136365d9939Sopenharmony_ci sptr<IRemoteObject> remote = data.ReadRemoteObject(); 137365d9939Sopenharmony_ci if (remote == nullptr) { 138365d9939Sopenharmony_ci SCLOCK_HILOGE("remote is nullptr"); 139365d9939Sopenharmony_ci return ERR_INVALID_DATA; 140365d9939Sopenharmony_ci } 141365d9939Sopenharmony_ci sptr<ScreenLockCallbackInterface> listener = iface_cast<ScreenLockCallbackInterface>(remote); 142365d9939Sopenharmony_ci if (listener.GetRefPtr() == nullptr) { 143365d9939Sopenharmony_ci SCLOCK_HILOGE("listener is null"); 144365d9939Sopenharmony_ci return ERR_INVALID_DATA; 145365d9939Sopenharmony_ci } 146365d9939Sopenharmony_ci int32_t ret = UnlockScreen(listener); 147365d9939Sopenharmony_ci reply.WriteInt32(ret); 148365d9939Sopenharmony_ci return ERR_NONE; 149365d9939Sopenharmony_ci} 150365d9939Sopenharmony_ci 151365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnLock(MessageParcel &data, MessageParcel &reply) 152365d9939Sopenharmony_ci{ 153365d9939Sopenharmony_ci sptr<IRemoteObject> remote = data.ReadRemoteObject(); 154365d9939Sopenharmony_ci if (remote == nullptr) { 155365d9939Sopenharmony_ci SCLOCK_HILOGE("ScreenLockManagerStub remote is nullptr"); 156365d9939Sopenharmony_ci return ERR_INVALID_DATA; 157365d9939Sopenharmony_ci } 158365d9939Sopenharmony_ci sptr<ScreenLockCallbackInterface> listener = iface_cast<ScreenLockCallbackInterface>(remote); 159365d9939Sopenharmony_ci if (listener.GetRefPtr() == nullptr) { 160365d9939Sopenharmony_ci SCLOCK_HILOGE("ScreenLockManagerStub listener is null"); 161365d9939Sopenharmony_ci return ERR_INVALID_DATA; 162365d9939Sopenharmony_ci } 163365d9939Sopenharmony_ci int32_t status = Lock(listener); 164365d9939Sopenharmony_ci reply.WriteInt32(status); 165365d9939Sopenharmony_ci return ERR_NONE; 166365d9939Sopenharmony_ci} 167365d9939Sopenharmony_ci 168365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnScreenLockOn(MessageParcel &data, MessageParcel &reply) 169365d9939Sopenharmony_ci{ 170365d9939Sopenharmony_ci sptr<IRemoteObject> remote = data.ReadRemoteObject(); 171365d9939Sopenharmony_ci if (remote == nullptr) { 172365d9939Sopenharmony_ci SCLOCK_HILOGE("ScreenLockManagerStub remote is nullptr"); 173365d9939Sopenharmony_ci return ERR_INVALID_DATA; 174365d9939Sopenharmony_ci } 175365d9939Sopenharmony_ci sptr<ScreenLockSystemAbilityInterface> listener = iface_cast<ScreenLockSystemAbilityInterface>(remote); 176365d9939Sopenharmony_ci if (listener.GetRefPtr() == nullptr) { 177365d9939Sopenharmony_ci SCLOCK_HILOGE("ScreenLockManagerStub listener is null"); 178365d9939Sopenharmony_ci return ERR_INVALID_DATA; 179365d9939Sopenharmony_ci } 180365d9939Sopenharmony_ci int32_t ret = OnSystemEvent(listener); 181365d9939Sopenharmony_ci reply.WriteInt32(ret); 182365d9939Sopenharmony_ci return ERR_NONE; 183365d9939Sopenharmony_ci} 184365d9939Sopenharmony_ci 185365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnSendScreenLockEvent(MessageParcel &data, MessageParcel &reply) 186365d9939Sopenharmony_ci{ 187365d9939Sopenharmony_ci std::string event = data.ReadString(); 188365d9939Sopenharmony_ci int param = data.ReadInt32(); 189365d9939Sopenharmony_ci SCLOCK_HILOGD("event=%{public}s, param=%{public}d", event.c_str(), param); 190365d9939Sopenharmony_ci int32_t retCode = SendScreenLockEvent(event, param); 191365d9939Sopenharmony_ci reply.WriteInt32(retCode); 192365d9939Sopenharmony_ci return ERR_NONE; 193365d9939Sopenharmony_ci} 194365d9939Sopenharmony_ci 195365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnIsScreenLockDisabled(MessageParcel &data, MessageParcel &reply) 196365d9939Sopenharmony_ci{ 197365d9939Sopenharmony_ci bool isDisabled = false; 198365d9939Sopenharmony_ci int userId = data.ReadInt32(); 199365d9939Sopenharmony_ci SCLOCK_HILOGD("userId=%{public}d", userId); 200365d9939Sopenharmony_ci int32_t retCode = IsScreenLockDisabled(userId, isDisabled); 201365d9939Sopenharmony_ci reply.WriteInt32(retCode); 202365d9939Sopenharmony_ci if (retCode == E_SCREENLOCK_OK) { 203365d9939Sopenharmony_ci reply.WriteBool(isDisabled); 204365d9939Sopenharmony_ci } 205365d9939Sopenharmony_ci return ERR_NONE; 206365d9939Sopenharmony_ci} 207365d9939Sopenharmony_ci 208365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnSetScreenLockDisabled(MessageParcel &data, MessageParcel &reply) 209365d9939Sopenharmony_ci{ 210365d9939Sopenharmony_ci bool disable = data.ReadBool(); 211365d9939Sopenharmony_ci int userId = data.ReadInt32(); 212365d9939Sopenharmony_ci SCLOCK_HILOGD("disable=%{public}d, userId=%{public}d", disable, userId); 213365d9939Sopenharmony_ci int32_t retCode = SetScreenLockDisabled(disable, userId); 214365d9939Sopenharmony_ci reply.WriteInt32(retCode); 215365d9939Sopenharmony_ci return ERR_NONE; 216365d9939Sopenharmony_ci} 217365d9939Sopenharmony_ci 218365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnSetScreenLockAuthState(MessageParcel &data, MessageParcel &reply) 219365d9939Sopenharmony_ci{ 220365d9939Sopenharmony_ci int32_t authState = data.ReadInt32(); 221365d9939Sopenharmony_ci int32_t userId = data.ReadInt32(); 222365d9939Sopenharmony_ci std::string authToken = data.ReadString(); 223365d9939Sopenharmony_ci int32_t retCode = SetScreenLockAuthState(authState, userId, authToken); 224365d9939Sopenharmony_ci reply.WriteInt32(retCode); 225365d9939Sopenharmony_ci return ERR_NONE; 226365d9939Sopenharmony_ci} 227365d9939Sopenharmony_ci 228365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnGetScreenLockAuthState(MessageParcel &data, MessageParcel &reply) 229365d9939Sopenharmony_ci{ 230365d9939Sopenharmony_ci int32_t authState = -1; 231365d9939Sopenharmony_ci int32_t userId = data.ReadInt32(); 232365d9939Sopenharmony_ci SCLOCK_HILOGD("userId=%{public}d", userId); 233365d9939Sopenharmony_ci int32_t retCode = GetScreenLockAuthState(userId, authState); 234365d9939Sopenharmony_ci reply.WriteInt32(retCode); 235365d9939Sopenharmony_ci if (retCode == E_SCREENLOCK_OK) { 236365d9939Sopenharmony_ci reply.WriteInt32(authState); 237365d9939Sopenharmony_ci } 238365d9939Sopenharmony_ci return ERR_NONE; 239365d9939Sopenharmony_ci} 240365d9939Sopenharmony_ci 241365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnRequestStrongAuth(MessageParcel &data, MessageParcel &reply) 242365d9939Sopenharmony_ci{ 243365d9939Sopenharmony_ci int32_t reasonFlag = data.ReadInt32(); 244365d9939Sopenharmony_ci int32_t userId = data.ReadInt32(); 245365d9939Sopenharmony_ci SCLOCK_HILOGD("OnRequestStrongAuth. reasonFlag=%{public}d", reasonFlag); 246365d9939Sopenharmony_ci int32_t retCode = RequestStrongAuth(reasonFlag, userId); 247365d9939Sopenharmony_ci reply.WriteInt32(retCode); 248365d9939Sopenharmony_ci return ERR_NONE; 249365d9939Sopenharmony_ci} 250365d9939Sopenharmony_ci 251365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnGetStrongAuth(MessageParcel &data, MessageParcel &reply) 252365d9939Sopenharmony_ci{ 253365d9939Sopenharmony_ci int32_t reasonFlag = -1; 254365d9939Sopenharmony_ci int32_t userId = data.ReadInt32(); 255365d9939Sopenharmony_ci int32_t retCode = GetStrongAuth(userId, reasonFlag); 256365d9939Sopenharmony_ci SCLOCK_HILOGI("userId=%{public}d, reasonFlag=%{public}d", userId, reasonFlag); 257365d9939Sopenharmony_ci reply.WriteInt32(retCode); 258365d9939Sopenharmony_ci if (retCode == E_SCREENLOCK_OK) { 259365d9939Sopenharmony_ci reply.WriteInt32(reasonFlag); 260365d9939Sopenharmony_ci } 261365d9939Sopenharmony_ci return ERR_NONE; 262365d9939Sopenharmony_ci} 263365d9939Sopenharmony_ci 264365d9939Sopenharmony_ciint32_t ScreenLockManagerStub::OnLockScreen(MessageParcel &data, MessageParcel &reply) 265365d9939Sopenharmony_ci{ 266365d9939Sopenharmony_ci int32_t useId = data.ReadInt32(); 267365d9939Sopenharmony_ci int32_t retCode = Lock(useId); 268365d9939Sopenharmony_ci reply.WriteInt32(retCode); 269365d9939Sopenharmony_ci return ERR_NONE; 270365d9939Sopenharmony_ci} 271365d9939Sopenharmony_ci} // namespace ScreenLock 272365d9939Sopenharmony_ci} // namespace OHOS