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?

Reply via email to