Использование ВНЕШНЕГО механизма с Сайрусом САСЛОМ

StackOverflow https://stackoverflow.com/questions/682431

  •  22-08-2019
  •  | 
  •  

Вопрос

Разве Cyrus SASL api не поддерживает ВНЕШНИЙ механизм?Я пытаюсь использовать его в качестве клиента, но он возвращает SASL_NOMECH когда его спросят.

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

Я просмотрел через Источник хотя, и похоже, что все клиенты должны поддерживать ВНЕШНИЙ механизм:

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_callback_tс, о котором я мог бы подумать, чтобы sasl_client_*(), но никому из них даже не позвонили.Есть ли какой-то аргумент, который я должен передать, который утверждает, что EXTERNAL является приемлемым механизмом?Или SASL_NOMECH всегда возвращается для EXTERNAL - b / c, что не кажется правильным.

Кто-нибудь может мне помочь?

Это было полезно?

Решение

Хорошо, я нашел пропущенный шаг.

Согласно sasl/sasl.h, Мне нужно было установить SASL_AUTH_EXTERNAL собственность для моего sasl_conn_t Первый:

/* 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.
 */

Как только я это сделал, все остальное сработало:

% 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

Однако, поскольку версия Cyrus SASL, которая поставляется с предустановленной версией OS X 10.5, содержит ошибку, из-за которой внешнему плагину требуется SASL_CB_USER обратный вызов и передает ему нулевой указатель для сохранения возвращаемого значения, это все равно означает, что мне придется обновить Cyrus SASL на всех этих машинах.

Или, может быть, я просто закодирую ошибку.

Другие советы

Это вызвано тем фактом, что Cyrus SASL был скомпилирован без каких-либо механизмов (предполагается, что по умолчанию они динамически связаны).Следовательно, если нет динамически связанных механизмов, он сообщит, что соответствующие механизмы отсутствуют.

Следовательно, лучшим решением будет перекомпилировать Cyrus SASL со статически связанными механизмами (называемыми плагинами в пакете Cyrus).Если вы посмотрите на конфигурацию.заголовок h и #define, соответствующие статические определения равны 1, затем перекомпилируйте (я вручную добавил исходные тексты плагинов из каталога плагинов в архив libsasl2.a).Затем, когда вы свяжете эту библиотеку, вы не получите эту ошибку (без найденного вами обходного пути).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top