| 84 |
84 |
static void imap_folder_destroy (Folder *folder);
|
| 85 |
85 |
|
| 86 |
86 |
static Session *imap_session_new (PrefsAccount *account);
|
|
87 |
static gint imap_session_connect (IMAPSession *session);
|
|
88 |
static gint imap_session_reconnect (IMAPSession *session);
|
| 87 |
89 |
static void imap_session_destroy (Session *session);
|
| 88 |
90 |
/* static void imap_session_destroy_all (void); */
|
| 89 |
91 |
|
| ... | ... | |
| 455 |
457 |
log_warning(_("IMAP4 connection to %s has been"
|
| 456 |
458 |
" disconnected. Reconnecting...\n"),
|
| 457 |
459 |
folder->account->recv_server);
|
| 458 |
|
session_destroy(rfolder->session);
|
| 459 |
|
rfolder->session = imap_session_new(folder->account);
|
| 460 |
|
if (rfolder->session)
|
|
460 |
if (imap_session_reconnect(IMAP_SESSION(rfolder->session))
|
|
461 |
== IMAP_SUCCESS)
|
| 461 |
462 |
imap_parse_namespace(IMAP_SESSION(rfolder->session),
|
| 462 |
463 |
IMAP_FOLDER(folder));
|
|
464 |
else {
|
|
465 |
session_destroy(rfolder->session);
|
|
466 |
rfolder->session = NULL;
|
|
467 |
}
|
| 463 |
468 |
}
|
| 464 |
469 |
|
| 465 |
470 |
return IMAP_SESSION(rfolder->session);
|
| ... | ... | |
| 526 |
531 |
static Session *imap_session_new(PrefsAccount *account)
|
| 527 |
532 |
{
|
| 528 |
533 |
IMAPSession *session;
|
| 529 |
|
SockInfo *sock;
|
| 530 |
|
gchar *pass;
|
| 531 |
534 |
gushort port;
|
| 532 |
535 |
|
| 533 |
536 |
g_return_val_if_fail(account != NULL, NULL);
|
| 534 |
537 |
g_return_val_if_fail(account->recv_server != NULL, NULL);
|
| 535 |
538 |
g_return_val_if_fail(account->userid != NULL, NULL);
|
| 536 |
539 |
|
| 537 |
|
pass = account->passwd;
|
| 538 |
|
if (!pass) {
|
| 539 |
|
gchar *tmp_pass;
|
| 540 |
|
tmp_pass = input_dialog_query_password(account->recv_server,
|
| 541 |
|
account->userid);
|
| 542 |
|
if (!tmp_pass)
|
| 543 |
|
return NULL;
|
| 544 |
|
Xstrdup_a(pass, tmp_pass, {g_free(tmp_pass); return NULL;});
|
| 545 |
|
g_free(tmp_pass);
|
| 546 |
|
}
|
| 547 |
|
|
| 548 |
540 |
#if USE_SSL
|
| 549 |
541 |
port = account->set_imapport ? account->imapport
|
| 550 |
542 |
: account->ssl_imap == SSL_TUNNEL ? IMAPS_PORT : IMAP4_PORT;
|
| ... | ... | |
| 552 |
544 |
port = account->set_imapport ? account->imapport : IMAP4_PORT;
|
| 553 |
545 |
#endif
|
| 554 |
546 |
|
| 555 |
|
log_message(_("creating IMAP4 connection to %s:%d ...\n"),
|
| 556 |
|
account->recv_server, port);
|
| 557 |
|
|
| 558 |
|
#if USE_SSL
|
| 559 |
|
if ((sock = imap_open(account->recv_server, port,
|
| 560 |
|
account->ssl_imap)) == NULL)
|
| 561 |
|
#else
|
| 562 |
|
if ((sock = imap_open(account->recv_server, port)) == NULL)
|
| 563 |
|
#endif
|
| 564 |
|
return NULL;
|
| 565 |
|
|
| 566 |
547 |
session = g_new0(IMAPSession, 1);
|
| 567 |
548 |
|
| 568 |
549 |
session_init(SESSION(session));
|
| 569 |
550 |
|
| 570 |
551 |
SESSION(session)->type = SESSION_IMAP;
|
|
552 |
SESSION(session)->sock = NULL;
|
| 571 |
553 |
SESSION(session)->server = g_strdup(account->recv_server);
|
| 572 |
|
SESSION(session)->sock = sock;
|
|
554 |
SESSION(session)->port = port;
|
|
555 |
#if USE_SSL
|
|
556 |
SESSION(session)->ssl_type = account->ssl_imap;
|
|
557 |
#endif
|
| 573 |
558 |
SESSION(session)->last_access_time = time(NULL);
|
| 574 |
|
SESSION(session)->data = NULL;
|
|
559 |
SESSION(session)->data = account;
|
| 575 |
560 |
|
| 576 |
561 |
SESSION(session)->destroy = imap_session_destroy;
|
| 577 |
562 |
|
| ... | ... | |
| 581 |
566 |
|
| 582 |
567 |
session_list = g_list_append(session_list, session);
|
| 583 |
568 |
|
| 584 |
|
if (imap_greeting(session) != IMAP_SUCCESS) {
|
|
569 |
if (imap_session_connect(session) != IMAP_SUCCESS) {
|
| 585 |
570 |
session_destroy(SESSION(session));
|
| 586 |
571 |
return NULL;
|
| 587 |
572 |
}
|
| 588 |
573 |
|
| 589 |
|
if (imap_cmd_capability(session) != IMAP_SUCCESS) {
|
| 590 |
|
session_destroy(SESSION(session));
|
| 591 |
|
return NULL;
|
|
574 |
return SESSION(session);
|
|
575 |
}
|
|
576 |
|
|
577 |
static gint imap_session_connect(IMAPSession *session)
|
|
578 |
{
|
|
579 |
SockInfo *sock;
|
|
580 |
PrefsAccount *account;
|
|
581 |
gchar *pass;
|
|
582 |
|
|
583 |
g_return_val_if_fail(session != NULL, IMAP_ERROR);
|
|
584 |
|
|
585 |
account = (PrefsAccount *)(SESSION(session)->data);
|
|
586 |
|
|
587 |
log_message(_("creating IMAP4 connection to %s:%d ...\n"),
|
|
588 |
SESSION(session)->server, SESSION(session)->port);
|
|
589 |
|
|
590 |
pass = account->passwd;
|
|
591 |
if (!pass) {
|
|
592 |
gchar *tmp_pass;
|
|
593 |
tmp_pass = input_dialog_query_password(account->recv_server,
|
|
594 |
account->userid);
|
|
595 |
if (!tmp_pass)
|
|
596 |
return IMAP_ERROR;
|
|
597 |
Xstrdup_a(pass, tmp_pass,
|
|
598 |
{g_free(tmp_pass); return IMAP_ERROR;});
|
|
599 |
g_free(tmp_pass);
|
| 592 |
600 |
}
|
|
601 |
|
|
602 |
#if USE_SSL
|
|
603 |
if ((sock = imap_open(SESSION(session)->server, SESSION(session)->port,
|
|
604 |
SESSION(session)->ssl_type)) == NULL)
|
|
605 |
#else
|
|
606 |
if ((sock = imap_open(SESSION(session)->server, SESSION(session)->port))
|
|
607 |
== NULL)
|
|
608 |
#endif
|
|
609 |
return IMAP_ERROR;
|
|
610 |
|
|
611 |
SESSION(session)->sock = sock;
|
|
612 |
|
|
613 |
if (imap_greeting(session) != IMAP_SUCCESS)
|
|
614 |
return IMAP_ERROR;
|
|
615 |
if (imap_cmd_capability(session) != IMAP_SUCCESS)
|
|
616 |
return IMAP_ERROR;
|
|
617 |
|
| 593 |
618 |
if (imap_has_capability(session, "UIDPLUS"))
|
| 594 |
619 |
session->uidplus = TRUE;
|
| 595 |
620 |
|
| ... | ... | |
| 601 |
626 |
ok = imap_cmd_starttls(session);
|
| 602 |
627 |
if (ok != IMAP_SUCCESS) {
|
| 603 |
628 |
log_warning(_("Can't start TLS session.\n"));
|
| 604 |
|
session_destroy(SESSION(session));
|
| 605 |
|
return NULL;
|
|
629 |
return IMAP_ERROR;
|
| 606 |
630 |
}
|
| 607 |
|
if (!ssl_init_socket_with_method(sock, SSL_METHOD_TLSv1)) {
|
| 608 |
|
session_destroy(SESSION(session));
|
| 609 |
|
return NULL;
|
| 610 |
|
}
|
|
631 |
if (!ssl_init_socket_with_method(sock, SSL_METHOD_TLSv1))
|
|
632 |
return IMAP_SOCKET;
|
| 611 |
633 |
}
|
| 612 |
634 |
#endif
|
| 613 |
635 |
|
| ... | ... | |
| 615 |
637 |
imap_auth(session, account->userid, pass, account->imap_auth_type)
|
| 616 |
638 |
!= IMAP_SUCCESS) {
|
| 617 |
639 |
imap_cmd_logout(session);
|
| 618 |
|
session_destroy(SESSION(session));
|
| 619 |
|
return NULL;
|
|
640 |
return IMAP_AUTHFAIL;
|
| 620 |
641 |
}
|
| 621 |
642 |
|
| 622 |
|
return SESSION(session);
|
|
643 |
return IMAP_SUCCESS;
|
| 623 |
644 |
}
|
| 624 |
645 |
|
|
646 |
static gint imap_session_reconnect(IMAPSession *session)
|
|
647 |
{
|
|
648 |
g_return_val_if_fail(session != NULL, IMAP_ERROR);
|
|
649 |
|
|
650 |
session_disconnect(SESSION(session));
|
|
651 |
|
|
652 |
imap_capability_free(session);
|
|
653 |
session->uidplus = FALSE;
|
|
654 |
g_free(session->mbox);
|
|
655 |
session->mbox = NULL;
|
|
656 |
session->authenticated = FALSE;
|
|
657 |
SESSION(session)->state = SESSION_READY;
|
|
658 |
|
|
659 |
return imap_session_connect(session);
|
|
660 |
}
|
|
661 |
|
| 625 |
662 |
static void imap_session_destroy(Session *session)
|
| 626 |
663 |
{
|
| 627 |
664 |
imap_capability_free(IMAP_SESSION(session));
|
| ... | ... | |
| 3259 |
3296 |
GArray *array;
|
| 3260 |
3297 |
gchar *str;
|
| 3261 |
3298 |
gchar *p, *ep;
|
|
3299 |
gint i;
|
| 3262 |
3300 |
guint32 uid;
|
| 3263 |
3301 |
|
| 3264 |
3302 |
g_return_val_if_fail(criteria != NULL, IMAP_ERROR);
|
| ... | ... | |
| 3269 |
3307 |
imap_cmd_gen_send(session, "UID SEARCH %s", criteria);
|
| 3270 |
3308 |
if ((ok = imap_cmd_ok(session, argbuf)) != IMAP_SUCCESS) THROW(ok);
|
| 3271 |
3309 |
|
| 3272 |
|
str = search_array_str(argbuf, "SEARCH");
|
| 3273 |
|
if (!str) THROW(IMAP_ERROR);
|
| 3274 |
|
|
| 3275 |
3310 |
array = g_array_new(FALSE, FALSE, sizeof(guint32));
|
| 3276 |
3311 |
|
| 3277 |
|
p = str + strlen("SEARCH");
|
|
3312 |
for (i = 0; i < argbuf->len; i++) {
|
|
3313 |
str = g_ptr_array_index(argbuf, i);
|
|
3314 |
if (strncmp(str, "SEARCH", 6) != 0)
|
|
3315 |
continue;
|
| 3278 |
3316 |
|
| 3279 |
|
while (*p != '\0') {
|
| 3280 |
|
uid = strtoul(p, &ep, 10);
|
| 3281 |
|
if (p < ep && uid > 0) {
|
| 3282 |
|
g_array_append_val(array, uid);
|
| 3283 |
|
p = ep;
|
| 3284 |
|
} else
|
| 3285 |
|
break;
|
|
3317 |
p = str + 6;
|
|
3318 |
while (*p != '\0') {
|
|
3319 |
uid = strtoul(p, &ep, 10);
|
|
3320 |
if (p < ep && uid > 0) {
|
|
3321 |
g_array_append_val(array, uid);
|
|
3322 |
p = ep;
|
|
3323 |
} else
|
|
3324 |
break;
|
|
3325 |
}
|
| 3286 |
3326 |
}
|
| 3287 |
3327 |
|
| 3288 |
3328 |
*result = array;
|