From: Aki Tuomi Date: Wed, 18 Jan 2017 11:45:27 +0000 (+0200) Subject: lib-sasl: Add API for setting and getting extra values X-Git-Tag: 2.3.0.rc1~2276 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d74a1ed4c9da3d8b0f2eb0fc45d74376c9c22a7;p=thirdparty%2Fdovecot%2Fcore.git lib-sasl: Add API for setting and getting extra values This allows setting extra parameters for authentication and recovering extended result information from mechanism. --- diff --git a/src/lib-sasl/dsasl-client-private.h b/src/lib-sasl/dsasl-client-private.h index 01e87128e8..7f0d29caed 100644 --- a/src/lib-sasl/dsasl-client-private.h +++ b/src/lib-sasl/dsasl-client-private.h @@ -20,6 +20,12 @@ struct dsasl_client_mech { int (*output)(struct dsasl_client *client, const unsigned char **output_r, size_t *output_len_r, const char **error_r); + int (*set_parameter)(struct dsasl_client *client, + const char *key, const char *value, + const char **error_r); + int (*get_result)(struct dsasl_client *client, + const char *key, const char **value_r, + const char **error_r); void (*free)(struct dsasl_client *client); }; diff --git a/src/lib-sasl/dsasl-client.c b/src/lib-sasl/dsasl-client.c index c96d9da109..055b63ac8d 100644 --- a/src/lib-sasl/dsasl-client.c +++ b/src/lib-sasl/dsasl-client.c @@ -96,6 +96,32 @@ int dsasl_client_output(struct dsasl_client *client, return client->mech->output(client, output_r, output_len_r, error_r); } +int dsasl_client_set_parameter(struct dsasl_client *client, + const char *param, const char *value, + const char **error_r) +{ + if (client->mech->set_parameter != NULL) { + int ret = client->mech->set_parameter(client, param, + value, error_r); + i_assert(ret >= 0 || *error_r != NULL); + return ret; + } else + return 0; +} + +int dsasl_client_get_result(struct dsasl_client *client, + const char *key, const char **value_r, + const char **error_r) +{ + if (client->mech->get_result != NULL) { + int ret = + client->mech->get_result(client, key, value_r, error_r); + i_assert(ret <= 0 || *value_r != NULL); + i_assert(ret >= 0 || *error_r != NULL); + } else + return 0; +} + void dsasl_clients_init(void) { if (init_refcount++ > 0) diff --git a/src/lib-sasl/dsasl-client.h b/src/lib-sasl/dsasl-client.h index 4265e3e862..073b8c9dee 100644 --- a/src/lib-sasl/dsasl-client.h +++ b/src/lib-sasl/dsasl-client.h @@ -31,6 +31,19 @@ int dsasl_client_output(struct dsasl_client *client, const unsigned char **output_r, size_t *output_len_r, const char **error_r); +/* Call for setting extra parameters for authentication, these are mechanism + dependant. -1 = error, 0 = not found, 1 = ok + value can be NULL. */ +int dsasl_client_set_parameter(struct dsasl_client *client, + const char *param, const char *value, + const char **error_r) ATTR_NULL(3); + +/* Call for getting extra result information. + -1 = error, 0 = not found, 1 = ok */ +int dsasl_client_get_result(struct dsasl_client *client, + const char *key, const char **value_r, + const char **error_r); + void dsasl_clients_init(void); void dsasl_clients_deinit(void);