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