if (ctx->success_data->used > 0 && !request->fields.final_resp_ok) {
/* we'll need one more SASL round, since client doesn't support
the final SASL response */
- i_assert(!request->final_resp_sent);
- request->final_resp_sent = TRUE;
auth_request_handler_reply_continue(request,
ctx->success_data->data, ctx->success_data->used);
return;
if (final_data_size > 0 && !request->fields.final_resp_ok) {
/* Otherwise, we need to send the data as part of a normal
challenge and wait for a dummy client response. */
- i_assert(!request->final_resp_sent);
- request->final_resp_sent = TRUE;
auth_request_handler_reply_continue(request, final_data,
final_data_size);
return;
{
i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
- if (request->final_resp_sent) {
- if (!request->fields.successful) {
- auth_request_fail(request);
- return;
- }
- auth_request_success(request, "", 0);
- return;
- }
-
auth_request_refresh_last_access(request);
auth_sasl_request_continue(request, data, data_size);
}
struct sasl_server_mech_request *mreq = req->mech;
const struct sasl_server_mech *mech = mreq->mech;
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_NEW);
+ req->state = SASL_SERVER_REQUEST_STATE_SERVER;
+
if (sasl_server_request_fail_on_nuls(req, data, data_size))
return;
struct sasl_server_mech_request *mreq = req->mech;
const struct sasl_server_mech *mech = mreq->mech;
+ if (req->state == SASL_SERVER_REQUEST_STATE_FINISHED &&
+ req->finished_with_data) {
+ req->state = SASL_SERVER_REQUEST_STATE_SERVER;
+ if (!req->failed)
+ sasl_server_request_success(mreq, "", 0);
+ else
+ sasl_server_request_failure(mreq);
+ return;
+ }
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_CLIENT);
+ i_assert(!req->finished_with_data);
+ req->state = SASL_SERVER_REQUEST_STATE_SERVER;
+
if (sasl_server_request_fail_on_nuls(req, data, data_size))
return;
i_assert(req->rctx != NULL);
i_assert(funcs->request_set_authid != NULL);
- return funcs->request_set_authid(req->rctx, authid_type, authid);
+ if (!funcs->request_set_authid(req->rctx, authid_type, authid)) {
+ req->failed = TRUE;
+ return FALSE;
+ }
+ return TRUE;
}
bool sasl_server_request_set_authzid(struct sasl_server_mech_request *mreq,
i_assert(req->rctx != NULL);
i_assert(funcs->request_set_authzid != NULL);
- return funcs->request_set_authzid(req->rctx, authzid);
+ if (!funcs->request_set_authzid(req->rctx, authzid)) {
+ req->failed = TRUE;
+ return FALSE;
+ }
+ return TRUE;
}
void sasl_server_request_set_realm(struct sasl_server_mech_request *mreq,
i_assert(req->rctx != NULL);
+ i_assert(!req->failed);
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_NEW ||
+ req->state == SASL_SERVER_REQUEST_STATE_SERVER ||
+ req->state == SASL_SERVER_REQUEST_STATE_PASSDB);
+ req->state = SASL_SERVER_REQUEST_STATE_CLIENT;
+ req->sequence++;
+
const struct sasl_server_output output = {
.status = SASL_SERVER_OUTPUT_CONTINUE,
.data = data,
i_assert(req->rctx != NULL);
+ i_assert(!req->failed);
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_NEW ||
+ req->state == SASL_SERVER_REQUEST_STATE_SERVER ||
+ req->state == SASL_SERVER_REQUEST_STATE_PASSDB);
+ req->state = SASL_SERVER_REQUEST_STATE_FINISHED;
+ req->sequence++;
+ if (data_size > 0) {
+ i_assert(!req->finished_with_data);
+ req->finished_with_data = TRUE;
+ }
+
const struct sasl_server_output output = {
.status = SASL_SERVER_OUTPUT_SUCCESS,
.data = data,
i_assert(req->rctx != NULL);
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_NEW ||
+ req->state == SASL_SERVER_REQUEST_STATE_SERVER ||
+ req->state == SASL_SERVER_REQUEST_STATE_PASSDB);
+ req->state = SASL_SERVER_REQUEST_STATE_FINISHED;
+ req->sequence++;
+ req->failed = TRUE;
+ if (data_size > 0) {
+ i_assert(status != SASL_SERVER_OUTPUT_INTERNAL_FAILURE);
+ i_assert(!req->finished_with_data);
+ req->finished_with_data = TRUE;
+ }
+
const struct sasl_server_output output = {
.status = status,
.data = data,
{
struct sasl_server_request *req = rctx->request;
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_PASSDB);
+ req->state = SASL_SERVER_REQUEST_STATE_SERVER;
+ if (result->status == SASL_PASSDB_RESULT_INTERNAL_FAILURE)
+ req->failed = TRUE;
+
i_assert(req->passdb_type == SASL_SERVER_PASSDB_TYPE_VERIFY_PLAIN);
req->passdb_callback(req->mech, result);
}
i_assert(req->rctx != NULL);
+ i_assert(!req->failed);
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_NEW ||
+ req->state == SASL_SERVER_REQUEST_STATE_SERVER);
+ req->state = SASL_SERVER_REQUEST_STATE_PASSDB;
+
req->passdb_type = SASL_SERVER_PASSDB_TYPE_VERIFY_PLAIN;
req->passdb_callback = callback;
{
struct sasl_server_request *req = rctx->request;
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_PASSDB);
+ req->state = SASL_SERVER_REQUEST_STATE_SERVER;
+ if (result->status == SASL_PASSDB_RESULT_INTERNAL_FAILURE)
+ req->failed = TRUE;
+
i_assert(req->passdb_type ==
SASL_SERVER_PASSDB_TYPE_LOOKUP_CREDENTIALS);
req->passdb_callback(req->mech, result);
i_assert(req->rctx != NULL);
+ i_assert(!req->failed);
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_NEW ||
+ req->state == SASL_SERVER_REQUEST_STATE_SERVER);
+ req->state = SASL_SERVER_REQUEST_STATE_PASSDB;
+
req->passdb_type = SASL_SERVER_PASSDB_TYPE_LOOKUP_CREDENTIALS;
req->passdb_callback = callback;
{
struct sasl_server_request *req = rctx->request;
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_PASSDB);
+ req->state = SASL_SERVER_REQUEST_STATE_SERVER;
+ if (result->status == SASL_PASSDB_RESULT_INTERNAL_FAILURE)
+ req->failed = TRUE;
+
i_assert(req->passdb_type == SASL_SERVER_PASSDB_TYPE_SET_CREDENTIALS);
req->passdb_callback(req->mech, result);
}
i_assert(req->rctx != NULL);
+ i_assert(!req->failed);
+ i_assert(req->state == SASL_SERVER_REQUEST_STATE_NEW ||
+ req->state == SASL_SERVER_REQUEST_STATE_SERVER);
+ req->state = SASL_SERVER_REQUEST_STATE_PASSDB;
+
req->passdb_type = SASL_SERVER_PASSDB_TYPE_SET_CREDENTIALS;
req->passdb_callback = callback;