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.
*/
+ set_timeout(0);
done_capa = FALSE;
ok = capa_probe(sock);
if (ok != PS_SUCCESS) {
} 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)
{
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 */
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)))