More and better leak fixes after commit 9729bf0e0.
[claws.git] / src / news.c
index 1102b4bcf454911cfda48b9909fc840e189dbb50..c062ac3dfd8e04e51291461299ba15200c67afdc 100644 (file)
@@ -48,6 +48,7 @@
 #include "statusbar.h"
 #include "codeconv.h"
 #include "utils.h"
+#include "passwordstore.h"
 #include "prefs_common.h"
 #include "prefs_account.h"
 #include "inputdialog.h"
 #include "remotefolder.h"
 #include "alertpanel.h"
 #include "inc.h"
+#include "account.h"
 #ifdef USE_GNUTLS
 #  include "ssl.h"
 #endif
+#include "main.h"
 
 #define NNTP_PORT      119
 #ifdef USE_GNUTLS
@@ -374,15 +377,6 @@ static Session *news_session_new_for_folder(Folder *folder)
        cm_return_val_if_fail(folder->account != NULL, NULL);
 
        ac = folder->account;
-       if (ac->use_nntp_auth && ac->userid && ac->userid[0]) {
-               userid = ac->userid;
-               if (ac->passwd && ac->passwd[0])
-                       passwd = g_strdup(ac->passwd);
-               else
-                       passwd = input_dialog_query_password_keep(ac->nntp_server,
-                                                                 userid,
-                                                                 &(ac->session_passwd));
-       }
 
 #ifdef USE_GNUTLS
        port = ac->set_nntpport ? ac->nntpport
@@ -393,8 +387,8 @@ static Session *news_session_new_for_folder(Folder *folder)
        if (ac->ssl_nntp != SSL_NONE) {
                if (alertpanel_full(_("Insecure connection"),
                        _("This connection is configured to be secured "
-                         "using SSL, but SSL is not available in this "
-                         "build of Claws Mail. \n\n"
+                         "using SSL/TLS, but SSL/TLS is not available "
+                         "in this build of Claws Mail. \n\n"
                          "Do you want to continue connecting to this "
                          "server? The communication would not be "
                          "secure."),
@@ -407,6 +401,18 @@ static Session *news_session_new_for_folder(Folder *folder)
        session = news_session_new(folder, ac->nntp_server, port, userid, passwd);
 #endif
 
+       if (ac->use_nntp_auth && ac->userid && ac->userid[0]) {
+               userid = ac->userid;
+               if (password_get(userid, ac->nntp_server, "nntp", port, &passwd)) {
+                       /* NOP */;
+               } else if ((passwd = passwd_store_get_account(ac->account_id,
+                                       PWS_ACCOUNT_RECV)) == NULL) {
+                       passwd = input_dialog_query_password_keep(ac->nntp_server,
+                                                                 userid,
+                                                                 &(ac->session_passwd));
+               }
+       }
+
        if (session != NULL)
                r = nntp_threaded_mode_reader(folder);
        else
@@ -443,7 +449,8 @@ static Session *news_session_new_for_folder(Folder *folder)
            else {
                /* An error state bail out */
                log_error(LOG_PROTOCOL, _("Error creating session with %s:%d\n"), ac->nntp_server, port);
-               session_destroy(SESSION(session));
+               if (session != NULL)
+                       session_destroy(SESSION(session));
                g_free(passwd);
                if (ac->session_passwd) {
                        g_free(ac->session_passwd);
@@ -578,7 +585,7 @@ static gchar *news_fetch_msg(Folder *folder, FolderItem *item, gint num)
        ok = news_get_article(folder,
                              num, filename);
        if (ok != NEWSNNTP_NO_ERROR) {
-               g_warning("can't read article %d\n", num);
+               g_warning("can't read article %d", num);
                if (ok == NEWSNNTP_ERROR_STREAM) {
                        session_destroy(SESSION(session));
                        REMOTE_FOLDER(folder)->session = NULL;
@@ -756,7 +763,7 @@ void news_remove_group_list_cache(Folder *folder)
        g_free(path);
 
        if (is_file_exist(filename)) {
-               if (remove(filename) < 0)
+               if (claws_unlink(filename) < 0)
                        FILE_OP_ERROR(filename, "remove");
        }
        g_free(filename);
@@ -799,8 +806,11 @@ static gint news_get_article(Folder *folder, gint num, gchar *filename)
        r = nntp_threaded_article(folder, num, &result, &len);
        
        if (r == NEWSNNTP_NO_ERROR) {
-               if (str_write_to_file(result, filename) < 0)
+               if (str_write_to_file(result, filename) < 0) {
+                       mmap_string_unref(result);
                        return -1;
+               }
+               mmap_string_unref(result);
        }
        
        return r;
@@ -910,7 +920,7 @@ static MsgInfo *news_parse_xover(struct newsnntp_xover_resp_item *item)
                                 msginfo->inreplyto = g_strdup(p);
                 }
                g_free(tmp);
-        
+       } 
 
        return msginfo;
 }
@@ -919,7 +929,7 @@ gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
 {
        gchar * tmp;
        FILE * tmpfp;
-       gchar buf[BUFFSIZE];
+       gchar date[RFC822_DATE_BUFFSIZE];
 
        tmp = g_strdup_printf("%s%ccancel%p", get_tmp_dir(),
                              G_DIR_SEPARATOR, msginfo);
@@ -932,10 +942,13 @@ gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
        }
        if (change_file_mode_rw(tmpfp, tmp) < 0) {
                FILE_OP_ERROR(tmp, "chmod");
-               g_warning("can't change file mode\n");
+               g_warning("can't change file mode");
        }
        
-       get_rfc822_date(buf, sizeof(buf));
+       if (prefs_common.hide_timezone)
+               get_rfc822_date_hide_tz(date, sizeof(date));
+       else
+               get_rfc822_date(date, sizeof(date));
        if (fprintf(tmpfp, "From: %s\r\n"
                       "Newsgroups: %s\r\n"
                       "Subject: cmsg cancel <%s>\r\n"
@@ -951,7 +964,7 @@ gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
                       msginfo->msgid,
                       msginfo->from,
                       msginfo->from,
-                      buf) < 0) {
+                      date) < 0) {
                FILE_OP_ERROR(tmp, "fprintf");
                fclose(tmpfp);
                claws_unlink(tmp);
@@ -967,7 +980,7 @@ gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
        }
 
        news_post(folder, tmp);
-       remove(tmp);
+       claws_unlink(tmp);
 
        g_free(tmp);
 
@@ -1123,6 +1136,8 @@ static void news_get_extra_fields(NewsSession *session, FolderItem *item, GSList
                        REMOTE_FOLDER(item->folder)->session = NULL;
                }
                news_folder_unlock(NEWS_FOLDER(item->folder));
+               if (hdrlist != NULL)
+                       newsnntp_xhdr_free(hdrlist);
                return;
        }
 
@@ -1136,6 +1151,7 @@ static void news_get_extra_fields(NewsSession *session, FolderItem *item, GSList
                }
        }
        newsnntp_xhdr_free(hdrlist);
+       hdrlist = NULL;
        
 /* To */
        ok = nntp_threaded_xhdr(item->folder, "to", first, last, &hdrlist);
@@ -1147,6 +1163,8 @@ static void news_get_extra_fields(NewsSession *session, FolderItem *item, GSList
                        REMOTE_FOLDER(item->folder)->session = NULL;
                }
                news_folder_unlock(NEWS_FOLDER(item->folder));
+               if (hdrlist != NULL)
+                       newsnntp_xhdr_free(hdrlist);
                return;
        }
 
@@ -1160,6 +1178,7 @@ static void news_get_extra_fields(NewsSession *session, FolderItem *item, GSList
                }
        }
        newsnntp_xhdr_free(hdrlist);
+       hdrlist = NULL;
        
 /* Cc */
        ok = nntp_threaded_xhdr(item->folder, "cc", first, last, &hdrlist);
@@ -1171,6 +1190,8 @@ static void news_get_extra_fields(NewsSession *session, FolderItem *item, GSList
                        REMOTE_FOLDER(item->folder)->session = NULL;
                }
                news_folder_unlock(NEWS_FOLDER(item->folder));
+               if (hdrlist != NULL)
+                       newsnntp_xhdr_free(hdrlist);
                return;
        }
 
@@ -1184,7 +1205,7 @@ static void news_get_extra_fields(NewsSession *session, FolderItem *item, GSList
                }
        }
        newsnntp_xhdr_free(hdrlist);
-       
+       hdrlist = NULL;
 
        g_hash_table_destroy(hash_table);
        news_folder_unlock(NEWS_FOLDER(item->folder));
@@ -1222,6 +1243,8 @@ static GSList *news_get_msginfos_for_range(NewsSession *session, FolderItem *ite
                        REMOTE_FOLDER(item->folder)->session = NULL;
                }
                news_folder_unlock(NEWS_FOLDER(item->folder));
+               if (msglist != NULL)
+                       newsnntp_xover_resp_list_free(msglist);
                return NULL;
        }
 
@@ -1285,8 +1308,6 @@ static GSList *news_get_msginfos(Folder *folder, FolderItem *item, GSList *msgnu
        NewsSession *session;
        GSList *elem, *msginfo_list = NULL, *tmp_msgnum_list, *tmp_msginfo_list;
        guint first, last, next;
-/*     guint tofetch, fetched;
-*/
        
        cm_return_val_if_fail(folder != NULL, NULL);
        cm_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, NULL);
@@ -1300,9 +1321,6 @@ static GSList *news_get_msginfos(Folder *folder, FolderItem *item, GSList *msgnu
        tmp_msgnum_list = g_slist_sort(tmp_msgnum_list, g_int_compare);
 
        progressindicator_start(PROGRESS_TYPE_NETWORK);
-/*     tofetch = g_slist_length(tmp_msgnum_list);
-       fetched = 0;
-*/
 
        first = GPOINTER_TO_INT(tmp_msgnum_list->data);
        last = first;
@@ -1312,13 +1330,8 @@ static GSList *news_get_msginfos(Folder *folder, FolderItem *item, GSList *msgnu
        for(elem = g_slist_next(tmp_msgnum_list); elem != NULL; elem = g_slist_next(elem)) {
                next = GPOINTER_TO_INT(elem->data);
                if(next != (last + 1)) {
-/*                     session->fetch_base_percentage = ((gfloat) fetched) / ((gfloat) tofetch);
-                       session->fetch_total_percentage = ((gfloat) (last - first + 1)) / ((gfloat) tofetch);
-*/
                        tmp_msginfo_list = news_get_msginfos_for_range(session, item, first, last);
                        msginfo_list = g_slist_concat(msginfo_list, tmp_msginfo_list);
-/*                     fetched = last - first + 1;
-*/
                        first = next;
                }
                last = next;
@@ -1326,9 +1339,6 @@ static GSList *news_get_msginfos(Folder *folder, FolderItem *item, GSList *msgnu
        
        news_folder_unlock(NEWS_FOLDER(item->folder));
        
-/*     session->fetch_base_percentage = ((gfloat) fetched) / ((gfloat) tofetch);
-       session->fetch_total_percentage = ((gfloat) (last - first + 1)) / ((gfloat) tofetch);
-*/
        tmp_msginfo_list = news_get_msginfos_for_range(session, item, first, last);
        msginfo_list = g_slist_concat(msginfo_list, tmp_msginfo_list);
 
@@ -1379,7 +1389,7 @@ static gint news_remove_folder(Folder *folder, FolderItem *item)
 
        path = folder_item_get_path(item);
        if (remove_dir_recursive(path) < 0) {
-               g_warning("can't remove directory `%s'\n", path);
+               g_warning("can't remove directory '%s'", path);
                g_free(path);
                return -1;
        }
@@ -1449,7 +1459,7 @@ static void warn_etpan(void)
                        _("You have one or more News accounts "
                          "defined. However this version of "
                          "Claws Mail has been built without "
-                         "News support; your News account(s) are "
+                         "News support; your News accounts are "
                          "disabled.\n\n"
                          "You probably need to "
                          "install libetpan and recompile "