2009-03-25 4 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_*()으로 생각할 수는 있었지만, 아무도 불리지 않았다. 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 아카이브로 플러그인 소스를 추가 함). 그런 다음이 라이브러리를 링크하면 찾을 수있는 해결 방법없이 오류가 발생합니다.