سؤال

هل المعهد سايروس SASL لا يدعم آلية الخارجية؟ أحاول أن استخدامه بمثابة العميل، ولكنه يعود 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_ts كنت أفكر فيه لsasl_client_*()، ولكن أيا منها حتى حصلت يسمى. هناك بعض الجدل وأود أن تمرير هذا يؤكد أن EXTERNAL هو آلية مقبولة؟ أو SASL_NOMECH عاد دائما لEXTERNAL - ب / ج التي لا يبدو الحق

ويمكن لأي شخص مساعدتي؟

هل كانت مفيدة؟

المحلول

وطيب، ولقد وجدت خطوة استبعاده.

ووفقا ل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

ولكن، منذ إصدار سايروس SASL التي تأتي مثبتة مسبقا على OS X 10.5 لديه علة في أن يجعل المساعد الخارجي تتطلب رد SASL_CB_USER ويمررها مؤشر NULL لتخزين قيمة الإرجاع في، يعني لا يزال سآخذ لتحديث سايروس SASL على جميع تلك الآلات.

وأو ربما سوف أكون مجرد رمز في جميع أنحاء علة.

نصائح أخرى

ويحدث هذا بسبب حقيقة أن سايروس SASL جمعت مع عدم وجود آليات (ويفترض أن تكون مرتبطة بشكل حيوي افتراضيا). ولذلك، إذا لم تكن هناك آليات مرتبطة بشكل حيوي سيكون التقرير أنه لا توجد آليات مطابقة.

وولذلك، فإن الجواب الأفضل هو إعادة ترجمة سايروس SASL مع آليات (وتسمى الإضافات في حزمة سايروس) مرتبطة بشكل ثابت. اذا نظرتم الى رأس config.h ورقم تعريف ويعرف ثابتة الموافق 1 ثم إعادة ترجمة (ط إضافتها يدويا مصادر المساعد من الإضافات DIR إلى الأرشيف libsasl2.a). ثم عند ربط هذه المكتبة التي لن تحصل على هذا الخطأ (بدون الحل الذي تم العثور عليه).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top