Using EXTERNAL mechanism with Cyrus SASL

Noah Easterly noah.easterly at gmail.com
Wed Mar 25 13:24:36 EDT 2009


Does the Cyrus SASL api not support the EXTERNAL mechanism? I'm trying
to use it as a client, but it returns SASL_NOMECH when asked.

		% cat cyrus_sal_ex.c
		/* cyrus_sasl_ex.c: Example of using the Cyrus SASL api */
		#include <stdio.h>      /* for printf() */
		#include <sasl/sasl.h>  /* for sasl_client_*(), SASL_*, sasl_*_t */

		static char const * SASL_return_code(int const code)
		{
			switch(code)
			{
				/* ... */
				case SASL_OK:     return "SASL_OK[0]: successful result";
				/* ... */
				case SASL_NOMECH: return "SASL_NOMECH[-4]: mechanism not supported";
				/* ... */
			}
			return "unrecognized";
		}

		int main()
		{
			char const *  output = NULL;
			unsigned      outlen = 0;
			char const *  mechanism = NULL;
			sasl_conn_t * conn;

		# define PRINT_RESULT( x ) do\
			{\
				int const __result = (x);\
				printf("%s == %d\n\t%s\n", #x, __result, SASL_return_code(__result));\
				if (__result < 0) goto done;\
			}\
			while (0)

			PRINT_RESULT( sasl_client_init( NULL ) );
			PRINT_RESULT( sasl_client_new( "fake", "fakey.mcfaker.ton",
"127.0.0.1", "127.255.255.1", NULL, 0, &conn) );
			PRINT_RESULT( sasl_client_start( conn, "EXTERNAL", NULL, &output,
&outlen, &mechanism) );

		done:
		# undef PRINT_RESULT
			printf("output: [%d bytes] : %s\n", outlen, (output ? output : "NULL") );
			printf("mechanism: %s\n", (mechanism ? mechanism : "NULL"));

			return 0;
		}
		% gcc -I/sw/include -L/sw/lib -lsasl2 cyrus_sasl_ex.c -o
cyrus_sasl_ex # your header/library locations may vary
		% ./cyrus_sasl_ex
		sasl_client_init( NULL ) == 0
						SASL_OK[0]: successful result
		sasl_client_new( "fake", "fakey.mcfaker.ton", "127.0.0.1",
"127.255.255.1", NULL, 0, &conn) == 0
						SASL_OK[0]: successful result
		sasl_client_start( conn, "EXTERNAL", NULL, &output, &outlen, &mechanism) == -4
						SASL_NOMECH[-4]: mechanism not supported
		output: [0 bytes] : NULL
		mechanism: EXTERNAL
		%

I browsed through the source though, and it looks like all the clients
should support the EXTERNAL mechanism:

		cyrus-sasl-2.1.22/lib/client.c:
		196 int sasl_client_init(const sasl_callback_t *callbacks)
		197 {
		...
		227
		228   sasl_client_add_plugin("EXTERNAL", &external_client_plug_init);
		229

So I'm guessing I'm doing something wrong here. I tried adding all the
sasl_callback_ts I could think of to sasl_client_*(), but it didnt'
seem to make a difference. Is there some argument I should pass that
asserts that EXTERNAL is an acceptable mechanism? Or is SASL_NOMECH
always returned for EXTERNAL - b/c that doesn't seem right.

Can anyone help me out?


More information about the Cyrus-sasl mailing list