Correct various bugs in the recovery mechanism
The namespace of the selected mailbox was not properly applied after recovery, CRAM-MD5 authentication during the recovery would fail, and searching after recovery could fail in some cases.
This commit is contained in:
parent
568e414754
commit
4c310f9df5
|
@ -209,8 +209,8 @@ request_login(session **ssnptr, const char *server, const char *port, const
|
||||||
CHECK(t = send_request(ssn, "AUTHENTICATE CRAM-MD5"));
|
CHECK(t = send_request(ssn, "AUTHENTICATE CRAM-MD5"));
|
||||||
CHECK(r = response_authenticate(ssn, t, &in));
|
CHECK(r = response_authenticate(ssn, t, &in));
|
||||||
if (r == STATUS_CONTINUE) {
|
if (r == STATUS_CONTINUE) {
|
||||||
if ((out = auth_cram_md5(user, pass, in)) ==
|
if ((out = auth_cram_md5(ssn->username,
|
||||||
NULL)
|
ssn->password, in)) == NULL)
|
||||||
goto abort;
|
goto abort;
|
||||||
CHECK(send_continuation(ssn, (char *)(out),
|
CHECK(send_continuation(ssn, (char *)(out),
|
||||||
strlen((char *)(out))));
|
strlen((char *)(out))));
|
||||||
|
@ -239,14 +239,16 @@ request_login(session **ssnptr, const char *server, const char *port, const
|
||||||
CHECK(t = send_request(ssn, "CAPABILITY"));
|
CHECK(t = send_request(ssn, "CAPABILITY"));
|
||||||
CHECK(response_capability(ssn, t));
|
CHECK(response_capability(ssn, t));
|
||||||
|
|
||||||
if (!ssn->ns.delim && ssn->capabilities & CAPABILITY_NAMESPACE &&
|
if (ssn->capabilities & CAPABILITY_NAMESPACE &&
|
||||||
get_option_boolean("namespace")) {
|
get_option_boolean("namespace")) {
|
||||||
CHECK(t = send_request(ssn, "NAMESPACE"));
|
CHECK(t = send_request(ssn, "NAMESPACE"));
|
||||||
CHECK(response_namespace(ssn, t));
|
CHECK(response_namespace(ssn, t));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ssn->selected) {
|
if (ssn->selected) {
|
||||||
CHECK(t = send_request(ssn, "SELECT \"%s\"", ssn->selected));
|
CHECK(t = send_request(ssn, "SELECT \"%s\"",
|
||||||
|
apply_namespace(ssn->selected, ssn->ns.prefix,
|
||||||
|
ssn->ns.delim)));
|
||||||
CHECK(response_select(ssn, t));
|
CHECK(response_select(ssn, t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,7 +320,7 @@ request_select(session *ssn, const char *mbox)
|
||||||
TRY(r = response_select(ssn, t));
|
TRY(r = response_select(ssn, t));
|
||||||
|
|
||||||
if (r == STATUS_OK)
|
if (r == STATUS_OK)
|
||||||
ssn->selected = mbox;
|
ssn->selected = xstrdup(mbox);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -335,8 +337,10 @@ request_close(session *ssn)
|
||||||
TRY(t = send_request(ssn, "CLOSE"));
|
TRY(t = send_request(ssn, "CLOSE"));
|
||||||
TRY(r = response_generic(ssn, t));
|
TRY(r = response_generic(ssn, t));
|
||||||
|
|
||||||
if (r == STATUS_OK && ssn->selected)
|
if (r == STATUS_OK && ssn->selected) {
|
||||||
|
xfree(ssn->selected);
|
||||||
ssn->selected = NULL;
|
ssn->selected = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -381,6 +381,8 @@ response_namespace(session *ssn, int tag)
|
||||||
if (r == -1 || r == STATUS_BYE)
|
if (r == -1 || r == STATUS_BYE)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
if (ssn->ns.prefix != NULL)
|
||||||
|
xfree(ssn->ns.prefix);
|
||||||
ssn->ns.prefix = NULL;
|
ssn->ns.prefix = NULL;
|
||||||
ssn->ns.delim = '\0';
|
ssn->ns.delim = '\0';
|
||||||
|
|
||||||
|
@ -576,13 +578,13 @@ response_search(session *ssn, int tag, char **mesgs)
|
||||||
re = &responses[RESPONSE_SEARCH];
|
re = &responses[RESPONSE_SEARCH];
|
||||||
|
|
||||||
b = ibuf.data;
|
b = ibuf.data;
|
||||||
m = NULL;
|
|
||||||
while (!regexec(re->preg, b, re->nmatch, re->pmatch, 0)) {
|
while (!regexec(re->preg, b, re->nmatch, re->pmatch, 0)) {
|
||||||
if (!*mesgs) {
|
if (!*mesgs) {
|
||||||
m = *mesgs = (char *)xmalloc((ibuf.len + 1) *
|
*mesgs = (char *)xmalloc((ibuf.len + 1) *
|
||||||
sizeof(char));
|
sizeof(char));
|
||||||
*m = '\0';
|
|
||||||
}
|
}
|
||||||
|
m = *mesgs;
|
||||||
|
*m = '\0';
|
||||||
|
|
||||||
min = (unsigned int)(re->pmatch[1].rm_eo -
|
min = (unsigned int)(re->pmatch[1].rm_eo -
|
||||||
re->pmatch[1].rm_so) < ibuf.len ?
|
re->pmatch[1].rm_so) < ibuf.len ?
|
||||||
|
|
|
@ -64,5 +64,7 @@ session_destroy(session *ssn)
|
||||||
|
|
||||||
if (ssn->ns.prefix)
|
if (ssn->ns.prefix)
|
||||||
xfree(ssn->ns.prefix);
|
xfree(ssn->ns.prefix);
|
||||||
|
if (ssn->selected)
|
||||||
|
xfree(ssn->selected);
|
||||||
xfree(ssn);
|
xfree(ssn);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ typedef struct session {
|
||||||
char *prefix; /* Namespace prefix. */
|
char *prefix; /* Namespace prefix. */
|
||||||
char delim; /* Namespace delimiter. */
|
char delim; /* Namespace delimiter. */
|
||||||
} ns;
|
} ns;
|
||||||
const char *selected; /* Selected mailbox. */
|
char *selected; /* Selected mailbox. */
|
||||||
} session;
|
} session;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue