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.
23 /******************************************************************************
24 * File : email-core-mm_callbacks.c
25 * Desc : mm_callbacks for IMAP-2004g
30 * 2006.08.22 : created
31 *****************************************************************************/
35 #include "email-internal-types.h"
37 #include "email-core-global.h"
38 #include "email-core-utils.h"
39 #include "email-debug-log.h"
40 #include "email-core-mailbox.h"
41 #include "email-core-account.h"
43 static void mm_get_error(char *string, int *err_code);
47 * get subscribed mailbox list
49 INTERNAL_FUNC void mm_lsub(MAILSTREAM *stream, int delimiter, char *mailbox, long attributes)
51 EM_DEBUG_FUNC_BEGIN();
52 email_callback_holder_t *p_holder = (email_callback_holder_t *)stream->sparep;
53 email_mailbox_t *p, *p_old = p_holder->data;
54 int count = p_holder->num;
57 /* memory allocation */
58 p = realloc(p_old, sizeof(email_mailbox_t) * (count + 1));
61 /* uw-imap mailbox name format (ex : "{mail.test.com...}inbox" or "{mail.test.com...}anybox/anysubbox") */
62 enc_path = strchr(mailbox, '}');
66 emcore_free_mailbox_list(&p, count+1);
70 /* Convert UTF7 mailbox name to UTF8 mailbox name */
72 /* convert directory delimiter to '/' */
73 for (s = enc_path; *s; s++) {
74 if (*s == (char)delimiter) {
80 p[count].mailbox_name = cpystr(enc_path);
81 p[count].alias = cpystr(enc_path);
83 p[count].account_id = stream->spare8;
89 /* ignore attributes */
90 /* if (attributes & latt_noinferiors) fputs (", no inferiors", fp_log); */
91 /* if (attributes & latt_noselect) fputs (", no select", fp_log); */
92 /* if (attributes & latt_marked) fputs (", marked", fp_log); */
93 /* if (attributes & latt_unmarked) fputs (", unmarked", fp_log); */
102 INTERNAL_FUNC void mm_list(MAILSTREAM *stream, int delimiter, char *mailbox, long attributes)
104 EM_DEBUG_FUNC_BEGIN();
105 email_callback_holder_t *p_holder = (email_callback_holder_t *)stream->sparep;
106 email_internal_mailbox_t *p, *p_old = p_holder->data;
107 int count = p_holder->num;
110 /* memory allocation */
111 p = realloc(p_old, sizeof(email_internal_mailbox_t) * (count + 1));
114 /* uw-imap mailbox name format (ex : "{mail.test.com...}inbox" or "{mail.test.com...}anybox/anysubbox") */
115 enc_path = strchr(mailbox, '}');
119 emcore_free_internal_mailbox(&p, count+1, NULL);
123 /* convert directory delimiter to '/' */
124 for (s = enc_path;*s;s++)
125 if (*s == (char)delimiter)
129 memset(p + count, 0x00, sizeof(email_internal_mailbox_t));
131 #ifdef __FEATURE_XLIST_SUPPORT__
132 if(attributes & LATT_XLIST_INBOX)
133 p[count].mailbox_type = EMAIL_MAILBOX_TYPE_INBOX;
134 else if(attributes & LATT_XLIST_ALL)
135 p[count].mailbox_type = EMAIL_MAILBOX_TYPE_ALL_EMAILS;
136 else if(attributes & LATT_XLIST_DRAFTS)
137 p[count].mailbox_type = EMAIL_MAILBOX_TYPE_DRAFT;
138 else if(attributes & LATT_XLIST_SENT)
139 p[count].mailbox_type = EMAIL_MAILBOX_TYPE_SENTBOX;
140 else if(attributes & LATT_XLIST_JUNK)
141 p[count].mailbox_type = EMAIL_MAILBOX_TYPE_SPAMBOX;
142 else if(attributes & LATT_XLIST_FLAGGED)
143 p[count].mailbox_type = EMAIL_MAILBOX_TYPE_FLAGGED;
144 else if(attributes & LATT_XLIST_TRASH)
145 p[count].mailbox_type = EMAIL_MAILBOX_TYPE_TRASH;
146 #endif /* __FEATURE_XLIST_SUPPORT__ */
148 if(attributes & LATT_NOSELECT)
149 p[count].no_select = true;
151 if(p[count].mailbox_type == EMAIL_MAILBOX_TYPE_INBOX) /* For exception handling of Gmail inbox*/
152 p[count].mailbox_name = cpystr("INBOX");
154 p[count].mailbox_name = cpystr(enc_path);
156 EM_DEBUG_LOG("mailbox name [%s] mailbox_type [%d] no_select [%d]", p[count].mailbox_name, p[count].mailbox_type, p[count].no_select);
158 p[count].alias = emcore_get_alias_of_mailbox((const char *)enc_path);
161 EM_DEBUG_LOG("mm_list account_id %d", stream->spare8);
164 /* in mailbox name parse n get user = %d - which is account_id */
165 tmp = strstr(mailbox, "user=");
168 for (s = tmp; *s != '/'; s++);
170 p[count].account_id = atoi(tmp);
172 EM_DEBUG_LOG("mm_list account_id %d ", p[count].account_id);
177 /* ignore attributes */
186 INTERNAL_FUNC void mm_status(MAILSTREAM *stream, char *mailbox, MAILSTATUS* status)
188 EM_DEBUG_FUNC_BEGIN();
189 email_callback_holder_t *p = stream->sparep;
191 EM_DEBUG_FUNC_BEGIN();
192 if (status->flags & SA_MESSAGES)
193 p->num = status->messages;
194 if (status->flags & SA_UNSEEN)
195 p->data = (void *)status->unseen;
200 * get user_name and password
203 INTERNAL_FUNC void mm_login(NETMBX *mb, char *user, char *pwd, long trial)
205 EM_DEBUG_FUNC_BEGIN();
207 email_account_t *ref_account = NULL;
208 char *username = NULL;
209 char *password = NULL;
212 EM_DEBUG_EXCEPTION("invalid account_id...");
216 account_id = atoi(mb->user);
218 ref_account = emcore_get_account_reference(account_id);
221 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed");
225 if (ref_account->incoming_server_user_name == NULL) {
226 EM_DEBUG_EXCEPTION("invalid incoming_server_user_name...");
229 username = EM_SAFE_STRDUP(ref_account->incoming_server_user_name);
231 if (ref_account->incoming_server_password == NULL) {
232 EM_SAFE_FREE(username);
233 EM_DEBUG_EXCEPTION("invalid password...");
237 password = EM_SAFE_STRDUP(ref_account->incoming_server_password);
239 if(EM_SAFE_STRLEN(username) > 0 && EM_SAFE_STRLEN(password) > 0) { /*prevent 34355*/
240 strcpy(user, username);
241 strcpy(pwd, password);
244 EM_DEBUG_EXCEPTION("User Information is NULL || EM_SAFE_STRLEN is 0 ");
249 emcore_free_account(ref_account);
250 EM_SAFE_FREE(ref_account);
253 EM_SAFE_FREE(username);
254 EM_SAFE_FREE(password);
260 INTERNAL_FUNC void mm_dlog(char *string)
262 #ifdef FEATURE_CORE_DEBUG
263 EM_DEBUG_LOG("IMAP_TOOLKIT_DLOG [%s]", string);
267 INTERNAL_FUNC void mm_log(char *string, long errflg)
270 switch ((short)errflg) {
272 EM_DEBUG_LOG("IMAP_TOOLKIT_LOG NIL [%s]", string);
276 EM_DEBUG_LOG("IMAP_TOOLKIT_LOG WARN [%s]", string);
280 EM_DEBUG_LOG("IMAP_TOOLKIT_LOG PARSE [%s]", string);
284 EM_DEBUG_LOG("IMAP_TOOLKIT_LOG BYE [%s]", string);
288 EM_DEBUG_LOG("IMAP_TOOLKIT_LOG TCPDEBUG [%s]", string);
292 email_session_t *session = NULL;
294 EM_DEBUG_EXCEPTION("IMAP_TOOLKIT_LOG ERROR [%s]", string);
296 emcore_get_current_session(&session);
299 mm_get_error(string, &session->error);
300 EM_DEBUG_EXCEPTION("IMAP_TOOLKIT_LOG ERROR [%d]", session->error);
308 INTERNAL_FUNC void mm_searched(MAILSTREAM *stream, unsigned long number)
310 EM_DEBUG_FUNC_BEGIN("stream [%p], number [%d]", stream, number);
314 INTERNAL_FUNC void mm_exists(MAILSTREAM *stream, unsigned long number)
316 EM_DEBUG_FUNC_BEGIN("stream [%p], number [%d]", stream, number);
320 INTERNAL_FUNC void mm_expunged(MAILSTREAM *stream, unsigned long number)
322 EM_DEBUG_FUNC_BEGIN("stream [%p], number [%d]", stream, number);
326 INTERNAL_FUNC void mm_flags(MAILSTREAM *stream, unsigned long number)
328 EM_DEBUG_FUNC_BEGIN("stream [%p], number [%d]", stream, number);
332 INTERNAL_FUNC void mm_notify(MAILSTREAM *stream, char *string, long errflg)
334 EM_DEBUG_FUNC_BEGIN();
335 mm_log(string, errflg);
339 INTERNAL_FUNC void mm_critical(MAILSTREAM *stream)
341 EM_DEBUG_FUNC_BEGIN("stream [%p]", stream);
345 INTERNAL_FUNC void mm_nocritical(MAILSTREAM *stream)
347 EM_DEBUG_FUNC_BEGIN("stream [%p]", stream);
351 INTERNAL_FUNC long mm_diskerror(MAILSTREAM *stream, long errcode, long serious)
353 EM_DEBUG_FUNC_BEGIN("stream [%p] errcode[%d] serious[%d]", stream, errcode, serious);
355 kill(getpid(), SIGSTOP);
363 INTERNAL_FUNC void mm_fatal(char *string)
365 EM_DEBUG_EXCEPTION("%s", string);
368 INTERNAL_FUNC void mm_get_error(char *string, int *err_code)
370 if (!string || !err_code)
373 EM_DEBUG_LOG("string [%s]", string);
375 if (strstr(string, "login failure") || strstr(string, "Login aborted") || strstr(string, "Can't login"))
376 *err_code = EMAIL_ERROR_LOGIN_FAILURE;
377 else if (strstr(string, "Scan not valid"))
378 *err_code = EMAIL_ERROR_SCAN_NOT_SUPPORTED;
379 else if (strstr(string, "Authentication cancelled"))
380 *err_code = EMAIL_ERROR_AUTHENTICATE;
381 else if (strstr(string, "authuser"))
382 *err_code = EMAIL_ERROR_AUTH_NOT_SUPPORTED;
383 else if (strstr(string, "negotiate TLS"))
384 *err_code = EMAIL_ERROR_CANNOT_NEGOTIATE_TLS;
385 else if (strstr(string, "TLS/SSL failure"))
386 *err_code = EMAIL_ERROR_TLS_SSL_FAILURE;
387 else if (strstr(string, "STARTLS"))
388 *err_code = EMAIL_ERROR_STARTLS;
389 else if (strstr(string, "TLS unavailable"))
390 *err_code = EMAIL_ERROR_TLS_NOT_SUPPORTED;
391 else if (strstr(string, "Can't access"))
392 *err_code = EMAIL_ERROR_IMAP4_APPEND_FAILURE;
393 else if (strstr(string, "Can not authenticate"))
394 *err_code = EMAIL_ERROR_AUTHENTICATE;
395 else if (strstr(string, "Unexpected IMAP response") || strstr(string, "hello"))
396 *err_code = EMAIL_ERROR_INVALID_RESPONSE;
397 else if (strstr(string, "NOTIMAP4REV1"))
398 *err_code = EMAIL_ERROR_COMMAND_NOT_SUPPORTED;
399 else if (strstr(string, "Anonymous"))
400 *err_code = EMAIL_ERROR_ANNONYM_NOT_SUPPORTED;
401 else if (strstr(string, "connection broken"))
402 *err_code = EMAIL_ERROR_CONNECTION_BROKEN;
403 else if (strstr(string, "SMTP greeting"))
404 *err_code = EMAIL_ERROR_NO_RESPONSE;
405 else if (strstr(string, "ESMTP failure"))
406 *err_code = EMAIL_ERROR_SMTP_SEND_FAILURE;
407 else if (strstr(string, "socket") || strstr(string, "Socket"))
408 *err_code = EMAIL_ERROR_SOCKET_FAILURE;
409 else if (strstr(string, "connect to") || strstr(string, "Connection failed"))
410 *err_code = EMAIL_ERROR_CONNECTION_FAILURE;
411 else if (strstr(string, "Certificate failure"))
412 *err_code = EMAIL_ERROR_CERTIFICATE_FAILURE;
413 else if (strstr(string, "ESMTP failure"))
414 *err_code = EMAIL_ERROR_INVALID_PARAM;
415 else if (strstr(string, "No such host"))
416 *err_code = EMAIL_ERROR_NO_SUCH_HOST;
417 else if (strstr(string, "host") || strstr(string, "Host"))
418 *err_code = EMAIL_ERROR_INVALID_SERVER;
419 else if (strstr(string, "SELECT failed"))
420 *err_code = EMAIL_ERROR_MAILBOX_NOT_FOUND;
421 else if (strstr(string, "15 minute"))
422 *err_code = EMAIL_ERROR_LOGIN_ALLOWED_EVERY_15_MINS;
424 *err_code = EMAIL_ERROR_UNKNOWN;
427 #ifdef __FEATURE_SUPPORT_IMAP_ID__
428 INTERNAL_FUNC void mm_imap_id (char **id_string)
430 EM_DEBUG_FUNC_BEGIN("id_string [%p]", id_string);
432 int err = EMAIL_ERROR_NONE;
434 char *result_string = NULL;
435 char *tag_string = "ID (\"os\" \"" IMAP_ID_OS "\" \"os-version\" \"" IMAP_ID_OS_VERSION "\" \"vendor\" \"" IMAP_ID_VENDOR "\" \"device\" \"" IMAP_ID_DEVICE_NAME "\" \"AGUID\" \"" IMAP_ID_AGUID "\" \"ACLID\" \"" IMAP_ID_ACLID "\"";
439 if (id_string == NULL) {
440 EM_DEBUG_EXCEPTION("EMAIL_ERROR_INVALID_PARAM");
441 err = EMAIL_ERROR_INVALID_PARAM;
448 tag_length = EM_SAFE_STRLEN(tag_string);
449 result_string = EM_SAFE_STRDUP(tag_string);
451 if(result_string == NULL) {
452 EM_DEBUG_EXCEPTION("malloc failed");
453 err = EMAIL_ERROR_OUT_OF_MEMORY;
457 *id_string = result_string;
461 EM_DEBUG_FUNC_END("err [%d]", err);
463 #endif /* __FEATURE_SUPPORT_IMAP_ID__ */