Использование ВНЕШНЕГО механизма с Сайрусом САСЛОМ
-
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).Затем, когда вы свяжете эту библиотеку, вы не получите эту ошибку (без найденного вами обходного пути).