2005-08-27 [colin] 1.9.13cvs63

* src/imap.c
	* src/etpan/imap-thread.c
	* src/etpan/imap-thread.h
		Implement automatic choosing of login method
		Fixes bug #791
	* src/gtk/.cvsignore
		Add sylpheed-marshal.[ch]
This commit is contained in:
Colin Leroy 2005-08-27 17:42:27 +00:00
parent 39b738233c
commit 1a5bf3ae6c
7 changed files with 130 additions and 25 deletions

View file

@ -1,3 +1,13 @@
2005-08-27 [colin] 1.9.13cvs63
* src/imap.c
* src/etpan/imap-thread.c
* src/etpan/imap-thread.h
Implement automatic choosing of login method
Fixes bug #791
* src/gtk/.cvsignore
Add sylpheed-marshal.[ch]
2005-08-27 [colin] 1.9.13cvs62
* src/common/utils.c

View file

@ -748,3 +748,4 @@
( cvs diff -u -r 1.49.2.56 -r 1.49.2.57 src/procmime.c; ) > 1.9.13cvs60.patchset
( cvs diff -u -r 1.43.2.21 -r 1.43.2.22 src/toolbar.c; cvs diff -u -r 1.19.2.4 -r 1.19.2.5 src/toolbar.h; ) > 1.9.13cvs61.patchset
( cvs diff -u -r 1.36.2.40 -r 1.36.2.41 src/common/utils.c; ) > 1.9.13cvs62.patchset
( cvs diff -u -r 1.179.2.60 -r 1.179.2.61 src/imap.c; cvs diff -u -r 1.1.4.17 -r 1.1.4.18 src/etpan/imap-thread.c; cvs diff -u -r 1.1.4.4 -r 1.1.4.5 src/etpan/imap-thread.h; cvs diff -u -r 1.1 -r 1.2 src/gtk/.cvsignore; ) > 1.9.13cvs63.patchset

View file

@ -11,7 +11,7 @@ MINOR_VERSION=9
MICRO_VERSION=13
INTERFACE_AGE=0
BINARY_AGE=0
EXTRA_VERSION=62
EXTRA_VERSION=63
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=

View file

@ -324,6 +324,50 @@ int imap_threaded_connect_ssl(Folder * folder, const char * server, int port)
return result.error;
}
struct capa_param {
mailimap * imap;
};
struct capa_result {
int error;
struct mailimap_capability_data *caps;
};
static void capability_run(struct etpan_thread_op * op)
{
int r;
struct capa_param * param;
struct capa_result * result;
struct mailimap_capability_data *caps;
param = op->param;
result = op->result;
r = mailimap_capability(param->imap, &caps);
result->error = r;
result->caps = caps;
}
struct mailimap_capability_data * imap_threaded_capability(Folder *folder)
{
struct capa_param param;
struct capa_result result;
mailimap *imap;
imap = get_imap(folder);
param.imap = imap;
threaded_run(folder, &param, &result, capability_run);
debug_print("capa ok\n");
return result.caps;
}
struct disconnect_param {
mailimap * imap;

View file

@ -16,6 +16,7 @@ void imap_done(Folder * folder);
int imap_threaded_connect(Folder * folder, const char * server, int port);
int imap_threaded_connect_ssl(Folder * folder, const char * server, int port);
struct mailimap_capability_data * imap_threaded_capability(Folder *folder);
int imap_threaded_connect_cmd(Folder * folder, const char * command,
const char * server, int port);

View file

@ -5,3 +5,5 @@ Makefile.in
*.o
*.lo
*.la
sylpheed-marshal.h
sylpheed-marshal.c

View file

@ -96,7 +96,7 @@ struct _IMAPSession
gboolean authenticated;
gchar **capability;
GSList *capability;
gboolean uidplus;
gchar *mbox;
@ -527,25 +527,84 @@ static void imap_reset_uid_lists(Folder *folder)
g_node_traverse(folder->node, G_IN_ORDER, G_TRAVERSE_ALL, -1, imap_reset_uid_lists_func, NULL);
}
void imap_get_capabilities(IMAPSession *session)
{
struct mailimap_capability_data *capabilities = NULL;
clistiter *cur;
if (session->capability != NULL)
return;
capabilities = imap_threaded_capability(session->folder);
for(cur = clist_begin(capabilities->cap_list) ; cur != NULL ;
cur = clist_next(cur)) {
struct mailimap_capability * cap =
clist_content(cur);
if (cap->cap_data.cap_name == NULL)
continue;
session->capability = g_slist_append
(session->capability,
g_strdup(cap->cap_data.cap_name));
debug_print("got capa %s\n", cap->cap_data.cap_name);
}
mailimap_capability_data_free(capabilities);
}
gboolean imap_has_capability(IMAPSession *session, const gchar *cap)
{
GSList *cur;
for (cur = session->capability; cur; cur = cur->next) {
if (!g_ascii_strcasecmp(cur->data, cap))
return TRUE;
}
return FALSE;
}
static gint imap_auth(IMAPSession *session, const gchar *user, const gchar *pass,
IMAPAuthType type)
{
gint ok;
gint ok = IMAP_ERROR;
static time_t last_login_err = 0;
/* TODO: implement Automatic mode */
imap_get_capabilities(session);
switch(type) {
case IMAP_AUTH_CRAM_MD5:
ok = imap_cmd_login(session, user, pass, "CRAM-MD5");
break;
case IMAP_AUTH_LOGIN:
default:
ok = imap_cmd_login(session, user, pass, "LOGIN");
break;
default:
debug_print("capabilities:\n"
"\t CRAM-MD5 %d\n"
"\t LOGIN %d\n",
imap_has_capability(session, "CRAM-MD5"),
imap_has_capability(session, "LOGIN"));
if (imap_has_capability(session, "CRAM-MD5"))
ok = imap_cmd_login(session, user, pass, "CRAM-MD5");
if (ok == IMAP_ERROR) /* we always try LOGIN before giving up */
ok = imap_cmd_login(session, user, pass, "LOGIN");
}
if (ok == IMAP_SUCCESS)
session->authenticated = TRUE;
else {
gchar *ext_info = NULL;
if (type == IMAP_AUTH_CRAM_MD5) {
ext_info = _("\n\nCRAM-MD5 logins only work if libetpan has been "
"compiled with SASL support and the "
"CRAM-MD5 SASL plugin is installed.");
} else {
ext_info = "";
}
if (time(NULL) - last_login_err > 10) {
alertpanel_error(_("Connection to %s failed: login refused.%s"),
SESSION(session)->server, ext_info);
}
last_login_err = time(NULL);
}
return ok;
}
@ -826,7 +885,7 @@ static gchar *imap_fetch_msg_full(Folder *folder, FolderItem *item, gint uid,
if (cached)
debug_print("message %d has been already %scached (%d/%d).\n", uid,
have_size == cached->size ? "fully ":"",
have_size, cached->size);
have_size, (int)cached->size);
if (cached && (cached->size == have_size || !body)) {
procmsg_msginfo_free(cached);
@ -2135,7 +2194,8 @@ static gint imap_status(IMAPSession *session, IMAPFolder *folder,
static void imap_free_capabilities(IMAPSession *session)
{
g_strfreev(session->capability);
slist_free_strings(session->capability);
g_slist_free(session->capability);
session->capability = NULL;
}
@ -2191,26 +2251,13 @@ static gint imap_cmd_login(IMAPSession *session,
{
int r;
gint ok;
static time_t last_login_err = 0;
log_print("IMAP4> Logging in to %s\n", SESSION(session)->server);
log_print("IMAP4> Logging %s to %s using %s\n",
user,
SESSION(session)->server,
type);
r = imap_threaded_login(session->folder, user, pass, type);
if (r != MAILIMAP_NO_ERROR) {
gchar *ext_info = NULL;
if (strcmp(type, "CRAM-MD5") == 0) {
ext_info = _("\n\nCRAM-MD5 logins only work if libetpan has been "
"compiled with SASL support and the "
"CRAM-MD5 SASL plugin is installed.");
} else {
ext_info = "";
}
if (time(NULL) - last_login_err > 10) {
alertpanel_error(_("Connection to %s failed: login refused.%s"),
SESSION(session)->server, ext_info);
}
last_login_err = time(NULL);
log_error("IMAP4< Error logging in to %s\n",
SESSION(session)->server);
ok = IMAP_ERROR;