2009-03-25 17 views
1

Cyrus SASL APIはEXTERNALメカニズムをサポートしていませんか?私は をクライアントとして使用しようとしていますが、尋ねられたらSASL_NOMECHを返します。 Cyrus SASLでのEXTERNALメカニズムの使用

% 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 
% 

は私も sourceを通じて閲覧、およびすべてのクライアントが外部メカニズムをサポートしなければならないように見えます:

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 

だから私は、私はここで何か間違ったことをやっている推測しています。私はsasl_client_*()と思うことができるsasl_callback_tをすべて追加しようとしましたが、 のどれも呼ばれていません。 EXTERNALが受け入れられるメカニズムであると主張するいくつかの議論がありますか? SASL_NOMECHは常にEXTERNAL-b/cのために返されますが、正しくないようです。

誰でもお手伝いできますか?

答えて

1

いいえ、私は左のステップを見つけました。

sasl/sasl.hによると、私はのためにSASL_AUTH_EXTERNALプロパティ を設定するために必要な私のsasl_conn_t最初:

% cat 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 */ 

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_errstring(__result,NULL,NULL));\ 
     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_setprop(conn, SASL_AUTH_EXTERNAL, "fake authority")); 
    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 
% ./cyrus_sasl_ex 
sasl_client_init(NULL) == 0 
     successful result 
sasl_client_new("fake", "fakey.mcfaker.ton", "127.0.0.1", "127.255.255.1", NULL, 0, &conn) == 0 
     successful result 
sasl_setprop(conn, SASL_AUTH_EXTERNAL, "fake authority") == 0 
     successful result 
sasl_client_start(conn, "EXTERNAL", NULL, &output, &outlen, &mechanism) == 0 
     successful result 
output: [0 bytes] : 
mechanism: EXTERNAL 

ただし、バージョン以降:私は、残りの部分が出て働いたことでしたら

/* set property in SASL connection state 
* returns: 
* SASL_OK  -- value set 
* SASL_BADPARAM -- invalid property or value 
*/ 
LIBSASL_API int sasl_setprop(sasl_conn_t *conn, 
       int propnum, 
       const void *value); 
#define SASL_SSF_EXTERNAL 100 /* external SSF active (sasl_ssf_t *) */ 
#define SASL_SEC_PROPS  101 /* sasl_security_properties_t */ 
#define SASL_AUTH_EXTERNAL 102 /* external authentication ID (const char *) */ 

/* If the SASL_AUTH_EXTERNAL value is non-NULL, then a special version of the 
* EXTERNAL mechanism is enabled (one for server-embedded EXTERNAL mechanisms). 
* Otherwise, the EXTERNAL mechanism will be absent unless a plug-in 
* including EXTERNAL is present. 
*/ 

OS X 10.5にプリインストールされているCyrus SASLには、外部プラグインにSASL_CB_USERコールバックが必要なバグがあり、その戻り値を格納するためのNULLポインタを渡します。これは、これらすべてのマシンでCyrus SASLを更新する必要があることを意味します。

おそらく私はバグの周りをコードするだけです。

0

これは、Cyrus SASLがメカニズムなしでコンパイルされたために発生します(デフォルトでは、動的にリンクされているとみなされます)。したがって、動的にリンクされたメカニズムがない場合、マッチングメカニズムがないことを報告します。

したがって、より良い答えは、静的にリンクされたメカニズム(Cyrusパッケージ内のプラグインと呼ばれる)でCyrus SASLを再コンパイルすることです。 config.hヘッダを見て対応する静的定義を1に設定して再コンパイルすると(プラグインディレクトリからlibsasl2.aアーカイブに手動でプラグインソースが追加されます)。次に、このライブラリをリンクすると、そのエラーは表示されません(回避策なし)。