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