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