12ee81decSopenharmony_ci/* 22ee81decSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 32ee81decSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 42ee81decSopenharmony_ci * you may not use this file except in compliance with the License. 52ee81decSopenharmony_ci * You may obtain a copy of the License at 62ee81decSopenharmony_ci * 72ee81decSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 82ee81decSopenharmony_ci * 92ee81decSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 102ee81decSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 112ee81decSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 122ee81decSopenharmony_ci * See the License for the specific language governing permissions and 132ee81decSopenharmony_ci * limitations under the License. 142ee81decSopenharmony_ci */ 152ee81decSopenharmony_ci 162ee81decSopenharmony_ci#include "dslm_msg_serialize.h" 172ee81decSopenharmony_ci 182ee81decSopenharmony_ci#include <stdbool.h> 192ee81decSopenharmony_ci#include <stdint.h> 202ee81decSopenharmony_ci#include <stdlib.h> 212ee81decSopenharmony_ci#include <string.h> 222ee81decSopenharmony_ci 232ee81decSopenharmony_ci#include "securec.h" 242ee81decSopenharmony_ci 252ee81decSopenharmony_ci#include "utils_json.h" 262ee81decSopenharmony_ci#include "utils_log.h" 272ee81decSopenharmony_ci#include "utils_mem.h" 282ee81decSopenharmony_ci 292ee81decSopenharmony_ci#define ASCII_MAX 0x7fU 302ee81decSopenharmony_ci 312ee81decSopenharmony_cistatic inline bool IsAscii(const uint8_t ch) 322ee81decSopenharmony_ci{ 332ee81decSopenharmony_ci return (((ch) & (~ASCII_MAX)) == 0); 342ee81decSopenharmony_ci} 352ee81decSopenharmony_ci 362ee81decSopenharmony_cibool CheckMessage(const uint8_t *msg, uint32_t length) 372ee81decSopenharmony_ci{ 382ee81decSopenharmony_ci if (msg == NULL || length <= 1 || length > MSG_BUFF_MAX_LENGTH) { 392ee81decSopenharmony_ci return false; 402ee81decSopenharmony_ci } 412ee81decSopenharmony_ci 422ee81decSopenharmony_ci // our msgs is a printable string 432ee81decSopenharmony_ci if (msg[length - 1] != '\0') { 442ee81decSopenharmony_ci return false; 452ee81decSopenharmony_ci } 462ee81decSopenharmony_ci for (uint32_t i = 0; i < length - 1; i++) { 472ee81decSopenharmony_ci if (!IsAscii(msg[i])) { 482ee81decSopenharmony_ci return false; 492ee81decSopenharmony_ci } 502ee81decSopenharmony_ci } 512ee81decSopenharmony_ci return true; 522ee81decSopenharmony_ci} 532ee81decSopenharmony_ci 542ee81decSopenharmony_ciMessagePacket *ParseMessage(const MessageBuff *buff) 552ee81decSopenharmony_ci{ 562ee81decSopenharmony_ci if (buff == NULL) { 572ee81decSopenharmony_ci SECURITY_LOG_DEBUG("EMPTY BUFF"); 582ee81decSopenharmony_ci return NULL; 592ee81decSopenharmony_ci } 602ee81decSopenharmony_ci 612ee81decSopenharmony_ci if (!CheckMessage(buff->buff, buff->length)) { 622ee81decSopenharmony_ci SECURITY_LOG_DEBUG("ERR MSG"); 632ee81decSopenharmony_ci return NULL; 642ee81decSopenharmony_ci } 652ee81decSopenharmony_ci 662ee81decSopenharmony_ci DslmJsonHandle handle = DslmCreateJson((const char *)buff->buff); 672ee81decSopenharmony_ci if (handle == NULL) { 682ee81decSopenharmony_ci SECURITY_LOG_DEBUG("ERR JSON MSG"); 692ee81decSopenharmony_ci return NULL; 702ee81decSopenharmony_ci } 712ee81decSopenharmony_ci 722ee81decSopenharmony_ci char *payload = NULL; 732ee81decSopenharmony_ci MessagePacket *packet = NULL; 742ee81decSopenharmony_ci do { 752ee81decSopenharmony_ci int32_t msgType = DslmGetJsonFieldInt(handle, FIELD_MESSAGE); 762ee81decSopenharmony_ci if (msgType < 0) { 772ee81decSopenharmony_ci break; 782ee81decSopenharmony_ci } 792ee81decSopenharmony_ci payload = DslmConvertJsonToString(DslmGetJsonFieldJson(handle, FIELD_PAYLOAD)); 802ee81decSopenharmony_ci if (payload == NULL) { 812ee81decSopenharmony_ci break; 822ee81decSopenharmony_ci } 832ee81decSopenharmony_ci packet = MALLOC(sizeof(MessagePacket)); 842ee81decSopenharmony_ci if (packet == NULL) { 852ee81decSopenharmony_ci FREE(payload); 862ee81decSopenharmony_ci break; 872ee81decSopenharmony_ci } 882ee81decSopenharmony_ci packet->type = (uint32_t)msgType; 892ee81decSopenharmony_ci packet->payload = (uint8_t *)payload; 902ee81decSopenharmony_ci packet->length = strlen(payload) + 1; // for the end flag '\0' 912ee81decSopenharmony_ci } while (0); 922ee81decSopenharmony_ci 932ee81decSopenharmony_ci DslmDestroyJson(handle); 942ee81decSopenharmony_ci return packet; 952ee81decSopenharmony_ci} 962ee81decSopenharmony_ci 972ee81decSopenharmony_civoid FreeMessagePacket(MessagePacket *packet) 982ee81decSopenharmony_ci{ 992ee81decSopenharmony_ci if (packet == NULL) { 1002ee81decSopenharmony_ci return; 1012ee81decSopenharmony_ci } 1022ee81decSopenharmony_ci if (packet->payload != NULL) { 1032ee81decSopenharmony_ci FREE(packet->payload); 1042ee81decSopenharmony_ci packet->payload = NULL; 1052ee81decSopenharmony_ci } 1062ee81decSopenharmony_ci FREE((void *)packet); 1072ee81decSopenharmony_ci} 1082ee81decSopenharmony_ci 1092ee81decSopenharmony_civoid FreeMessageBuff(MessageBuff *buff) 1102ee81decSopenharmony_ci{ 1112ee81decSopenharmony_ci if (buff == NULL) { 1122ee81decSopenharmony_ci return; 1132ee81decSopenharmony_ci } 1142ee81decSopenharmony_ci if (buff->buff != NULL) { 1152ee81decSopenharmony_ci FREE(buff->buff); 1162ee81decSopenharmony_ci buff->buff = NULL; 1172ee81decSopenharmony_ci } 1182ee81decSopenharmony_ci FREE((void *)buff); 1192ee81decSopenharmony_ci} 120