commit f040b66a06bb0a82bf6aa156513fa6132a8af06a
parent c0fe6d3d75b97f04149e7d42b6d6489f05c2ed92
Author: Oliver Lowe <o@olowe.co>
Date: Sun, 24 Aug 2025 00:37:16 +1000
Remove more NNTP support :(
Diffstat:
6 files changed, 2 insertions(+), 712 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am
@@ -79,7 +79,6 @@ claws_mail_SOURCES = \
mh_gtk.c \
mimeview.c \
msgcache.c \
- news.c \
noticeview.c \
oauth2.c \
password.c \
diff --git a/src/folder.c b/src/folder.c
@@ -96,7 +96,6 @@ void folder_system_init(void)
{
folder_register_class(mh_get_class());
folder_register_class(imap_get_class());
- folder_register_class(news_get_class());
}
static GSList *folder_get_class_list(void)
@@ -1597,13 +1596,7 @@ gchar *folder_item_get_name(FolderItem *item)
if (folder_item_parent(item) == NULL) {
name = g_strconcat(item->name, " (", item->folder->klass->uistr, ")", NULL);
} else {
- if (FOLDER_CLASS(item->folder) == news_get_class() &&
- item->path && !g_strcmp0(item->name, item->path))
- name = get_abbrev_newsgroup_name
- (item->path,
- prefs_common.ng_abbrev_len);
- else
- name = g_strdup(item->name);
+ name = g_strdup(item->name);
}
}
diff --git a/src/mainwindow.c b/src/mainwindow.c
@@ -77,7 +77,6 @@
#include "icon_legend.h"
#include "textview.h"
#include "imap.h"
-#include "news.h"
#include "socket.h"
#include "printing.h"
#include "send_message.h"
@@ -3524,7 +3523,6 @@ static void online_switch_clicked (GtkButton *btn, gpointer data)
mainwindow_check_synchronise(mainwin, TRUE);
prefs_common.work_offline = TRUE;
imap_disconnect_all(TRUE);
- nntp_disconnect_all(TRUE);
hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
} else {
/*go online */
diff --git a/src/news.c b/src/news.c
@@ -1,680 +0,0 @@
-/*
- * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2025 the Claws Mail team and Hiroyuki Yamamoto
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#include "defs.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <time.h>
-#include <libetpan/libetpan.h>
-
-#include "news.h"
-#include "socket.h"
-#include "procmsg.h"
-#include "procheader.h"
-#include "folder.h"
-#include "session.h"
-#include "statusbar.h"
-#include "codeconv.h"
-#include "utils.h"
-#include "passwordstore.h"
-#include "prefs_common.h"
-#include "prefs_account.h"
-#include "inputdialog.h"
-#include "log.h"
-#include "progressindicator.h"
-#include "remotefolder.h"
-#include "alertpanel.h"
-#include "inc.h"
-#include "account.h"
-#ifdef USE_GNUTLS
-# include "ssl.h"
-#endif
-#include "main.h"
-#include "file-utils.h"
-
-#define NNTP_PORT 119
-#ifdef USE_GNUTLS
-#define NNTPS_PORT 563
-#endif
-
-typedef struct _NewsFolder NewsFolder;
-typedef struct _NewsSession NewsSession;
-
-#define NEWS_FOLDER(obj) ((NewsFolder *)obj)
-#define NEWS_SESSION(obj) ((NewsSession *)obj)
-
-struct _NewsFolder
-{
- RemoteFolder rfolder;
-
- gboolean use_auth;
- gboolean lock_count;
- guint refcnt;
-};
-
-struct _NewsSession
-{
- Session session;
- Folder *folder;
- gchar *group;
-};
-
-static Folder *news_folder_new (const gchar *name,
- const gchar *folder);
-static void news_folder_destroy (Folder *folder);
-
-static gchar *news_fetch_msg (Folder *folder,
- FolderItem *item,
- gint num);
-static void news_remove_cached_msg (Folder *folder,
- FolderItem *item,
- MsgInfo *msginfo);
-static Session *news_session_new (Folder *folder,
- const PrefsAccount *account,
- gushort port,
- SSLType ssl_type);
-
-static gint news_get_article (Folder *folder,
- gint num,
- gchar *filename);
-
-static gint news_select_group (Folder *folder,
- const gchar *group,
- gint *num,
- gint *first,
- gint *last);
-static MsgInfo *news_parse_xover (struct newsnntp_xover_resp_item *item);
-static gint news_get_num_list (Folder *folder,
- FolderItem *item,
- GSList **list,
- gboolean *old_uids_valid);
-static MsgInfo *news_get_msginfo (Folder *folder,
- FolderItem *item,
- gint num);
-static GSList *news_get_msginfos (Folder *folder,
- FolderItem *item,
- GSList *msgnum_list);
-static gboolean news_scan_required (Folder *folder,
- FolderItem *item);
-
-static gchar *news_folder_get_path (Folder *folder);
-static gchar *news_item_get_path (Folder *folder,
- FolderItem *item);
-static void news_synchronise (FolderItem *item, gint days);
-static int news_remove_msg (Folder *folder,
- FolderItem *item,
- gint msgnum);
-static gint news_rename_folder (Folder *folder,
- FolderItem *item,
- const gchar *name);
-static gint news_remove_folder (Folder *folder,
- FolderItem *item);
-static FolderClass news_class;
-
-FolderClass *news_get_class(void)
-{
- if (news_class.idstr == NULL) {
- news_class.type = F_NEWS;
- news_class.idstr = "news";
- news_class.uistr = "News";
- news_class.supports_server_search = FALSE;
-
- /* Folder functions */
- news_class.new_folder = news_folder_new;
- news_class.destroy_folder = news_folder_destroy;
-
- /* FolderItem functions */
- news_class.item_get_path = news_item_get_path;
- news_class.get_num_list = news_get_num_list;
- news_class.scan_required = news_scan_required;
- news_class.rename_folder = news_rename_folder;
- news_class.remove_folder = news_remove_folder;
-
- /* Message functions */
- news_class.get_msginfo = news_get_msginfo;
- news_class.get_msginfos = news_get_msginfos;
- news_class.fetch_msg = news_fetch_msg;
- news_class.synchronise = news_synchronise;
- news_class.search_msgs = folder_item_search_msgs_local;
- news_class.remove_msg = news_remove_msg;
- news_class.remove_cached_msg = news_remove_cached_msg;
- };
-
- return &news_class;
-}
-
-guint nntp_folder_get_refcnt(Folder *folder)
-{
- return ((NewsFolder *)folder)->refcnt;
-}
-
-void nntp_folder_ref(Folder *folder)
-{
- ((NewsFolder *)folder)->refcnt++;
-}
-
-void nntp_folder_unref(Folder *folder)
-{
- if (((NewsFolder *)folder)->refcnt > 0)
- ((NewsFolder *)folder)->refcnt--;
-}
-
-static int news_remove_msg (Folder *folder,
- FolderItem *item,
- gint msgnum)
-{
- gchar *path, *filename;
-
- cm_return_val_if_fail(folder != NULL, -1);
- cm_return_val_if_fail(item != NULL, -1);
-
- path = folder_item_get_path(item);
- if (!is_dir_exist(path))
- make_dir_hier(path);
-
- filename = g_strconcat(path, G_DIR_SEPARATOR_S, itos(msgnum), NULL);
- g_free(path);
- unlink(filename);
- g_free(filename);
- return 0;
-}
-
-static void news_folder_lock(NewsFolder *folder)
-{
- folder->lock_count++;
-}
-
-static void news_folder_unlock(NewsFolder *folder)
-{
- if (folder->lock_count > 0)
- folder->lock_count--;
-}
-
-int news_folder_locked(Folder *folder)
-{
- if (folder == NULL)
- return 0;
-
- return NEWS_FOLDER(folder)->lock_count;
-}
-
-static Folder *news_folder_new(const gchar *name, const gchar *path)
-{
- Folder *folder;
- folder = (Folder *)g_new0(NewsFolder, 1);
- folder->klass = &news_class;
- folder_init(folder, name);
- return folder;
-}
-
-static void news_folder_destroy(Folder *folder)
-{
- gchar *dir;
-
- while (nntp_folder_get_refcnt(folder) > 0)
- gtk_main_iteration();
-
- dir = news_folder_get_path(folder);
- if (is_dir_exist(dir))
- remove_dir_recursive(dir);
- g_free(dir);
-
- RemoteFolder *rfolder = REMOTE_FOLDER(folder);
- if (rfolder->session)
- session_destroy(rfolder->session);
-}
-
-static void news_session_destroy(Session *session)
-{
- NewsSession *news_session = NEWS_SESSION(session);
-
- cm_return_if_fail(session != NULL);
-
- if (news_session->group)
- g_free(news_session->group);
-}
-
-static gboolean nntp_ping(gpointer data)
-{
- fprintf(stderr, "TODO(otl): delete nntp_ping\n");
- return FALSE;
-}
-
-
-static Session *news_session_new(Folder *folder, const PrefsAccount *account, gushort port, SSLType ssl_type)
-{
- fprintf(stderr, "TODO(otl): delete news_session_new\n");
- return NULL;
-}
-
-static Session *news_session_new_for_folder(Folder *folder)
-{
- fprintf(stderr, "TODO(otl): delete news_session_new_for_folder\n");
- return NULL;
-}
-
-static void news_remove_cached_msg(Folder *folder, FolderItem *item, MsgInfo *msginfo)
-{
- gchar *path, *filename;
-
- path = folder_item_get_path(item);
-
- if (!is_dir_exist(path)) {
- g_free(path);
- return;
- }
-
- filename = g_strconcat(path, G_DIR_SEPARATOR_S, itos(msginfo->msgnum), NULL);
- g_free(path);
-
- if (is_file_exist(filename)) {
- unlink(filename);
- }
- g_free(filename);
-}
-
-static gchar *news_fetch_msg(Folder *folder, FolderItem *item, gint num)
-{
- fprintf(stderr, "TODO: delete news_fetch_msg\n");
- return NULL;
-}
-
-static NewsGroupInfo *news_group_info_new(const gchar *name,
- gint first, gint last, gchar type)
-{
- NewsGroupInfo *ginfo;
-
- ginfo = g_new(NewsGroupInfo, 1);
- ginfo->name = g_strdup(name);
- ginfo->first = first;
- ginfo->last = last;
- ginfo->type = type;
-
- return ginfo;
-}
-
-static void news_group_info_free(NewsGroupInfo *ginfo)
-{
- g_free(ginfo->name);
- g_free(ginfo);
-}
-
-static gint news_group_info_compare(NewsGroupInfo *ginfo1,
- NewsGroupInfo *ginfo2)
-{
- return g_ascii_strcasecmp(ginfo1->name, ginfo2->name);
-}
-
-GSList *news_get_group_list(Folder *folder)
-{
- fprintf(stderr, "TODO(otl): delete news_get_group_list\n");
- return NULL;
-}
-
-void news_group_list_free(GSList *group_list)
-{
- GSList *cur;
-
- if (!group_list) return;
-
- for (cur = group_list; cur != NULL; cur = cur->next)
- news_group_info_free((NewsGroupInfo *)cur->data);
- g_slist_free(group_list);
-}
-
-void news_remove_group_list_cache(Folder *folder)
-{
- gchar *path, *filename;
-
- cm_return_if_fail(folder != NULL);
- cm_return_if_fail(FOLDER_CLASS(folder) == &news_class);
-
- path = folder_item_get_path(FOLDER_ITEM(folder->node->data));
- filename = g_strconcat(path, G_DIR_SEPARATOR_S, NEWSGROUP_LIST, NULL);
- g_free(path);
-
- if (is_file_exist(filename)) {
- if (unlink(filename) < 0)
- FILE_OP_ERROR(filename, "remove");
- }
- g_free(filename);
-}
-
-int news_post(Folder *folder, const gchar *file)
-{
- fprintf(stderr, "TODO(otl): delete news_post\n");
- return -1;
-}
-
-static int news_get_article(Folder *folder, gint num, gchar *filename)
-{
- fprintf(stderr, "TODO(otl): delete news_post\n");
- return -1;
-}
-
-/**
- * news_select_group:
- * @session: Active NNTP session.
- * @group: Newsgroup name.
- * @num: Estimated number of articles.
- * @first: First article number.
- * @last: Last article number.
- *
- * Select newsgroup @group with the GROUP command if it is not already
- * selected in @session, or article numbers need to be returned.
- *
- * Return value: NNTP result code.
- **/
-static gint news_select_group(Folder *folder, const gchar *group,
- gint *num, gint *first, gint *last)
-{
- fprintf(stderr, "TODO(otl): delete news_select_group\n");
- return -1;
-}
-
-static MsgInfo *news_parse_xover(struct newsnntp_xover_resp_item *item)
-{
- MsgInfo *msginfo;
-
- /* set MsgInfo */
- msginfo = procmsg_msginfo_new();
- msginfo->msgnum = item->ovr_article;
- msginfo->size = item->ovr_size;
-
- msginfo->date = g_strdup(item->ovr_date);
- msginfo->date_t = procheader_date_parse(NULL, item->ovr_date, 0);
-
- msginfo->from = conv_unmime_header(item->ovr_author, NULL, TRUE);
- msginfo->fromname = procheader_get_fromname(msginfo->from);
-
- msginfo->subject = conv_unmime_header(item->ovr_subject, NULL, FALSE);
-
- remove_return(msginfo->from);
- remove_return(msginfo->fromname);
- remove_return(msginfo->subject);
-
- if (item->ovr_message_id) {
- gchar *tmp = g_strdup(item->ovr_message_id);
- extract_parenthesis(tmp, '<', '>');
- remove_space(tmp);
- if (*tmp != '\0')
- msginfo->msgid = g_strdup(tmp);
- g_free(tmp);
- }
-
- /* FIXME: this is a quick fix; references' meaning was changed
- * into having the actual list of references in the References: header.
- * We need a GSList here, so msginfo_free() and msginfo_copy() can do
- * their things properly. */
- if (item->ovr_references && *(item->ovr_references)) {
- gchar **ref_tokens = g_strsplit(item->ovr_references, " ", -1);
- guint i = 0;
- char *tmp;
- char *p;
- while (ref_tokens[i]) {
- gchar *cur_ref = ref_tokens[i];
- msginfo->references = references_list_append(msginfo->references,
- cur_ref);
- i++;
- }
- g_strfreev(ref_tokens);
-
- tmp = g_strdup(item->ovr_references);
- eliminate_parenthesis(tmp, '(', ')');
- if ((p = strrchr(tmp, '<')) != NULL) {
- extract_parenthesis(p, '<', '>');
- remove_space(p);
- if (*p != '\0')
- msginfo->inreplyto = g_strdup(p);
- }
- g_free(tmp);
- }
-
- return msginfo;
-}
-
-gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
-{
- gchar * tmp;
- FILE * tmpfp;
- gchar date[RFC822_DATE_BUFFSIZE];
-
- tmp = g_strdup_printf("%s%ccancel%p", get_tmp_dir(),
- G_DIR_SEPARATOR, msginfo);
- if (tmp == NULL)
- return -1;
-
- if ((tmpfp = g_fopen(tmp, "wb")) == NULL) {
- FILE_OP_ERROR(tmp, "g_fopen");
- g_free(tmp);
- return -1;
- }
- if (change_file_mode_rw(tmpfp, tmp) < 0) {
- FILE_OP_ERROR(tmp, "chmod");
- g_warning("can't change file mode");
- }
-
- 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"
- "Control: cancel <%s>\r\n"
- "X-Cancelled-by: %s\r\n"
- "Date: %s\r\n"
- "\r\n"
- "removed with Claws Mail\r\n",
- msginfo->from,
- msginfo->newsgroups,
- msginfo->msgid,
- msginfo->msgid,
- msginfo->from,
- date) < 0) {
- FILE_OP_ERROR(tmp, "fprintf");
- fclose(tmpfp);
- unlink(tmp);
- g_free(tmp);
- return -1;
- }
-
- if (safe_fclose(tmpfp) == EOF) {
- FILE_OP_ERROR(tmp, "fclose");
- unlink(tmp);
- g_free(tmp);
- return -1;
- }
-
- news_post(folder, tmp);
- unlink(tmp);
-
- g_free(tmp);
-
- return 0;
-}
-
-static gchar *news_folder_get_path(Folder *folder)
-{
- gchar *folder_path;
-
- cm_return_val_if_fail(folder->account != NULL, NULL);
-
- folder_path = g_strconcat(get_news_cache_dir(),
- G_DIR_SEPARATOR_S,
- folder->account->nntp_server,
- NULL);
- return folder_path;
-}
-
-static gchar *news_item_get_path(Folder *folder, FolderItem *item)
-{
- gchar *folder_path, *path;
-
- cm_return_val_if_fail(folder != NULL, NULL);
- cm_return_val_if_fail(item != NULL, NULL);
- folder_path = news_folder_get_path(folder);
-
- cm_return_val_if_fail(folder_path != NULL, NULL);
- if (g_path_is_absolute(folder_path)) {
- if (item->path)
- path = g_strconcat(folder_path, G_DIR_SEPARATOR_S,
- item->path, NULL);
- else
- path = g_strdup(folder_path);
- } else {
- if (item->path)
- path = g_strconcat(get_home_dir(), G_DIR_SEPARATOR_S,
- folder_path, G_DIR_SEPARATOR_S,
- item->path, NULL);
- else
- path = g_strconcat(get_home_dir(), G_DIR_SEPARATOR_S,
- folder_path, NULL);
- }
- g_free(folder_path);
- return path;
-}
-
-static gint news_get_num_list(Folder *folder, FolderItem *item, GSList **msgnum_list, gboolean *old_uids_valid)
-{
- fprintf(stderr, "TODO: delete news_get_num_list\n");
- return -1;
-}
-
-static void news_set_msg_flags(FolderItem *item, MsgInfo *msginfo)
-{
- msginfo->flags.tmp_flags = 0;
- if (item->folder->account->mark_crosspost_read && msginfo->msgid) {
- if (item->folder->newsart &&
- g_hash_table_lookup(item->folder->newsart, msginfo->msgid) != NULL) {
- msginfo->flags.perm_flags = MSG_COLORLABEL_TO_FLAGS(item->folder->account->crosspost_col);
-
- } else {
- if (!item->folder->newsart)
- item->folder->newsart = g_hash_table_new(g_str_hash, g_str_equal);
- g_hash_table_insert(item->folder->newsart,
- g_strdup(msginfo->msgid), GINT_TO_POINTER(1));
- msginfo->flags.perm_flags = MSG_NEW|MSG_UNREAD;
- }
- } else {
- msginfo->flags.perm_flags = MSG_NEW|MSG_UNREAD;
- }
-}
-
-static void news_get_extra_fields(NewsSession *session, FolderItem *item, GSList *msglist)
-{
- fprintf(stderr, "TODO(otl): delete news_get_extra_fields\n");
- return;
-}
-
-static GSList *news_get_msginfos_for_range(NewsSession *session, FolderItem *item, guint begin, guint end)
-{
- fprintf(stderr, "TODO(otl): delete news_get_msginfos_for_range\n");
- return NULL;
-}
-
-static MsgInfo *news_get_msginfo(Folder *folder, FolderItem *item, gint num)
-{
- fprintf(stderr, "TODO: delete news_get_msginfo\n");
- return NULL;
-}
-
-static GSList *news_get_msginfos(Folder *folder, FolderItem *item, GSList *msgnum_list)
-{
- fprintf(stderr, "TODO: delete news_get_msginfos\n");
- return NULL;
-}
-
-static gboolean news_scan_required(Folder *folder, FolderItem *item)
-{
- return TRUE;
-}
-
-void news_synchronise(FolderItem *item, gint days)
-{
-}
-
-static gint news_rename_folder(Folder *folder, FolderItem *item,
- const gchar *name)
-{
- gchar *path;
-
- cm_return_val_if_fail(folder != NULL, -1);
- cm_return_val_if_fail(item != NULL, -1);
- cm_return_val_if_fail(item->path != NULL, -1);
- cm_return_val_if_fail(name != NULL, -1);
-
- path = folder_item_get_path(item);
- if (!is_dir_exist(path))
- make_dir_hier(path);
-
- g_free(item->name);
- item->name = g_strdup(name);
-
- return 0;
-}
-
-static gint news_remove_folder(Folder *folder, FolderItem *item)
-{
- gchar *path;
-
- cm_return_val_if_fail(folder != NULL, -1);
- cm_return_val_if_fail(item != NULL, -1);
- cm_return_val_if_fail(item->path != NULL, -1);
-
- path = folder_item_get_path(item);
- if (remove_dir_recursive(path) < 0) {
- g_warning("can't remove directory '%s'", path);
- g_free(path);
- return -1;
- }
-
- g_free(path);
- folder_item_remove(item);
- return 0;
-}
-
-void nntp_disconnect_all(gboolean have_connectivity)
-{
- GList *list;
-
- for (list = account_get_list(); list != NULL; list = list->next) {
- PrefsAccount *account = list->data;
- if (account->protocol == A_NNTP) {
- RemoteFolder *folder = (RemoteFolder *)account->folder;
- if (folder && folder->session) {
- NewsSession *session = (NewsSession *)folder->session;
- SESSION(session)->state = SESSION_DISCONNECTED;
- SESSION(session)->sock = NULL;
- session_destroy(SESSION(session));
- folder->session = NULL;
- }
- }
- }
-}
-
diff --git a/src/news.h b/src/news.h
@@ -14,7 +14,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
#ifndef __NEWS_H__
@@ -35,21 +35,4 @@ struct _NewsGroupInfo
gchar type;
};
-FolderClass *news_get_class (void);
-
-GSList *news_get_group_list (Folder *folder);
-void news_group_list_free (GSList *group_list);
-void news_remove_group_list_cache (Folder *folder);
-
-gint news_post (Folder *folder,
- const gchar *file);
-gint news_cancel_article (Folder *folder,
- MsgInfo *msginfo);
-int news_folder_locked (Folder *folder);
-
-guint nntp_folder_get_refcnt(Folder *folder);
-void nntp_folder_ref(Folder *folder);
-void nntp_folder_unref(Folder *folder);
-void nntp_disconnect_all(gboolean have_connectivity);
-
#endif /* __NEWS_H__ */
diff --git a/src/summaryview.c b/src/summaryview.c
@@ -62,7 +62,6 @@
#include "folder_item_prefs.h"
#include "string_match.h"
#include "toolbar.h"
-#include "news.h"
#include "hooks.h"
#include "description_window.h"
#include "folderutils.h"
@@ -4197,8 +4196,6 @@ void summary_cancel(SummaryView *summaryview)
if (!check_permission(summaryview, msginfo))
return;
- news_cancel_article(summaryview->folder_item->folder, msginfo);
-
if (summary_is_locked(summaryview)) return;
summary_lock(summaryview);