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