#endif /* OPIE_ENABLE */
#ifdef SSL_ENABLE
flag connection_may_have_tls_errors = FALSE;
- flag got_tls = FALSE;
#endif /* SSL_ENABLE */
done_capa = FALSE;
*
* 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;
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:
* Now that we're confident in our TLS connection we can
* guarantee a secure capability re-probe.
*/
- got_tls = TRUE;
+ set_timeout(0);
done_capa = FALSE;
ok = capa_probe(sock);
if (ok != PS_SUCCESS) {
{
report(stdout, GT_("%s: upgrade to TLS succeeded.\n"), commonname);
}
- }
- }
-
- if (!got_tls) {
- if (must_tls(ctl)) {
+ } 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 {
* 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)
{
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;
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)
{
/* UIDL worked - parse reply */
unsigned long unum;
+ struct idlist *newl = NULL;
*newp = 0;
while (gen_recv(sock, buf, sizeof(buf)) == PS_SUCCESS)
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)))