-I$(top_srcdir)/src/lib-login \
-I$(top_srcdir)/src/lib-mail \
-I$(top_srcdir)/src/lib-var-expand \
+ -I$(top_srcdir)/src/lib-ssl-iostream \
-I$(top_srcdir)/src/login-common \
$(BINARY_CFLAGS)
AM_CPPFLAGS = \
-I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/lib-test \
+ -I$(top_srcdir)/src/lib-settings \
-I$(top_srcdir)/src/lib-auth \
- -I$(top_srcdir)/src/lib-json
+ -I$(top_srcdir)/src/lib-json \
+ -I$(top_srcdir)/src/lib-ssl-iostream
libsasl_la_SOURCES = \
mech-external.c \
struct dsasl_client_settings set;
char *password;
const struct dsasl_client_mech *mech;
+
+ enum ssl_iostream_protocol_version channel_version;
+ dsasl_client_channel_binding_callback_t *cbinding_callback;
+ void *cbinding_context;
};
struct dsasl_client_mech {
void dsasl_client_mech_register(const struct dsasl_client_mech *mech);
void dsasl_client_mech_unregister(const struct dsasl_client_mech *mech);
+static inline int
+dasl_client_get_channel_binding(struct dsasl_client *client,
+ const char *type, const buffer_t **data_r,
+ const char **error_r)
+{
+ if (client->channel_version == SSL_IOSTREAM_PROTOCOL_VERSION_UNKNOWN ||
+ client->cbinding_callback == NULL) {
+ *error_r = "Channel binding not available locally";
+ return -1;
+ }
+ return client->cbinding_callback(type, client->cbinding_context,
+ data_r, error_r);
+}
+
#endif
pool_unref(&client->pool);
}
+void dsasl_client_enable_channel_binding(
+ struct dsasl_client *client,
+ enum ssl_iostream_protocol_version channel_version,
+ dsasl_client_channel_binding_callback_t *callback, void *context)
+{
+ client->channel_version = channel_version;
+ client->cbinding_callback = callback;
+ client->cbinding_context = context;
+}
+
int dsasl_client_input(struct dsasl_client *client,
const unsigned char *input, size_t input_len,
const char **error_r)
#ifndef DSASL_CLIENT_H
#define DSASL_CLIENT_H
+#include "iostream-ssl.h"
+
struct dsasl_client_settings {
/* authentication ID - must be set with most mechanisms */
const char *authid;
const char *password;
};
+typedef int
+dsasl_client_channel_binding_callback_t(const char *type, void *context,
+ const buffer_t **data_r,
+ const char **error_r);
+
/* PLAIN mechanism always exists and can be accessed directly via this. */
extern const struct dsasl_client_mech dsasl_client_mech_plain;
const struct dsasl_client_settings *set);
void dsasl_client_free(struct dsasl_client **client);
+/* Enable channel binding support for this client. */
+void dsasl_client_enable_channel_binding(
+ struct dsasl_client *client,
+ enum ssl_iostream_protocol_version channel_version,
+ dsasl_client_channel_binding_callback_t *callback, void *context);
+
/* Call for server input. */
int dsasl_client_input(struct dsasl_client *client,
const unsigned char *input, size_t input_len,
-I$(top_srcdir)/src/lib-master \
-I$(top_srcdir)/src/lib-login \
-I$(top_srcdir)/src/login-common \
+ -I$(top_srcdir)/src/lib-ssl-iostream \
-I$(top_srcdir)/src/lib-pop3 \
-I$(top_srcdir)/src/lib-var-expand \
$(BINARY_CFLAGS)
-I$(top_srcdir)/src/lib-login \
-I$(top_srcdir)/src/lib-smtp \
-I$(top_srcdir)/src/lib-var-expand \
+ -I$(top_srcdir)/src/lib-ssl-iostream \
-I$(top_srcdir)/src/login-common
submission_login_LDADD = \