-/* $Cambridge: exim/src/src/auths/cyrus_sasl.c,v 1.1 2004/10/07 13:10:01 ph10 Exp $ */
+/* $Cambridge: exim/src/src/auths/cyrus_sasl.c,v 1.4 2006/02/10 14:25:43 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
/* Copyright (c) University of Cambridge 1995 - 2003 */
/* See the file NOTICE for conditions of use and distribution. */
-/* This code was contributed by Matthew Byng-Maddick */
+/* This code was originally contributed by Matthew Byng-Maddick */
/* Copyright (c) A L Digital 2004 */
enable consistency checks to be done, or anything else that needs
to be set up. */
+
+/* Auxiliary function, passed in data to sasl_server_init(). */
+
+static int
+mysasl_config(void *context,
+ const char *plugin_name,
+ const char *option,
+ const char **result,
+ unsigned int *len)
+{
+if (context && !strcmp(option, "mech_list"))
+ {
+ *result = context;
+ if (len != NULL) *len = strlen(*result);
+ return SASL_OK;
+ }
+return SASL_FAIL;
+}
+
+/* Here's the real function */
+
void
auth_cyrus_sasl_init(auth_instance *ablock)
{
auth_cyrus_sasl_options_block *ob =
(auth_cyrus_sasl_options_block *)(ablock->options_block);
-sasl_callback_t cbs[]={{SASL_CB_LIST_END, NULL, NULL}};
-sasl_conn_t *conn;
uschar *list, *listptr, *buffer;
int rc, i;
unsigned int len;
uschar *rs_point;
+sasl_conn_t *conn;
+sasl_callback_t cbs[]={
+ {SASL_CB_GETOPT, NULL, NULL },
+ {SASL_CB_LIST_END, NULL, NULL}};
+
/* default the mechanism to our "public name" */
if(ob->server_mech == NULL)
ob->server_mech=string_copy(ablock->public_name);
/* we're going to initialise the library to check that there is an
* authenticator of type whatever mechanism we're using
*/
+
+cbs[0].proc = &mysasl_config;
+cbs[0].context = ob->server_mech;
+
rc=sasl_server_init(cbs, "exim");
+
if( rc != SASL_OK )
log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s authenticator: "
"couldn't initialise Cyrus SASL library.", ablock->name);
return DEFER;
}
-rc=sasl_server_new(CS ob->server_service, CS ob->server_hostname,
- CS ob->server_realm, NULL, NULL, NULL, 0, &conn);
+rc=sasl_server_new(CS ob->server_service, CS hname, CS ob->server_realm, NULL,
+ NULL, NULL, 0, &conn);
+
if( rc != SASL_OK )
{
auth_defer_msg = US"couldn't initialise Cyrus SASL connection";
}
else if(rc==SASL_OK)
{
- /* get the username and copy it into $1 */
- rc=sasl_getprop(conn, SASL_USERNAME, (const void **)(&out2));
- expand_nstring[1]=string_copy(out2);
- expand_nlength[1]=Ustrlen(expand_nstring[1]);
- expand_nmax=1;
+ /* Get the username and copy it into $auth1 and $1. The former is now the
+ preferred variable; the latter is the original variable. */
+ rc = sasl_getprop(conn, SASL_USERNAME, (const void **)(&out2));
+ auth_vars[0] = expand_nstring[1] = string_copy(out2);
+ expand_nlength[1] = Ustrlen(expand_nstring[1]);
+ expand_nmax = 1;
HDEBUG(D_auth)
debug_printf("Cyrus SASL %s authentiction succeeded for %s\n", ob->server_mech, out2);