}
void auth_sasl_request_init(struct auth_request *request,
- const struct sasl_server_mech_def *mech)
+ const struct sasl_server_mech_def *mech_def)
{
struct auth *auth = auth_request_get_auth(request);
+ const struct sasl_server_mech *mech;
- sasl_server_request_create(&request->sasl.req, auth->sasl_inst, mech,
+ mech = sasl_server_mech_find(auth->sasl_inst, mech_def->name);
+ if (mech == NULL)
+ mech = sasl_server_mech_register(auth->sasl_inst, mech_def);
+ i_assert(mech != NULL);
+ sasl_server_request_create(&request->sasl.req, mech,
auth_sasl_translate_protocol_name(request),
request->mech_event);
}
*/
void auth_sasl_request_init(struct auth_request *request,
- const struct sasl_server_mech_def *mech);
+ const struct sasl_server_mech_def *mech_def);
void auth_sasl_request_deinit(struct auth_request *request);
void auth_sasl_request_initial(struct auth_request *request);
i_assert(failure->status != NULL);
json_ostream_ndescend_object(joutput, NULL);
- if (request->mech == &mech_xoauth2) {
+ if (request->mech->def == &mech_xoauth2) {
if (strcmp(failure->status, "invalid_token") == 0)
json_ostream_nwrite_string(joutput, "status", "401");
else if (strcmp(failure->status, "insufficient_scope") == 0)
json_ostream_nwrite_string(joutput, "status", "400");
json_ostream_nwrite_string(joutput, "schemes", "bearer");
} else {
- i_assert(request->mech == &mech_oauthbearer);
+ i_assert(request->mech->def == &mech_oauthbearer);
json_ostream_nwrite_string(joutput, "status", failure->status);
}
if (failure->scope == NULL)
struct sasl_server_mech_request *request =
sasl_server_request_get_mech_request(rctx);
- i_assert(request->mech == &mech_oauthbearer ||
- request->mech == &mech_xoauth2);
+ i_assert(request->mech->def == &mech_oauthbearer ||
+ request->mech->def == &mech_xoauth2);
struct oauth2_auth_request *oauth2_req =
container_of(request, struct oauth2_auth_request, request);
struct sasl_server_mech_request *request =
sasl_server_request_get_mech_request(rctx);
- i_assert(request->mech == &mech_oauthbearer ||
- request->mech == &mech_xoauth2);
+ i_assert(request->mech->def == &mech_oauthbearer ||
+ request->mech->def == &mech_xoauth2);
struct oauth2_auth_request *oauth2_req =
container_of(request, struct oauth2_auth_request, request);
struct sasl_server_mech_request *mreq,
const unsigned char *data, size_t data_size)
{
- const struct sasl_server_mech_def *mech = mreq->mech;
+ const struct sasl_server_mech *mech = mreq->mech;
if (data == NULL) {
sasl_server_request_output(mreq, uchar_empty_ptr, 0);
} else {
/* initial reply given, even if it was 0 bytes */
- i_assert(mech->funcs->auth_continue != NULL);
- mech->funcs->auth_continue(mreq, data, data_size);
+ i_assert(mech->def->funcs->auth_continue != NULL);
+ mech->def->funcs->auth_continue(mreq, data, data_size);
}
}
struct auth_request;
struct sasl_server_mech_funcs;
+struct sasl_server_mech_def;
struct sasl_server_mech_request;
typedef void
struct sasl_server_mech_request {
pool_t pool;
- const struct sasl_server_mech_def *mech;
+ const struct sasl_server_mech *mech;
struct sasl_server_request *req;
struct event *mech_event;
*/
void sasl_server_request_create(struct sasl_server_req_ctx *rctx,
- struct sasl_server_instance *sinst,
- const struct sasl_server_mech_def *mech,
+ const struct sasl_server_mech *mech,
const char *protocol,
struct event *event_parent)
{
+ struct sasl_server_instance *sinst = mech->sinst;
struct sasl_server *server = sinst->server;
struct auth_request *request =
container_of(rctx, struct auth_request, sasl.req);
struct sasl_server_request *req;
pool_t pool;
- i_assert(mech->funcs != NULL);
+ i_assert(mech->def != NULL);
+ i_assert(mech->def->funcs != NULL);
i_zero(rctx);
struct sasl_server_mech_request *mreq;
- if (mech->funcs->auth_new != NULL)
- mreq = mech->funcs->auth_new(pool);
+ if (mech->def->funcs->auth_new != NULL)
+ mreq = mech->def->funcs->auth_new(pool);
else
mreq = p_new(pool, struct sasl_server_mech_request, 1);
mreq->pool = pool;
req->mech = mreq;
rctx->mech = mech;
- rctx->mech_name = mech->name;
+ rctx->mech_name = mech->def->name;
rctx->request = req;
}
i_assert(server->requests > 0);
server->requests--;
- if (mreq->mech->funcs->auth_free != NULL)
- mreq->mech->funcs->auth_free(mreq);
+ if (mreq->mech->def->funcs->auth_free != NULL)
+ mreq->mech->def->funcs->auth_free(mreq);
}
static bool
sasl_server_request_fail_on_nuls(struct sasl_server_request *req,
const unsigned char *data, size_t data_size)
{
- const struct sasl_server_mech_def *mech = req->mech->mech;
+ const struct sasl_server_mech *mech = req->mech->mech;
- if ((mech->flags & SASL_MECH_SEC_ALLOW_NULS) != 0)
+ if ((mech->def->flags & SASL_MECH_SEC_ALLOW_NULS) != 0)
return FALSE;
if (memchr(data, '\0', data_size) != NULL) {
e_debug(req->mech->mech_event, "Unexpected NUL in auth data");
{
struct sasl_server_request *req = rctx->request;
struct sasl_server_mech_request *mreq = req->mech;
- const struct sasl_server_mech_def *mech = mreq->mech;
+ const struct sasl_server_mech *mech = mreq->mech;
if (sasl_server_request_fail_on_nuls(req, data, data_size))
return;
- i_assert(mech->funcs->auth_initial != NULL);
- mech->funcs->auth_initial(mreq, data, data_size);
+ i_assert(mech->def->funcs->auth_initial != NULL);
+ mech->def->funcs->auth_initial(mreq, data, data_size);
}
void sasl_server_request_input(struct sasl_server_req_ctx *rctx,
{
struct sasl_server_request *req = rctx->request;
struct sasl_server_mech_request *mreq = req->mech;
- const struct sasl_server_mech_def *mech = mreq->mech;
+ const struct sasl_server_mech *mech = mreq->mech;
if (sasl_server_request_fail_on_nuls(req, data, data_size))
return;
- i_assert(mech->funcs->auth_continue != NULL);
- mech->funcs->auth_continue(mreq, data, data_size);
+ i_assert(mech->def->funcs->auth_continue != NULL);
+ mech->def->funcs->auth_continue(mreq, data, data_size);
}
void sasl_server_request_test_set_authid(struct sasl_server_req_ctx *rctx,
};
struct sasl_server_req_ctx {
- const struct sasl_server_mech_def *mech;
+ const struct sasl_server_mech *mech;
const char *mech_name;
struct sasl_server_request *request;
};
void sasl_server_request_create(struct sasl_server_req_ctx *rctx,
- struct sasl_server_instance *sinst,
- const struct sasl_server_mech_def *mech,
+ const struct sasl_server_mech *mech,
const char *protocol,
struct event *event_parent);
void sasl_server_request_destroy(struct sasl_server_req_ctx *rctx);