Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

409 lines
9.9 KiB

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
params.cxx
Abstract:
Header and parameter parser for digest sspi package.
Author:
Adriaan Canter (adriaanc) 01-Aug-1998
--*/
#include "include.hxx"
// Static parameter map - this must
// agree with PARAM_INDEX.
// BUGBUG - declare const.
LPSTR CParams::szParamMap[] =
{
HOST_SZ,
USER_SZ,
PASS_SZ,
URL_SZ,
METHOD_SZ,
NONCE_SZ,
OPAQUE_SZ,
REALM_SZ,
DOMAIN_SZ,
STALE_SZ,
ALGORITHM_SZ,
QOP_SZ,
MS_LOGOFF_SZ
};
//--------------------------------------------------------------------
// CParams::TrimQuotes
// Inplace trim of one leading and one trailing quote.
// BUGBUG -ppsz
//--------------------------------------------------------------------
VOID CParams::TrimQuotes(LPSTR *psz, LPDWORD pcb)
{
if (*pcb && (**psz == '"'))
{
(*psz)++;
(*pcb)--;
}
if (*pcb && (*(*psz + *pcb - 1) == '"'))
(*pcb)--;
}
//--------------------------------------------------------------------
// CParams::TrimWhiteSpace
// Inplace trim of leading and trailing whitespace.
//--------------------------------------------------------------------
VOID CParams::TrimWhiteSpace(LPSTR *psz, LPDWORD pcb)
{
DWORD cb = *pcb;
CHAR* beg = *psz;
CHAR* end = beg + cb - 1;
while ((cb != 0) && ((*beg == ' ') || (*beg == '\t')))
{
beg++;
cb--;
}
while ((cb != 0) && ((*end == ' ') || (*end == '\t')))
{
end--;
cb--;
}
*psz = beg;
*pcb = cb;
}
//--------------------------------------------------------------------
// CParams::GetDelimitedToken
// Inplace strtok based on one delimiter. Ignores delimiter scoped by quotes.
// bugbug - IN/OUT
//--------------------------------------------------------------------
BOOL CParams::GetDelimitedToken(LPSTR* pszBuf, LPDWORD pcbBuf,
LPSTR* pszTok, LPDWORD pcbTok,
CHAR cDelim)
{
CHAR *pEnd;
BOOL fQuote = FALSE,
fRet = FALSE;
*pcbTok = 0;
*pszTok = *pszBuf;
pEnd = *pszBuf + *pcbBuf - 1;
while (*pcbBuf)
{
if ( ((**pszBuf == cDelim) && !fQuote)
|| (**pszBuf =='\r')
|| (**pszBuf =='\n')
|| (**pszBuf =='\0'))
{
fRet = TRUE;
break;
}
if (**pszBuf == '"')
fQuote = !fQuote;
(*pszBuf)++;
(*pcbBuf)--;
}
// bugbug - OFF BY ONE WHEN NOT TERMINATING WITH A COMMA.
if (fRet)
{
*pcbBuf = (DWORD)(pEnd - *pszBuf);
*pcbTok = (DWORD)(*pszBuf - *pszTok);
if (**pszBuf == cDelim)
(*pszBuf)++;
}
return fRet;
}
//--------------------------------------------------------------------
// CParams::GetKeyValuePair
// Inplace retrieval of key and value from a buffer of form key = <">value<">
//--------------------------------------------------------------------
BOOL CParams::GetKeyValuePair(LPSTR szB, DWORD cbB,
LPSTR* pszK, LPDWORD pcbK,
LPSTR* pszV, LPDWORD pcbV)
{
if (GetDelimitedToken(&szB, &cbB, pszK, pcbK, '='))
{
TrimWhiteSpace(pszK, pcbK);
if (cbB)
{
*pszV = szB;
*pcbV = cbB;
TrimWhiteSpace(pszV, pcbV);
}
else
{
*pszV = NULL;
*pcbV = 0;
}
return TRUE;
}
else
{
*pszK = *pszV = NULL;
*pcbK = *pcbV = 0;
}
return FALSE;
}
//--------------------------------------------------------------------
// CParams::CParams
// BUGBUG - SET A dwstatus variable.
//--------------------------------------------------------------------
CParams::CParams(LPSTR szBuffer)
{
LPSTR szData, szTok, szKey, szValue;
DWORD cbData, cbTok, cbKey, cbValue;
// Zero set the entry array.
memset(_Entry, 0, sizeof(_Entry));
_hWnd = 0;
_cNC = 0;
_fPreAuth = FALSE;
_fCredsSupplied = FALSE;
// May be created with NULL buffer.
if (!szBuffer)
{
_szBuffer = 0;
_cbBuffer = 0;
return;
}
_cbBuffer = strlen(szBuffer) + 1;
_szBuffer = new CHAR[_cbBuffer];
if (_szBuffer)
{
memcpy(_szBuffer, szBuffer, _cbBuffer);
}
else
{
DIGEST_ASSERT(FALSE);
return;
}
szData = _szBuffer;
cbData = _cbBuffer;
DWORD Idx;
while (GetDelimitedToken(&szData, &cbData, &szTok, &cbTok, ','))
{
if (GetKeyValuePair(szTok, cbTok, &szKey, &cbKey, &szValue, &cbValue))
{
TrimQuotes(&szValue, &cbValue);
for (Idx = METHOD; Idx < MAX_PARAMS; Idx++)
{
if (!_strnicmp(szKey, szParamMap[Idx], cbKey)
&& !szParamMap[Idx][cbKey])
{
if (szValue)
{
*(szValue + cbValue) = '\0';
}
_Entry[Idx].szParam = szParamMap[Idx];
_Entry[Idx].szValue = szValue;
_Entry[Idx].cbValue = cbValue;
}
}
}
}
}
//--------------------------------------------------------------------
// CParams::~CParams
// BUGBUG [] for deletes
//--------------------------------------------------------------------
CParams::~CParams()
{
for (DWORD Idx = 0; Idx < MAX_PARAMS; Idx++)
{
if (_Entry[Idx].fAllocated)
delete _Entry[Idx].szValue;
}
if (_szBuffer)
delete _szBuffer;
}
//--------------------------------------------------------------------
// CParams::GetParam
//--------------------------------------------------------------------
LPSTR CParams::GetParam(PARAM_INDEX Idx)
{
return _Entry[Idx].szValue;
}
//--------------------------------------------------------------------
// CParams::GetParam
//--------------------------------------------------------------------
BOOL CParams::GetParam(PARAM_INDEX Idx, LPSTR *pszValue, LPDWORD pcbValue)
{
*pszValue = _Entry[Idx].szValue;
if (!*pszValue)
return FALSE;
*pcbValue = _Entry[Idx].cbValue;
return TRUE;
}
//--------------------------------------------------------------------
// CParams::SetParam
// BUGBUG - []
// AND FIGURE OUT IF EVER CALLED WITH null, 0
//--------------------------------------------------------------------
BOOL CParams::SetParam(PARAM_INDEX Idx, LPSTR szValue, DWORD cbValue)
{
if (_Entry[Idx].fAllocated && _Entry[Idx].szValue)
delete _Entry[Idx].szValue;
if (szValue && cbValue)
{
_Entry[Idx].szValue = new CHAR[cbValue + 1];
if (!_Entry[Idx].szValue)
{
DIGEST_ASSERT(FALSE);
return FALSE;
}
memcpy(_Entry[Idx].szValue, szValue, cbValue);
*(_Entry[Idx].szValue + cbValue) = '\0';
}
_Entry[Idx].cbValue = cbValue;
_Entry[Idx].szParam = szParamMap[Idx];
_Entry[Idx].fAllocated = TRUE;
return TRUE;
}
//--------------------------------------------------------------------
// CParams::GetHwnd
//--------------------------------------------------------------------
HWND CParams::GetHwnd()
{
return _hWnd;
}
//--------------------------------------------------------------------
// CParams::SetHwnd
//--------------------------------------------------------------------
BOOL CParams::SetHwnd(HWND* phWnd)
{
_hWnd = phWnd ? *phWnd : GetActiveWindow();
return TRUE;
}
//--------------------------------------------------------------------
// CParams::SetNC
//--------------------------------------------------------------------
VOID CParams::SetNC(DWORD* pcNC)
{
_cNC = *pcNC;
}
//--------------------------------------------------------------------
// CParams::GetNC
//--------------------------------------------------------------------
DWORD CParams::GetNC()
{
return _cNC;
}
//--------------------------------------------------------------------
// CParams::SetPreAuth
//--------------------------------------------------------------------
VOID CParams::SetPreAuth(BOOL fPreAuth)
{
_fPreAuth = fPreAuth;
}
//--------------------------------------------------------------------
// CParams::IsPreAuth
//--------------------------------------------------------------------
BOOL CParams::IsPreAuth()
{
return _fPreAuth;
}
//--------------------------------------------------------------------
// CParams::SetMd5Sess
//--------------------------------------------------------------------
VOID CParams::SetMd5Sess(BOOL fMd5Sess)
{
_fMd5Sess = fMd5Sess;
}
//--------------------------------------------------------------------
// CParams::IsMd5Sess
//--------------------------------------------------------------------
BOOL CParams::IsMd5Sess()
{
return _fMd5Sess;
}
//--------------------------------------------------------------------
// CParams::SetCredsSupplied
//--------------------------------------------------------------------
VOID CParams::SetCredsSupplied(BOOL fCredsSupplied)
{
_fCredsSupplied = fCredsSupplied;
}
//--------------------------------------------------------------------
// CParams::AreCredsSupplied
//--------------------------------------------------------------------
BOOL CParams::AreCredsSupplied()
{
return _fCredsSupplied;
}
//--------------------------------------------------------------------
// CParams::FindToken
// Returns TRUE if non-ws token is found in comma delmited string.
//--------------------------------------------------------------------
BOOL CParams::FindToken(LPSTR szBuf, DWORD cbBuf, LPSTR szMatch, DWORD cbMatch, LPSTR *pszPtr)
{
LPSTR ptr = szBuf, szTok;
DWORD cb = cbBuf, cbTok;
while (GetDelimitedToken(&ptr, &cb, &szTok, &cbTok, ','))
{
TrimWhiteSpace(&szTok, &cbTok);
if (!_strnicmp(szTok, szMatch, cbMatch) && (cbTok == cbMatch))
{
if (pszPtr)
*pszPtr = szTok;
return TRUE;
}
}
return FALSE;
}