Tizen 2.0 Release
[framework/system/oma-dm-agent.git] / src / agent / framework / san-parser / pm_sanparser.c
1 /*
2  * oma-dm-agent
3  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4  *
5  * Licensed under the Apache License, Version 2.0 (the License);
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 /*lib*/
19 #include <inttypes.h>
20 #include <wbxml/wbxml.h>
21 #include <wbxml/wbxml_tree.h>
22
23 /*sync-agent*/
24 #include <sync_agent.h>
25
26 /*dm-agent*/
27 #include "common/dm_common.h"
28 #include "framework/san-parser/pm_sanparser.h"
29
30 #ifndef OMADM_AGENT_LOG
31 #undef LOG_TAG
32 #define LOG_TAG "DM_SAN"
33 #endif
34
35 SanPackage *sanpackage_noti_parser(const char *msgBody, unsigned int msgSize)
36 {
37         _EXTERN_FUNC_ENTER;
38
39         retvm_if((msgBody) == NULL, NULL, "msgBody is NULL!!");
40
41         _DEBUG_INFO("[sanPackage12Parser] msgSize : %d ", msgSize);
42
43         unsigned int idLength = (uint8_t) msgBody[23];
44         if (msgSize < (24 + idLength)) {
45                 _DEBUG_INFO("[sanPackage12Parser] SAN package size is smaller than");
46                 _DEBUG_INFO("[sanPackage12Parser] its minimal size specified in the spec, related to [Header] part.");
47                 _EXTERN_FUNC_EXIT;
48                 return NULL;
49         }
50
51         SanPackage *san = (SanPackage *) calloc(1, sizeof(SanPackage));
52         if (san == NULL) {
53                 _DEBUG_INFO("[sanPackage12Parser] SAN package memory allocation fail. [Container]");
54                 _EXTERN_FUNC_EXIT;
55                 return NULL;
56         }
57         // MSG BODY WITHOUT DIGEST
58         san->msgBodyWithoutDigest = (char *)calloc(msgSize - 16, sizeof(char));
59         if (san->msgBodyWithoutDigest == NULL) {
60                 _DEBUG_INFO("[sanPackage12Parser] SAN package memory allocation fail. [Msg body]");
61                 goto error;
62         }
63         memcpy(san->msgBodyWithoutDigest, msgBody + 16, msgSize - 16);
64         san->msgBodyWithoutDigestLength = msgSize - 16;
65
66         // DIGEST
67         san->digest = (char *)calloc(16, sizeof(char));
68         if (san->digest == NULL) {
69                 _DEBUG_INFO("[sanPackage12Parser] SAN package memory allocation fail. [Digest]");
70                 goto error;
71         }
72         memcpy(san->digest, msgBody, 16);
73
74         // VERSION
75         unsigned int version = ((uint8_t) msgBody[16]) << 2;
76         version = version | ((uint8_t) msgBody[17]) >> 6;
77
78         /*CURRENT VERSION 11
79            if ( version != 12 ) {
80            _DEBUG_INFO("[sanPackage12Parser] Not supported SAN version %d.", version);
81            goto error;
82            } */
83         _DEBUG_INFO("[sanPackage12Parser] SAN version %d.", version);
84         san->version = version;
85
86         // UI MODE
87         san->uiMode = (((uint8_t) msgBody[17]) & 0x30) >> 4;
88
89         // INITIATOR
90         san->initiator = (((uint8_t) msgBody[17]) & 0x08) >> 3;
91
92         // SESSION ID
93         /*san->sessionID = ((uint8_t)msgBody[21]) << 8;
94            san->sessionID = san->sessionID | (uint8_t)msgBody[22]; */
95         _DEBUG_INFO("session id : %02X%02X \n", msgBody[21], msgBody[22]);
96         san->sessionID = (unsigned char *)g_strdup_printf("%02X%02X", msgBody[21], msgBody[22]);
97         _DEBUG_INFO("------------------------------------------------------------------------------\n");
98         _DEBUG_INFO("session id : %s \n", san->sessionID);
99
100         // SERVER ID
101         if (idLength != 0) {
102                 san->serverID = (char *)calloc(idLength + 1, sizeof(char));
103                 if (san->serverID == NULL) {
104                         _DEBUG_INFO("[sanPackage_noti_Parser] SAN package memory allocation fail. [Server ID]");
105                         goto error;
106                 }
107                 memcpy(san->serverID, msgBody + 24, idLength);
108         }
109
110         _EXTERN_FUNC_EXIT;
111         return san;
112
113  error:
114         free_sanpackageparser(san);
115         _EXTERN_FUNC_EXIT;
116         return NULL;
117
118 }
119
120 SanPackage *sanpackage_xml_parser(const char *msgBody, unsigned int msgSize)
121 {
122         _EXTERN_FUNC_ENTER;
123
124         retvm_if((msgBody) == NULL, NULL, "msgBody is NULL!!");
125
126         SanPackage *san = (SanPackage *) calloc(1, sizeof(SanPackage));
127         if (san == NULL) {
128                 _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [Container]");
129                 _EXTERN_FUNC_EXIT;
130                 return NULL;
131         }
132
133         WBXMLTree *wbxml_tree = NULL;
134         WBXMLError wbxml_err = wbxml_tree_from_wbxml((unsigned char *)msgBody, msgSize, WBXML_LANG_UNKNOWN, WBXML_CHARSET_UNKNOWN, &wbxml_tree);
135
136         if (wbxml_err != WBXML_OK) {
137                 _DEBUG_INFO("[sanPackage_xml_Parser] Libwbxml2 failed to parse WBXML STREAM to WBXML TREE, error code : %s", wbxml_errors_string(wbxml_err));
138                 goto error;
139         }
140
141         WBXMLTreeNode *synchdr_node;
142         if ((synchdr_node = wbxml_tree_node_elt_get_from_name(wbxml_tree->root, "SyncHdr", TRUE)) == NULL) {
143                 _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [SyncHdr]");
144                 goto error;
145         }
146         WBXMLTreeNode *child_node = NULL;
147         const char *child_node_name = NULL;
148
149         for (child_node = synchdr_node->children; child_node != NULL; child_node = child_node->next) {
150                 child_node_name = (const char *)wbxml_tag_get_xml_name(child_node->name);
151
152                 if ((strcmp(child_node_name, "VerDTD") == 0) || (strcmp(child_node_name, "VerProto") == 0)) {
153                         char *version = NULL;
154                         if (child_node->children != NULL && child_node->children->type == WBXML_TREE_TEXT_NODE && child_node->children->content != NULL) {
155
156                                 version = (char *)wbxml_buffer_get_cstr(child_node->children->content);
157
158                                 if (strcmp(version, "1.1") && strcmp(version, "SyncML/1.1")) {
159                                         _DEBUG_INFO("[sanPackage_xml_Parser] Not supported SAN version %s.", version);
160                                         goto error;
161                                 }
162                                 san->version = 11;
163                         }
164                 } else if (strcmp(child_node_name, "SessionID") == 0) {
165                         char *sessionID = NULL;
166                         if (child_node->children != NULL && child_node->children->type == WBXML_TREE_TEXT_NODE && child_node->children->content != NULL) {
167
168                                 sessionID = (char *)wbxml_buffer_get_cstr(child_node->children->content);
169
170                                 if (sessionID == NULL) {
171                                         _DEBUG_INFO("[sanPackage_xml_Parser] NULL sessionID detected. sessionID MUST NOT be NULL.");
172                                         goto error;
173                                 }
174                                 san->sessionID = (unsigned char *)strdup(sessionID);
175                         }
176                 } else if (strcmp(child_node_name, "Source") == 0) {
177                         char *serverID = NULL;
178                         unsigned serverIDlen = 0;
179                         WBXMLTreeNode *serverid_node;
180                         if ((serverid_node = wbxml_tree_node_elt_get_from_name(child_node, "LocURI", TRUE)) == NULL) {
181                                 _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [LocURI]");
182                                 goto error;
183                         }
184
185                         if (serverid_node->children != NULL && serverid_node->children->type == WBXML_TREE_TEXT_NODE && serverid_node->children->content != NULL) {
186
187                                 serverID = (char *)wbxml_buffer_get_cstr(serverid_node->children->content);
188                                 serverIDlen = wbxml_buffer_len(serverid_node->children->content);
189                                 if (serverID == NULL) {
190                                         _DEBUG_INFO("[sanPackage_xml_Parser] NULL serverID detected. serverID MUST NOT be NULL.");
191                                         goto error;
192                                 }
193
194                                 san->serverID = (char *)calloc(serverIDlen, sizeof(char));
195                                 if (san->serverID == NULL) {
196                                         _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [Server ID]");
197                                         goto error;
198                                 }
199                                 memcpy(san->serverID, serverID, serverIDlen);
200                         }
201                 } else if (strcmp(child_node_name, "Cred") == 0) {
202
203                         san->cred = (SanCred *) calloc(1, sizeof(SanCred));
204                         if (san->cred == NULL) {
205                                 _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [cred]");
206                                 goto error;
207                         }
208                         char *credFormat = NULL;
209                         unsigned credFormatLen = 0;
210                         WBXMLTreeNode *credformat_node;
211                         if ((credformat_node = wbxml_tree_node_elt_get_from_name(child_node, "Format", TRUE)) == NULL) {
212                                 _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [Format]");
213                                 goto error;
214                         }
215
216                         if (credformat_node->children != NULL && credformat_node->children->type == WBXML_TREE_TEXT_NODE && credformat_node->children->content != NULL) {
217
218                                 credFormat = (char *)wbxml_buffer_get_cstr(credformat_node->children->content);
219                                 credFormatLen = wbxml_buffer_len(credformat_node->children->content);
220                                 if (credFormat == NULL) {
221                                         _DEBUG_INFO("[sanPackage_xml_Parser] NULL credFormat detected. credFormat MUST NOT be NULL.");
222                                         goto error;
223                                 }
224
225                                 san->cred->credFormat = (char *)calloc(credFormatLen, sizeof(char));
226                                 if (san->cred->credFormat == NULL) {
227                                         _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [credFormat]");
228                                         goto error;
229                                 }
230                                 memcpy(san->cred->credFormat, credFormat, credFormatLen);
231                         }
232
233                         char *credAuth = NULL;
234                         unsigned credAuthLen = 0;
235                         WBXMLTreeNode *credauth_node;
236                         if ((credauth_node = wbxml_tree_node_elt_get_from_name(child_node, "Type", TRUE)) == NULL) {
237                                 _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [Type]");
238                                 goto error;
239                         }
240
241                         if (credauth_node->children != NULL && credauth_node->children->type == WBXML_TREE_TEXT_NODE && credauth_node->children->content != NULL) {
242
243                                 credAuth = (char *)wbxml_buffer_get_cstr(credauth_node->children->content);
244                                 credAuthLen = wbxml_buffer_len(credauth_node->children->content);
245                                 if (credAuth == NULL) {
246                                         _DEBUG_INFO("[sanPackage11Parser] NULL credAuth detected. credAuth MUST NOT be NULL.");
247                                         goto error;
248                                 }
249
250                                 san->cred->credAuth = (char *)calloc(credAuthLen, sizeof(char));
251                                 if (san->cred->credAuth == NULL) {
252                                         _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [credAuth]");
253                                         goto error;
254                                 }
255                                 memcpy(san->cred->credAuth, credAuth, credAuthLen);
256                         }
257
258                         char *credData = NULL;
259                         unsigned credDataLen = 0;
260                         WBXMLTreeNode *creddata_node;
261                         if ((creddata_node = wbxml_tree_node_elt_get_from_name(child_node, "Data", TRUE)) == NULL) {
262                                 _DEBUG_INFO("[sanPackage_xml_Parser] NULL from wbxml_tree_node_elt_get_from_name. [Data]");
263                                 goto error;
264                         }
265
266                         if (creddata_node->children != NULL && creddata_node->children->type == WBXML_TREE_TEXT_NODE && creddata_node->children->content != NULL) {
267
268                                 credData = (char *)wbxml_buffer_get_cstr(creddata_node->children->content);
269                                 credDataLen = wbxml_buffer_len(creddata_node->children->content);
270                                 if (credData == NULL) {
271                                         _DEBUG_INFO("[sanPackage_xml_Parser] NULL credData detected. credData MUST NOT be NULL.");
272                                         goto error;
273                                 }
274
275                                 san->cred->credData = (char *)calloc(credDataLen, sizeof(char));
276                                 if (san->cred->credData == NULL) {
277                                         _DEBUG_INFO("[sanPackage_xml_Parser] SAN package memory allocation fail. [credData]");
278                                         goto error;
279                                 }
280                                 memcpy(san->cred->credData, credData, credDataLen);
281                         }
282                 }
283         }
284
285         wbxml_tree_destroy(wbxml_tree);
286
287         _EXTERN_FUNC_EXIT;
288         return san;
289
290  error:
291         free_sanpackageparser(san);
292
293         _EXTERN_FUNC_EXIT;
294
295         return NULL;
296
297 }
298
299 void free_sanpackageparser(SanPackage * san)
300 {
301         _EXTERN_FUNC_ENTER;
302
303         if (san != NULL) {
304                 if (san->msgBodyWithoutDigest != NULL)
305                         free(san->msgBodyWithoutDigest);
306                 if (san->digest != NULL)
307                         free(san->digest);
308                 if (san->cred != NULL) {
309                         if (san->cred->credFormat != NULL)
310                                 free(san->cred->credFormat);
311                         if (san->cred->credAuth != NULL)
312                                 free(san->cred->credAuth);
313                         if (san->cred->credData != NULL)
314                                 free(san->cred->credData);
315                         free(san->cred);
316                 }
317                 if (san->serverID != NULL) {
318                         free(san->serverID);
319                 }
320                 if (san->sessionID != NULL) {
321                         free(san->sessionID);
322                 }
323                 free(san);
324         }
325         san = NULL;
326
327         _EXTERN_FUNC_EXIT;
328 }
329
330 void san_printmsg(SanPackage * san)
331 {
332         _EXTERN_FUNC_ENTER;
333
334         int i;
335         retm_if((san) == NULL, "san is NULL!!");
336
337         _DEBUG_INFO("Printing SAN package ============================\n\n");
338
339         _DEBUG_INFO("MsgBody without Digest :\n\t");
340         for (i = 0; i < san->msgBodyWithoutDigestLength; i++) {
341                 _DEBUG_INFO("%02x ", san->msgBodyWithoutDigest[i]);
342                 if ((i + 1) % 16 == 0)
343                         printf("\n\t");
344         }
345         _DEBUG_INFO("\n");
346
347         _DEBUG_INFO("Digest : %s\n", san->digest);
348         if (san->cred != NULL) {
349                 if (san->cred->credFormat)
350                         _DEBUG_INFO("Cred Format : %s\n", san->cred->credFormat);
351                 if (san->cred->credAuth != NULL)
352                         _DEBUG_INFO("Cred Type : %s\n", san->cred->credAuth);
353                 if (san->cred->credData != NULL)
354                         _DEBUG_INFO("Cred Data : %s\n", san->cred->credData);
355         }
356         _DEBUG_INFO("Version : %d\n", san->version);
357         _DEBUG_INFO("UI mode : %d\n", san->uiMode);
358         _DEBUG_INFO("Initiator : %d\n", san->initiator);
359         _DEBUG_INFO("Session ID : %u\n", san->sessionID);
360         _DEBUG_INFO("Server ID : %s\n", san->serverID);
361
362         _EXTERN_FUNC_EXIT;
363 }