diff options
-rw-r--r-- | CHANGES | 12 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | lib/Makefile.vc6 | 1 | ||||
-rw-r--r-- | lib/http_ntlm.c | 64 | ||||
-rw-r--r-- | src/Makefile.vc6 | 1 |
5 files changed, 58 insertions, 21 deletions
@@ -8,6 +8,18 @@ +Daniel (8 November 2005) +- Dmitry Bartsevich discovered some issues in compatibilty of SSPI-enabled + version of libcurl with different Windows versions. Current version of + libcurl imports SSPI functions from secur32.dll. However, under Windows NT + 4.0 these functions are located in security.dll, under Windows 9x - in + secur32.dll and Windows 2000 and XP contains both these DLLs (security.dll + just forwards calls to secur32.dll). + + Dmitry's patch loads proper library dynamically depending on Windows + version. Function InitSecurityInterface() is used to obtain pointers to all + of SSPI function in one structure. + Daniel (31 October 2005) - Vilmos Nebehaj improved libcurl's LDAP abilities: diff --git a/configure.ac b/configure.ac index 40c95a0ea..629f0ba28 100644 --- a/configure.ac +++ b/configure.ac @@ -1784,7 +1784,6 @@ AC_HELP_STRING([--disable-sspi],[Disable SSPI]), AC_MSG_RESULT(yes) AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) AC_SUBST(USE_WINDOWS_SSPI) - LIBS="$LIBS -lsecur32" curl_sspi_msg="yes" ;; *) diff --git a/lib/Makefile.vc6 b/lib/Makefile.vc6 index 304703ec3..18cb2aefb 100644 --- a/lib/Makefile.vc6 +++ b/lib/Makefile.vc6 @@ -89,7 +89,6 @@ CFGSET = FALSE !IFDEF WINDOWS_SSPI
CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-LFLAGS = $(LFLAGS) $(WINDOWS_SDK_PATH)\lib\secur32.lib
!ENDIF
##############################################################
diff --git a/lib/http_ntlm.c b/lib/http_ntlm.c index a64f61170..1d404345a 100644 --- a/lib/http_ntlm.c +++ b/lib/http_ntlm.c @@ -76,6 +76,11 @@ #include <rpc.h> +/* Handle of security.dll or secur32.dll, depending on Windows version */ +static HMODULE s_hSecDll = NULL; +/* Pointer to SSPI dispatch table */ +static PSecurityFunctionTable s_pSecFn = NULL; + #endif /* The last #include file should be: */ @@ -305,8 +310,8 @@ ntlm_sspi_cleanup(struct ntlmdata *ntlm) ntlm->type_2 = NULL; } if (ntlm->has_handles) { - DeleteSecurityContext(&ntlm->c_handle); - FreeCredentialsHandle(&ntlm->handle); + s_pSecFn->DeleteSecurityContext(&ntlm->c_handle); + s_pSecFn->FreeCredentialsHandle(&ntlm->handle); ntlm->has_handles = 0; } if (ntlm->p_identity) { @@ -376,6 +381,35 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, if(!passwdp) passwdp=(char *)""; +#ifdef USE_WINDOWS_SSPI + /* If security interface is not yet initialized try to do this */ + if (s_hSecDll == NULL) { + /* Determine Windows version. Security functions are located in + * security.dll on WinNT 4.0 and in secur32.dll on Win9x. Win2K and XP + * contain both these DLLs (security.dll just forwards calls to + * secur32.dll) + */ + OSVERSIONINFO osver; + osver.dwOSVersionInfoSize = sizeof(osver); + GetVersionEx(&osver); + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT + && osver.dwMajorVersion == 4) + s_hSecDll = LoadLibrary("security.dll"); + else + s_hSecDll = LoadLibrary("secur32.dll"); + if (s_hSecDll != NULL) { + INIT_SECURITY_INTERFACE pInitSecurityInterface; + pInitSecurityInterface = + (INIT_SECURITY_INTERFACE)GetProcAddress(s_hSecDll, + "InitSecurityInterfaceA"); + if (pInitSecurityInterface != NULL) + s_pSecFn = pInitSecurityInterface(); + } + } + if (s_pSecFn == NULL) + return CURLE_RECV_ERROR; +#endif + switch(ntlm->state) { case NTLMSTATE_TYPE1: default: /* for the weird cases we (re)start here */ @@ -429,7 +463,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, ntlm->p_identity = NULL; } - if (AcquireCredentialsHandle( + if (s_pSecFn->AcquireCredentialsHandle( NULL, (char *)"NTLM", SECPKG_CRED_OUTBOUND, NULL, ntlm->p_identity, NULL, NULL, &ntlm->handle, &tsDummy ) != SEC_E_OK) { @@ -443,7 +477,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, buf.BufferType = SECBUFFER_TOKEN; buf.pvBuffer = ntlmbuf; - status = InitializeSecurityContext(&ntlm->handle, NULL, (char *) host, + status = s_pSecFn->InitializeSecurityContext(&ntlm->handle, NULL, (char *) host, ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONNECTION, @@ -453,21 +487,10 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, if (status == SEC_I_COMPLETE_AND_CONTINUE || status == SEC_I_CONTINUE_NEEDED) { - /* CompleteAuthToken() is not present in Win9x, so load it dynamically */ - SECURITY_STATUS (__stdcall * pCompleteAuthToken) - (PCtxtHandle,PSecBufferDesc); - HMODULE hSecur32 = GetModuleHandle("secur32.dll"); - if (hSecur32 != NULL) { - pCompleteAuthToken = - (SECURITY_STATUS (__stdcall *)(PCtxtHandle,PSecBufferDesc)) - GetProcAddress(hSecur32, "CompleteAuthToken"); - if( pCompleteAuthToken != NULL ) { - pCompleteAuthToken(&ntlm->c_handle, &desc); - } - } + s_pSecFn->CompleteAuthToken(&ntlm->c_handle, &desc); } else if (status != SEC_E_OK) { - FreeCredentialsHandle(&ntlm->handle); + s_pSecFn->FreeCredentialsHandle(&ntlm->handle); return CURLE_RECV_ERROR; } @@ -579,7 +602,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, type_3.pvBuffer = ntlmbuf; type_3.cbBuffer = sizeof(ntlmbuf); - status = InitializeSecurityContext(&ntlm->handle, &ntlm->c_handle, + status = s_pSecFn->InitializeSecurityContext(&ntlm->handle, &ntlm->c_handle, (char *) host, ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECT | @@ -783,6 +806,11 @@ Curl_ntlm_cleanup(struct connectdata *conn) #ifdef USE_WINDOWS_SSPI ntlm_sspi_cleanup(&conn->ntlm); ntlm_sspi_cleanup(&conn->proxyntlm); + if (s_hSecDll != NULL) { + FreeLibrary(s_hSecDll); + s_hSecDll = NULL; + s_pSecFn = NULL; + } #else (void)conn; #endif diff --git a/src/Makefile.vc6 b/src/Makefile.vc6 index 60874442e..b7ea2d8b1 100644 --- a/src/Makefile.vc6 +++ b/src/Makefile.vc6 @@ -69,7 +69,6 @@ RESFLAGS = /i../include !IFDEF WINDOWS_SSPI
CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-LFLAGS = $(LFLAGS) $(WINDOWS_SDK_PATH)\lib\secur32.lib
!ENDIF
RELEASE_OBJS= \
|