Hi folks,I am the originator of this ticket but was not able to provide a suitable patch up until now.
The changes and reasons in/for this patch:
Due to missing #ifdefs, curl tries to perform SPNEGO auth even if it has been compiled w/o fbopenssl SPNEGO library. Now, Negotiate works, if and only if, SPNEGO support has bin compiled in, requiring GSS-API is present and enabled --with-gssapi.
Git diff: https://github.com/michael-o/curl/compare/HEAD...a893c7e Patch has been tested on Ubuntu and HP-UX. Please review and report back, Michael
diff --git a/lib/curl_setup.h b/lib/curl_setup.h index 4e18d67..79d2b70 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -602,7 +602,7 @@ int netware_init(void); #endif #if !defined(CURL_DISABLE_CRYPTO_AUTH) && \ - (defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)) + (defined(HAVE_GSSAPI) && defined(HAVE_SPNEGO) || defined(USE_WINDOWS_SSPI)) #define USE_HTTP_NEGOTIATE #endif diff --git a/lib/http_negotiate.c b/lib/http_negotiate.c index 53df30e..301cbff 100644 --- a/lib/http_negotiate.c +++ b/lib/http_negotiate.c @@ -28,7 +28,7 @@ #define NCOMPAT 1 #endif -#ifndef CURL_DISABLE_HTTP +#if !defined(CURL_DISABLE_HTTP) && defined(USE_HTTP_NEGOTIATE) #include "urldata.h" #include "sendf.h" @@ -39,17 +39,15 @@ #include "curl_memory.h" #include "url.h" -#ifdef HAVE_SPNEGO -# include <spnegohelp.h> -# ifdef USE_SSLEAY -# ifdef USE_OPENSSL -# include <openssl/objects.h> -# else -# include <objects.h> -# endif +#include <spnegohelp.h> +#ifdef USE_SSLEAY +# ifdef USE_OPENSSL +# include <openssl/objects.h> # else -# error "Can't compile SPNEGO support without OpenSSL." +# include <objects.h> # endif +#else +# error "Can't compile SPNEGO support without OpenSSL." #endif #define _MPRINTF_REPLACE /* use our functions only */ @@ -192,7 +190,7 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, DEBUGASSERT(input_token.value != NULL); -#ifdef HAVE_SPNEGO /* Handle SPNEGO */ + /* Handle SPNEGO */ if(checkprefix("Negotiate", header)) { unsigned char *spnegoToken = NULL; size_t spnegoTokenLength = 0; @@ -237,7 +235,6 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, infof(data, "Parse SPNEGO Target Token succeeded\n"); } } -#endif } major_status = Curl_gss_init_sec_context(data, @@ -279,7 +276,7 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy) CURLcode error; OM_uint32 discard_st; -#ifdef HAVE_SPNEGO /* Handle SPNEGO */ + /* Handle SPNEGO */ if(checkprefix("Negotiate", neg_ctx->protocol)) { ASN1_OBJECT *object = NULL; unsigned char *responseToken = NULL; @@ -324,7 +321,6 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy) infof(conn->data, "Make SPNEGO Initial Token succeeded\n"); } } -#endif error = Curl_base64_encode(conn->data, neg_ctx->output_token.value, neg_ctx->output_token.length, @@ -382,5 +378,6 @@ void Curl_cleanup_negotiate(struct SessionHandle *data) } -#endif +#endif /* !CURL_DISABLE_HTTP && USE_HTTP_NEGOTIATE */ + #endif diff --git a/lib/http_negotiate.c b/lib/http_negotiate.c index 53df30e..301cbff 100644 --- a/lib/http_negotiate.c +++ b/lib/http_negotiate.c @@ -28,7 +28,7 @@ #define NCOMPAT 1 #endif -#ifndef CURL_DISABLE_HTTP +#if !defined(CURL_DISABLE_HTTP) && defined(USE_HTTP_NEGOTIATE) #include "urldata.h" #include "sendf.h" @@ -39,17 +39,15 @@ #include "curl_memory.h" #include "url.h" -#ifdef HAVE_SPNEGO -# include <spnegohelp.h> -# ifdef USE_SSLEAY -# ifdef USE_OPENSSL -# include <openssl/objects.h> -# else -# include <objects.h> -# endif +#include <spnegohelp.h> +#ifdef USE_SSLEAY +# ifdef USE_OPENSSL +# include <openssl/objects.h> # else -# error "Can't compile SPNEGO support without OpenSSL." +# include <objects.h> # endif +#else +# error "Can't compile SPNEGO support without OpenSSL." #endif #define _MPRINTF_REPLACE /* use our functions only */ @@ -192,7 +190,7 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, DEBUGASSERT(input_token.value != NULL); -#ifdef HAVE_SPNEGO /* Handle SPNEGO */ + /* Handle SPNEGO */ if(checkprefix("Negotiate", header)) { unsigned char *spnegoToken = NULL; size_t spnegoTokenLength = 0; @@ -237,7 +235,6 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, infof(data, "Parse SPNEGO Target Token succeeded\n"); } } -#endif } major_status = Curl_gss_init_sec_context(data, @@ -279,7 +276,7 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy) CURLcode error; OM_uint32 discard_st; -#ifdef HAVE_SPNEGO /* Handle SPNEGO */ + /* Handle SPNEGO */ if(checkprefix("Negotiate", neg_ctx->protocol)) { ASN1_OBJECT *object = NULL; unsigned char *responseToken = NULL; @@ -324,7 +321,6 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy) infof(conn->data, "Make SPNEGO Initial Token succeeded\n"); } } -#endif error = Curl_base64_encode(conn->data, neg_ctx->output_token.value, neg_ctx->output_token.length, @@ -382,5 +378,6 @@ void Curl_cleanup_negotiate(struct SessionHandle *data) } -#endif +#endif /* !CURL_DISABLE_HTTP && USE_HTTP_NEGOTIATE */ + #endif
------------------------------------------------------------------- List admin: http://cool.haxx.se/list/listinfo/curl-library Etiquette: http://curl.haxx.se/mail/etiquette.html