/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2013 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2015 Hiroyuki Yamamoto and the Claws Mail team
*
* 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
#include "filtering.h"
#include "prefs_actions.h"
#include "hooks.h"
+#include "passwordstore.h"
enum {
ACCOUNT_IS_DEFAULT,
while (fgets(buf, sizeof(buf), fp) != NULL) {
if (!strncmp(buf, "[Account: ", 10)) {
strretchomp(buf);
- memmove(buf, buf + 1, strlen(buf));
+ memmove(buf, buf + 1, sizeof(buf) - 1);
buf[strlen(buf) - 1] = '\0';
debug_print("Found label: %s\n", buf);
ac_label_list = g_slist_append(ac_label_list,
/* read config data from file */
cur_account = NULL;
for (cur = ac_label_list; cur != NULL; cur = cur->next) {
- ac_prefs = prefs_account_new();
- prefs_account_read_config(ac_prefs, (gchar *)cur->data);
+ ac_prefs = prefs_account_new_from_config((gchar *)cur->data);
account_list = g_list_append(account_list, ac_prefs);
if (ac_prefs->is_default)
cur_account = ac_prefs;
void account_edit_focus(void)
{
+ if (edit_account.window == NULL) {
+ return;
+ }
manage_window_set_transient(GTK_WINDOW(edit_account.window));
gtk_widget_grab_focus(edit_account.close_btn);
gtk_widget_show(edit_account.window);
if (compose_get_compose_list()) {
alertpanel_error(_("Some composing windows are open.\n"
"Please close all the composing "
- "windows before editing the accounts."));
+ "windows before editing accounts."));
inc_unlock();
return;
}
}
}
-void account_open(PrefsAccount *ac_prefs)
+void account_open(PrefsAccount *ac_prefs, gboolean called_from_acc_list)
{
gboolean prev_default;
gchar *ac_name, *old_prefix, *new_prefix;
cm_return_if_fail(ac_prefs != NULL);
+ if (compose_get_compose_list()) {
+ alertpanel_error(_("Some composing windows are open.\n"
+ "Please close all the composing "
+ "windows before editing accounts."));
+ return;
+ }
+
prev_default = ac_prefs->is_default;
Xstrdup_a(ac_name, ac_prefs->account_name ? ac_prefs->account_name : "",
return);
prefs_account_open(ac_prefs, &account_dirty);
- account_edit_focus();
+ if (called_from_acc_list)
+ account_edit_focus();
if (account_dirty) {
if (!prev_default && ac_prefs->is_default)
ac_prefs = account_list_view_get_selected_account(edit_account.list_view);
if (ac_prefs) {
- account_open(ac_prefs);
+ account_open(ac_prefs, TRUE);
account_list_view_set();
}
}
ac_clon->is_default = FALSE;
ACP_FASSIGN(folder);
+ ACP_FASSIGN(config_version);
+
+ ACP_FASSIGN(use_proxy);
+ ACP_FASSIGN(use_default_proxy);
+ ACP_FASSIGN(use_proxy_for_send);
+ ACP_FASSIGN(proxy_info.proxy_type);
+ ACP_FDUP(proxy_info.proxy_host);
+ ACP_FASSIGN(proxy_info.proxy_port);
+ ACP_FASSIGN(proxy_info.use_proxy_auth);
+ ACP_FDUP(proxy_info.proxy_name);
+ ACP_FDUP(proxy_info.proxy_pass);
+
account_list = g_list_append(account_list, ac_clon);
account_list_view_set();
}
#undef ACP_FDUP
#undef ACP_FASSIGN
+static void account_empty_cache(PrefsAccount *ac_prefs)
+{
+ gchar *cache_dir;
+
+ cache_dir = prefs_account_cache_dir(ac_prefs, FALSE);
+ if (cache_dir == NULL)
+ return; /* no cache dir, nothing to do */
+
+ if (is_dir_exist(cache_dir) && remove_dir_recursive(cache_dir) < 0) {
+ g_warning("can't remove directory '%s'", cache_dir);
+ } else {
+ gchar *server_dir = prefs_account_cache_dir(ac_prefs, TRUE);
+ if (g_rmdir(server_dir) == 0)
+ debug_print("Removed empty cache server directory\n");
+ else
+ debug_print("Cache server directory not empty: not removed\n");
+ g_free(server_dir);
+ }
+ g_free(cache_dir);
+}
+
static void account_delete(GtkWidget *widget, gpointer data)
{
PrefsAccount *ac_prefs;
GList *list;
Folder *folder;
GSList *cur;
-
+
ac_prefs = account_list_view_get_selected_account(edit_account.list_view);
if (ac_prefs == NULL)
return;
ac_prefs->account_name ? ac_prefs->account_name :
_("(Untitled)"));
if (alertpanel_full(_("Delete account"), buf,
- GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, FALSE,
- NULL, ALERT_WARNING, G_ALERTDEFAULT) != G_ALERTALTERNATE)
+ GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, ALERTFOCUS_FIRST, FALSE,
+ NULL, ALERT_WARNING) != G_ALERTALTERNATE)
return;
account_list_dirty = TRUE;
GINT_TO_POINTER(ac_prefs->account_id));
}
+ gchar *uid = g_strdup_printf("%d", ac_prefs->account_id);
+ passwd_store_delete_block(PWS_ACCOUNT, uid);
+ g_free(uid);
+
debug_print("Removing filter rules relative to this account...\n");
for(cur = filtering_rules ; cur != NULL ;) {
FilteringProp * prop = (FilteringProp *) cur->data;
cur = g_slist_next(cur);
}
}
+
+ debug_print("Removing cache directory of this account...\n");
+ account_empty_cache(ac_prefs);
+
folder_write_list();
}
#ifdef USE_GNUTLS
protocol = ac_prefs->protocol == A_POP3 ?
(ac_prefs->ssl_pop == SSL_TUNNEL ?
- "POP3 (SSL)" :
+ "POP (SSL/TLS)" :
ac_prefs->ssl_pop == SSL_STARTTLS ?
- "POP3 (TLS)" : "POP3") :
+ "POP (STARTTLS)" : "POP") :
ac_prefs->protocol == A_IMAP4 ?
(ac_prefs->ssl_imap == SSL_TUNNEL ?
- "IMAP4 (SSL)" :
+ "IMAP (SSL/TLS)" :
ac_prefs->ssl_imap == SSL_STARTTLS ?
- "IMAP4 (TLS)" : "IMAP4") :
+ "IMAP (STARTTLS)" : "IMAP") :
ac_prefs->protocol == A_NNTP ?
(ac_prefs->ssl_nntp == SSL_TUNNEL ?
- "NNTP (SSL)" : "NNTP") :
+ "NNTP (SSL/TLS)" : "NNTP") :
ac_prefs->protocol == A_LOCAL ? "Local" :
ac_prefs->protocol == A_NONE ? "SMTP" : "-";
#else
- protocol = ac_prefs->protocol == A_POP3 ? "POP3" :
- ac_prefs->protocol == A_IMAP4 ? "IMAP4" :
+ protocol = ac_prefs->protocol == A_POP3 ? "POP" :
+ ac_prefs->protocol == A_IMAP4 ? "IMAP" :
ac_prefs->protocol == A_LOCAL ? "Local" :
ac_prefs->protocol == A_NNTP ? "NNTP" :
ac_prefs->protocol == A_NONE ? "SMTP" : "-";
GtkTreeIter iter;
if (!gtk_tree_model_iter_nth_child(model, &iter, NULL, row)) {
- g_warning("%s(%d) - no iter found???\n", __FILE__, __LINE__);
+ g_warning("%s(%d) - no iter found???", __FILE__, __LINE__);
continue;
}
/* select the account set in folderitem's property (if enabled) */
if (msginfo->folder->prefs && msginfo->folder->prefs->enable_default_account)
account = account_find_from_id(msginfo->folder->prefs->default_account);
-
+ else if (folder_has_parent_of_type(msginfo->folder, F_QUEUE) ||
+ folder_has_parent_of_type(msginfo->folder, F_OUTBOX) ||
+ folder_has_parent_of_type(msginfo->folder, F_DRAFT)) {
+ gchar *from = NULL;
+ if (!procheader_get_header_from_msginfo
+ (msginfo, &from, "From:")) {
+ gchar *buf = from + strlen("From:");
+ extract_address(buf);
+ account = account_find_from_address(buf, FALSE);
+ g_free(from);
+ }
+ }
/* select account by to: and cc: header if enabled */
if (reply_autosel) {
gchar * field = NULL;
}
}
if (!account) {
- gchar deliveredto[BUFFSIZE];
+ gchar *deliveredto = NULL;
if (!procheader_get_header_from_msginfo
- (msginfo, deliveredto,sizeof deliveredto , "Delivered-To:")) {
+ (msginfo, &deliveredto, "Delivered-To:")) {
gchar *buf = deliveredto + strlen("Delivered-To:");
extract_address(buf);
account = account_find_from_address(buf, FALSE);
- }
+ g_free(deliveredto);
+ }
}
}
*/
static gint account_list_view_get_selected_account_id(GtkWidget *list_view)
{
- GtkTreeSelection *selector;
- GtkTreeModel *model;
- GtkTreeIter iter;
PrefsAccount *res = NULL;
- selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
-
- if (!gtk_tree_selection_get_selected(selector, &model, &iter))
- return -1;
-
- gtk_tree_model_get(model, &iter, ACCOUNT_DATA, &res, -1);
+ res = (PrefsAccount *)gtkut_tree_view_get_selected_pointer(
+ GTK_TREE_VIEW(list_view), ACCOUNT_DATA,
+ NULL, NULL, NULL);
- return res->account_id;
+ return (res != NULL ? res->account_id : -1);
}
/*!
*/
static PrefsAccount *account_list_view_get_selected_account(GtkWidget *list_view)
{
- GtkTreeSelection *selector;
- GtkTreeModel *model;
- GtkTreeIter iter;
- PrefsAccount *res = NULL;
+ PrefsAccount *res =
+ (PrefsAccount *)gtkut_tree_view_get_selected_pointer(
+ GTK_TREE_VIEW(list_view), ACCOUNT_DATA,
+ NULL, NULL, NULL);
- selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
-
- if (!gtk_tree_selection_get_selected(selector, &model, &iter))
- return NULL;
-
- gtk_tree_model_get(model, &iter, ACCOUNT_DATA, &res, -1);
-
- return res;
+ return res;
}
/*!
return NULL;
if (account->sig_type == SIG_FILE) {
- if (!is_file_or_fifo_exist(account->sig_path)) {
- g_warning("can't open signature file: %s\n",
- account->sig_path);
+ gchar *sig_full_path;
+ if (!g_path_is_absolute(account->sig_path)) {
+ sig_full_path = g_build_filename(get_home_dir(), account->sig_path, NULL);
+ } else {
+ sig_full_path = g_strdup(account->sig_path);
+ }
+
+ if (!is_file_or_fifo_exist(sig_full_path)) {
+ g_warning("can't open signature file: '%s'", sig_full_path);
+ g_free(sig_full_path);
return NULL;
}
- }
- if (account->sig_type == SIG_COMMAND)
- sig_body = get_command_output(account->sig_path);
- else {
- gchar *tmp;
+ debug_print("Reading signature from file '%s'\n", sig_full_path);
+ gchar *tmp = file_read_to_str(sig_full_path);
+ g_free(sig_full_path);
- tmp = file_read_to_str(account->sig_path);
if (!tmp)
return NULL;
+
sig_body = normalize_newlines(tmp);
g_free(tmp);
+ } else {
+ sig_body = get_command_output(account->sig_path);
}
if (account->sig_sep) {
}
return FALSE;
}
+
+static GSList *account_signatures_list = NULL;
+
+/* create a list of unique signatures from accounts list */
+void account_signatures_matchlist_create(void)
+{
+ GList *cur_ac = NULL;
+ PrefsAccount *ac_prefs = NULL;
+
+ if (account_signatures_list)
+ return;
+
+ account_signatures_list = g_slist_prepend(account_signatures_list, g_strdup("-- "));
+ for (cur_ac = account_get_list();
+ cur_ac != NULL;
+ cur_ac = g_list_next(cur_ac)) {
+ ac_prefs = (PrefsAccount *)cur_ac->data;
+
+ if (ac_prefs->sig_sep && *ac_prefs->sig_sep != '\0') {
+ if (!g_slist_find_custom(account_signatures_list, ac_prefs->sig_sep,
+ (GCompareFunc)strcmp2)) {
+ account_signatures_list = g_slist_prepend(account_signatures_list,
+ g_strdup(ac_prefs->sig_sep));
+ }
+ }
+ }
+}
+
+/* delete the list of signatures created by account_signatures_matchlist_create() */
+void account_signatures_matchlist_delete(void)
+{
+ if (account_signatures_list) {
+ slist_free_strings_full(account_signatures_list);
+ account_signatures_list = NULL;
+ }
+}
+
+/* match a string against all signatures in list, using the specified format */
+gboolean account_signatures_matchlist_str_found(const gchar *str, const gchar *format)
+{
+ gchar *tmp = NULL;
+ gboolean found = FALSE;
+ GSList *item;
+
+ for (item = account_signatures_list;
+ item != NULL && !found;
+ item = g_slist_next(item)) {
+ tmp = g_strdup_printf(format, (gchar *)item->data);
+ found = (strcmp(tmp, str) == 0);
+ g_free(tmp);
+ }
+ return found;
+}
+
+/* match M first char of a string against all signatures in list, using the specified format */
+gboolean account_signatures_matchlist_nchar_found(const gchar *str, const gchar *format)
+{
+ gchar *tmp = NULL;
+ gboolean found = FALSE;
+ GSList *item;
+ gint len;
+
+ for (item = account_signatures_list;
+ item != NULL && !found;
+ item = g_slist_next(item)) {
+ tmp = g_strdup_printf(format, (gchar *)item->data);
+ len = strlen(tmp);
+ found = (strncmp(tmp, str, len) == 0);
+ g_free(tmp);
+ }
+ return found;
+}