X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=pop3.c;h=5549dc9ac5a56ff41e3efbbb7bbb6a61e581cd99;hb=1506acc082f2f6f39c0028484cbb9378def68967;hp=21251e59a2e7700475e34b8fae3303d461fd5d22;hpb=d5dcdd9b11de6a3e97b7b686b09ddb5fb33085bf;p=~andy%2Ffetchmail diff --git a/pop3.c b/pop3.c index 21251e59..5549dc9a 100644 --- a/pop3.c +++ b/pop3.c @@ -322,9 +322,9 @@ static int pop3_getauth(int sock, struct query *ctl, char *greeting) * * Matthias Andree */ - if (peek_capable && strstr(greeting, "Maillennium POP3/PROXY server")) { + if (peek_capable && strstr(greeting, "Maillennium POP3")) { if ((ctl->server.workarounds & WKA_TOP) == 0) { - report(stdout, GT_("Warning: \"Maillennium POP3/PROXY server\" found, using RETR command instead of TOP.\n")); + report(stdout, GT_("Warning: \"Maillennium POP3\" found, using RETR command instead of TOP.\n")); ctl->server.workarounds |= WKA_TOP; } peek_capable = 0; @@ -440,16 +440,17 @@ static int pop3_getauth(int sock, struct query *ctl, char *greeting) if (ctl->sslcommonname) commonname = ctl->sslcommonname; - if (has_stls) + if (has_stls + || must_tls(ctl)) /* if TLS is mandatory, ignore capabilities */ { /* Use "tls1" rather than ctl->sslproto because tls1 is the only * protocol that will work with STARTTLS. Don't need to worry * whether TLS is mandatory or opportunistic unless SSLOpen() fails * (see below). */ if (gen_transact(sock, "STLS") == 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: @@ -464,6 +465,7 @@ static int pop3_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. */ + set_timeout(0); done_capa = FALSE; ok = capa_probe(sock); if (ok != PS_SUCCESS) { @@ -476,6 +478,7 @@ static int pop3_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 { @@ -484,16 +487,13 @@ static int pop3_getauth(int sock, struct query *ctl, char *greeting) * allowed til post-authentication), so leave it in an unknown * state, mark it as such, and check more carefully if things * go wrong when we try to authenticate. */ + set_timeout(0); connection_may_have_tls_errors = TRUE; if (outlevel >= O_VERBOSE) { report(stdout, GT_("%s: opportunistic upgrade to TLS failed, trying to continue.\n"), commonname); } } - } else if (must_tls(ctl)) { - /* Config required TLS but STLS is not advertised. */ - report(stderr, GT_("%s: cannot upgrade to TLS: no STLS in CAPA response.\n"), commonname); - return PS_SOCKET; } } /* maybe_tls() */ #endif /* SSL_ENABLE */ @@ -815,6 +815,7 @@ static int pop3_fastuidl( int sock, struct query *ctl, unsigned int count, int int ok; unsigned int first_nr, last_nr, try_nr; char id [IDLEN+1]; + struct idlist *savep = NULL; /** pointer to cache save_str result, speeds up saves */ first_nr = 0; last_nr = count + 1; @@ -856,8 +857,8 @@ static int pop3_fastuidl( int sock, struct query *ctl, unsigned int count, int last_nr = try_nr; /* save it */ - newl = save_str(&ctl->oldsaved, id, UID_UNSEEN); - newl->val.status.num = try_nr; + savep = save_str(savep ? &savep : &ctl->oldsaved, id, UID_UNSEEN); + savep->val.status.num = try_nr; } } if (outlevel >= O_DEBUG && last_nr <= count) @@ -1057,6 +1058,7 @@ static int pop3_getrange(int sock, { /* UIDL worked - parse reply */ unsigned long unum; + struct idlist *newl = NULL; *newp = 0; while (gen_recv(sock, buf, sizeof(buf)) == PS_SUCCESS) @@ -1066,9 +1068,9 @@ static int pop3_getrange(int sock, if (parseuid(buf, &unum, id, sizeof(id)) == PS_SUCCESS) { - struct idlist *old, *newl; + struct idlist *old; - newl = save_str(&ctl->newsaved, id, UID_UNSEEN); + newl = save_str(newl ? &newl : &ctl->newsaved, id, UID_UNSEEN); newl->val.status.num = unum; if ((old = str_in_list(&ctl->oldsaved, id, FALSE)))