secur32: Tests for the new functionality in the NTLM security provider.
Kai Blin
blin at gmx.net
Sat Aug 27 11:03:37 CDT 2005
These tests will work correctly when ntlm_auth is installed but the
users aren't set up, too. Otherwise they should fail gracefully.
Changelog:
Kai Blin <blin at gmx.net>
Added some specific NTLM tests.
--
Kai Blin, (blin at gmx dot net)
Coward, n.:
One who in a perilous emergency thinks with his legs.
-- Ambrose Bierce, "The Devil's Dictionary"
-------------- next part --------------
? dlls/secur32/tests/ntlm.c
Index: dlls/secur32/tests/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/secur32/tests/Makefile.in,v
retrieving revision 1.2
diff -u -3 -r1.2 Makefile.in
--- dlls/secur32/tests/Makefile.in 27 Aug 2005 09:27:10 -0000 1.2
+++ dlls/secur32/tests/Makefile.in 27 Aug 2005 15:33:11 -0000
@@ -6,7 +6,8 @@
IMPORTS = secur32 kernel32
CTESTS = \
- main.c
+ main.c \
+ ntlm.c
@MAKE_TEST_RULES@
--- /dev/null 2005-08-19 11:42:14.099901488 +0200
+++ dlls/secur32/tests/ntlm.c 2005-08-27 17:29:24.073015088 +0200
@@ -0,0 +1,661 @@
+/*
+ * NTLM security provider tests
+ *
+ * Copyright 2005 Kai Blin
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#define SECURITY_WIN32
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <windows.h>
+#include "wine/test.h"
+#include <winbase.h>
+#include <sspi.h>
+#include <rpc.h>
+#include <string.h>
+
+#define MAX_MESSAGE 3000
+
+static const char* getSecError(SECURITY_STATUS status)
+{
+#define _SEC_ERR(x) case (x): return #x;
+ switch(status)
+ {
+ _SEC_ERR(SEC_E_OK);
+ _SEC_ERR(SEC_E_INSUFFICIENT_MEMORY);
+ _SEC_ERR(SEC_E_INVALID_HANDLE);
+ _SEC_ERR(SEC_E_UNSUPPORTED_FUNCTION);
+ _SEC_ERR(SEC_E_TARGET_UNKNOWN);
+ _SEC_ERR(SEC_E_INTERNAL_ERROR);
+ _SEC_ERR(SEC_E_SECPKG_NOT_FOUND);
+ _SEC_ERR(SEC_E_NOT_OWNER);
+ _SEC_ERR(SEC_E_CANNOT_INSTALL);
+ _SEC_ERR(SEC_E_INVALID_TOKEN);
+ _SEC_ERR(SEC_E_CANNOT_PACK);
+ _SEC_ERR(SEC_E_QOP_NOT_SUPPORTED);
+ _SEC_ERR(SEC_E_NO_IMPERSONATION);
+ _SEC_ERR(SEC_I_CONTINUE_NEEDED);
+ _SEC_ERR(SEC_E_BUFFER_TOO_SMALL);
+ _SEC_ERR(SEC_E_ILLEGAL_MESSAGE);
+ _SEC_ERR(SEC_E_LOGON_DENIED);
+ _SEC_ERR(SEC_E_NO_CREDENTIALS);
+ default:
+ trace("Error = 0x%08lx\n", status);
+ return "Unknown error";
+ }
+#undef _SEC_ERR
+}
+
+/**********************************************************************/
+
+SECURITY_STATUS setupClient(PCredHandle cred, const char *user,
+ const char *pass, const char *domain)
+{
+ SECURITY_STATUS ret;
+ PSEC_WINNT_AUTH_IDENTITY identity = NULL;
+ TimeStamp ttl;
+
+ trace("Running setupClient\n");
+
+ if(user != NULL)
+ {
+ identity = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(SEC_WINNT_AUTH_IDENTITY_A));
+
+ memset( identity, 0, sizeof(identity));
+ identity->Domain = HeapAlloc(GetProcessHeap(), 0,
+ lstrlenA( domain ? domain :"") + 1);
+ lstrcpyA(identity->Domain, domain ? domain :"");
+ identity->DomainLength = domain ? strlen(domain): 0;
+ identity->User = HeapAlloc(GetProcessHeap(), 0,
+ lstrlenA( user ? user :"") + 1);
+ lstrcpyA(identity->User, user ? user :"");
+ identity->UserLength = user ? strlen(user) : 0;
+ identity->Password = HeapAlloc(GetProcessHeap(), 0,
+ lstrlenA( pass ? pass :"") + 1);
+ lstrcpyA(identity->Password, pass ? pass : "");
+ identity->PasswordLength = pass ? strlen(pass): 0;
+ identity->Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
+ }
+
+ if((ret = AcquireCredentialsHandle(NULL, "NTLM", SECPKG_CRED_OUTBOUND,
+ NULL, identity, NULL, NULL, cred, &ttl)) != SEC_E_OK)
+ {
+ trace("AcquireCredentialsHandle() returned %s\n", getSecError(ret));
+ }
+
+ ok(ret == SEC_E_OK, "AcquireCredentialsHande() returned %s\n",
+ getSecError(ret));
+
+ if( identity != NULL)
+ {
+ if(identity->Domain != 0)
+ HeapFree(GetProcessHeap(), 0, identity->Domain);
+ if(identity->User != 0)
+ HeapFree(GetProcessHeap(), 0, identity->User);
+ if(identity->Password != 0)
+ HeapFree(GetProcessHeap(), 0, identity->Password);
+ HeapFree(GetProcessHeap(), 0, identity);
+ }
+
+ return ret;
+}
+
+/**********************************************************************/
+
+SECURITY_STATUS setupServer(PCredHandle cred)
+{
+ SECURITY_STATUS ret;
+ TimeStamp ttl;
+
+ trace("Running setupServer\n");
+
+ if((ret = AcquireCredentialsHandle(NULL, "NTLM", SECPKG_CRED_INBOUND, NULL,
+ NULL, NULL, NULL, cred, &ttl)) != SEC_E_OK)
+ {
+ trace("AcquireCredentialsHandle() returned %s\n", getSecError(ret));
+ }
+
+ ok(ret == SEC_E_OK, "AcquireCredentialsHande() returned %s\n",
+ getSecError(ret));
+
+ return ret;
+}
+
+/**********************************************************************/
+
+SECURITY_STATUS setupBuffers(PSecBufferDesc *new_in_buf,
+ PSecBufferDesc *new_out_buf)
+{
+ int size = MAX_MESSAGE;
+ PSecBufferDesc in_buf = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(SecBufferDesc));
+
+ if(in_buf != NULL)
+ {
+ PSecBuffer sec_buffer = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(SecBuffer));
+ if(sec_buffer == NULL){
+ trace("in_buf: sec_buffer == NULL");
+ return SEC_E_INSUFFICIENT_MEMORY;
+ }
+
+ PBYTE buffer = HeapAlloc(GetProcessHeap(), 0, size);
+
+ if(buffer == NULL){
+ trace("in_buf: buffer == NULL");
+ return SEC_E_INSUFFICIENT_MEMORY;
+ }
+
+ in_buf->ulVersion = SECBUFFER_VERSION;
+ in_buf->cBuffers = 1;
+ in_buf->pBuffers = sec_buffer;
+
+ sec_buffer->cbBuffer = size;
+ sec_buffer->BufferType = SECBUFFER_TOKEN;
+ sec_buffer->pvBuffer = buffer;
+ *new_in_buf = in_buf;
+ }
+ else
+ {
+ trace("HeapAlloc in_buf returned NULL\n");
+ return SEC_E_INSUFFICIENT_MEMORY;
+ }
+
+ PSecBufferDesc out_buf = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(PSecBufferDesc));
+
+ if(out_buf != NULL)
+ {
+ PSecBuffer sec_buffer = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(SecBuffer));
+
+ if(sec_buffer == NULL){
+ trace("out_buf: sec_buffer == NULL");
+ return SEC_E_INSUFFICIENT_MEMORY;
+ }
+
+ PBYTE buffer = HeapAlloc(GetProcessHeap(), 0, size);
+
+ if(buffer == NULL){
+ trace("out_buf: buffer == NULL");
+ return SEC_E_INSUFFICIENT_MEMORY;
+ }
+
+ out_buf->ulVersion = SECBUFFER_VERSION;
+ out_buf->cBuffers = 1;
+ out_buf->pBuffers = sec_buffer;
+
+ sec_buffer->cbBuffer = 0;
+ sec_buffer->BufferType = SECBUFFER_TOKEN;
+ sec_buffer->pvBuffer = buffer;
+ *new_out_buf = out_buf;
+ }
+ else
+ {
+ trace("HeapAlloc out_buf returned NULL\n");
+ return SEC_E_INSUFFICIENT_MEMORY;
+ }
+
+ return SEC_E_OK;
+}
+
+/**********************************************************************/
+
+void cleanupBuffers(PSecBufferDesc in_buf, PSecBufferDesc out_buf)
+{
+ int i;
+
+ if(in_buf != NULL)
+ {
+ for(i = 0; i < in_buf->cBuffers; ++i)
+ {
+ HeapFree(GetProcessHeap(), 0, in_buf->pBuffers[i].pvBuffer);
+ }
+ HeapFree(GetProcessHeap(), 0, in_buf->pBuffers);
+ HeapFree(GetProcessHeap(), 0, in_buf);
+ }
+
+ if(out_buf != NULL)
+ {
+ for(i = 0; i < out_buf->cBuffers; ++i)
+ {
+ HeapFree(GetProcessHeap(), 0, out_buf->pBuffers[i].pvBuffer);
+ }
+ HeapFree(GetProcessHeap(), 0, out_buf->pBuffers);
+ HeapFree(GetProcessHeap(), 0, out_buf);
+ }
+}
+
+/**********************************************************************/
+
+SECURITY_STATUS runClient(PCredHandle cred, PCtxtHandle ctxt,
+ PSecBufferDesc in_buf, PSecBufferDesc out_buf, BOOL first)
+{
+ SECURITY_STATUS ret;
+ ULONG req_attr = ISC_REQ_CONNECTION;
+ ULONG ctxt_attr;
+ TimeStamp ttl;
+
+ trace("Running the client the %s time.\n", first?"first":"second");
+
+ ret = InitializeSecurityContext(cred, first?NULL:ctxt, NULL, req_attr,
+ 0, SECURITY_NATIVE_DREP, first?NULL:in_buf, 0, ctxt, out_buf,
+ &ctxt_attr, &ttl);
+
+ if(ret == SEC_I_COMPLETE_AND_CONTINUE || ret == SEC_I_COMPLETE_NEEDED)
+ {
+ CompleteAuthToken(ctxt, out_buf);
+ if(ret == SEC_I_COMPLETE_AND_CONTINUE)
+ ret = SEC_I_CONTINUE_NEEDED;
+ else if(ret == SEC_I_COMPLETE_NEEDED)
+ ret = SEC_E_OK;
+ }
+
+ return ret;
+}
+
+/**********************************************************************/
+
+SECURITY_STATUS runServer(PCredHandle cred, PCtxtHandle ctxt,
+ PSecBufferDesc in_buf, PSecBufferDesc out_buf, BOOL first)
+{
+ SECURITY_STATUS ret;
+ ULONG ctxt_attr;
+ TimeStamp ttl;
+
+ trace("Running the server the %s time\n", first?"first":"second");
+
+ ret = AcceptSecurityContext(cred, first?NULL:ctxt, in_buf, 0,
+ SECURITY_NATIVE_DREP, ctxt, out_buf, &ctxt_attr, &ttl);
+
+ if(ret == SEC_I_COMPLETE_AND_CONTINUE || ret == SEC_I_COMPLETE_NEEDED)
+ {
+ CompleteAuthToken(ctxt, out_buf);
+ if(ret == SEC_I_COMPLETE_AND_CONTINUE)
+ ret = SEC_I_CONTINUE_NEEDED;
+ else if(ret == SEC_I_COMPLETE_NEEDED)
+ ret = SEC_E_OK;
+ }
+
+
+ return ret;
+}
+
+/**********************************************************************/
+
+void communicate(PSecBufferDesc in_buf, PSecBufferDesc out_buf)
+{
+ if(in_buf != NULL && out_buf != NULL)
+ {
+ trace("Running communicate.\n");
+ if((in_buf->cBuffers >= 1) && (out_buf->cBuffers >= 1))
+ {
+ if((in_buf->pBuffers[0].pvBuffer != NULL) &&
+ (out_buf->pBuffers[0].pvBuffer != NULL))
+ {
+ memset(out_buf->pBuffers[0].pvBuffer, 0, MAX_MESSAGE);
+
+ memcpy(out_buf->pBuffers[0].pvBuffer,
+ in_buf->pBuffers[0].pvBuffer,
+ in_buf->pBuffers[0].cbBuffer);
+
+ out_buf->pBuffers[0].cbBuffer = in_buf->pBuffers[0].cbBuffer;
+
+ memset(in_buf->pBuffers[0].pvBuffer, 0, MAX_MESSAGE);
+ }
+ }
+ }
+}
+
+/**********************************************************************/
+
+void testNTLMAuthWithUser(void)
+{
+ SECURITY_STATUS sec_status;
+ CredHandle server_cred;
+ CredHandle client_cred;
+ CtxtHandle server_ctxt;
+ CtxtHandle client_ctxt;
+
+ PSecBufferDesc client_in = NULL, client_out = NULL;
+ PSecBufferDesc server_in = NULL, server_out = NULL;
+
+ BOOL continue_client = FALSE, continue_server = FALSE;
+
+ sec_status = setupClient(&client_cred, "testuser", "testpass","WORKGROUP");
+
+ if(sec_status != SEC_E_OK)
+ {
+ trace("Error: Setting up the client returned %s, exiting test!\n",
+ getSecError(sec_status));
+ FreeCredentialsHandle(&client_cred);
+ return;
+ }
+
+ sec_status = setupServer(&server_cred);
+
+ if(sec_status != SEC_E_OK)
+ {
+ trace("Error: Setting up the server returned %s, exiting test!\n",
+ getSecError(sec_status));
+ FreeCredentialsHandle(&server_cred);
+ FreeCredentialsHandle(&client_cred);
+ return;
+ }
+
+ setupBuffers(&client_in, &client_out);
+ setupBuffers(&server_in, &server_out);
+
+ sec_status = runClient(&client_cred, &client_ctxt, client_in, client_out,
+ TRUE);
+
+ ok(sec_status == SEC_E_OK || sec_status == SEC_I_CONTINUE_NEEDED,
+ "Running the client returned %s, more tests will fail from now.\n",
+ getSecError(sec_status));
+
+ if(sec_status == SEC_I_CONTINUE_NEEDED)
+ continue_client = TRUE;
+
+ communicate(client_out, server_in);
+
+ sec_status = runServer(&server_cred, &server_ctxt, server_in, server_out,
+ TRUE);
+
+ ok(sec_status == SEC_E_OK || sec_status == SEC_I_CONTINUE_NEEDED,
+ "Running the server returned %s, more tests will fail from now.\n",
+ getSecError(sec_status));
+
+ if(sec_status == SEC_I_CONTINUE_NEEDED)
+ {
+ continue_server = TRUE;
+ communicate(server_out, client_in);
+ }
+
+ if(continue_client)
+ {
+ sec_status = runClient(&client_cred, &client_ctxt, client_in, client_out,
+ FALSE);
+
+ ok(sec_status == SEC_E_OK,
+ "Running the client returned %s, more tests will fail from now.\n",
+ getSecError(sec_status));
+
+ communicate(client_out, server_in);
+ }
+
+ if(continue_server)
+ {
+ sec_status = runServer(&server_cred, &server_ctxt, server_in, server_out,
+ FALSE);
+ ok(sec_status == SEC_E_OK || SEC_E_LOGON_DENIED,
+ "Running the server returned %s.\n", getSecError(sec_status));
+ }
+
+ /* contine writing the test here */
+
+ trace("Before cleanupBuffers\n");
+ cleanupBuffers(client_in, client_out);
+ cleanupBuffers(server_in, server_out);
+
+ trace("After cleanupBuffers\n");
+
+ sec_status = DeleteSecurityContext(&server_ctxt);
+ ok(sec_status == SEC_E_OK, "DeleteSecurityContext(server) returned %s\n",
+ getSecError(sec_status));
+
+ sec_status = DeleteSecurityContext(&client_ctxt);
+ ok(sec_status == SEC_E_OK, "DeleteSecurityContext(client) returned %s\n",
+ getSecError(sec_status));
+
+ sec_status = FreeCredentialsHandle(&server_cred);
+ ok(sec_status == SEC_E_OK, "FreeCredentialsHandle(server) returned %s\n",
+ getSecError(sec_status));
+
+ sec_status = FreeCredentialsHandle(&client_cred);
+ ok(sec_status == SEC_E_OK, "FreeCredentialsHandle(client) returned %s\n",
+ getSecError(sec_status));
+
+}
+
+/**********************************************************************/
+
+void testNTLMAuthWithMissingDomain(void)
+{
+ SECURITY_STATUS sec_status;
+ CredHandle server_cred;
+ CredHandle client_cred;
+ CtxtHandle server_ctxt;
+ CtxtHandle client_ctxt;
+
+ PSecBufferDesc client_in = NULL, client_out = NULL;
+ PSecBufferDesc server_in = NULL, server_out = NULL;
+
+ BOOL continue_client = FALSE, continue_server = FALSE;
+
+ sec_status = setupClient(&client_cred, "testuser", "testpass", NULL);
+
+ if(sec_status != SEC_E_OK)
+ {
+ trace("Error: Setting up the client returned %s, exiting test!\n",
+ getSecError(sec_status));
+ FreeCredentialsHandle(&client_cred);
+ return;
+ }
+
+ sec_status = setupServer(&server_cred);
+
+ if(sec_status != SEC_E_OK)
+ {
+ trace("Error: Setting up the server returned %s, exiting test!\n",
+ getSecError(sec_status));
+ FreeCredentialsHandle(&server_cred);
+ FreeCredentialsHandle(&client_cred);
+ return;
+ }
+
+ setupBuffers(&client_in, &client_out);
+ setupBuffers(&server_in, &server_out);
+
+ sec_status = runClient(&client_cred, &client_ctxt, client_in, client_out,
+ TRUE);
+
+ ok(sec_status == SEC_E_OK || sec_status == SEC_I_CONTINUE_NEEDED,
+ "Running the client returned %s, more tests will fail from now.\n",
+ getSecError(sec_status));
+
+ if(sec_status == SEC_I_CONTINUE_NEEDED)
+ continue_client = TRUE;
+
+ communicate(client_out, server_in);
+
+ sec_status = runServer(&server_cred, &server_ctxt, server_in, server_out,
+ TRUE);
+
+ ok(sec_status == SEC_E_OK || sec_status == SEC_I_CONTINUE_NEEDED,
+ "Running the server returned %s, more tests will fail from now.\n",
+ getSecError(sec_status));
+
+ if(sec_status == SEC_I_CONTINUE_NEEDED)
+ {
+ continue_server = TRUE;
+ communicate(server_out, client_in);
+ }
+
+ if(continue_client)
+ {
+ sec_status = runClient(&client_cred, &client_ctxt, client_in, client_out,
+ FALSE);
+
+ ok(sec_status == SEC_E_OK,
+ "Running the client returned %s, more tests will fail from now.\n",
+ getSecError(sec_status));
+
+ communicate(client_out, server_in);
+ }
+
+ if(continue_server)
+ {
+ sec_status = runServer(&server_cred, &server_ctxt, server_in, server_out,
+ FALSE);
+ ok(sec_status == SEC_E_OK || SEC_E_LOGON_DENIED,
+ "Running the server returned %s.\n", getSecError(sec_status));
+ }
+
+ /* contine writing the test here */
+
+ trace("Before cleanupBuffers\n");
+ cleanupBuffers(client_in, client_out);
+ cleanupBuffers(server_in, server_out);
+
+ trace("After cleanupBuffers\n");
+
+ sec_status = DeleteSecurityContext(&server_ctxt);
+ ok(sec_status == SEC_E_OK, "DeleteSecurityContext(server) returned %s\n",
+ getSecError(sec_status));
+
+ sec_status = DeleteSecurityContext(&client_ctxt);
+ ok(sec_status == SEC_E_OK, "DeleteSecurityContext(client) returned %s\n",
+ getSecError(sec_status));
+
+ sec_status = FreeCredentialsHandle(&server_cred);
+ ok(sec_status == SEC_E_OK, "FreeCredentialsHandle(server) returned %s\n",
+ getSecError(sec_status));
+
+ sec_status = FreeCredentialsHandle(&client_cred);
+ ok(sec_status == SEC_E_OK, "FreeCredentialsHandle(client) returned %s\n",
+ getSecError(sec_status));
+
+}
+
+/**********************************************************************/
+
+void testNTLMAuthWithMissingUserDomain(void)
+{
+ SECURITY_STATUS sec_status;
+ CredHandle server_cred;
+ CredHandle client_cred;
+ CtxtHandle server_ctxt;
+ CtxtHandle client_ctxt;
+
+ PSecBufferDesc client_in = NULL, client_out = NULL;
+ PSecBufferDesc server_in = NULL, server_out = NULL;
+
+ BOOL continue_client = FALSE, continue_server = FALSE;
+
+ sec_status = setupClient(&client_cred, NULL, "testpass", NULL);
+
+ if(sec_status != SEC_E_OK)
+ {
+ trace("Error: Setting up the client returned %s, exiting test!\n",
+ getSecError(sec_status));
+ FreeCredentialsHandle(&client_cred);
+ return;
+ }
+
+ sec_status = setupServer(&server_cred);
+
+ if(sec_status != SEC_E_OK)
+ {
+ trace("Error: Setting up the server returned %s, exiting test!\n",
+ getSecError(sec_status));
+ FreeCredentialsHandle(&server_cred);
+ FreeCredentialsHandle(&client_cred);
+ return;
+ }
+
+ setupBuffers(&client_in, &client_out);
+ setupBuffers(&server_in, &server_out);
+
+ sec_status = runClient(&client_cred, &client_ctxt, client_in, client_out,
+ TRUE);
+
+ ok(sec_status == SEC_E_OK || sec_status == SEC_I_CONTINUE_NEEDED,
+ "Running the client returned %s, more tests will fail from now.\n",
+ getSecError(sec_status));
+
+ if(sec_status == SEC_I_CONTINUE_NEEDED)
+ continue_client = TRUE;
+
+ communicate(client_out, server_in);
+
+ sec_status = runServer(&server_cred, &server_ctxt, server_in, server_out,
+ TRUE);
+
+ ok(sec_status == SEC_E_OK || sec_status == SEC_I_CONTINUE_NEEDED,
+ "Running the server returned %s, more tests will fail from now.\n",
+ getSecError(sec_status));
+
+ if(sec_status == SEC_I_CONTINUE_NEEDED)
+ {
+ continue_server = TRUE;
+ communicate(server_out, client_in);
+ }
+
+ if(continue_client)
+ {
+ sec_status = runClient(&client_cred, &client_ctxt, client_in, client_out,
+ FALSE);
+
+ ok(sec_status == SEC_E_OK,
+ "Running the client returned %s, more tests will fail from now.\n",
+ getSecError(sec_status));
+
+ communicate(client_out, server_in);
+ }
+
+ if(continue_server)
+ {
+ sec_status = runServer(&server_cred, &server_ctxt, server_in, server_out,
+ FALSE);
+ ok(sec_status == SEC_E_OK || SEC_E_LOGON_DENIED,
+ "Running the server returned %s.\n", getSecError(sec_status));
+ }
+
+ /* contine writing the test here */
+
+ trace("Before cleanupBuffers\n");
+ cleanupBuffers(client_in, client_out);
+ cleanupBuffers(server_in, server_out);
+
+ trace("After cleanupBuffers\n");
+
+ sec_status = DeleteSecurityContext(&server_ctxt);
+ ok(sec_status == SEC_E_OK, "DeleteSecurityContext(server) returned %s\n",
+ getSecError(sec_status));
+
+ sec_status = DeleteSecurityContext(&client_ctxt);
+ ok(sec_status == SEC_E_OK, "DeleteSecurityContext(client) returned %s\n",
+ getSecError(sec_status));
+
+ sec_status = FreeCredentialsHandle(&server_cred);
+ ok(sec_status == SEC_E_OK, "FreeCredentialsHandle(server) returned %s\n",
+ getSecError(sec_status));
+
+ sec_status = FreeCredentialsHandle(&client_cred);
+ ok(sec_status == SEC_E_OK, "FreeCredentialsHandle(client) returned %s\n",
+ getSecError(sec_status));
+
+}
+
+START_TEST(ntlm)
+{
+ testNTLMAuthWithUser();
+ testNTLMAuthWithMissingDomain();
+ testNTLMAuthWithMissingUserDomain();
+}
More information about the wine-patches
mailing list