Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

232 lines
6.3 KiB

#include "stdafx.h"
#include "common.h"
#include "coauth.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
BOOL
EqualAuthInfo(
COAUTHINFO* pAuthInfo,
COAUTHINFO* pAuthInfoOther)
{
if ( pAuthInfo && pAuthInfoOther )
{
if ( (pAuthInfo->dwAuthnSvc != pAuthInfoOther->dwAuthnSvc) ||
(pAuthInfo->dwAuthzSvc != pAuthInfoOther->dwAuthzSvc) ||
(pAuthInfo->dwAuthnLevel != pAuthInfoOther->dwAuthnLevel) ||
(pAuthInfo->dwImpersonationLevel != pAuthInfoOther->dwImpersonationLevel) ||
(pAuthInfo->dwCapabilities != pAuthInfoOther->dwCapabilities) )
{
return FALSE;
}
// only compare pwszServerPrincName's if they're both specified
if (pAuthInfo->pwszServerPrincName && pAuthInfoOther->pwszServerPrincName)
{
if ( lstrcmpW(pAuthInfo->pwszServerPrincName,
pAuthInfoOther->pwszServerPrincName) != 0 )
{
return FALSE;
}
}
else
{
// if one was NULL, both should be NULL for equality
if (pAuthInfo->pwszServerPrincName != pAuthInfoOther->pwszServerPrincName)
{
return FALSE;
}
}
// we never cache authid, so one of them must be NULL
ASSERT(!(pAuthInfo->pAuthIdentityData && pAuthInfoOther->pAuthIdentityData));
if (pAuthInfo->pAuthIdentityData || pAuthInfoOther->pAuthIdentityData)
{
return FALSE;
}
}
else
{
if ( pAuthInfo != pAuthInfoOther )
{
return FALSE;
}
}
return TRUE;
}
HRESULT
CopyServerInfoStruct(
IN COSERVERINFO * pServerInfoSrc,
IN COSERVERINFO * pServerInfoDest
)
{
HRESULT hr = E_OUTOFMEMORY;
if (pServerInfoSrc == NULL)
{
return S_OK;
}
if (pServerInfoDest == NULL)
{
return E_POINTER;
}
CopyMemory(pServerInfoDest, pServerInfoSrc, sizeof(COSERVERINFO));
// We need to allocate these fields and make a copy
pServerInfoDest->pwszName = NULL;
// only alloc space for pwszServerPrincName if its non-null
if (pServerInfoSrc->pwszName)
{
pServerInfoDest->pwszName =
(LPWSTR) LocalAlloc(LPTR,(lstrlenW(pServerInfoSrc->pwszName) + 1) * sizeof(WCHAR));
if (!pServerInfoDest->pwszName)
goto Cleanup;
lstrcpyW(pServerInfoDest->pwszName, pServerInfoSrc->pwszName);
}
pServerInfoDest->pAuthInfo = NULL;
hr = S_OK;
Cleanup:
return hr;
}
HRESULT
CopyAuthInfoStruct(
IN COAUTHINFO * pAuthInfoSrc,
IN COAUTHINFO * pAuthInfoDest
)
{
HRESULT hr = E_OUTOFMEMORY;
if (pAuthInfoSrc == NULL)
{
return S_OK;
}
if (pAuthInfoDest == NULL)
{
return E_POINTER;
}
CopyMemory(pAuthInfoDest, pAuthInfoSrc, sizeof(COAUTHINFO));
// We need to allocate these fields and make a copy
pAuthInfoDest->pwszServerPrincName = NULL;
pAuthInfoDest->pAuthIdentityData = NULL;
// only alloc space for pwszServerPrincName if its non-null
if (pAuthInfoSrc->pwszServerPrincName)
{
pAuthInfoDest->pwszServerPrincName =
(LPWSTR) LocalAlloc(LPTR,(lstrlenW(pAuthInfoSrc->pwszServerPrincName) + 1) * sizeof(WCHAR));
if (!pAuthInfoDest->pwszServerPrincName)
goto Cleanup;
lstrcpyW(pAuthInfoDest->pwszServerPrincName, pAuthInfoSrc->pwszServerPrincName);
}
pAuthInfoDest->pAuthIdentityData = NULL;
hr = S_OK;
Cleanup:
return hr;
}
HRESULT
CopyAuthIdentityStruct(
IN COAUTHIDENTITY * pAuthIdentSrc,
IN COAUTHIDENTITY * pAuthIdentDest
)
{
HRESULT hr = E_OUTOFMEMORY;
ULONG ulCharLen = 1;
if (pAuthIdentSrc == NULL)
{
hr = E_POINTER;
goto Cleanup;
}
if (pAuthIdentDest == NULL)
{
hr = E_POINTER;
goto Cleanup;
}
// Guard against both being set, although presumably this would have
// caused grief before we got to this point.
if ((pAuthIdentSrc->Flags & SEC_WINNT_AUTH_IDENTITY_UNICODE) &&
(pAuthIdentSrc->Flags & SEC_WINNT_AUTH_IDENTITY_ANSI))
{
ASSERT(0 && "Both string type flags were set!");
hr = E_UNEXPECTED;
goto Cleanup;
}
if (pAuthIdentSrc->Flags & SEC_WINNT_AUTH_IDENTITY_UNICODE)
{
ulCharLen = sizeof(WCHAR);
}
else if (pAuthIdentSrc->Flags & SEC_WINNT_AUTH_IDENTITY_ANSI)
{
ulCharLen = sizeof(CHAR);
}
else
{
// The user didn't specify either string bit? How did we get here?
ASSERT(0 && "String type flag was not set!");
hr = E_UNEXPECTED;
goto Cleanup;
}
CopyMemory(pAuthIdentDest, pAuthIdentSrc, sizeof(COAUTHIDENTITY));
// Strings need to be allocated individually and copied
pAuthIdentDest->User = pAuthIdentDest->Domain = pAuthIdentDest->Password = NULL;
if (pAuthIdentSrc->User)
{
pAuthIdentDest->User = (USHORT *)LocalAlloc(LPTR,(pAuthIdentDest->UserLength+1) * ulCharLen);
if (!pAuthIdentDest->User)
goto Cleanup;
CopyMemory(pAuthIdentDest->User, pAuthIdentSrc->User, (pAuthIdentDest->UserLength+1) * ulCharLen);
}
if (pAuthIdentSrc->Domain)
{
pAuthIdentDest->Domain = (USHORT *)LocalAlloc(LPTR,(pAuthIdentDest->DomainLength+1) * ulCharLen);
if (!pAuthIdentDest->Domain)
goto Cleanup;
CopyMemory(pAuthIdentDest->Domain, pAuthIdentSrc->Domain, (pAuthIdentDest->DomainLength+1) * ulCharLen);
}
if (pAuthIdentSrc->Password)
{
pAuthIdentDest->Password = (USHORT *)LocalAlloc(LPTR,(pAuthIdentDest->PasswordLength+1) * ulCharLen);
if (!pAuthIdentDest->Password)
goto Cleanup;
CopyMemory(pAuthIdentDest->Password, pAuthIdentSrc->Password, (pAuthIdentDest->PasswordLength+1) * ulCharLen);
}
hr = S_OK;
Cleanup:
return hr;
}