|
|
/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/
/*
eaphlp.cpp FILE HISTORY: */
#include <precompiled.h>
#include <afxtempl.h>
#include <winldap.h>
#include "eaphlp.h"
#include "resource.h"
#include "lm.h"
#include "dsrole.h"
#include "lmserver.h"
#include "tregkey.h"
/*!--------------------------------------------------------------------------
HrIsStandaloneServer Returns S_OK if the machine name passed in is a standalone server, or if pszMachineName is S_FALSE.
Returns FALSE otherwise. Author: WeiJiang ---------------------------------------------------------------------------*/ HRESULT HrIsStandaloneServer(LPCWSTR pMachineName) { DWORD netRet = 0; HRESULT hr = S_OK; DSROLE_PRIMARY_DOMAIN_INFO_BASIC* pdsRole = NULL;
netRet = DsRoleGetPrimaryDomainInformation(pMachineName, DsRolePrimaryDomainInfoBasic, (LPBYTE*)&pdsRole);
if(netRet != 0) { hr = HRESULT_FROM_WIN32(netRet); goto L_ERR; }
ASSERT(pdsRole); // if the machine is not a standalone server
if(pdsRole->MachineRole != DsRole_RoleStandaloneServer) { hr = S_FALSE; } L_ERR: if(pdsRole) DsRoleFreeMemory(pdsRole);
return hr; }
#undef CONST_STRING
#undef CONST_STRINGA
#undef CONST_STRINGW
#define _STRINGS_DEFINE_STRINGS
#ifdef _STRINGS_DEFINE_STRINGS
#define CONST_STRING(rg,s) const TCHAR rg[] = TEXT(s);
#define CONST_STRINGA(rg,s) const char rg[] = s;
#define CONST_STRINGW(rg,s) const WCHAR rg[] = s;
#else
#define CONST_STRING(rg,s) extern const TCHAR rg[];
#define CONST_STRINGA(rg,s) extern const char rg[];
#define CONST_STRINGW(rg,s) extern const WCHAR rg[];
#endif
CONST_STRING(c_szRasmanPPPKey, "System\\CurrentControlSet\\Services\\Rasman\\PPP") CONST_STRING(c_szEAP, "EAP") CONST_STRING(c_szConfigCLSID, "ConfigCLSID") CONST_STRING(c_szFriendlyName, "FriendlyName") CONST_STRING(c_szMPPEEncryptionSupported, "MPPEEncryptionSupported") CONST_STRING(c_szStandaloneSupported, "StandaloneSupported")
// EAP helper functions
HRESULT LoadEapProviders(HKEY hkeyBase, AuthProviderArray *pProvList, BOOL bStandAlone);
HRESULT GetEapProviders(LPCTSTR pServerName, AuthProviderArray *pProvList) { RegKey m_regkeyRasmanPPP; RegKey regkeyEap; DWORD dwErr = ERROR_SUCCESS; HRESULT hr = S_OK;
BOOL bStandAlone = ( S_OK == HrIsStandaloneServer(pServerName));
// Get the list of EAP providers
// ----------------------------------------------------------------
dwErr = m_regkeyRasmanPPP.Open(HKEY_LOCAL_MACHINE,c_szRasmanPPPKey,KEY_ALL_ACCESS,pServerName); if ( ERROR_SUCCESS == dwErr ) { if ( ERROR_SUCCESS == regkeyEap.Open(m_regkeyRasmanPPP, c_szEAP) ) hr = LoadEapProviders(regkeyEap, pProvList, bStandAlone); } else hr = HRESULT_FROM_WIN32(dwErr);
return hr; }
/*!--------------------------------------------------------------------------
DATA_SRV_AUTH::LoadEapProviders - Author: KennT ---------------------------------------------------------------------------*/ HRESULT LoadEapProviders(HKEY hkeyBase, AuthProviderArray *pProvList, BOOL bStandAlone) { RegKey regkeyProviders; HRESULT hr = S_OK; HRESULT hrIter; RegKeyIterator regkeyIter; CString stKey; RegKey regkeyProv; AuthProviderData data; DWORD dwErr; DWORD dwData;
ASSERT(hkeyBase); ASSERT(pProvList);
// Open the providers key
// ----------------------------------------------------------------
regkeyProviders.Attach(hkeyBase);
hr = regkeyIter.Init(®keyProviders);
if (hr != S_OK) goto L_ERR;
for ( hrIter=regkeyIter.Next(&stKey); hrIter == S_OK; hrIter=regkeyIter.Next(&stKey), regkeyProv.Close() ) { // Open the key
// ------------------------------------------------------------
dwErr = regkeyProv.Open(regkeyProviders, stKey, KEY_READ); if ( dwErr != ERROR_SUCCESS ) continue;
// Initialize the data structure
// ------------------------------------------------------------
data.m_stKey = stKey; data.m_stTitle.Empty(); data.m_stConfigCLSID.Empty(); data.m_stGuid.Empty(); data.m_fSupportsEncryption = FALSE; data.m_dwStandaloneSupported = 0;
// Read in the values that we require
// ------------------------------------------------------------
regkeyProv.QueryValue(c_szFriendlyName, data.m_stTitle); regkeyProv.QueryValue(c_szConfigCLSID, data.m_stConfigCLSID); regkeyProv.QueryValue(c_szMPPEEncryptionSupported, dwData); data.m_fSupportsEncryption = (dwData != 0);
// Read in the standalone supported value.
// ------------------------------------------------------------
if (S_OK != regkeyProv.QueryValue(c_szStandaloneSupported, dwData)) dwData = 1; // the default
data.m_dwStandaloneSupported = dwData;
if(dwData == 0 /* standalone not supported */ && bStandAlone) ; else pProvList->Add(data); }
L_ERR: regkeyProviders.Detach(); return hr; }
|