]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sasl: Add API for setting and getting extra values
authorAki Tuomi <aki.tuomi@dovecot.fi>
Wed, 18 Jan 2017 11:45:27 +0000 (13:45 +0200)
committerGitLab <gitlab@git.dovecot.net>
Fri, 20 Jan 2017 22:07:24 +0000 (00:07 +0200)
This allows setting extra parameters for authentication
and recovering extended result information from
mechanism.

src/lib-sasl/dsasl-client-private.h
src/lib-sasl/dsasl-client.c
src/lib-sasl/dsasl-client.h

index 01e87128e815bbb2f8c19c78a9310f034eca50de..7f0d29caedb10074d98f44b17c2bff99d9c2a71a 100644 (file)
@@ -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);
 };
 
index c96d9da109e17f97ada3f4604b5f0bfd954c33d4..055b63ac8d7f8b9d99182474b7d961bff2935fbc 100644 (file)
@@ -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)
index 4265e3e86285ed53345bcd107742d37299cd2f09..073b8c9dee88378ad070a5cb18de0176c70e15a3 100644 (file)
@@ -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);