1 /*
2  * Copyright (c) 2022-2024 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 "dscreen_source_stub.h"
17 
18 #include "iservice_registry.h"
19 
20 #include "accesstoken_kit.h"
21 #include "dscreen_constants.h"
22 #include "dscreen_errcode.h"
23 #include "dscreen_ipc_interface_code.h"
24 #include "dscreen_log.h"
25 #include "dscreen_source_callback_proxy.h"
26 #include "ipc_skeleton.h"
27 
28 namespace OHOS {
29 namespace DistributedHardware {
DScreenSourceStub()30 DScreenSourceStub::DScreenSourceStub() {}
31 
HasEnableDHPermission()32 bool DScreenSourceStub::HasEnableDHPermission()
33 {
34     Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
35     const std::string permissionName = "ohos.permission.ENABLE_DISTRIBUTED_HARDWARE";
36     int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(callerToken,
37         permissionName);
38     return (result == Security::AccessToken::PERMISSION_GRANTED);
39 }
40 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)41 int32_t DScreenSourceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
42     MessageOption &option)
43 {
44     std::u16string desc = DScreenSourceStub::GetDescriptor();
45     std::u16string remoteDesc = data.ReadInterfaceToken();
46     if (desc != remoteDesc) {
47         DHLOGE("DScreenSourceStub::OnRemoteRequest remoteDesc is invalid!");
48         return ERR_INVALID_DATA;
49     }
50 
51     switch (static_cast<IDScreenSourceInterfaceCode>(code)) {
52         case IDScreenSourceInterfaceCode::INIT_SOURCE:
53             return InitSourceInner(data, reply, option);
54         case IDScreenSourceInterfaceCode::RELEASE_SOURCE:
55             return ReleaseSourceInner(data, reply, option);
56         case IDScreenSourceInterfaceCode::REGISTER_DISTRIBUTED_HARDWARE:
57             return RegisterDistributedHardwareInner(data, reply, option);
58         case IDScreenSourceInterfaceCode::UNREGISTER_DISTRIBUTED_HARDWARE:
59             return UnregisterDistributedHardwareInner(data, reply, option);
60         case IDScreenSourceInterfaceCode::CONFIG_DISTRIBUTED_HARDWARE:
61             return ConfigDistributedHardwareInner(data, reply, option);
62         case IDScreenSourceInterfaceCode::DSCREEN_NOTIFY:
63             return DScreenNotifyInner(data, reply, option);
64         default:
65             DHLOGE("invalid request code.");
66             return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
67     }
68 }
69 
InitSourceInner(MessageParcel & data,MessageParcel & reply,MessageOption & option)70 int32_t DScreenSourceStub::InitSourceInner(MessageParcel &data, MessageParcel &reply,
71     MessageOption &option)
72 {
73     (void)option;
74     if (!HasEnableDHPermission()) {
75         DHLOGE("The caller has no ENABLE_DISTRIBUTED_HARDWARE permission.");
76         return DSCREEN_INIT_ERR;
77     }
78     std::string param = data.ReadString();
79     if (param.empty() || param.size() > PARAM_MAX_SIZE) {
80         DHLOGE("InitSourceInner error: invalid parameter");
81         return ERR_DH_SCREEN_INPUT_PARAM_INVALID;
82     }
83     sptr<IRemoteObject> remoteObject = data.ReadRemoteObject();
84     if (remoteObject == nullptr) {
85         DHLOGE("Read param failed.");
86         return ERR_DH_SCREEN_SA_READPARAM_FAILED;
87     }
88 
89     sptr<DScreenSourceCallbackProxy> dScreenSourceCallbackProxy(new DScreenSourceCallbackProxy(remoteObject));
90     if (dScreenSourceCallbackProxy == nullptr) {
91         DHLOGE("dScreenSourceCallbackProxy is nullptr.");
92         return ERR_DH_SCREEN_SA_READPARAM_FAILED;
93     }
94     int32_t ret = InitSource(param, dScreenSourceCallbackProxy);
95     reply.WriteInt32(ret);
96     return DH_SUCCESS;
97 }
98 
ReleaseSourceInner(MessageParcel & data,MessageParcel & reply,MessageOption & option)99 int32_t DScreenSourceStub::ReleaseSourceInner(MessageParcel &data, MessageParcel &reply,
100     MessageOption &option)
101 {
102     (void)data;
103     (void)option;
104     if (!HasEnableDHPermission()) {
105         DHLOGE("The caller has no ENABLE_DISTRIBUTED_HARDWARE permission.");
106         return DSCREEN_INIT_ERR;
107     }
108     int32_t ret = ReleaseSource();
109     reply.WriteInt32(ret);
110     return DH_SUCCESS;
111 }
112 
RegisterDistributedHardwareInner(MessageParcel & data,MessageParcel & reply,MessageOption & option)113 int32_t DScreenSourceStub::RegisterDistributedHardwareInner(MessageParcel &data, MessageParcel &reply,
114     MessageOption &option)
115 {
116     (void)option;
117     if (!HasEnableDHPermission()) {
118         DHLOGE("The caller has no ENABLE_DISTRIBUTED_HARDWARE permission.");
119         return DSCREEN_INIT_ERR;
120     }
121     std::string devId = data.ReadString();
122     std::string dhId = data.ReadString();
123     std::string version = data.ReadString();
124     std::string attrs = data.ReadString();
125     std::string reqId = data.ReadString();
126     if (!CheckRegParams(devId, dhId, version, attrs, reqId)) {
127         DHLOGE("RegisterDistributedHardwareInner error: invalid parameter");
128         return ERR_DH_SCREEN_INPUT_PARAM_INVALID;
129     }
130     EnableParam enableParam;
131     enableParam.sinkVersion = version;
132     enableParam.sinkAttrs = attrs;
133 
134     int32_t ret = RegisterDistributedHardware(devId, dhId, enableParam, reqId);
135     reply.WriteInt32(ret);
136     return DH_SUCCESS;
137 }
138 
UnregisterDistributedHardwareInner(MessageParcel & data,MessageParcel & reply,MessageOption & option)139 int32_t DScreenSourceStub::UnregisterDistributedHardwareInner(MessageParcel &data, MessageParcel &reply,
140     MessageOption &option)
141 {
142     (void)option;
143     if (!HasEnableDHPermission()) {
144         DHLOGE("The caller has no ENABLE_DISTRIBUTED_HARDWARE permission.");
145         return DSCREEN_INIT_ERR;
146     }
147     std::string devId = data.ReadString();
148     std::string dhId = data.ReadString();
149     std::string reqId = data.ReadString();
150     if (!CheckUnregParams(devId, dhId, reqId)) {
151         DHLOGE("UnregisterDistributedHardwareInner error: invalid parameter");
152         return ERR_DH_SCREEN_INPUT_PARAM_INVALID;
153     }
154 
155     int32_t ret = UnregisterDistributedHardware(devId, dhId, reqId);
156     reply.WriteInt32(ret);
157     return DH_SUCCESS;
158 }
159 
ConfigDistributedHardwareInner(MessageParcel & data,MessageParcel & reply,MessageOption & option)160 int32_t DScreenSourceStub::ConfigDistributedHardwareInner(MessageParcel &data, MessageParcel &reply,
161     MessageOption &option)
162 {
163     (void)option;
164     std::string devId = data.ReadString();
165     std::string dhId = data.ReadString();
166     std::string key = data.ReadString();
167     std::string value = data.ReadString();
168     if (!CheckConfigParams(devId, dhId, key, value)) {
169         DHLOGE("ConfigDistributedHardwareInner error: invalid parameter");
170         return ERR_DH_SCREEN_INPUT_PARAM_INVALID;
171     }
172 
173     int32_t ret = ConfigDistributedHardware(devId, dhId, key, value);
174     reply.WriteInt32(ret);
175     return DH_SUCCESS;
176 }
177 
DScreenNotifyInner(MessageParcel & data,MessageParcel & reply,MessageOption & option)178 int32_t DScreenSourceStub::DScreenNotifyInner(MessageParcel &data, MessageParcel &reply,
179     MessageOption &option)
180 {
181     (void)reply;
182     (void)option;
183     std::string devId = data.ReadString();
184     int32_t eventCode = data.ReadInt32();
185     std::string eventContent = data.ReadString();
186     if (devId.empty() || devId.size() > DID_MAX_SIZE || eventContent.empty() ||
187         eventContent.size() > PARAM_MAX_SIZE) {
188         DHLOGE("DScreenNotifyInner error: invalid parameter");
189         return ERR_DH_SCREEN_INPUT_PARAM_INVALID;
190     }
191 
192     DScreenNotify(devId, eventCode, eventContent);
193     return DH_SUCCESS;
194 }
195 
CheckRegParams(const std::string & devId,const std::string & dhId,const std::string & version,const std::string & attrs,const std::string & reqId) const196 bool DScreenSourceStub::CheckRegParams(const std::string &devId, const std::string &dhId,
197     const std::string &version, const std::string &attrs, const std::string &reqId) const
198 {
199     if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) {
200         DHLOGE("DScreenSourceStub CheckRegParams devId or dhId is inlvalid.");
201         return false;
202     }
203     if (version.empty() || version.size() > PARAM_MAX_SIZE || attrs.empty() || attrs.size() > PARAM_MAX_SIZE) {
204         DHLOGE("DScreenSourceStub CheckRegParams version or attrs is inlvalid.");
205         return false;
206     }
207     if (reqId.empty() || reqId.size() > DID_MAX_SIZE) {
208         DHLOGE("DScreenSourceStub CheckRegParams reqId is inlvalid.");
209         return false;
210     }
211     return true;
212 }
213 
CheckUnregParams(const std::string & devId,const std::string & dhId,const std::string & reqId) const214 bool DScreenSourceStub::CheckUnregParams(const std::string &devId,
215     const std::string &dhId, const std::string &reqId) const
216 {
217     if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) {
218         DHLOGE("DScreenSourceStub CheckUnregParams devId or dhId is invalid.");
219         return false;
220     }
221     if (reqId.empty() || reqId.size() > DID_MAX_SIZE) {
222         DHLOGE("DScreenSourceStub CheckUnregParams reqId is invalid.");
223         return false;
224     }
225     return true;
226 }
227 
CheckConfigParams(const std::string & devId,const std::string & dhId,const std::string & key,const std::string & value) const228 bool DScreenSourceStub::CheckConfigParams(const std::string &devId, const std::string &dhId,
229     const std::string &key, const std::string &value) const
230 {
231     if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) {
232         DHLOGE("DScreenSourceStub CheckConfigParams devId or dhId is invalid.");
233         return false;
234     }
235     if (key.empty() || key.size() > PARAM_MAX_SIZE || value.empty() || value.size() > PARAM_MAX_SIZE) {
236         DHLOGE("DScreenSourceStub CheckConfigParams key or value is invalid.");
237         return false;
238     }
239     return true;
240 }
241 } // namespace DistributedHardware
242 } // namespace OHOS