X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=imap.c;h=cb87eda5378f258f20955c3524f2f84c6d29cd0e;hb=e4dd196b137223195739b9e0f50ec2a8a02b3534;hp=6145564baa1cefff872790aff95888351e94df44;hpb=6fdb9350ecdfd0dc7f65975ac9b4d6ba00161b19;p=~andy%2Ffetchmail diff --git a/imap.c b/imap.c index 6145564b..cb87eda5 100644 --- a/imap.c +++ b/imap.c @@ -324,7 +324,7 @@ static void imap_canonicalize(char *result, char *raw, size_t maxlen) result[j] = '\0'; } -static void capa_probe(int sock, struct query *ctl) +static int capa_probe(int sock, struct query *ctl) /* set capability variables from a CAPA probe */ { int ok; @@ -360,6 +360,8 @@ static void capa_probe(int sock, struct query *ctl) if (outlevel >= O_DEBUG) report(stdout, GT_("Protocol identified as IMAP2 or IMAP2BIS\n")); } + else + return ok; /* * Handle idling. We depend on coming through here on startup @@ -377,6 +379,8 @@ static void capa_probe(int sock, struct query *ctl) } peek_capable = (imap_version >= IMAP4); + + return PS_SUCCESS; } static int do_authcert (int sock, const char *command, const char *name) @@ -412,7 +416,8 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting) else expunge_period = 1; - capa_probe(sock, ctl); + if ((ok = capa_probe(sock, ctl))) + return ok; /* * If either (a) we saw a PREAUTH token in the greeting, or @@ -442,9 +447,9 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting) * whether TLS is mandatory or opportunistic unless SSLOpen() fails * (see below). */ if (gen_transact(sock, "STARTTLS") == PS_SUCCESS - && SSLOpen(sock, ctl->sslcert, ctl->sslkey, "tls1", ctl->sslcertck, + && (set_timeout(mytimeout), SSLOpen(sock, ctl->sslcert, ctl->sslkey, "tls1", ctl->sslcertck, ctl->sslcertfile, ctl->sslcertpath, ctl->sslfingerprint, commonname, - ctl->server.pollname, &ctl->remotename) != -1) + ctl->server.pollname, &ctl->remotename)) != -1) { /* * RFC 2595 says this: @@ -459,7 +464,8 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting) * Now that we're confident in our TLS connection we can * guarantee a secure capability re-probe. */ - capa_probe(sock, ctl); + if ((ok = capa_probe(sock, ctl))) + return ok; if (outlevel >= O_VERBOSE) { report(stdout, GT_("%s: upgrade to TLS succeeded.\n"), commonname); @@ -467,9 +473,11 @@ static int imap_getauth(int sock, struct query *ctl, char *greeting) } else if (must_tls(ctl)) { /* Config required TLS but we couldn't guarantee it, so we must * stop. */ + set_timeout(0); report(stderr, GT_("%s: upgrade to TLS failed.\n"), commonname); return PS_SOCKET; } else { + set_timeout(0); if (outlevel >= O_VERBOSE) { report(stdout, GT_("%s: opportunistic upgrade to TLS failed, trying to continue\n"), commonname); } @@ -761,7 +769,7 @@ static int imap_idle(int sock) static int imap_search(int sock, struct query *ctl, int count) /* search for unseen messages */ { - int ok, first, last; + int ok; char buf[MSGBUFSIZE+1], *cp; /* Don't count deleted messages. Enabled only for IMAP4 servers or @@ -1158,7 +1166,8 @@ static int imap_fetch_headers(int sock, struct query *ctl,int number,int *lenp) /* try to recover for some responses */ if (!strncmp(buf, "* NO", 4) || - !strncmp(buf, "* BAD", 5)) + !strncmp(buf, "* BAD", 5) || + strstr(buf, "FETCH ()")) { return(PS_TRANSIENT); } @@ -1173,7 +1182,7 @@ static int imap_fetch_headers(int sock, struct query *ctl,int number,int *lenp) /* an unexpected tagged response */ if (outlevel > O_SILENT) report(stderr, GT_("Incorrect FETCH response: %s.\n"), buf); - return(PS_ERROR); + return(PS_TRANSIENT); } return(ok); } @@ -1291,20 +1300,11 @@ static int imap_delete(int sock, struct query *ctl, int number) int ok; /* Select which flags to set on message deletion: */ const char delflags_seen[] = "\\Seen \\Deleted"; - const char delflags_unseen[] = "\\Deleted"; static const char *delflags; /* Which environment variable to look for: */ - const char dis_env[] = "FETCHMAIL_IMAP_DELETED_REMAINS_UNSEEN"; - if (!delflags) { - char *tmp; - if ((tmp = getenv(dis_env)) != NULL && *tmp) { - delflags = delflags_unseen; - } else { - /* DEFAULT since many fetchmail versions <= 6.3.X */ - delflags = delflags_seen; - } - } + /* DEFAULT since many fetchmail versions <= 6.3.X */ + delflags = delflags_seen; (void)ctl; /* expunges change the fetch numbers */