* Request
*/
-bool
+static bool
auth_sasl_request_set_authid(struct sasl_server_req_ctx *rctx,
enum sasl_server_authid_type authid_type,
const char *authid)
i_unreached();
}
-bool
+static bool
auth_sasl_request_set_authzid(struct sasl_server_req_ctx *rctx,
const char *authzid)
{
return TRUE;
}
-void
+static void
auth_sasl_request_set_realm(struct sasl_server_req_ctx *rctx,
const char *realm)
{
auth_request_set_realm(request, realm);
}
-bool
+static bool
auth_sasl_request_get_extra_field(struct sasl_server_req_ctx *rctx,
const char *name, const char **field_r)
{
return TRUE;
}
-void
+static void
auth_sasl_request_start_channel_binding(struct sasl_server_req_ctx *rctx,
const char *type)
{
auth_request_start_channel_binding(request, type);
}
-int
+static int
auth_sasl_request_accept_channel_binding(struct sasl_server_req_ctx *rctx,
buffer_t **data_r)
{
return auth_request_accept_channel_binding(request, data_r);
}
-void
+static void
auth_sasl_request_output(struct sasl_server_req_ctx *rctx,
const struct sasl_server_output *output)
{
request->sasl.passdb_callback(&request->sasl.req, &result);
}
-void
+static void
auth_sasl_request_verify_plain(struct sasl_server_req_ctx *rctx,
const char *password,
sasl_server_passdb_callback_t *callback)
request->sasl.passdb_callback(&request->sasl.req, &result);
}
-void
+static void
auth_sasl_request_lookup_credentials(struct sasl_server_req_ctx *rctx,
const char *scheme,
sasl_server_passdb_callback_t *callback)
request->sasl.passdb_callback(&request->sasl.req, &result);
}
-void
+static void
auth_sasl_request_set_credentials(struct sasl_server_req_ctx *rctx,
const char *scheme, const char *data,
sasl_server_passdb_callback_t *callback)
set_credentials_callback);
}
+static const struct sasl_server_request_funcs auth_sasl_request_funcs = {
+ .request_set_authid = auth_sasl_request_set_authid,
+ .request_set_authzid = auth_sasl_request_set_authzid,
+ .request_set_realm = auth_sasl_request_set_realm,
+
+ .request_get_extra_field = auth_sasl_request_get_extra_field,
+
+ .request_start_channel_binding =
+ auth_sasl_request_start_channel_binding,
+ .request_accept_channel_binding =
+ auth_sasl_request_accept_channel_binding,
+
+ .request_output = auth_sasl_request_output,
+
+ .request_verify_plain = auth_sasl_request_verify_plain,
+ .request_lookup_credentials = auth_sasl_request_lookup_credentials,
+ .request_set_credentials = auth_sasl_request_set_credentials,
+};
+
static const char *
auth_sasl_translate_protocol_name(struct auth_request *request)
{
void auth_sasl_preinit(void)
{
auth_sasl_oauth2_initialize();
- auth_sasl_server = sasl_server_init(auth_event);
+ auth_sasl_server = sasl_server_init(auth_event,
+ &auth_sasl_request_funcs);
}
void auth_sasl_init(void)
* Request
*/
-bool
-auth_sasl_request_set_authid(struct sasl_server_req_ctx *rctx,
- enum sasl_server_authid_type authid_type,
- const char *authid);
-
-bool
-auth_sasl_request_set_authzid(struct sasl_server_req_ctx *rctx,
- const char *authzid);
-
-void
-auth_sasl_request_set_realm(struct sasl_server_req_ctx *rctx,
- const char *realm);
-
-bool
-auth_sasl_request_get_extra_field(struct sasl_server_req_ctx *rctx,
- const char *name, const char **field_r);
-
-void
-auth_sasl_request_start_channel_binding(struct sasl_server_req_ctx *rctx,
- const char *type);
-int
-auth_sasl_request_accept_channel_binding(struct sasl_server_req_ctx *rctx,
- buffer_t **data_r);
-
-void
-auth_sasl_request_output(struct sasl_server_req_ctx *rctx,
- const struct sasl_server_output *output);
-
-void
-auth_sasl_request_verify_plain(struct sasl_server_req_ctx *rctx,
- const char *password,
- sasl_server_passdb_callback_t *callback);
-
-void
-auth_sasl_request_lookup_credentials(struct sasl_server_req_ctx *rctx,
- const char *scheme,
- sasl_server_passdb_callback_t *callback);
-
-void
-auth_sasl_request_set_credentials(struct sasl_server_req_ctx *rctx,
- const char *scheme, const char *data,
- sasl_server_passdb_callback_t *callback);
-
void auth_sasl_request_init(struct auth_request *request,
const struct sasl_server_mech_def *mech);
void auth_sasl_request_deinit(struct auth_request *request);
struct sasl_server {
pool_t pool;
struct event *event;
+ const struct sasl_server_request_funcs *funcs;
unsigned int requests;
};
const char *authid)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
- return auth_sasl_request_set_authid(req->rctx, authid_type, authid);
+ i_assert(funcs->request_set_authid != NULL);
+ return funcs->request_set_authid(req->rctx, authid_type, authid);
}
bool sasl_server_request_set_authzid(struct sasl_server_mech_request *mreq,
const char *authzid)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
- return auth_sasl_request_set_authzid(req->rctx, authzid);
+ i_assert(funcs->request_set_authzid != NULL);
+ return funcs->request_set_authzid(req->rctx, authzid);
}
void sasl_server_request_set_realm(struct sasl_server_mech_request *mreq,
const char *realm)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
- auth_sasl_request_set_realm(req->rctx, realm);
+ i_assert(funcs->request_set_realm != NULL);
+ funcs->request_set_realm(req->rctx, realm);
}
bool sasl_server_request_get_extra_field(struct sasl_server_mech_request *mreq,
const char **field_r)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
- return auth_sasl_request_get_extra_field(req->rctx, name, field_r);
+ if (funcs->request_get_extra_field == NULL) {
+ *field_r = NULL;
+ return FALSE;
+ }
+ return funcs->request_get_extra_field(req->rctx, name, field_r);
}
void sasl_server_request_start_channel_binding(
struct sasl_server_mech_request *mreq, const char *type)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
- auth_sasl_request_start_channel_binding(req->rctx, type);
+ i_assert(funcs->request_start_channel_binding != NULL);
+ funcs->request_start_channel_binding(req->rctx, type);
}
int sasl_server_request_accept_channel_binding(
struct sasl_server_mech_request *mreq, buffer_t **data_r)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
- return auth_sasl_request_accept_channel_binding(req->rctx, data_r);
+ i_assert(funcs->request_accept_channel_binding != NULL);
+ return funcs->request_accept_channel_binding(req->rctx, data_r);
}
void sasl_server_request_output(struct sasl_server_mech_request *mreq,
const void *data, size_t data_size)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
const struct sasl_server_output output = {
.status = SASL_SERVER_OUTPUT_CONTINUE,
.data = data,
.data_size = data_size,
};
- auth_sasl_request_output(req->rctx, &output);
+ i_assert(funcs->request_output != NULL);
+ funcs->request_output(req->rctx, &output);
}
void sasl_server_request_success(struct sasl_server_mech_request *mreq,
const void *data, size_t data_size)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
const struct sasl_server_output output = {
.status = SASL_SERVER_OUTPUT_SUCCESS,
.data = data,
.data_size = data_size,
};
- auth_sasl_request_output(req->rctx, &output);
+ i_assert(funcs->request_output != NULL);
+ funcs->request_output(req->rctx, &output);
}
static void
const void *data, size_t data_size)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
const struct sasl_server_output output = {
.status = status,
.data = data,
.data_size = data_size,
};
- auth_sasl_request_output(req->rctx, &output);
+ i_assert(funcs->request_output != NULL);
+ funcs->request_output(req->rctx, &output);
}
void sasl_server_request_failure_with_reply(
sasl_server_mech_passdb_callback_t *callback)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
req->passdb_type = SASL_SERVER_PASSDB_TYPE_VERIFY_PLAIN;
req->passdb_callback = callback;
- auth_sasl_request_verify_plain(req->rctx, password,
- verify_plain_callback);
+ i_assert(funcs->request_verify_plain != NULL);
+ funcs->request_verify_plain(req->rctx, password,
+ verify_plain_callback);
}
static void
sasl_server_mech_passdb_callback_t *callback)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
req->passdb_type = SASL_SERVER_PASSDB_TYPE_LOOKUP_CREDENTIALS;
req->passdb_callback = callback;
- auth_sasl_request_lookup_credentials(req->rctx, scheme,
- lookup_credentials_callback);
+ i_assert(funcs->request_lookup_credentials != NULL);
+ funcs->request_lookup_credentials(req->rctx, scheme,
+ lookup_credentials_callback);
}
static void
sasl_server_mech_passdb_callback_t *callback)
{
struct sasl_server_request *req = mreq->req;
+ struct sasl_server *server = req->server;
+ const struct sasl_server_request_funcs *funcs = server->funcs;
req->passdb_type = SASL_SERVER_PASSDB_TYPE_SET_CREDENTIALS;
req->passdb_callback = callback;
- auth_sasl_request_set_credentials(req->rctx, scheme, data,
- set_credentials_callback);
+ i_assert(funcs->request_set_credentials != NULL);
+ funcs->request_set_credentials(req->rctx, scheme, data,
+ set_credentials_callback);
}
struct sasl_server_mech_request *
* Server
*/
-struct sasl_server *sasl_server_init(struct event *event_parent)
+struct sasl_server *
+sasl_server_init(struct event *event_parent,
+ const struct sasl_server_request_funcs *funcs)
{
struct sasl_server *server;
pool_t pool;
server = p_new(pool, struct sasl_server, 1);
server->pool = pool;
+ server->funcs = funcs;
+
server->event = event_create(event_parent);
event_add_category(server->event, &event_category_sasl_server);
event_set_append_log_prefix(server->event, "sasl: ");
struct sasl_server_request *request;
};
+struct sasl_server_request_funcs {
+ bool (*request_set_authid)(struct sasl_server_req_ctx *rctx,
+ enum sasl_server_authid_type authid_type,
+ const char *authid);
+ bool (*request_set_authzid)(struct sasl_server_req_ctx *rctx,
+ const char *authzid);
+ void (*request_set_realm)(struct sasl_server_req_ctx *rctx,
+ const char *realm);
+
+ bool (*request_get_extra_field)(struct sasl_server_req_ctx *rctx,
+ const char *name, const char **field_r);
+
+ void (*request_start_channel_binding)(struct sasl_server_req_ctx *rctx,
+ const char *type);
+ int (*request_accept_channel_binding)(struct sasl_server_req_ctx *rctx,
+ buffer_t **data_r);
+
+ void (*request_output)(struct sasl_server_req_ctx *rctx,
+ const struct sasl_server_output *output);
+
+ void (*request_verify_plain)(
+ struct sasl_server_req_ctx *rctx, const char *password,
+ sasl_server_passdb_callback_t *callback);
+ void (*request_lookup_credentials)(
+ struct sasl_server_req_ctx *rctx, const char *scheme,
+ sasl_server_passdb_callback_t *callback);
+ void (*request_set_credentials)(
+ struct sasl_server_req_ctx *rctx,
+ const char *scheme, const char *data,
+ sasl_server_passdb_callback_t *callback);
+};
+
void sasl_server_request_create(struct sasl_server_req_ctx *rctx,
struct sasl_server *server,
const struct sasl_server_mech_def *mech,
* Server
*/
-struct sasl_server *sasl_server_init(struct event *event_parent);
+struct sasl_server *
+sasl_server_init(struct event *event_parent,
+ const struct sasl_server_request_funcs *funcs);
void sasl_server_deinit(struct sasl_server **_server);
#endif