2.0_alpha release commit
[framework/messaging/email-service.git] / email-core / email-core-mm-callbacks.c
1 /*
2 *  email-service
3 *
4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5 *
6 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>
7
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
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
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.
19 *
20 */
21
22
23 /******************************************************************************
24  * File :  email-core-mm_callbacks.c
25  * Desc :  mm_callbacks for IMAP-2004g
26  *
27  * Auth :  
28  *
29  * History : 
30  * 2006.08.22  :  created
31  *****************************************************************************/
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include "email-internal-types.h"
36 #include "c-client.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"
42
43 static void mm_get_error(char *string, int *err_code);
44
45 /*
46  * callback mm_lsub
47  *              get subscribed mailbox list
48  */
49 INTERNAL_FUNC void mm_lsub(MAILSTREAM *stream, int delimiter, char *mailbox, long attributes)
50 {
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;
55         char *s, *enc_path;
56
57         /* memory allocation */
58         p = realloc(p_old, sizeof(email_mailbox_t) * (count + 1));
59         if (!p) return ;
60
61         /* uw-imap mailbox name format (ex : "{mail.test.com...}inbox" or "{mail.test.com...}anybox/anysubbox") */
62         enc_path = strchr(mailbox, '}');
63         if (enc_path)   
64                 enc_path += 1;
65         else {
66                 emcore_free_mailbox_list(&p, count+1);
67                 return ;
68         }
69
70         /* Convert UTF7 mailbox name to UTF8 mailbox name */
71
72         /* convert directory delimiter to '/' */
73         for (s = enc_path; *s; s++) {
74                 if (*s == (char)delimiter) {
75                         *s = '/';
76                 }
77         }
78
79         /* coyp string */
80         p[count].mailbox_name = cpystr(enc_path);
81         p[count].alias        = cpystr(enc_path);
82         p[count].local        = 0;
83         p[count].account_id   = stream->spare8;
84
85
86         p_holder->data = p;
87         p_holder->num++;
88
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); */
94         EM_DEBUG_FUNC_END();
95 }
96
97
98 /*
99  * callback mm_lsub
100  * get mailbox list
101  */
102 INTERNAL_FUNC void mm_list(MAILSTREAM *stream, int delimiter, char *mailbox, long attributes)
103 {
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;
108         char *s, *enc_path;
109
110         /* memory allocation */
111         p = realloc(p_old, sizeof(email_internal_mailbox_t) * (count + 1));
112         if (!p) return ;
113
114         /* uw-imap mailbox name format (ex : "{mail.test.com...}inbox" or "{mail.test.com...}anybox/anysubbox") */
115         enc_path = strchr(mailbox, '}');
116         if (enc_path)   
117                 enc_path += 1;
118         else {
119                 emcore_free_internal_mailbox(&p, count+1, NULL);
120                 return ;
121         }
122
123         /* convert directory delimiter to '/' */
124         for (s = enc_path;*s;s++) 
125                 if (*s == (char)delimiter) 
126                         *s = '/';
127
128         /* copy string */
129         memset(p + count, 0x00, sizeof(email_internal_mailbox_t));
130
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__ */
147
148         if(p[count].mailbox_type == EMAIL_MAILBOX_TYPE_INBOX) /* For exception handling of Gmail inbox*/
149                 p[count].mailbox_name  = cpystr("INBOX");
150         else
151                 p[count].mailbox_name  = cpystr(enc_path);
152
153         EM_DEBUG_LOG("mm_list mailbox name is %s ", p[count].mailbox_name);
154
155         p[count].alias = emcore_get_alias_of_mailbox((const char *)enc_path);
156         p[count].local = 0;
157
158         EM_DEBUG_LOG("mm_list account_id %d", stream->spare8);
159
160         char *tmp = NULL;
161         /* in mailbox name parse n get user = %d - which is account_id */
162         tmp = strstr(mailbox, "user=");
163         if (tmp) {
164                 tmp = tmp+5;
165                 for (s = tmp; *s != '/'; s++);
166                 *s = '\0';
167                 p[count].account_id = atoi(tmp);
168         }
169         EM_DEBUG_LOG("mm_list account_id %d ", p[count].account_id);
170
171         p_holder->data = p;
172         p_holder->num++;
173
174         /* ignore attributes */
175         EM_DEBUG_FUNC_END();
176 }
177
178
179 /*
180  * callback mm_status
181  * get mailbox status
182  */
183 INTERNAL_FUNC void mm_status(MAILSTREAM *stream, char *mailbox, MAILSTATUS* status)
184 {
185         EM_DEBUG_FUNC_BEGIN();
186         email_callback_holder_t *p = stream->sparep;
187
188         EM_DEBUG_FUNC_BEGIN();
189         if (status->flags & SA_MESSAGES) 
190                 p->num = status->messages;
191         if (status->flags & SA_UNSEEN) 
192                 p->data = (void *)status->unseen;
193         EM_DEBUG_FUNC_END();
194 }
195
196 /* callback mm_login
197  * get user_name and password
198  */
199
200 INTERNAL_FUNC void mm_login(NETMBX *mb, char *user, char *pwd, long trial)
201 {
202         EM_DEBUG_FUNC_BEGIN();
203         int account_id;
204         email_account_t *ref_account;
205         char *username = NULL;
206         char *password = NULL;
207
208         if (!mb->user[0])  {
209                 EM_DEBUG_EXCEPTION("invalid account_id...");
210                 return;
211         }
212         
213         account_id = atoi(mb->user);
214
215         ref_account = emcore_get_account_reference(account_id);
216
217         if (!ref_account)  {
218                 EM_DEBUG_EXCEPTION("emcore_get_account_reference failed");
219                 return;
220         }
221
222         if (ref_account->incoming_server_user_name == NULL) {
223                 EM_DEBUG_EXCEPTION("invalid incoming_server_user_name...");
224                 return;
225         }
226         username = EM_SAFE_STRDUP(ref_account->incoming_server_user_name);
227
228         if (ref_account->incoming_server_password == NULL) {
229                 EM_SAFE_FREE(username);
230                 EM_DEBUG_EXCEPTION("invalid password...");
231                 return;
232         }
233
234         password = EM_SAFE_STRDUP(ref_account->incoming_server_password);
235
236         if (username && password && strlen(username) > 0 && strlen(password) > 0) {
237                 strcpy(user, username);
238                 strcpy(pwd, password);
239         }
240         else
241                 EM_DEBUG_EXCEPTION("User Information is NULL || strlen is 0 ");
242                 
243         EM_SAFE_FREE(username);
244         EM_SAFE_FREE(password);
245
246         EM_DEBUG_FUNC_END();
247 }
248
249
250 INTERNAL_FUNC void mm_dlog(char *string)
251 {
252 #ifdef FEATURE_CORE_DEBUG
253         EM_DEBUG_LOG("IMAP_TOOLKIT_DLOG [%s]", string);
254         /* Write into debug file
255         FILE *fp_dlog = NULL; 
256         fp_dlog = fopen("/opt/data/email/.emfdata/core_debug", "a");
257     if(fp_dlog) {
258                 fprintf(fp_dlog, "%s\n", string); 
259                 fclose(fp_dlog);
260         }
261         */
262 #endif
263 }
264
265 INTERNAL_FUNC void mm_log(char *string, long errflg)
266 {
267         /* EM_DEBUG_FUNC_BEGIN(); */
268         
269         switch ((short)errflg)  {
270                 case NIL:
271                         EM_DEBUG_LOG("IMAP_TOOLKIT_LOG NIL [%s]", string);
272                         break;
273                         
274                 case WARN:
275                         EM_DEBUG_LOG("IMAP_TOOLKIT_LOG WARN [%s]", string);
276                         break;
277                         
278                 case PARSE:
279                         EM_DEBUG_LOG("IMAP_TOOLKIT_LOG PARSE [%s]", string);
280                         break;
281                         
282                 case BYE:
283                         EM_DEBUG_LOG("IMAP_TOOLKIT_LOG BYE [%s]", string);
284                         break;
285                         
286                 case TCPDEBUG:
287                         EM_DEBUG_LOG("IMAP_TOOLKIT_LOG TCPDEBUG [%s]", string);
288                         break;
289                         
290                 case ERROR: {
291                         email_session_t *session = NULL;
292                         
293                         EM_DEBUG_EXCEPTION("IMAP_TOOLKIT_LOG ERROR [%s]", string);
294
295                         emcore_get_current_session(&session);
296                         
297                         if (session) {
298                                 mm_get_error(string, &session->error);
299                                 EM_DEBUG_EXCEPTION("IMAP_TOOLKIT_LOG ERROR [%d]", session->error);
300                         }
301                         
302                         /*  Handling exceptional case of connection failures.  */
303                         /*
304                         if (string) {
305                                 if (strstr(string, "15 minute") != 0) {
306                                         if (session)
307                                                 session->error = EMAIL_ERROR_LOGIN_ALLOWED_EVERY_15_MINS;
308                                 }
309                                 else if (strstr(string, "Too many login failures") == 0) {
310                                         if (session)
311                                                 session->error = EMAIL_ERROR_TOO_MANY_LOGIN_FAILURE;
312                                 }
313                         }
314                         */
315                         
316                         break;
317                 }
318         }
319 }
320
321 INTERNAL_FUNC void mm_searched(MAILSTREAM *stream, unsigned long number)
322 {
323         EM_DEBUG_FUNC_BEGIN("stream [%p], number [%d]", stream, number);
324         EM_DEBUG_FUNC_END();
325 }
326
327 INTERNAL_FUNC void mm_exists(MAILSTREAM *stream, unsigned long number)
328 {
329         EM_DEBUG_FUNC_BEGIN("stream [%p], number [%d]", stream, number);
330         EM_DEBUG_FUNC_END();
331 }
332
333 INTERNAL_FUNC void mm_expunged(MAILSTREAM *stream, unsigned long number)
334 {
335         EM_DEBUG_FUNC_BEGIN("stream [%p], number [%d]", stream, number);
336         EM_DEBUG_FUNC_END();
337 }
338
339 INTERNAL_FUNC void mm_flags(MAILSTREAM *stream, unsigned long number)
340 {
341         EM_DEBUG_FUNC_BEGIN("stream [%p], number [%d]", stream, number);
342         EM_DEBUG_FUNC_END();
343 }
344
345 INTERNAL_FUNC void mm_notify(MAILSTREAM *stream, char *string, long errflg)
346 {
347         EM_DEBUG_FUNC_BEGIN();
348         mm_log(string, errflg);
349         EM_DEBUG_FUNC_END();
350 }
351
352 INTERNAL_FUNC void mm_critical(MAILSTREAM *stream)
353 {
354         EM_DEBUG_FUNC_BEGIN("stream [%p]", stream);
355         EM_DEBUG_FUNC_END();
356 }
357
358 INTERNAL_FUNC void mm_nocritical(MAILSTREAM *stream)
359 {
360         EM_DEBUG_FUNC_BEGIN("stream [%p]", stream);
361         EM_DEBUG_FUNC_END();
362 }
363
364 INTERNAL_FUNC long mm_diskerror(MAILSTREAM *stream, long errcode, long serious)
365 {
366         EM_DEBUG_FUNC_BEGIN("stream [%p] errcode[%d] serious[%d]", stream, errcode, serious);
367 #if UNIXLIKE
368         kill(getpid(), SIGSTOP);
369 #else
370         abort();
371 #endif
372         EM_DEBUG_FUNC_END();
373         return NIL;
374 }
375
376 INTERNAL_FUNC void mm_fatal(char *string)
377 {
378         EM_DEBUG_EXCEPTION("%s", string);
379 }
380
381 INTERNAL_FUNC void mm_get_error(char *string, int *err_code)
382 {
383         if (!string || !err_code)
384                 return ;
385
386         EM_DEBUG_LOG("string [%s]", string);
387
388         if (strstr(string, "login failure") || strstr(string, "Login aborted") || strstr(string, "Can't login"))
389                 *err_code = EMAIL_ERROR_LOGIN_FAILURE;
390         else if (strstr(string, "Scan not valid"))
391                 *err_code = EMAIL_ERROR_MAILBOX_FAILURE;
392         else if (strstr(string, "Authentication cancelled"))
393                 *err_code = EMAIL_ERROR_AUTHENTICATE;
394         else if (strstr(string, "authuser"))
395                 *err_code = EMAIL_ERROR_AUTH_NOT_SUPPORTED;
396         else if (strstr(string, "negotiate TLS"))
397                 *err_code = EMAIL_ERROR_CANNOT_NEGOTIATE_TLS;
398         else if (strstr(string, "TLS/SSL failure"))
399                 *err_code = EMAIL_ERROR_TLS_SSL_FAILURE;
400         else if (strstr(string, "STARTLS"))
401                 *err_code = EMAIL_ERROR_STARTLS;
402         else if (strstr(string, "TLS unavailable"))
403                 *err_code = EMAIL_ERROR_TLS_NOT_SUPPORTED;
404         else if (strstr(string, "Can't access"))
405                 *err_code = EMAIL_ERROR_APPEND_FAILURE;
406         else if (strstr(string, "Can not authenticate"))
407                 *err_code = EMAIL_ERROR_AUTHENTICATE;
408         else if (strstr(string, "Unexpected IMAP response") || strstr(string, "hello"))
409                 *err_code = EMAIL_ERROR_INVALID_RESPONSE;
410         else if (strstr(string, "NOTIMAP4REV1"))
411                 *err_code = EMAIL_ERROR_COMMAND_NOT_SUPPORTED;
412         else if (strstr(string, "Anonymous"))
413                 *err_code = EMAIL_ERROR_ANNONYM_NOT_SUPPORTED;
414         else if (strstr(string, "connection broken"))
415                 *err_code = EMAIL_ERROR_CONNECTION_BROKEN;
416         else if (strstr(string, "SMTP greeting"))
417                 *err_code = EMAIL_ERROR_NO_RESPONSE;
418         else if (strstr(string, "ESMTP failure"))
419                 *err_code = EMAIL_ERROR_SMTP_SEND_FAILURE;
420         else if (strstr(string, "socket") || strstr(string, "Socket"))
421                 *err_code = EMAIL_ERROR_SOCKET_FAILURE;
422         else if (strstr(string, "connect to") || strstr(string, "Connection failed"))
423                 *err_code = EMAIL_ERROR_CONNECTION_FAILURE;
424         else if (strstr(string, "Certificate failure"))
425                 *err_code = EMAIL_ERROR_CERTIFICATE_FAILURE;
426         else if (strstr(string, "ESMTP failure"))
427                 *err_code = EMAIL_ERROR_INVALID_PARAM;
428         else if (strstr(string, "No such host"))
429                 *err_code = EMAIL_ERROR_NO_SUCH_HOST;
430         else if (strstr(string, "host") || strstr(string, "Host"))
431                 *err_code = EMAIL_ERROR_INVALID_SERVER;
432         else if (strstr(string, "SELECT failed"))
433                 *err_code = EMAIL_ERROR_MAILBOX_NOT_FOUND;
434         else
435                 *err_code = EMAIL_ERROR_UNKNOWN;
436 }
437 /* EOF */