static gint send_recv_message(Session *session, const gchar *msg, gpointer data) { gchar buf[BUFFSIZE]; SMTPSession *smtp_session = SMTP_SESSION(session); SendProgressDialog *dialog = (SendProgressDialog *)data; gchar *state_str = NULL; cm_return_val_if_fail(dialog != NULL, -1); switch (smtp_session->state) { case SMTP_READY: return 0; case SMTP_HELO: g_snprintf(buf, sizeof(buf), _("Sending HELO...")); state_str = _("Authenticating"); statusbar_print_all(_("Sending message...")); break; case SMTP_EHLO: g_snprintf(buf, sizeof(buf), _("Sending EHLO...")); state_str = _("Authenticating"); statusbar_print_all(_("Sending message...")); break; case SMTP_AUTH: g_snprintf(buf, sizeof(buf), _("Authenticating...")); state_str = _("Authenticating"); break; case SMTP_FROM: g_snprintf(buf, sizeof(buf), _("Sending MAIL FROM...")); state_str = _("Sending"); break; case SMTP_RCPT: g_snprintf(buf, sizeof(buf), _("Sending RCPT TO...")); state_str = _("Sending"); break; case SMTP_DATA: case SMTP_EOM: g_snprintf(buf, sizeof(buf), _("Sending DATA...")); state_str = _("Sending"); break; case SMTP_QUIT: g_snprintf(buf, sizeof(buf), _("Quitting...")); state_str = _("Quitting"); break; case SMTP_ERROR: g_warning("send: error: %s", msg); return 0; default: return 0; } progress_dialog_set_label(dialog->dialog, buf); progress_dialog_list_set_status(dialog->dialog, 0, state_str); return 0; }
static gint mh_remove_msgs(Folder *folder, FolderItem *item, MsgInfoList *msglist, GHashTable *relation) { gboolean need_scan = FALSE; gchar *path, *file; time_t last_mtime = (time_t)0; MsgInfoList *cur; gint total = 0, curnum = 0; cm_return_val_if_fail(item != NULL, -1); path = folder_item_get_path(item); need_scan = mh_scan_required(folder, item); last_mtime = item->mtime; total = g_slist_length(msglist); if (total > 100) { statusbar_print_all(_("Deleting messages...")); } for (cur = msglist; cur; cur = cur->next) { MsgInfo *msginfo = (MsgInfo *)cur->data; if (msginfo == NULL) continue; if (MSG_IS_MOVE(msginfo->flags) && MSG_IS_MOVE_DONE(msginfo->flags)) { msginfo->flags.tmp_flags &= ~MSG_MOVE_DONE; continue; } if (total > 100) { statusbar_progress_all(curnum, total, 100); if (curnum % 100 == 0) GTK_EVENTS_FLUSH(); curnum++; } file = g_strconcat(path, G_DIR_SEPARATOR_S, itos(msginfo->msgnum), NULL); if (file == NULL) continue; if (claws_unlink(file) < 0) { g_free(file); continue; } g_free(file); } if (total > 100) { statusbar_progress_all(0,0,0); statusbar_pop_all(); } if (item->mtime == last_mtime && !need_scan) { mh_set_mtime(folder, item); } g_free(path); return 0; }
static void inc_progress_dialog_set_label(IncProgressDialog *inc_dialog, IncSession *inc_session) { ProgressDialog *dialog = inc_dialog->dialog; Pop3Session *session; cm_return_if_fail(inc_session != NULL); session = POP3_SESSION(inc_session->session); switch (session->state) { case POP3_GREETING: break; case POP3_GETAUTH_USER: case POP3_GETAUTH_PASS: case POP3_GETAUTH_APOP: progress_dialog_set_label(dialog, _("Authenticating...")); statuswindow_pop_all(); statusbar_print_all(_("Retrieving messages from %s (%s) ..."), SESSION(session)->server, session->ac_prefs->account_name); break; case POP3_GETRANGE_STAT: progress_dialog_set_label (dialog, _("Getting the number of new messages (STAT)...")); break; case POP3_GETRANGE_LAST: progress_dialog_set_label (dialog, _("Getting the number of new messages (LAST)...")); break; case POP3_GETRANGE_UIDL: progress_dialog_set_label (dialog, _("Getting the number of new messages (UIDL)...")); break; case POP3_GETSIZE_LIST: progress_dialog_set_label (dialog, _("Getting the size of messages (LIST)...")); break; case POP3_RETR: case POP3_RETR_RECV: case POP3_DELETE: break; case POP3_LOGOUT: progress_dialog_set_label(dialog, _("Quitting")); break; default: break; } }
static gboolean gtk_message_callback(gpointer data) { BsCbData *cbdata = (BsCbData *)data; if (cbdata->message) statusbar_print_all("%s", cbdata->message); else if (cbdata->total == 0) { statusbar_pop_all(); } if (cbdata->total && cbdata->done) statusbar_progress_all(cbdata->done, cbdata->total, 10); else statusbar_progress_all(0,0,0); g_free(cbdata->message); g_free(cbdata); GTK_EVENTS_FLUSH(); return FALSE; }
static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist, GHashTable *relation) { gboolean dest_need_scan = FALSE; gboolean src_need_scan = FALSE; FolderItem *src = NULL; gchar *srcfile; gchar *destfile; FolderItemPrefs *prefs; MsgInfo *msginfo = NULL; MsgInfoList *cur = NULL; gint curnum = 0, total = 0; gchar *srcpath = NULL; gboolean full_fetch = FALSE; time_t last_dest_mtime = (time_t)0; time_t last_src_mtime = (time_t)0; cm_return_val_if_fail(dest != NULL, -1); cm_return_val_if_fail(msglist != NULL, -1); msginfo = (MsgInfo *)msglist->data; cm_return_val_if_fail(msginfo != NULL, -1); if (msginfo->folder == dest) { g_warning("the src folder is identical to the dest.\n"); return -1; } if (msginfo->folder->folder != dest->folder) full_fetch = TRUE; if (FOLDER_TYPE(msginfo->folder->folder) == F_MH) { src = msginfo->folder; } if (dest->last_num < 0) { mh_get_last_num(folder, dest); if (dest->last_num < 0) return -1; } prefs = dest->prefs; srcpath = folder_item_get_path(msginfo->folder); dest_need_scan = mh_scan_required(dest->folder, dest); last_dest_mtime = dest->mtime; if (src) { src_need_scan = mh_scan_required(src->folder, src); last_src_mtime = src->mtime; } total = g_slist_length(msglist); if (total > 100) { if (MSG_IS_MOVE(msginfo->flags)) statusbar_print_all(_("Moving messages...")); else statusbar_print_all(_("Copying messages...")); } for (cur = msglist; cur; cur = cur->next) { msginfo = (MsgInfo *)cur->data; if (!msginfo) { goto err_reset_status; } if (!full_fetch) { srcfile = g_strconcat(srcpath, G_DIR_SEPARATOR_S, itos(msginfo->msgnum), NULL); } else { srcfile = procmsg_get_message_file(msginfo); } if (!srcfile) { goto err_reset_status; } destfile = mh_get_new_msg_filename(dest); if (!destfile) { g_free(srcfile); goto err_reset_status; } if (total > 100) { statusbar_progress_all(curnum, total, 100); if (curnum % 100 == 0) GTK_EVENTS_FLUSH(); curnum++; } debug_print("Copying message %s%c%d to %s ...\n", msginfo->folder->path, G_DIR_SEPARATOR, msginfo->msgnum, dest->path); if (MSG_IS_MOVE(msginfo->flags)) { msginfo->flags.tmp_flags &= ~MSG_MOVE_DONE; if (move_file(srcfile, destfile, TRUE) < 0) { FILE_OP_ERROR(srcfile, "move"); if (copy_file(srcfile, destfile, TRUE) < 0) { FILE_OP_ERROR(srcfile, "copy"); g_free(srcfile); g_free(destfile); goto err_reset_status; } } else { /* say unlinking's not necessary */ msginfo->flags.tmp_flags |= MSG_MOVE_DONE; } } else if (copy_file(srcfile, destfile, TRUE) < 0) { FILE_OP_ERROR(srcfile, "copy"); g_free(srcfile); g_free(destfile); goto err_reset_status; } if (prefs && prefs->enable_folder_chmod && prefs->folder_chmod) { if (chmod(destfile, prefs->folder_chmod) < 0) FILE_OP_ERROR(destfile, "chmod"); } if (relation) { if (g_hash_table_lookup(relation, msginfo) != NULL) g_warning("already in : %p", msginfo); g_hash_table_insert(relation, msginfo, GINT_TO_POINTER(dest->last_num+1)); } g_free(srcfile); g_free(destfile); dest->last_num++; } g_free(srcpath); mh_write_sequences(dest, TRUE); if (dest->mtime == last_dest_mtime && !dest_need_scan) { mh_set_mtime(folder, dest); } if (src && src->mtime == last_src_mtime && !src_need_scan) { mh_set_mtime(folder, src); } if (total > 100) { statusbar_progress_all(0,0,0); statusbar_pop_all(); } return dest->last_num; err_reset_status: g_free(srcpath); mh_write_sequences(dest, TRUE); if (total > 100) { statusbar_progress_all(0,0,0); statusbar_pop_all(); } return -1; }
gint proc_mbox(FolderItem *dest, const gchar *mbox, gboolean apply_filter, PrefsAccount *account) /* return values: -1 error, >=0 number of msgs added */ { FILE *mbox_fp; gchar buf[MESSAGEBUFSIZE]; gchar *tmp_file; gint msgs = 0; gint lines; MsgInfo *msginfo; gboolean more; GSList *to_filter = NULL, *filtered = NULL, *unfiltered = NULL, *cur, *to_add = NULL; gboolean printed = FALSE; FolderItem *dropfolder; cm_return_val_if_fail(dest != NULL, -1); cm_return_val_if_fail(mbox != NULL, -1); debug_print("Getting messages from %s into %s...\n", mbox, dest->path); if ((mbox_fp = g_fopen(mbox, "rb")) == NULL) { FILE_OP_ERROR(mbox, "fopen"); alertpanel_error(_("Could not open mbox file:\n%s\n"), mbox); return -1; } /* ignore empty lines on the head */ do { if (fgets(buf, sizeof(buf), mbox_fp) == NULL) { g_warning("can't read mbox file.\n"); fclose(mbox_fp); return -1; } } while (buf[0] == '\n' || buf[0] == '\r'); if (strncmp(buf, "From ", 5) != 0) { g_warning("invalid mbox format: %s\n", mbox); fclose(mbox_fp); return -1; } tmp_file = get_tmp_file(); folder_item_update_freeze(); if (apply_filter) dropfolder = folder_get_default_processing(); else dropfolder = dest; do { FILE *tmp_fp; gint empty_lines; gint msgnum; if (msgs > 0 && msgs%500 == 0) { if (printed) statusbar_pop_all(); statusbar_print_all( ngettext("Importing from mbox... (%d mail imported)", "Importing from mbox... (%d mails imported)", msgs), msgs); printed=TRUE; GTK_EVENTS_FLUSH(); } if ((tmp_fp = g_fopen(tmp_file, "wb")) == NULL) { FILE_OP_ERROR(tmp_file, "fopen"); g_warning("can't open temporary file\n"); fclose(mbox_fp); g_free(tmp_file); return -1; } if (change_file_mode_rw(tmp_fp, tmp_file) < 0) { FILE_OP_ERROR(tmp_file, "chmod"); } empty_lines = 0; lines = 0; /* process all lines from mboxrc file */ while (fgets(buf, sizeof(buf), mbox_fp) != NULL) { int offset; /* eat empty lines */ if (buf[0] == '\n' || buf[0] == '\r') { empty_lines++; continue; } /* From separator or quoted From */ offset = 0; /* detect leading '>' char(s) */ while ((buf[offset] == '>')) { offset++; } if (!strncmp(buf+offset, "From ", 5)) { /* From separator: */ if (offset == 0) { /* expect next mbox item */ break; } /* quoted From: */ /* flush any eaten empty line */ if (empty_lines > 0) { while (empty_lines-- > 0) { FPUTS_TO_TMP_ABORT_IF_FAIL("\n"); } empty_lines = 0; } /* store the unquoted line */ FPUTS_TO_TMP_ABORT_IF_FAIL(buf + 1); continue; } /* other line */ /* flush any eaten empty line */ if (empty_lines > 0) { while (empty_lines-- > 0) { FPUTS_TO_TMP_ABORT_IF_FAIL("\n"); } empty_lines = 0; } /* store the line itself */ FPUTS_TO_TMP_ABORT_IF_FAIL(buf); } /* end of mbox item or end of mbox */ /* flush any eaten empty line (but the last one) */ if (empty_lines > 0) { while (--empty_lines > 0) { FPUTS_TO_TMP_ABORT_IF_FAIL("\n"); } } /* more emails to expect? */ more = !feof(mbox_fp); /* warn if email part is empty (it's the minimum check we can do */ if (lines == 0) { g_warning("malformed mbox: %s: message %d is empty\n", mbox, msgs); fclose(tmp_fp); fclose(mbox_fp); claws_unlink(tmp_file); return -1; } if (fclose(tmp_fp) == EOF) { FILE_OP_ERROR(tmp_file, "fclose"); g_warning("can't write to temporary file\n"); fclose(mbox_fp); claws_unlink(tmp_file); g_free(tmp_file); return -1; } if (apply_filter) { if ((msgnum = folder_item_add_msg(dropfolder, tmp_file, NULL, TRUE)) < 0) { fclose(mbox_fp); claws_unlink(tmp_file); g_free(tmp_file); return -1; } msginfo = folder_item_get_msginfo(dropfolder, msgnum); to_filter = g_slist_prepend(to_filter, msginfo); } else { MsgFileInfo *finfo = g_new0(MsgFileInfo, 1); finfo->file = tmp_file; to_add = g_slist_prepend(to_add, finfo); tmp_file = get_tmp_file(); /* flush every 500 */ if (msgs > 0 && msgs % 500 == 0) { folder_item_add_msgs(dropfolder, to_add, TRUE); procmsg_message_file_list_free(to_add); to_add = NULL; } } msgs++; } while (more); if (printed) statusbar_pop_all(); if (apply_filter) { folder_item_set_batch(dropfolder, FALSE); procmsg_msglist_filter(to_filter, account, &filtered, &unfiltered, TRUE); folder_item_set_batch(dropfolder, TRUE); filtering_move_and_copy_msgs(to_filter); for (cur = filtered; cur; cur = g_slist_next(cur)) { MsgInfo *info = (MsgInfo *)cur->data; procmsg_msginfo_free(info); } unfiltered = g_slist_reverse(unfiltered); if (unfiltered) { folder_item_move_msgs(dest, unfiltered); for (cur = unfiltered; cur; cur = g_slist_next(cur)) { MsgInfo *info = (MsgInfo *)cur->data; procmsg_msginfo_free(info); } } g_slist_free(unfiltered); g_slist_free(filtered); g_slist_free(to_filter); } else if (to_add) { folder_item_add_msgs(dropfolder, to_add, TRUE); procmsg_message_file_list_free(to_add); to_add = NULL; } folder_item_update_thaw(); g_free(tmp_file); fclose(mbox_fp); debug_print("%d messages found.\n", msgs); return msgs; }
static void gtk_message_callback(gchar *message) { statusbar_print_all("%s", message); }
static gboolean scan_func(GNode *node, gpointer data) { struct clamd_result *result = (struct clamd_result *) data; MimeInfo *mimeinfo = (MimeInfo *) node->data; gchar *outfile; response buf; int max; GStatBuf info; gchar* msg; outfile = procmime_get_tmp_file_name(mimeinfo); if (procmime_get_part(outfile, mimeinfo) < 0) g_warning("Can't get the part of multipart message."); else { max = config.clamav_max_size * 1048576; /* maximum file size */ if (g_stat(outfile, &info) == -1) g_warning("Can't determine file size"); else { if (info.st_size <= max) { debug_print("Scanning %s\n", outfile); result->status = clamd_verify_email(outfile, &buf); debug_print("status: %d\n", result->status); switch (result->status) { case NO_SOCKET: g_warning("[scanning] No socket information"); if (config.alert_ack) { alertpanel_error(_("Scanning\nNo socket information.\nAntivirus disabled.")); config.alert_ack = FALSE; } break; case NO_CONNECTION: g_warning("[scanning] Clamd does not respond to ping"); if (config.alert_ack) { alertpanel_warning(_("Scanning\nClamd does not respond to ping.\nIs clamd running?")); config.alert_ack = FALSE; } break; case VIRUS: msg = g_strconcat(_("Detected %s virus."), clamd_get_virus_name(buf.msg), NULL); g_warning("%s\n", msg); debug_print("no_recv: %d\n", prefs_common_get_prefs()->no_recv_err_panel); if (prefs_common_get_prefs()->no_recv_err_panel) { statusbar_print_all("%s", msg); } else { alertpanel_warning("%s\n", msg); } g_free(msg); config.alert_ack = TRUE; break; case SCAN_ERROR: debug_print("Error: %s\n", buf.msg); if (config.alert_ack) { alertpanel_error(_("Scanning error:\n%s"), buf.msg); config.alert_ack = FALSE; } break; case OK: debug_print("No virus detected.\n"); config.alert_ack = TRUE; break; } } else { msg = g_strdup_printf(_("File: %s. Size (%d) greater than limit (%d)\n"), outfile, (int) info.st_size, max); statusbar_print_all("%s", msg); debug_print("%s", msg); g_free(msg); } } g_unlink(outfile); } return (result->status == OK) ? FALSE : TRUE; }