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