1 /*
2 * Copyright (c) 2023-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 "ipc_utils.h"
17 #include "dp_subscribe_info.h"
18 #include "macro_utils.h"
19
20 namespace OHOS {
21 namespace DistributedDeviceProfile {
22 namespace {
23 const std::string TAG = "IpcUtils";
24 }
Marshalling(MessageParcel & parcel,const std::vector<TrustDeviceProfile> & trustDeviceProfiles)25 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<TrustDeviceProfile>& trustDeviceProfiles)
26 {
27 uint32_t size = trustDeviceProfiles.size();
28 WRITE_HELPER_RET(parcel, Uint32, size, false);
29 if (trustDeviceProfiles.empty() || trustDeviceProfiles.size() > MAX_PROFILE_SIZE) {
30 HILOGE("profile size is invalid!size : %{public}zu", trustDeviceProfiles.size());
31 return false;
32 }
33 for (const auto& profile : trustDeviceProfiles) {
34 if (!profile.Marshalling(parcel)) {
35 HILOGE("profile Marshalling fail!");
36 return false;
37 }
38 }
39 return true;
40 }
41
Marshalling(MessageParcel & parcel,const std::vector<AccessControlProfile> & aclProfiles)42 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<AccessControlProfile>& aclProfiles)
43 {
44 uint32_t size = aclProfiles.size();
45 WRITE_HELPER_RET(parcel, Uint32, size, false);
46 if (aclProfiles.empty() || aclProfiles.size() > MAX_PROFILE_SIZE) {
47 HILOGE("profile size is invalid!size : %{public}zu", aclProfiles.size());
48 return false;
49 }
50 for (const auto& profile : aclProfiles) {
51 if (!profile.Marshalling(parcel)) {
52 HILOGE("profile Marshalling fail!");
53 return false;
54 }
55 }
56 return true;
57 }
58
Marshalling(MessageParcel & parcel,const std::vector<DeviceProfile> & deviceProfiles)59 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<DeviceProfile>& deviceProfiles)
60 {
61 uint32_t size = deviceProfiles.size();
62 WRITE_HELPER_RET(parcel, Uint32, size, false);
63 if (deviceProfiles.empty() || deviceProfiles.size() > MAX_PROFILE_SIZE) {
64 HILOGE("profile size is invalid!size : %{public}zu", deviceProfiles.size());
65 return false;
66 }
67 for (const auto& profile : deviceProfiles) {
68 if (!profile.Marshalling(parcel)) {
69 HILOGE("profile Marshalling fail!");
70 return false;
71 }
72 }
73 return true;
74 }
75
Marshalling(MessageParcel & parcel,const std::vector<ProductInfo> & productInfos)76 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<ProductInfo>& productInfos)
77 {
78 uint32_t size = productInfos.size();
79 WRITE_HELPER_RET(parcel, Uint32, size, false);
80 if (productInfos.empty() || productInfos.size() > MAX_PROFILE_SIZE) {
81 HILOGE("profile size is invalid!size : %{public}zu", productInfos.size());
82 return false;
83 }
84 for (const auto& productInfo : productInfos) {
85 if (!productInfo.Marshalling(parcel)) {
86 HILOGE("productInfo Marshalling fail!");
87 return false;
88 }
89 }
90 return true;
91 }
92
Marshalling(MessageParcel & parcel,const std::vector<ServiceProfile> & serviceProfiles)93 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<ServiceProfile>& serviceProfiles)
94 {
95 uint32_t size = serviceProfiles.size();
96 WRITE_HELPER_RET(parcel, Uint32, size, false);
97 if (serviceProfiles.empty() || serviceProfiles.size() > MAX_PROFILE_SIZE) {
98 HILOGE("profile size is invalid!size : %{public}zu", serviceProfiles.size());
99 return false;
100 }
101 for (const auto& profile : serviceProfiles) {
102 if (!profile.Marshalling(parcel)) {
103 HILOGE("profile Marshalling fail!");
104 return false;
105 }
106 }
107 return true;
108 }
109
Marshalling(MessageParcel & parcel,const std::vector<CharacteristicProfile> & charProfiles)110 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<CharacteristicProfile>& charProfiles)
111 {
112 uint32_t size = charProfiles.size();
113 WRITE_HELPER_RET(parcel, Uint32, size, false);
114 if (charProfiles.empty() || charProfiles.size() > MAX_PROFILE_SIZE) {
115 HILOGE("profile size is invalid!size : %{public}zu", charProfiles.size());
116 return false;
117 }
118 for (const auto& profile : charProfiles) {
119 profile.Marshalling(parcel);
120 }
121 return true;
122 }
123
Marshalling(MessageParcel & parcel,const std::vector<std::string> & strings)124 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<std::string>& strings)
125 {
126 size_t size = strings.size();
127 WRITE_HELPER_RET(parcel, Uint32, size, false);
128 if (strings.empty() || strings.size() > MAX_ID_SIZE) {
129 HILOGE("string vector, strings size is invalid! size : %{public}zu", strings.size());
130 return false;
131 }
132 for (const auto& item : strings) {
133 WRITE_HELPER_RET(parcel, String, item, false);
134 }
135 return true;
136 }
137
Marshalling(MessageParcel & parcel,const std::vector<int32_t> & params)138 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<int32_t>& params)
139 {
140 size_t size = params.size();
141 WRITE_HELPER_RET(parcel, Uint32, size, false);
142 if (params.empty() || params.size() > MAX_ID_SIZE) {
143 HILOGE("int32_t vector, params size is invalid! size : %{public}zu", params.size());
144 return false;
145 }
146 for (const auto& item : params) {
147 WRITE_HELPER_RET(parcel, Int32, item, false);
148 }
149 return true;
150 }
151
Marshalling(MessageParcel & parcel,const std::vector<uint8_t> & params)152 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<uint8_t>& params)
153 {
154 int32_t length = static_cast<int32_t>(params.size());
155 WRITE_HELPER_RET(parcel, Int32, length, false);
156 if (params.empty() || params.size() > MAX_ICON_SIZE) {
157 HILOGE("uint8_t vector, params size is invalid! size : %{public}zu", params.size());
158 return false;
159 }
160 if (length > 0) {
161 const unsigned char *buffer = reinterpret_cast<const unsigned char *>(params.data());
162 parcel.WriteRawData(buffer, length);
163 }
164 return true;
165 }
166
Marshalling(MessageParcel & parcel,const std::map<std::string,std::string> & params)167 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::map<std::string, std::string>& params)
168 {
169 uint32_t size = params.size();
170 WRITE_HELPER_RET(parcel, Uint32, size, false);
171 if (params.size() == 0 || params.size() > MAX_PARAM_SIZE) {
172 HILOGE("Params size is invalid!size : %{public}zu", params.size());
173 return false;
174 }
175 for (const auto& item : params) {
176 WRITE_HELPER_RET(parcel, String, item.first + SEPARATOR + item.second, false);
177 }
178 return true;
179 }
180
Marshalling(MessageParcel & parcel,const std::map<std::string,OHOS::DistributedDeviceProfile::SubscribeInfo> & listenerMap)181 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::map<std::string,
182 OHOS::DistributedDeviceProfile::SubscribeInfo>& listenerMap)
183 {
184 uint32_t size = listenerMap.size();
185 WRITE_HELPER_RET(parcel, Uint32, size, false);
186 if (listenerMap.size() == 0 || listenerMap.size() > MAX_LISTENER_SIZE) {
187 HILOGE("listenerMap size is invalid!size : %{public}zu", listenerMap.size());
188 return false;
189 }
190 for (const auto& item : listenerMap) {
191 OHOS::DistributedDeviceProfile::SubscribeInfo subscribeInfo = item.second;
192 if (!subscribeInfo.Marshalling(parcel)) {
193 HILOGE("subscribeInfo Marshalling fail!");
194 return false;
195 }
196 }
197 return true;
198 }
199
Marshalling(MessageParcel & parcel,const std::unordered_set<ProfileChangeType> & changeTypes)200 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::unordered_set<ProfileChangeType>& changeTypes)
201 {
202 uint32_t size = changeTypes.size();
203 WRITE_HELPER_RET(parcel, Uint32, size, false);
204 if (changeTypes.size() == 0 || changeTypes.size() > MAX_SUBSCRIBE_CHANGE_SIZE) {
205 HILOGE("listenerMap size is invalid!size : %{public}zu", changeTypes.size());
206 return false;
207 }
208 for (ProfileChangeType item : changeTypes) {
209 WRITE_HELPER_RET(parcel, Int32, static_cast<int32_t>(item), false);
210 }
211 return true;
212 }
213
Marshalling(MessageParcel & parcel,const std::vector<TrustedDeviceInfo> & deviceInfos)214 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<TrustedDeviceInfo>& deviceInfos)
215 {
216 uint32_t size = deviceInfos.size();
217 WRITE_HELPER_RET(parcel, Uint32, size, false);
218 if (deviceInfos.empty() || deviceInfos.size() > MAX_PROFILE_SIZE) {
219 HILOGE("deviceInfos size is invalid!size : %{public}zu", deviceInfos.size());
220 return false;
221 }
222 for (const auto& item : deviceInfos) {
223 item.Marshalling(parcel);
224 }
225 return true;
226 }
227
Marshalling(MessageParcel & parcel,const std::vector<DeviceIconInfo> & deviceIconInfos)228 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<DeviceIconInfo>& deviceIconInfos)
229 {
230 uint32_t size = deviceIconInfos.size();
231 WRITE_HELPER_RET(parcel, Uint32, size, false);
232 if (deviceIconInfos.size() > MAX_PROFILE_SIZE) {
233 HILOGE("deviceInfos size is invalid!size : %{public}zu", deviceIconInfos.size());
234 return false;
235 }
236 for (const auto& item : deviceIconInfos) {
237 item.Marshalling(parcel);
238 }
239 return true;
240 }
241
Marshalling(MessageParcel & parcel,const std::vector<ServiceInfoProfile> & serviceInfoProfiles)242 bool IpcUtils::Marshalling(MessageParcel& parcel, const std::vector<ServiceInfoProfile>& serviceInfoProfiles)
243 {
244 uint32_t size = serviceInfoProfiles.size();
245 WRITE_HELPER_RET(parcel, Uint32, size, false);
246 if (serviceInfoProfiles.empty() || serviceInfoProfiles.size() > MAX_PROFILE_SIZE) {
247 HILOGE("deviceInfos size is invalid!size : %{public}zu", serviceInfoProfiles.size());
248 return false;
249 }
250 for (const auto& item : serviceInfoProfiles) {
251 item.Marshalling(parcel);
252 }
253 return true;
254 }
255
UnMarshalling(MessageParcel & parcel,std::vector<ServiceInfoProfile> & serviceInfoProfiles)256 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ServiceInfoProfile>& serviceInfoProfiles)
257 {
258 uint32_t size = parcel.ReadUint32();
259 if (size == 0 || size > MAX_PROFILE_SIZE) {
260 HILOGE("Profile size is invalid!size : %{public}u", size);
261 return false;
262 }
263 for (uint32_t i = 0; i < size; i++) {
264 ServiceInfoProfile serviceInfoProfile;
265 if (!serviceInfoProfile.UnMarshalling(parcel)) {
266 HILOGE("Profile UnMarshalling fail!");
267 return false;
268 }
269 serviceInfoProfiles.emplace_back(serviceInfoProfile);
270 }
271 return true;
272 }
273
UnMarshalling(MessageParcel & parcel,std::vector<DeviceIconInfo> & deviceIconInfos)274 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<DeviceIconInfo>& deviceIconInfos)
275 {
276 uint32_t size = parcel.ReadUint32();
277 if (size == 0 || size > MAX_PROFILE_SIZE) {
278 HILOGE("Profile size is invalid!size : %{public}u", size);
279 return false;
280 }
281 for (uint32_t i = 0; i < size; i++) {
282 DeviceIconInfo deviceIconInfo;
283 if (!deviceIconInfo.UnMarshalling(parcel)) {
284 HILOGE("Profile UnMarshalling fail!");
285 return false;
286 }
287 deviceIconInfos.emplace_back(deviceIconInfo);
288 }
289 return true;
290 }
291
UnMarshalling(MessageParcel & parcel,std::vector<ProductInfo> & productInfos)292 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ProductInfo>& productInfos)
293 {
294 uint32_t size = parcel.ReadUint32();
295 if (size == 0 || size > MAX_PROFILE_SIZE) {
296 HILOGE("Profile size is invalid!size : %{public}u", size);
297 return false;
298 }
299 for (uint32_t i = 0; i < size; i++) {
300 ProductInfo productInfo;
301 if (!productInfo.UnMarshalling(parcel)) {
302 HILOGE("Profile UnMarshalling fail!");
303 return false;
304 }
305 productInfos.emplace_back(productInfo);
306 }
307 return true;
308 }
309
UnMarshalling(MessageParcel & parcel,std::vector<TrustDeviceProfile> & trustDeviceProfiles)310 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<TrustDeviceProfile>& trustDeviceProfiles)
311 {
312 uint32_t size = parcel.ReadUint32();
313 if (size == 0 || size > MAX_PROFILE_SIZE) {
314 HILOGE("Profile size is invalid!size : %{public}u", size);
315 return false;
316 }
317 for (uint32_t i = 0; i < size; i++) {
318 TrustDeviceProfile trustDeviceProfile;
319 if (!trustDeviceProfile.UnMarshalling(parcel)) {
320 HILOGE("Profile UnMarshalling fail!");
321 return false;
322 }
323 trustDeviceProfiles.emplace_back(trustDeviceProfile);
324 }
325 return true;
326 }
327
UnMarshalling(MessageParcel & parcel,std::vector<AccessControlProfile> & aclProfiles)328 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<AccessControlProfile>& aclProfiles)
329 {
330 uint32_t size = parcel.ReadUint32();
331 if (size == 0 || size > MAX_PROFILE_SIZE) {
332 HILOGE("Profile size is invalid!size : %{public}u", size);
333 return false;
334 }
335 for (uint32_t i = 0; i < size; i++) {
336 AccessControlProfile aclProfile;
337 if (!aclProfile.UnMarshalling(parcel)) {
338 HILOGE("Profile UnMarshalling fail!");
339 return false;
340 }
341 aclProfiles.emplace_back(aclProfile);
342 }
343 return true;
344 }
345
UnMarshalling(MessageParcel & parcel,std::vector<DeviceProfile> & deviceProfiles)346 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<DeviceProfile>& deviceProfiles)
347 {
348 uint32_t size = parcel.ReadUint32();
349 if (size == 0 || size > MAX_PROFILE_SIZE) {
350 HILOGE("Profile size is invalid!size : %{public}u", size);
351 return false;
352 }
353 for (uint32_t i = 0; i < size; i++) {
354 DeviceProfile deviceProfile;
355 if (!deviceProfile.UnMarshalling(parcel)) {
356 HILOGE("Profile UnMarshalling fail!");
357 return false;
358 }
359 deviceProfiles.emplace_back(deviceProfile);
360 }
361 return true;
362 }
363
UnMarshalling(MessageParcel & parcel,std::vector<ServiceProfile> & serviceProfiles)364 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<ServiceProfile>& serviceProfiles)
365 {
366 uint32_t size = parcel.ReadUint32();
367 if (size == 0 || size > MAX_PROFILE_SIZE) {
368 HILOGE("Profile size is invalid!size : %{public}u", size);
369 return false;
370 }
371 for (uint32_t i = 0; i < size; i++) {
372 ServiceProfile serviceProfile;
373 if (!serviceProfile.UnMarshalling(parcel)) {
374 HILOGE("Profile UnMarshalling fail!");
375 return false;
376 }
377 serviceProfiles.emplace_back(serviceProfile);
378 }
379 return true;
380 }
381
UnMarshalling(MessageParcel & parcel,std::vector<CharacteristicProfile> & charProfiles)382 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<CharacteristicProfile>& charProfiles)
383 {
384 uint32_t size = parcel.ReadUint32();
385 if (size == 0 || size > MAX_PROFILE_SIZE) {
386 HILOGE("Profile size is invalid!size : %{public}u", size);
387 return false;
388 }
389 for (uint32_t i = 0; i < size; i++) {
390 CharacteristicProfile charProfile;
391 if (!charProfile.UnMarshalling(parcel)) {
392 HILOGE("Profile UnMarshalling fail!");
393 return false;
394 }
395 charProfiles.emplace_back(charProfile);
396 }
397 return true;
398 }
399
UnMarshalling(MessageParcel & parcel,std::vector<std::string> & strings)400 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<std::string>& strings)
401 {
402 size_t size = parcel.ReadUint32();
403 if (size == 0 || size > MAX_ID_SIZE) {
404 HILOGE("string vector, strings size is invalid!size : %{public}zu", size);
405 return false;
406 }
407 for (uint32_t i = 0; i < size; i++) {
408 std::string item = "";
409 READ_HELPER_RET(parcel, String, item, false);
410 strings.emplace_back(item);
411 }
412 return true;
413 }
414
UnMarshalling(MessageParcel & parcel,std::vector<int32_t> & params)415 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<int32_t>& params)
416 {
417 size_t size = parcel.ReadUint32();
418 if (size == 0 || size > MAX_ID_SIZE) {
419 HILOGE("int32_t vector, params size is invalid! size : %{public}zu", size);
420 return false;
421 }
422 for (uint32_t i = 0; i < size; i++) {
423 int32_t item = 0;
424 READ_HELPER_RET(parcel, Int32, item, false);
425 params.emplace_back(item);
426 }
427 return true;
428 }
429
UnMarshalling(MessageParcel & parcel,std::vector<uint8_t> & params)430 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<uint8_t>& params)
431 {
432 int32_t length = parcel.ReadInt32();
433 if (length <= 0 || length > MAX_ICON_SIZE) {
434 HILOGE("uint8_t vector, params size is invalid! size : %{public}d", length);
435 return false;
436 }
437 const void *temp = parcel.ReadRawData((size_t)length);
438 if (temp == nullptr) {
439 HILOGE("read raw data failed, length = %{public}d", length);
440 return false;
441 }
442 const unsigned char *buffer = reinterpret_cast<const unsigned char *>(temp);
443 if (buffer == nullptr) {
444 HILOGE("Unexpected null after reinterpret_cast");
445 return false;
446 }
447 std::vector<uint8_t> icon(buffer, buffer + length);
448 params = icon;
449 return true;
450 }
451
UnMarshalling(MessageParcel & parcel,std::map<std::string,std::string> & params)452 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::map<std::string, std::string>& params)
453 {
454 uint32_t size = parcel.ReadUint32();
455 if (size == 0 || size > MAX_PARAM_SIZE) {
456 HILOGE("Params size is invalid!size : %{public}u", size);
457 return false;
458 }
459 for (uint32_t i = 0; i < size; i++) {
460 std::string item = "";
461 READ_HELPER_RET(parcel, String, item, false);
462 std::string::size_type position = item.find(SEPARATOR);
463 if (position == item.npos) {
464 HILOGE("Not found the separator!");
465 continue;
466 }
467 std::string key = item.substr(0, position);
468 std::string value = item.substr(position + 1);
469 params[key] = value;
470 }
471 return true;
472 }
473
UnMarshalling(MessageParcel & parcel,std::map<std::string,OHOS::DistributedDeviceProfile::SubscribeInfo> & listenerMap)474 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::map<std::string,
475 OHOS::DistributedDeviceProfile::SubscribeInfo>& listenerMap)
476 {
477 uint32_t size = parcel.ReadUint32();
478 if (size == 0 || size > MAX_LISTENER_SIZE) {
479 HILOGE("Params size is invalid!size : %{public}u", size);
480 return false;
481 }
482 for (uint32_t i = 0; i < size; i++) {
483 OHOS::DistributedDeviceProfile::SubscribeInfo subscribeInfo;
484 if (!subscribeInfo.UnMarshalling(parcel)) {
485 HILOGE("subscribeInfo UnMarshalling fail!");
486 return false;
487 }
488 listenerMap[subscribeInfo.GetSubscribeKey() + SEPARATOR + std::to_string(subscribeInfo.GetSaId())] =
489 subscribeInfo;
490 }
491 return true;
492 }
493
UnMarshalling(MessageParcel & parcel,std::unordered_set<ProfileChangeType> & changeTypes)494 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::unordered_set<ProfileChangeType>& changeTypes)
495 {
496 uint32_t size = parcel.ReadUint32();
497 if (size == 0 || size > MAX_SUBSCRIBE_CHANGE_SIZE) {
498 HILOGE("Params size is invalid!size : %{public}u", size);
499 return false;
500 }
501 for (uint32_t i = 0; i < size; i++) {
502 uint32_t num = parcel.ReadUint32();
503 if (num <= ProfileChangeType::PROFILE_CHANGE_TYPE_MIN || num >= ProfileChangeType::PROFILE_CHANGE_TYPE_MAX) {
504 HILOGE("The value is invalid!");
505 return false;
506 }
507 changeTypes.emplace(static_cast<ProfileChangeType>(num));
508 }
509 return true;
510 }
511
UnMarshalling(MessageParcel & parcel,std::vector<TrustedDeviceInfo> & deviceInfos)512 bool IpcUtils::UnMarshalling(MessageParcel& parcel, std::vector<TrustedDeviceInfo>& deviceInfos)
513 {
514 uint32_t size = parcel.ReadUint32();
515 if (size == 0 || size > MAX_PROFILE_SIZE) {
516 HILOGE("deviceInfos size is invalid!size : %{public}u", size);
517 return false;
518 }
519 for (uint32_t i = 0; i < size; i++) {
520 TrustedDeviceInfo item;
521 if (!item.UnMarshalling(parcel)) {
522 HILOGE("Profile UnMarshalling fail!");
523 return false;
524 }
525 deviceInfos.emplace_back(item);
526 }
527 return true;
528 }
529 } // namespace DistributedDeviceProfile
530 } // namespace OHOS
531