break;
case SASL_MECH_PASSDB_NEED_VERIFY_RESPONSE:
case SASL_MECH_PASSDB_NEED_LOOKUP_CREDENTIALS:
- case SASL_MECH_PASSDB_NEED_SET_CREDENTIALS:
if (!auth_passdb_list_have_lookup_credentials(auth))
return FALSE;
break;
callback(&fctx->ssrctx, &result);
}
-static void
-fuzz_server_request_set_credentials(
- struct sasl_server_req_ctx *rctx,
- const char *scheme ATTR_UNUSED, const char *data ATTR_UNUSED,
- sasl_server_passdb_callback_t *callback)
-{
- struct fuzz_sasl_context *fctx =
- container_of(rctx, struct fuzz_sasl_context, ssrctx);
- struct sasl_passdb_result result;
-
- /* Credentials are currently not actually stored */
-
- i_zero(&result);
- result.status = SASL_PASSDB_RESULT_OK;
- callback(&fctx->ssrctx, &result);
-}
-
static void
fuzz_sasl_amend_data(struct fuzz_sasl_context *fctx,
const unsigned char **_data, size_t *_size)
.request_verify_plain = fuzz_server_request_verify_plain,
.request_lookup_credentials = fuzz_server_request_lookup_credentials,
- .request_set_credentials = fuzz_server_request_set_credentials,
.request_output = fuzz_server_request_output,
};
enum sasl_server_passdb_type {
SASL_SERVER_PASSDB_TYPE_VERIFY_PLAIN,
SASL_SERVER_PASSDB_TYPE_LOOKUP_CREDENTIALS,
- SASL_SERVER_PASSDB_TYPE_SET_CREDENTIALS,
};
struct sasl_server_request {
void sasl_server_request_lookup_credentials(
struct sasl_server_mech_request *mreq, const char *scheme,
sasl_server_mech_passdb_callback_t *callback);
-void sasl_server_request_set_credentials(
- struct sasl_server_mech_request *mreq,
- const char *scheme, const char *data,
- sasl_server_mech_passdb_callback_t *callback);
/* Obtains the mechanism request struct (protected) from the request context
struct (public). This function meant for providing the means to have
lookup_credentials_callback);
}
-static void
-set_credentials_callback(struct sasl_server_req_ctx *rctx,
- const struct sasl_passdb_result *result)
-{
- 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;
-
- e_debug(req->event, "Finished updating passdb credentials (status=%s)",
- sasl_passdb_result_to_string(result->status));
-
- i_assert(req->passdb_type == SASL_SERVER_PASSDB_TYPE_SET_CREDENTIALS);
- req->passdb_callback(req->mech, result);
-}
-
-void sasl_server_request_set_credentials(
- struct sasl_server_mech_request *mreq,
- const char *scheme, const char *data,
- sasl_server_mech_passdb_callback_t *callback)
-{
- struct sasl_server_request *req = mreq->req;
- struct sasl_server *server = req->sinst->server;
- const struct sasl_server_request_funcs *funcs = server->funcs;
-
- 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;
-
- e_debug(req->event, "Updating passdb credentials (scheme=%s)",
- scheme);
-
- req->passdb_type = SASL_SERVER_PASSDB_TYPE_SET_CREDENTIALS;
- req->passdb_callback = callback;
-
- i_assert(funcs->request_set_credentials != NULL);
- funcs->request_set_credentials(req->rctx, scheme, data,
- set_credentials_callback);
-}
-
struct sasl_server_mech_request *
sasl_server_request_get_mech_request(struct sasl_server_req_ctx *rctx)
{
SASL_MECH_PASSDB_NEED_VERIFY_RESPONSE,
/* Mechanism needs to look up credentials with appropriate scheme */
SASL_MECH_PASSDB_NEED_LOOKUP_CREDENTIALS,
- /* Mechanism needs to look up credentials and also modify them */
- SASL_MECH_PASSDB_NEED_SET_CREDENTIALS,
};
enum sasl_server_output_status {
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 (*request_free)(struct sasl_server_req_ctx *rctx);
};
bool failure:1;
};
-struct test_sasl_passdb {
- pool_t pool;
-
- const char *credentials_stored;
- const char *credentials_scheme;
-};
-
struct test_sasl_context {
pool_t pool;
- struct test_sasl_passdb *passdb;
-
struct sasl_server_req_ctx ssrctx;
const struct test_sasl *test;
struct test_sasl_context *tctx =
container_of(rctx, struct test_sasl_context, ssrctx);
const struct test_sasl *test = tctx->test;
- struct test_sasl_passdb *passdb = tctx->passdb;
struct sasl_passdb_result result;
i_zero(&result);
return;
}
- if (passdb->credentials_stored != NULL) {
- i_assert(strcasecmp(scheme, passdb->credentials_scheme) == 0);
- result.status = SASL_PASSDB_RESULT_OK;
- result.credentials.data =
- (const unsigned char *)passdb->credentials_stored;
- result.credentials.size = strlen(passdb->credentials_stored);
- callback(&tctx->ssrctx, &result);
- return;
- }
-
const struct password_generate_params params = {
.user = (test->server.realm == NULL ? test->server.authid :
t_strconcat(test->server.authid, "@",
callback(&tctx->ssrctx, &result);
}
-static void
-test_server_request_set_credentials(
- struct sasl_server_req_ctx *rctx, const char *scheme, const char *data,
- sasl_server_passdb_callback_t *callback)
-{
- struct test_sasl_context *tctx =
- container_of(rctx, struct test_sasl_context, ssrctx);
- struct test_sasl_passdb *passdb = tctx->passdb;
- struct sasl_passdb_result result;
-
- passdb->credentials_stored = p_strdup(passdb->pool, data);
- passdb->credentials_scheme = p_strdup(passdb->pool, scheme);
-
- result.status = SASL_PASSDB_RESULT_OK;
- callback(&tctx->ssrctx, &result);
-}
-
static void
test_server_request_output(struct sasl_server_req_ctx *rctx,
const struct sasl_server_output *output)
.request_verify_plain = test_server_request_verify_plain,
.request_lookup_credentials = test_server_request_lookup_credentials,
- .request_set_credentials = test_server_request_set_credentials,
.request_output = test_server_request_output,
};
static void
test_sasl_run_once(const struct test_sasl *test,
- struct test_sasl_passdb *passdb,
const struct sasl_server_mech *server_mech,
bool auth_initial)
{
i_zero(&tctx);
tctx.pool = pool_alloconly_create(MEMPOOL_GROWING"test_sasl", 2048);
- tctx.passdb = passdb;
tctx.test = test;
tctx.auth_initial = auth_initial;
}
#endif
- struct test_sasl_passdb passdb;
unsigned int repeat = (test->repeat > 0 ? test->repeat : 1);
- i_zero(&passdb);
- passdb.pool = pool_alloconly_create(MEMPOOL_GROWING"test passdb", 2048);
-
for (i = 0; i < repeat && !test_has_failed(); i++)
- test_sasl_run_once(test, &passdb, server_mech, auth_initial);
-
- pool_unref(&passdb.pool);
+ test_sasl_run_once(test, server_mech, auth_initial);
sasl_server_instance_unref(&server_inst);
sasl_server_deinit(&server);