4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
27 #include <stdarg.h> /* Needed for the definition of va_list */
30 #include "email-daemon.h"
31 #include "email-daemon-emn.h"
33 /* --------------------------------------------------------------------------------*/
34 /* ----- WBXML Parsing (2007.06.09) -----------------------------------------------*/
35 /* --------------------------------------------------------------------------------*/
39 #include <wbxml_errors.h>
40 #include "email-debug-log.h"
46 email_emn_noti_cb callback;
48 } email_emn_noti_pack_t;
51 /* Parse the Email address to Get the user Name for the account [deepam.p@samsung.com] */
52 static char* _get_username(char *account_username)
54 EM_IF_NULL_RETURN_VALUE(account_username, NULL);
57 char **token_list = NULL;
58 char *username = NULL, *name = NULL;
60 username = g_strdup(account_username);
61 token_list = g_strsplit_set(username, "@", -1);
67 if (token_list[index] != NULL)
69 name = g_strdup(token_list[index]);
70 g_strfreev(token_list); /* MUST BE. */
71 EM_DEBUG_LOG("ACCOUNT USER NAME [%s] \n", name);
78 static void _cb_parser_start_document(void* ctx, WB_LONG charset, const WBXMLLangEntry* lang)
80 EM_DEBUG_LOG("_cb_parser_start_document\n");
81 EM_DEBUG_LOG("Parsing Document:\n\tRoot Element: %s\n\tPublic ID: %s\n\tDTD: %s\n",
82 lang->publicID->xmlRootElt,
83 lang->publicID->xmlPublicID,
84 lang->publicID->xmlDTD);
87 static void _cb_parser_end_document(void* ctx)
89 EM_DEBUG_LOG("_cb_parser_end_document\n");
92 static void _cb_parser_start_element(void* ctx, WBXMLTag* element, WBXMLAttribute** atts, WB_BOOL empty)
94 WB_UTINY* p, **pp = ctx;
95 WB_ULONG j = 0, len = 0;
96 EM_DEBUG_LOG("parse_clb_start_element\n");
98 if (strcasecmp((char *)wbxml_tag_get_xml_name(element), "emn") != 0)
100 EM_DEBUG_LOG("not email notification\n");
106 EM_DEBUG_LOG("no emn attributes\n");
110 len = EM_SAFE_STRLEN((char *)wbxml_tag_get_xml_name(element)) + 1;
111 while (atts[j] != NULL)
113 len += (EM_SAFE_STRLEN((char *)wbxml_attribute_get_xml_name(atts[j])) + EM_SAFE_STRLEN((char *)wbxml_attribute_get_xml_value(atts[j])) + 7);
118 if (!(p = malloc(sizeof(WB_UTINY) * len + 1)))
123 EM_DEBUG_LOG("<%s", (char *)wbxml_tag_get_xml_name(element));
124 sprintf((char *)p, "<%s", (char *)wbxml_tag_get_xml_name(element));
127 while (atts[j] != NULL)
129 EM_DEBUG_LOG(" %s=\"%s\"", (char *)wbxml_attribute_get_xml_name(atts[j]), (char *)wbxml_attribute_get_xml_value(atts[j]));
130 strcat((char *)p, " ");
131 strcat((char *)p, (char *)wbxml_attribute_get_xml_name(atts[j]));
132 strcat((char *)p, "=");
133 strcat((char *)p, "\"");
134 strcat((char *)p, (char *)wbxml_attribute_get_xml_value(atts[j]));
135 strcat((char *)p, "\"");
141 EM_DEBUG_LOG("/>\n");
142 strcat((char *)p, "/>");
147 strcat((char *)p, ">");
153 static void _cb_parser_end_element(void* ctx, WBXMLTag* element, WB_BOOL empty)
155 EM_DEBUG_LOG("parse_clb_end_element\n");
158 static void _cb_parser_characters(void* ctx, WB_UTINY* ch, WB_ULONG start, WB_ULONG length)
160 EM_DEBUG_LOG("_cb_parser_characters\n");
163 static int _get_addr_from_element(unsigned char* elm,
165 unsigned char** incoming_server_user_name,
166 unsigned char** host_addr,
167 unsigned char** mbox_name,
168 unsigned char** auth_type)
172 unsigned char* user = NULL;
173 unsigned char* host = NULL;
174 unsigned char* mailbox = NULL;
175 unsigned char* auth = NULL;
177 EM_DEBUG_FUNC_BEGIN();
179 if (!(p = (unsigned char*)strstr((char *)elm, "mailbox"))) /* add acetrack.20080331.K8.4043 */
181 EM_DEBUG_EXCEPTION("invalid notification data\n");
186 s = (unsigned char*)strchr((char *)p, '\"');
187 /* 2007-05-08 by acetrack */
193 case 'm':/* mailat (RFC2234) */
196 if (!(s = (unsigned char*)strchr((char *)p, '@'))) return 0;
198 user = (unsigned char*)EM_SAFE_STRDUP((char *)p);
200 host = (unsigned char*)EM_SAFE_STRDUP((char *)s);
205 case 'p':/* pop3 (RFC2384) */
208 if ((s = (unsigned char*)strchr((char *)p, ';')))
211 if (EM_SAFE_STRLEN((char *)p)) user = (unsigned char*)EM_SAFE_STRDUP((char *)p);
214 if ((s = (unsigned char*)strchr((char *)p, '@')))
217 if (user || *(p - 3) == '/')
219 if (strncmp((char *)p, "AUTH=", 5) == 0) auth = (unsigned char*)EM_SAFE_STRDUP((char *)p + 5);
222 user = (unsigned char*)EM_SAFE_STRDUP((char *)p);
225 if ((s = (unsigned char*)strchr((char *)p, ':')))
229 EM_DEBUG_LOG("PORT:%s\n", s);
231 host = (unsigned char*)EM_SAFE_STRDUP((char *)p);
235 case 'i':/* imap (RFC2192) */
238 if ((s = (unsigned char*)strchr((char *)p, ';')))
241 if (EM_SAFE_STRLEN((char *)p)) user = (unsigned char*)EM_SAFE_STRDUP((char *)p);
244 if ((s = (unsigned char*)strchr((char *)p, '@')))
247 if (user || *(p - 3) == '/')
249 if (strncmp((char *)p, "AUTH=", 5) == 0) auth = (unsigned char*)EM_SAFE_STRDUP((char *)p + 5);
252 user = (unsigned char*)EM_SAFE_STRDUP((char *)p);
256 if ((s = (unsigned char *)strchr((char *)p, '/'))) * s = '\0';
257 host = (unsigned char *)EM_SAFE_STRDUP((char *)p);
260 if ((s = (unsigned char*)strchr((char *)p, '?'))) * s = '\0';
261 else if ((s = (unsigned char*)strchr((char *)p, ';'))) * s = '\0';
262 else s = p + EM_SAFE_STRLEN((char *)p);
263 if (*(s - 1) == '/') *(s - 1) = '\0';
265 if (EM_SAFE_STRLEN((char *)p)) mailbox =(unsigned char*) EM_SAFE_STRDUP((char *)p);
268 case 'h': /* not supported */
269 EM_DEBUG_LOG("Http URI is not yet supported\n");
276 *incoming_server_user_name = user;
278 *mbox_name = mailbox;
284 static int _get_time_from_element(unsigned char* elm,
285 unsigned char** time_stamp)
287 EM_DEBUG_FUNC_BEGIN();
289 unsigned char* p, *s, *stamp = NULL;
290 if (!(p = (unsigned char*)strstr((char *)elm, "timestamp")))
292 EM_DEBUG_EXCEPTION("invalid notification data\n");
297 s = (unsigned char*)strchr((char *)p, '\"');
298 /* 2007-05-08 by acetrack */
303 if (!stamp) /* added acetrack.20080331.K8.4045 */
305 EM_DEBUG_EXCEPTION("malloc failed");
309 memcpy(stamp + 4, p + 5, 2);
310 memcpy(stamp + 6, p + 8, 2);
311 memcpy(stamp + 8, p + 11, 2);
312 memcpy(stamp + 10, p + 14, 2);
313 memcpy(stamp + 12, p + 17, 2);
321 /* <emn mailbox="mailat:user@wapforum.org" timestamp="2002-04-16T06:40:00Z"/> */
322 static int _get_data_from_element(unsigned char* elm,
324 unsigned char** incoming_server_user_name,
325 unsigned char** host_addr,
326 unsigned char** mbox_name,
327 unsigned char** auth_type,
328 unsigned char** time_stamp)
331 EM_DEBUG_FUNC_BEGIN();
332 if (!_get_time_from_element(elm, time_stamp))
337 /* must call get_addr_from_element after calling _get_time_from_element */
338 if (!_get_addr_from_element(elm, type, incoming_server_user_name, host_addr, mbox_name, auth_type))
340 EM_SAFE_FREE*time_stamp) /* added acetrack.20080331.K8.4046 */
350 * get account from OMA EMN data
352 * wbxml_b64 : BASE64 encoded data
353 * account_id: id of account to be retrieved from EMN data
354 * mailbox : if mail-box information exists in EMN data, mailbox holds the name of mailbox.
355 * err_code : hold error code
360 static int _get_emn_account(unsigned char* wbxml_b64, email_account_t* account, char** mailbox, int* err_code)
362 EM_DEBUG_LOG("_get_emn_account Enter");
363 WBXMLContentHandler parse_handler = {
364 (WBXMLStartDocumentHandler) _cb_parser_start_document,
365 (WBXMLEndDocumentHandler) _cb_parser_end_document,
366 (WBXMLStartElementHandler) _cb_parser_start_element,
367 (WBXMLEndElementHandler) _cb_parser_end_element,
368 (WBXMLCharactersHandler) _cb_parser_characters,
372 WBXMLParser* wbxml_parser = NULL;
373 WB_UTINY* wbxml = NULL;
374 WB_UTINY* elm = NULL;
375 WB_ULONG wbxml_len = 0;
376 WB_ULONG err_idx = 0;
377 WBXMLError ret = WBXML_OK;
378 email_account_t* accounts = NULL;
379 unsigned char* incoming_server_user_name = NULL;
380 unsigned char* host_addr = NULL;
381 unsigned char* mbox_name = NULL;
382 unsigned char* auth_type = NULL;
383 unsigned char* time_stamp = NULL;
388 int err = EMAIL_ERROR_NONE;
392 if (!wbxml_b64 || !account)
394 EM_DEBUG_EXCEPTION(">>>> Invalid Parameter >>>> \n");
395 err = EMAIL_ERROR_INVALID_PARAM;
399 wbxml = g_base64_decode((const char*)wbxml_b64, (unsigned int*)&wbxml_len);
400 EM_DEBUG_LOG("wbxml = %p\n", wbxml);
401 EM_DEBUG_LOG("wbxml_len = %d\n", wbxml_len);
403 /* create wbxml parser */
404 if (!(wbxml_parser = wbxml_parser_create()))
406 err = EMAIL_ERROR_OUT_OF_MEMORY;
410 /* initialize wbxml parser */
411 wbxml_parser_set_user_data(wbxml_parser, (void*)&elm);
412 wbxml_parser_set_content_handler(wbxml_parser, &parse_handler);
415 if ((ret = wbxml_parser_parse(wbxml_parser, wbxml, wbxml_len)) != WBXML_OK)
417 err_idx = wbxml_parser_get_current_byte_index(wbxml_parser);
418 EM_DEBUG_LOG("Parsing failed at %u - Token %x - %s", err_idx, wbxml[err_idx], wbxml_errors_string(ret));
420 err = EMAIL_ERROR_XML_PARSER_FAILURE;
425 EM_DEBUG_LOG("Parsing OK !\n");
429 wbxml_parser_destroy(wbxml_parser);
438 EM_DEBUG_EXCEPTION("invalid elements\n");
440 err = EMAIL_ERROR_XML_PARSER_FAILURE;
444 EM_DEBUG_LOG("elements = [%s]\n", elm);
445 _get_data_from_element(elm, &type, &incoming_server_user_name, &host_addr, &mbox_name, &auth_type, &time_stamp);
449 EM_DEBUG_LOG("user_type = [%d]\n", type);
450 EM_DEBUG_LOG("incoming_server_user_name = [%s]\n", (char *)incoming_server_user_name ? (char*)incoming_server_user_name : "NIL");
451 EM_DEBUG_LOG("host_addr = [%s]\n", (char *)host_addr ? (char*)host_addr : "NIL");
452 EM_DEBUG_LOG("mbox_name = [%s]\n", (char *)mbox_name ? (char*)mbox_name : "NIL");
453 EM_DEBUG_LOG("auth_type = [%s]\n", (char *)auth_type ? (char*)auth_type : "NIL");
454 EM_DEBUG_LOG("time_stamp= [%s]\n", (char *)time_stamp? (char*)time_stamp: "NIL");
456 if (!emdaemon_get_account_list(&accounts, &count, &err))
458 EM_DEBUG_EXCEPTION(" emdaemon_get_account_list error");
459 err = EMAIL_ERROR_DB_FAILURE;
463 for (i = 0; i < count; i++)
465 /* sowmya.kr, 201009, Fix for EMN */
466 char* temp_account_name = NULL;
468 /* EM_DEBUG_LOG(">>>> Account Information UserName [ %s ] Email Addr [ %s], Account ID [ %d] >>> \n",accounts[i].incoming_server_user_name,accounts[i].user_email_address, accounts[i].account_id); */
469 temp_account_name =(char*) EM_SAFE_STRDUP((char *)accounts[i].incoming_server_user_name);
471 if ((s = (char*)strchr((char *)temp_account_name, '@'))) {
473 EM_SAFE_FREE(accounts[i].incoming_server_user_name);
474 accounts[i].incoming_server_user_name = (char*)EM_SAFE_STRDUP((char *)temp_account_name);
476 EM_SAFE_FREE(temp_account_name);
477 if (incoming_server_user_name) {
478 if (strcmp(accounts[i].incoming_server_user_name, (char *)incoming_server_user_name) == 0 &&
479 strstr(accounts[i].user_email_address, (char *)host_addr)) {
480 EM_DEBUG_LOG(">>>> Account Match >>> \n");
482 (type == 2 && accounts[i].incoming_server_type == EMAIL_SERVER_TYPE_POP3) ||
483 (type == 3 && accounts[i].incoming_server_type == EMAIL_SERVER_TYPE_IMAP4)) {
484 accounts[i].flag2 = type;
485 EM_DEBUG_LOG("found target account id[%d] name[%s]", accounts[i].account_id, accounts[i].incoming_server_user_name);
493 EM_DEBUG_EXCEPTION("no account was found");
494 err = EMAIL_ERROR_ACCOUNT_NOT_FOUND;
498 account->account_id = accounts[i].account_id;
499 account->flag2 = accounts[i].flag2;
504 *mailbox = mbox_name ? (char *)mbox_name : NULL;
507 emdaemon_free_account(&accounts, count, NULL);
513 if (wbxml) wbxml_free(wbxml);
514 if (wbxml_parser) wbxml_parser_destroy(wbxml_parser);
516 if (accounts) emdaemon_free_account(&accounts, count, NULL);
517 EM_SAFE_FREE(incoming_server_user_name);
518 EM_SAFE_FREE(mbox_name);
519 EM_SAFE_FREE(auth_type);
520 EM_SAFE_FREE(time_stamp);
521 if (err_code) *err_code = err;
525 INTERNAL_FUNC int emdaemon_handle_emn_notification(unsigned char* wbxml_b64, email_emn_noti_cb callback, int* err_code)
527 EM_DEBUG_FUNC_BEGIN("wbxml_b64[%p], callback[%p], err_code[%p]", wbxml_b64, callback, err_code);
530 int err = EMAIL_ERROR_NONE;;
531 char* mailbox_name = NULL;
532 email_mailbox_t mailbox = { 0 };
533 email_account_t account = { 0 };
534 email_emn_noti_pack_t* pack = NULL;
535 char* pmailbox = NULL;
538 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
539 err = EMAIL_ERROR_INVALID_PARAM;
543 pack = (email_emn_noti_pack_t*)em_malloc(sizeof(email_emn_noti_pack_t));
545 EM_DEBUG_EXCEPTION("em_malloc failed");
546 err = EMAIL_ERROR_OUT_OF_MEMORY;
550 if (!_get_emn_account(wbxml_b64, &account, &mailbox_name, &err)) {
551 EM_DEBUG_EXCEPTION("_get_emn_account failed [%d]", err);
555 mailbox.account_id = account.account_id;
557 if (!emstorage_get_mailbox_name_by_mailbox_type(mailbox.account_id,EMAIL_MAILBOX_TYPE_INBOX,&pmailbox, false, &err)) {
558 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_name_by_mailbox_type failed [%d", err);
563 if ((account.incoming_server_type == EMAIL_SERVER_TYPE_IMAP4) && (account.flag2 == 3)) {
565 if (!mailbox_name || strncmp(pmailbox, mailbox_name, EM_SAFE_STRLEN(pmailbox)) != 0) {
566 EM_DEBUG_EXCEPTION("invalid inbox name [%p]", mailbox_name);
567 err = EMAIL_ERROR_INVALID_MAILBOX;
572 /* sync header with mail server */
573 mailbox.mailbox_name = mailbox_tbl->mailbox_name;
575 if (!emdaemon_sync_header(mailbox.account_id, mailbox.mailbox_id, NULL, &err)) {
576 EM_DEBUG_EXCEPTION("emdaemon_sync_header falied [%d]", err);
586 EM_SAFE_FREE(pmailbox);
588 if (err_code != NULL)
594 int emdaemon_initialize_emn(void)
596 EM_DEBUG_FUNC_BEGIN();
598 /* TODO : Write codes for subscribing OMA-EMN notification */
604 int emdaemon_finalize_emn(gboolean bExtDest)
606 EM_DEBUG_FUNC_BEGIN();
611 #endif /* USE_OMA_EMN */