summaryrefslogtreecommitdiff
path: root/src/agent/framework/san-parser/pm_sanparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/agent/framework/san-parser/pm_sanparser.c')
-rw-r--r--src/agent/framework/san-parser/pm_sanparser.c363
1 files changed, 363 insertions, 0 deletions
diff --git a/src/agent/framework/san-parser/pm_sanparser.c b/src/agent/framework/san-parser/pm_sanparser.c
new file mode 100644
index 0000000..f82cad9
--- /dev/null
+++ b/src/agent/framework/san-parser/pm_sanparser.c
@@ -0,0 +1,363 @@
+/*
+ * oma-dm-agent
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*lib*/
+#include <inttypes.h>
+#include <wbxml/wbxml.h>
+#include <wbxml/wbxml_tree.h>
+
+/*sync-agent*/
+#include <sync_agent.h>
+
+/*dm-agent*/
+#include "common/dm_common.h"
+#include "framework/san-parser/pm_sanparser.h"
+
+#ifndef OMADM_AGENT_LOG
+#undef LOG_TAG
+#define LOG_TAG "DM_SAN"
+#endif
+
+SanPackage *sanpackage_noti_parser(const char *msgBody, unsigned int msgSize)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retvm_if((msgBody) == NULL, NULL, "msgBody is NULL!!");
+
+ _DEBUG_INFO("[sanPackage12Parser] msgSize : %d ", msgSize);
+
+ unsigned int idLength = (uint8_t) msgBody[23];
+ if (msgSize < (24 + idLength)) {
+ _DEBUG_INFO("[sanPackage12Parser] SAN package size is smaller than");
+ _DEBUG_INFO("[sanPackage12Parser] its minimal size specified in the spec, related to [Header] part.");
+ _EXTERN_FUNC_EXIT;
+ return NULL;
+ }
+
+ SanPackage *san = (SanPackage *) calloc(1, sizeof(SanPackage));
+ if (san == NULL) {
+ _DEBUG_INFO("[sanPackage12Parser] SAN package memory allocation fail. [Container]");
+ _EXTERN_FUNC_EXIT;
+ return NULL;
+ }
+ // MSG BODY WITHOUT DIGEST
+ san->msgBodyWithoutDigest = (char *)calloc(msgSize - 16, sizeof(char));
+ if (san->msgBodyWithoutDigest == NULL) {
+ _DEBUG_INFO("[sanPackage12Parser] SAN package memory allocation fail. [Msg body]");
+ goto error;
+ }
+ memcpy(san->msgBodyWithoutDigest, msgBody + 16, msgSize - 16);
+ san->msgBodyWithoutDigestLength = msgSize - 16;
+
+ // DIGEST
+ san->digest = (char *)calloc(16, sizeof(char));
+ if (san->digest == NULL) {
+ _DEBUG_INFO("[sanPackage12Parser] SAN package memory allocation fail. [Digest]");
+ goto error;
+ }
+ memcpy(san->digest, msgBody, 16);
+
+ // VERSION
+ unsigned int version = ((uint8_t) msgBody[16]) << 2;
+ version = version | ((uint8_t) msgBody[17]) >> 6;
+
+ /*CURRENT VERSION 11
+ if ( version != 12 ) {
+ _DEBUG_INFO("[sanPackage12Parser] Not supported SAN version %d.", version);
+ goto error;
+ } */
+ _DEBUG_INFO("[sanPackage12Parser] SAN version %d.", version);
+ san->version = version;
+
+ // UI MODE
+ san->uiMode = (((uint8_t) msgBody[17]) & 0x30) >> 4;
+
+ // INITIATOR
+ san->initiator = (((uint8_t) msgBody[17]) & 0x08) >> 3;
+
+ // SESSION ID
+ /*san->sessionID = ((uint8_t)msgBody[21]) << 8;
+ san->sessionID = san->sessionID | (uint8_t)msgBody[22]; */
+ _DEBUG_INFO("session id : %02X%02X \n", msgBody[21], msgBody[22]);
+ san->sessionID = (unsigned char *)g_strdup_printf("%02X%02X", msgBody[21], msgBody[22]);
+ _DEBUG_INFO("------------------------------------------------------------------------------\n");
+ _DEBUG_INFO("session id : %s \n", san->sessionID);
+
+ // SERVER ID
+ if (idLength != 0) {
+ san->serverID = (char *)calloc(idLength + 1, sizeof(char));
+ if (san->serverID == NULL) {
+ _DEBUG_INFO("[sanPackage_noti_Parser] SAN package memory allocation fail. [Server ID]");
+ goto error;
+ }
+ memcpy(san->serverID, msgBody + 24, idLength);
+ }
+
+ _EXTERN_FUNC_EXIT;
+ return san;
+
+ error:
+ free_sanpackageparser(san);
+ _EXTERN_FUNC_EXIT;
+ return NULL;
+
+}
+
+SanPackage *sanpackage_xml_parser(const char *msgBody, unsigned int msgSize)
+{
+ _EXTERN_FUNC_ENTER;
+
+ retvm_if((msgBody) == NULL, NULL, "msgBody is NULL!!");
+
+ SanPackage *san = (SanPackage *) calloc(1, sizeof(SanPackage));
+ if (san == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [Container]");
+ _EXTERN_FUNC_EXIT;
+ return NULL;
+ }
+
+ WBXMLTree *wbxml_tree = NULL;
+ WBXMLError wbxml_err = wbxml_tree_from_wbxml((unsigned char *)msgBody, msgSize, WBXML_LANG_UNKNOWN, WBXML_CHARSET_UNKNOWN, &wbxml_tree);
+
+ if (wbxml_err != WBXML_OK) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] Libwbxml2 failed to parse WBXML STREAM to WBXML TREE, error code : %s", wbxml_errors_string(wbxml_err));
+ goto error;
+ }
+
+ WBXMLTreeNode *synchdr_node;
+ if ((synchdr_node = wbxml_tree_node_elt_get_from_name(wbxml_tree->root, "SyncHdr", TRUE)) == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [SyncHdr]");
+ goto error;
+ }
+ WBXMLTreeNode *child_node = NULL;
+ const char *child_node_name = NULL;
+
+ for (child_node = synchdr_node->children; child_node != NULL; child_node = child_node->next) {
+ child_node_name = (const char *)wbxml_tag_get_xml_name(child_node->name);
+
+ if ((strcmp(child_node_name, "VerDTD") == 0) || (strcmp(child_node_name, "VerProto") == 0)) {
+ char *version = NULL;
+ if (child_node->children != NULL && child_node->children->type == WBXML_TREE_TEXT_NODE && child_node->children->content != NULL) {
+
+ version = (char *)wbxml_buffer_get_cstr(child_node->children->content);
+
+ if (strcmp(version, "1.1") && strcmp(version, "SyncML/1.1")) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] Not supported SAN version %s.", version);
+ goto error;
+ }
+ san->version = 11;
+ }
+ } else if (strcmp(child_node_name, "SessionID") == 0) {
+ char *sessionID = NULL;
+ if (child_node->children != NULL && child_node->children->type == WBXML_TREE_TEXT_NODE && child_node->children->content != NULL) {
+
+ sessionID = (char *)wbxml_buffer_get_cstr(child_node->children->content);
+
+ if (sessionID == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] NULL sessionID detected. sessionID MUST NOT be NULL.");
+ goto error;
+ }
+ san->sessionID = (unsigned char *)strdup(sessionID);
+ }
+ } else if (strcmp(child_node_name, "Source") == 0) {
+ char *serverID = NULL;
+ unsigned serverIDlen = 0;
+ WBXMLTreeNode *serverid_node;
+ if ((serverid_node = wbxml_tree_node_elt_get_from_name(child_node, "LocURI", TRUE)) == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [LocURI]");
+ goto error;
+ }
+
+ if (serverid_node->children != NULL && serverid_node->children->type == WBXML_TREE_TEXT_NODE && serverid_node->children->content != NULL) {
+
+ serverID = (char *)wbxml_buffer_get_cstr(serverid_node->children->content);
+ serverIDlen = wbxml_buffer_len(serverid_node->children->content);
+ if (serverID == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] NULL serverID detected. serverID MUST NOT be NULL.");
+ goto error;
+ }
+
+ san->serverID = (char *)calloc(serverIDlen, sizeof(char));
+ if (san->serverID == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [Server ID]");
+ goto error;
+ }
+ memcpy(san->serverID, serverID, serverIDlen);
+ }
+ } else if (strcmp(child_node_name, "Cred") == 0) {
+
+ san->cred = (SanCred *) calloc(1, sizeof(SanCred));
+ if (san->cred == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [cred]");
+ goto error;
+ }
+ char *credFormat = NULL;
+ unsigned credFormatLen = 0;
+ WBXMLTreeNode *credformat_node;
+ if ((credformat_node = wbxml_tree_node_elt_get_from_name(child_node, "Format", TRUE)) == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [Format]");
+ goto error;
+ }
+
+ if (credformat_node->children != NULL && credformat_node->children->type == WBXML_TREE_TEXT_NODE && credformat_node->children->content != NULL) {
+
+ credFormat = (char *)wbxml_buffer_get_cstr(credformat_node->children->content);
+ credFormatLen = wbxml_buffer_len(credformat_node->children->content);
+ if (credFormat == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] NULL credFormat detected. credFormat MUST NOT be NULL.");
+ goto error;
+ }
+
+ san->cred->credFormat = (char *)calloc(credFormatLen, sizeof(char));
+ if (san->cred->credFormat == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [credFormat]");
+ goto error;
+ }
+ memcpy(san->cred->credFormat, credFormat, credFormatLen);
+ }
+
+ char *credAuth = NULL;
+ unsigned credAuthLen = 0;
+ WBXMLTreeNode *credauth_node;
+ if ((credauth_node = wbxml_tree_node_elt_get_from_name(child_node, "Type", TRUE)) == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [Type]");
+ goto error;
+ }
+
+ if (credauth_node->children != NULL && credauth_node->children->type == WBXML_TREE_TEXT_NODE && credauth_node->children->content != NULL) {
+
+ credAuth = (char *)wbxml_buffer_get_cstr(credauth_node->children->content);
+ credAuthLen = wbxml_buffer_len(credauth_node->children->content);
+ if (credAuth == NULL) {
+ _DEBUG_INFO("[sanPackage11Parser] NULL credAuth detected. credAuth MUST NOT be NULL.");
+ goto error;
+ }
+
+ san->cred->credAuth = (char *)calloc(credAuthLen, sizeof(char));
+ if (san->cred->credAuth == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [credAuth]");
+ goto error;
+ }
+ memcpy(san->cred->credAuth, credAuth, credAuthLen);
+ }
+
+ char *credData = NULL;
+ unsigned credDataLen = 0;
+ WBXMLTreeNode *creddata_node;
+ if ((creddata_node = wbxml_tree_node_elt_get_from_name(child_node, "Data", TRUE)) == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [Data]");
+ goto error;
+ }
+
+ if (creddata_node->children != NULL && creddata_node->children->type == WBXML_TREE_TEXT_NODE && creddata_node->children->content != NULL) {
+
+ credData = (char *)wbxml_buffer_get_cstr(creddata_node->children->content);
+ credDataLen = wbxml_buffer_len(creddata_node->children->content);
+ if (credData == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] NULL credData detected. credData MUST NOT be NULL.");
+ goto error;
+ }
+
+ san->cred->credData = (char *)calloc(credDataLen, sizeof(char));
+ if (san->cred->credData == NULL) {
+ _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [credData]");
+ goto error;
+ }
+ memcpy(san->cred->credData, credData, credDataLen);
+ }
+ }
+ }
+
+ wbxml_tree_destroy(wbxml_tree);
+
+ _EXTERN_FUNC_EXIT;
+ return san;
+
+ error:
+ free_sanpackageparser(san);
+
+ _EXTERN_FUNC_EXIT;
+
+ return NULL;
+
+}
+
+void free_sanpackageparser(SanPackage * san)
+{
+ _EXTERN_FUNC_ENTER;
+
+ if (san != NULL) {
+ if (san->msgBodyWithoutDigest != NULL)
+ free(san->msgBodyWithoutDigest);
+ if (san->digest != NULL)
+ free(san->digest);
+ if (san->cred != NULL) {
+ if (san->cred->credFormat != NULL)
+ free(san->cred->credFormat);
+ if (san->cred->credAuth != NULL)
+ free(san->cred->credAuth);
+ if (san->cred->credData != NULL)
+ free(san->cred->credData);
+ free(san->cred);
+ }
+ if (san->serverID != NULL) {
+ free(san->serverID);
+ }
+ if (san->sessionID != NULL) {
+ free(san->sessionID);
+ }
+ free(san);
+ }
+ san = NULL;
+
+ _EXTERN_FUNC_EXIT;
+}
+
+void san_printmsg(SanPackage * san)
+{
+ _EXTERN_FUNC_ENTER;
+
+ int i;
+ retm_if((san) == NULL, "san is NULL!!");
+
+ _DEBUG_INFO("Printing SAN package ============================\n\n");
+
+ _DEBUG_INFO("MsgBody without Digest :\n\t");
+ for (i = 0; i < san->msgBodyWithoutDigestLength; i++) {
+ _DEBUG_INFO("%02x ", san->msgBodyWithoutDigest[i]);
+ if ((i + 1) % 16 == 0)
+ printf("\n\t");
+ }
+ _DEBUG_INFO("\n");
+
+ _DEBUG_INFO("Digest : %s\n", san->digest);
+ if (san->cred != NULL) {
+ if (san->cred->credFormat)
+ _DEBUG_INFO("Cred Format : %s\n", san->cred->credFormat);
+ if (san->cred->credAuth != NULL)
+ _DEBUG_INFO("Cred Type : %s\n", san->cred->credAuth);
+ if (san->cred->credData != NULL)
+ _DEBUG_INFO("Cred Data : %s\n", san->cred->credData);
+ }
+ _DEBUG_INFO("Version : %d\n", san->version);
+ _DEBUG_INFO("UI mode : %d\n", san->uiMode);
+ _DEBUG_INFO("Initiator : %d\n", san->initiator);
+ _DEBUG_INFO("Session ID : %u\n", san->sessionID);
+ _DEBUG_INFO("Server ID : %s\n", san->serverID);
+
+ _EXTERN_FUNC_EXIT;
+}