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.
 
 
 
 
 
 

598 lines
20 KiB

#include "precomp.h"
#include "rsopsec.h"
#include <urlmon.h>
#include <wininet.h>
#ifdef WINNT
#include <winineti.h>
#endif // WINNT
#define REGSTR_PRIVACYPS_PATH TEXT("Software\\Policies\\Microsoft\\Internet Explorer")
#define REGSTR_PRIVACYPS_VALU TEXT("PrivacyAddRemoveSites")
#define ENABLEAPPLY(hDlg) SendMessage( GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L )
typedef struct {
DWORD dwType; // what is the type of lParam? is it an unknown passed in with a
// property page addition (0), passed in with a
// DialogBoxParam call (1), or a new IEPROPPAGEINFO2 ptr for RSoP(2)?
LPARAM lParam;
} INETCPL_PPAGE_LPARAM, *LPINETCPL_PPAGE_LPARAM;
// structure to pass info to the control panel
typedef struct {
UINT cbSize; // size of the structure
DWORD dwFlags; // enabled page flags (remove pages)
LPSTR pszCurrentURL; // the current URL (NULL=none)
DWORD dwRestrictMask; // disable sections of the control panel
DWORD dwRestrictFlags; // masking for the above
} IEPROPPAGEINFO, *LPIEPROPPAGEINFO;
// structure to pass info to the control panel
// The RSOP field(s) should eventually be moved to the original
// IEPROPPAGEINFO struct and this structure can be removed
typedef struct {
LPIEPROPPAGEINFO piepi;
BSTR bstrRSOPNamespace;
} IEPROPPAGEINFO2, *LPIEPROPPAGEINFO2;
///////////////////////////////////////////////////////////////////////////////////////
//
// Advanced privacy settings dialog
//
// We store the advanced settings in the privacy slider struct because it
// can be easily retrieved from the main privacy dlg. Either we need to
// pass RSoP data from the main dlg to the advanced dlg, or we need to query
// WMI twice. Since WMI queries are slow, we'll do the former.
//
///////////////////////////////////////////////////////////////////////////////////////
typedef struct _privslider {
DWORD_PTR dwLevel;
BOOL fAdvanced;
BOOL fCustom;
HFONT hfontBolded;
BOOL fEditDisabled;
DWORD dwTemplateFirst;
WCHAR szSessionFirst[MAX_PATH];
DWORD dwTemplateThird;
WCHAR szSessionThird[MAX_PATH];
} PRIVSLIDER, *PPRIVSLIDER;
DWORD MapPrefToIndex(WCHAR wcPref)
{
switch(wcPref)
{
case 'r': return 1; // reject
case 'p': return 2; // prompt
default: return 0; // default is accept
}
}
WCHAR MapRadioToPref(HWND hDlg, DWORD dwResource)
{
if(IsDlgButtonChecked(hDlg, dwResource + 1)) // deny
{
return 'r';
}
if(IsDlgButtonChecked(hDlg, dwResource + 2)) // prompt
{
return 'p';
}
// deafult is accept
return 'a';
}
void OnAdvancedInit(HWND hDlg, HWND hwndPrivPage)
{
BOOL fSession = FALSE;
DWORD dwFirst = IDC_FIRST_ACCEPT;
DWORD dwThird = IDC_THIRD_ACCEPT;
PPRIVSLIDER pData = NULL;
// if we're not in RSoP mode, this returns NULL
pData = (PPRIVSLIDER)GetWindowLongPtr(hwndPrivPage, DWLP_USER);
if(NULL != pData && pData->fAdvanced)
{
WCHAR szBuffer[MAX_PATH];
// MAX_PATH is sufficent for advanced mode setting strings, MaxPrivacySettings is overkill.
LPWSTR pszBuffer = szBuffer;
WCHAR *pszAlways;
DWORD dwError = (DWORD)-1L; // anything but ERROR_SUCCESS
//
// turn on advanced check box
//
CheckDlgButton(hDlg, IDC_USE_ADVANCED, TRUE);
//
// Figure out first party setting and session
//
pszBuffer = pData->szSessionFirst;
if (0 != pszBuffer[0])
dwError = ERROR_SUCCESS;
if(ERROR_SUCCESS == dwError)
{
pszAlways = StrStrW(pszBuffer, L"always=");
if(pszAlways)
{
dwFirst = IDC_FIRST_ACCEPT + MapPrefToIndex(*(pszAlways + 7));
}
if(StrStrW(pszBuffer, L"session"))
{
fSession = TRUE;
}
}
//
// Figure out third party setting
//
pszBuffer = pData->szSessionThird;
if (0 != pszBuffer[0])
dwError = ERROR_SUCCESS;
if(ERROR_SUCCESS == dwError)
{
WCHAR *pszAlways;
pszAlways = StrStrW(pszBuffer, L"always=");
if(pszAlways)
{
dwThird = IDC_THIRD_ACCEPT + MapPrefToIndex(*(pszAlways + 7));
}
}
}
CheckRadioButton(hDlg, IDC_FIRST_ACCEPT, IDC_FIRST_PROMPT, dwFirst);
CheckRadioButton(hDlg, IDC_THIRD_ACCEPT, IDC_THIRD_PROMPT, dwThird);
CheckDlgButton( hDlg, IDC_SESSION_OVERRIDE, fSession);
}
void OnAdvancedEnable(HWND hDlg)
{
EnableWindow(GetDlgItem(hDlg, IDC_USE_ADVANCED), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_FIRST_ACCEPT), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_FIRST_DENY), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_FIRST_PROMPT), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_THIRD_ACCEPT), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_THIRD_DENY), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_THIRD_PROMPT), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_SESSION_OVERRIDE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TX_FIRST), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_TX_THIRD), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_EDIT), FALSE);
}
INT_PTR CALLBACK PrivAdvancedDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
OnAdvancedInit(hDlg, (HWND)lParam);
OnAdvancedEnable(hDlg);
return TRUE;
case WM_HELP: // F1
// ResWinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE,
// HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
break;
case WM_CONTEXTMENU: // right mouse click
// ResWinHelp( (HWND) wParam, IDS_HELPFILE,
// HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
// fall through
case IDCANCEL:
EndDialog(hDlg, IDOK == LOWORD(wParam));
return 0;
case IDC_FIRST_ACCEPT:
case IDC_FIRST_PROMPT:
case IDC_FIRST_DENY:
CheckRadioButton(hDlg, IDC_FIRST_ACCEPT, IDC_FIRST_PROMPT, LOWORD(wParam));
return 0;
case IDC_THIRD_ACCEPT:
case IDC_THIRD_PROMPT:
case IDC_THIRD_DENY:
CheckRadioButton(hDlg, IDC_THIRD_ACCEPT, IDC_THIRD_PROMPT, LOWORD(wParam));
return 0;
case IDC_USE_ADVANCED:
OnAdvancedEnable(hDlg);
return 0;
case IDC_PRIVACY_EDIT:
// DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_PRIVACY_PERSITE),
// hDlg, PrivPerSiteDlgProc);
return 0;
}
break;
}
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////////////
//
// Privacy pane
//
///////////////////////////////////////////////////////////////////////////////////////
#define PRIVACY_LEVELS 6
#define SLIDER_LEVEL_CUSTOM 6
TCHAR szPrivacyLevel[PRIVACY_LEVELS + 1][30];
TCHAR szPrivacyDescription[PRIVACY_LEVELS + 1][300];
void EnablePrivacyControls(HWND hDlg, BOOL fCustom)
{
WCHAR szBuffer[256];
if( fCustom)
LoadString( g_hInstance, IDS_PRIVACY_SLIDERCOMMANDDEF, szBuffer, ARRAYSIZE( szBuffer));
else
LoadString( g_hInstance, IDS_PRIVACY_SLIDERCOMMANDSLIDE, szBuffer, ARRAYSIZE( szBuffer));
SendMessage(GetDlgItem(hDlg, IDC_PRIVACY_SLIDERCOMMAND), WM_SETTEXT,
0, (LPARAM)szBuffer);
// slider disabled when custom
EnableWindow(GetDlgItem(hDlg, IDC_LEVEL_SLIDER), !fCustom);
ShowWindow(GetDlgItem(hDlg, IDC_LEVEL_SLIDER), !fCustom);
// disable controls if in read-only mode
EnableWindow(GetDlgItem(hDlg, IDC_LEVEL_SLIDER), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_DEFAULT), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_IMPORT), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_IMPORT), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_ADVANCED), fCustom);
if (fCustom)
{
// Give advanced button focus since slider is disabled
SendMessage( hDlg, WM_NEXTDLGCTL,
(WPARAM)GetDlgItem( hDlg, IDC_PRIVACY_ADVANCED),
MAKELPARAM( TRUE, 0));
}
}
/////////////////////////////////////////////////////////////////////
HRESULT OnPrivacyInitRSoP(CDlgRSoPData *pDRD, PPRIVSLIDER pData)
{
HRESULT hr = E_FAIL;
__try
{
pData->fAdvanced = FALSE;
BSTR bstrClass = SysAllocString(L"RSOP_IEPrivacySettings");
BSTR bstrPrecedenceProp = SysAllocString(L"rsopPrecedence");
if (NULL != bstrClass && NULL != bstrPrecedenceProp)
{
WCHAR wszObjPath[128];
DWORD dwCurGPOPrec = pDRD->GetImportedSecZonesPrec();
// create the object path of this privacy instance for this GPO
wnsprintf(wszObjPath, countof(wszObjPath),
L"RSOP_IEPrivacySettings.rsopID=\"IEAK\",rsopPrecedence=%ld", dwCurGPOPrec);
_bstr_t bstrObjPath = wszObjPath;
ComPtr<IWbemClassObject> pPrivObj = NULL;
ComPtr<IWbemServices> pWbemServices = pDRD->GetWbemServices();
hr = pWbemServices->GetObject(bstrObjPath, 0L, NULL, (IWbemClassObject**)&pPrivObj, NULL);
if (SUCCEEDED(hr))
{
BOOL fPrivacyHandled = FALSE; // unused
// useAdvancedSettings field
pData->fAdvanced = GetWMIPropBool(pPrivObj,
L"useAdvancedSettings",
pData->fAdvanced,
fPrivacyHandled);
// firstPartyPrivacyType field
pData->dwTemplateFirst = GetWMIPropUL(pPrivObj,
L"firstPartyPrivacyType",
pData->dwTemplateFirst,
fPrivacyHandled);
// firstPartyPrivacyTypeText field
GetWMIPropPWSTR(pPrivObj, L"firstPartyPrivacyTypeText",
pData->szSessionFirst, ARRAYSIZE(pData->szSessionFirst),
NULL, fPrivacyHandled);
// thirdPartyPrivacyType field
pData->dwTemplateThird = GetWMIPropUL(pPrivObj,
L"thirdPartyPrivacyType",
pData->dwTemplateThird,
fPrivacyHandled);
// thirdPartyPrivacyTypeText field
GetWMIPropPWSTR(pPrivObj, L"thirdPartyPrivacyTypeText",
pData->szSessionThird, ARRAYSIZE(pData->szSessionThird),
NULL, fPrivacyHandled);
}
SysFreeString(bstrClass);
SysFreeString(bstrPrecedenceProp);
}
}
__except(TRUE)
{
}
return hr;
}
/////////////////////////////////////////////////////////////////////
PPRIVSLIDER OnPrivacyInit(HWND hDlg, CDlgRSoPData *pDRD)
{
DWORD i;
PPRIVSLIDER pData;
DWORD dwRet, dwType, dwSize, dwValue;
// allocate storage for the font and current level
pData = new PRIVSLIDER;
if(NULL == pData)
{
// doh
return NULL;
}
pData->dwLevel = (DWORD)-1L;
pData->hfontBolded = NULL;
pData->fAdvanced = FALSE;
pData->fCustom = FALSE;
pData->fEditDisabled = FALSE;
// data stored in slider struct to pass RSoP data to advanced dlg
pData->dwTemplateFirst = PRIVACY_TEMPLATE_CUSTOM;
pData->szSessionFirst[0] = 0;
pData->dwTemplateThird = PRIVACY_TEMPLATE_CUSTOM;
pData->szSessionThird[0] = 0;
//
// Init RSoP variables
//
OnPrivacyInitRSoP(pDRD, pData);
//
// Set the font of the name to the bold font
//
// find current font
HFONT hfontOrig = (HFONT) SendDlgItemMessage(hDlg, IDC_LEVEL, WM_GETFONT, (WPARAM) 0, (LPARAM) 0);
if(hfontOrig == NULL)
hfontOrig = (HFONT) GetStockObject(SYSTEM_FONT);
// build bold font
if(hfontOrig)
{
LOGFONT lfData;
if(GetObject(hfontOrig, sizeof(lfData), &lfData) != 0)
{
// The distance from 400 (normal) to 700 (bold)
lfData.lfWeight += 300;
if(lfData.lfWeight > 1000)
lfData.lfWeight = 1000;
pData->hfontBolded = CreateFontIndirect(&lfData);
if(pData->hfontBolded)
{
// the zone level and zone name text boxes should have the same font, so this is okat
SendDlgItemMessage(hDlg, IDC_LEVEL, WM_SETFONT, (WPARAM) pData->hfontBolded, (LPARAM) MAKELPARAM(FALSE, 0));
}
}
}
// initialize slider
SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_SETRANGE, (WPARAM) (BOOL) FALSE, (LPARAM) MAKELONG(0, PRIVACY_LEVELS - 1));
SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_SETTICFREQ, (WPARAM) 1, (LPARAM) 0);
// initialize strings for levels and descriptions
for(i=0; i<PRIVACY_LEVELS + 1; i++)
{
LoadString(g_hInstance, IDS_PRIVACY_LEVEL_NO_COOKIE + i, szPrivacyLevel[i], ARRAYSIZE(szPrivacyLevel[i]));
LoadString(g_hInstance, IDS_PRIVACY_DESC_NO_COOKIE + i, szPrivacyDescription[i], ARRAYSIZE(szPrivacyDescription[i]));
}
//
// Get current internet privacy level
//
if(pData->dwTemplateFirst == pData->dwTemplateThird &&
pData->dwTemplateFirst != PRIVACY_TEMPLATE_CUSTOM)
{
// matched template values, set slider to template level
pData->dwLevel = pData->dwTemplateFirst;
if(pData->dwTemplateFirst == PRIVACY_TEMPLATE_ADVANCED)
{
pData->fAdvanced = TRUE;
pData->dwLevel = SLIDER_LEVEL_CUSTOM;
}
}
else
{
// make custom end of list
pData->dwLevel = SLIDER_LEVEL_CUSTOM;
pData->fCustom = TRUE;
}
// move slider to right spot
SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pData->dwLevel);
// Enable stuff based on mode
EnablePrivacyControls(hDlg, ((pData->fAdvanced) || (pData->fCustom)));
// save off struct
SetWindowLongPtr(hDlg, DWLP_USER, (DWORD_PTR)pData);
dwRet = SHGetValue(HKEY_CURRENT_USER, REGSTR_PRIVACYPS_PATH, REGSTR_PRIVACYPS_VALU, &dwType, &dwValue, &dwSize);
if (ERROR_SUCCESS == dwRet && 1 == dwValue && REG_DWORD == dwType)
{
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_EDIT), FALSE);
pData->fEditDisabled = TRUE;
}
return pData;
}
void OnPrivacySlider(HWND hDlg, PPRIVSLIDER pData, CDlgRSoPData *pDRD = NULL)
{
DWORD dwPos;
if(pData->fCustom || pData->fAdvanced)
{
dwPos = SLIDER_LEVEL_CUSTOM;
}
else
{
dwPos = (DWORD)SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_GETPOS, 0, 0);
if(dwPos != pData->dwLevel)
{
ENABLEAPPLY(hDlg);
}
if (NULL == pDRD)
{
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_DEFAULT),
(dwPos != PRIVACY_TEMPLATE_MEDIUM) ? TRUE : FALSE);
}
}
if (NULL != pDRD ||
PRIVACY_TEMPLATE_NO_COOKIES == dwPos || PRIVACY_TEMPLATE_LOW == dwPos || pData->fEditDisabled)
{
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_EDIT), FALSE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_EDIT), TRUE);
}
// on Mouse Move, change the level description only
SetDlgItemText(hDlg, IDC_LEVEL_DESCRIPTION, szPrivacyDescription[dwPos]);
SetDlgItemText(hDlg, IDC_LEVEL, szPrivacyLevel[dwPos]);
}
INT_PTR CALLBACK PrivacyDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PPRIVSLIDER pData = (PPRIVSLIDER)GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg)
{
case WM_INITDIALOG:
{
// IEAK team needs additional info passed in for RSoP, so they're making
// use of lParam, which doesn't seem to be used as per the comments above
// Retrieve Property Sheet Page info
CDlgRSoPData *pDRD = (CDlgRSoPData*)((LPPROPSHEETPAGE)lParam)->lParam;
// The dlg needs to store the RSoP and other info for later use, particularly
// for the advanced dlg
// On second thought, all the info is stored in the pData variable - never mind.
// HWND hwndPSheet = GetParent(hDlg);
// SetWindowLongPtr(hwndPSheet, GWLP_USERDATA, (LONG_PTR)pDRD);
// initialize slider
pData = OnPrivacyInit(hDlg, pDRD);
if(pData)
OnPrivacySlider(hDlg, pData, pDRD);
return TRUE;
}
case WM_VSCROLL:
// Slider Messages
OnPrivacySlider(hDlg, pData);
return TRUE;
case WM_NOTIFY:
{
NMHDR *lpnm = (NMHDR *) lParam;
ASSERT(lpnm);
switch (lpnm->code)
{
case PSN_QUERYCANCEL:
case PSN_KILLACTIVE:
case PSN_RESET:
return TRUE;
case PSN_APPLY:
break;
}
break;
}
case WM_DESTROY:
{
if(pData)
{
if(pData->hfontBolded)
DeleteObject(pData->hfontBolded);
delete pData;
}
break;
}
case WM_HELP: // F1
// ResWinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE,
// HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
break;
case WM_CONTEXTMENU: // right mouse click
// ResWinHelp( (HWND) wParam, IDS_HELPFILE,
// HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_PRIVACY_DEFAULT:
return 0;
case IDC_PRIVACY_ADVANCED:
{
// show advanced, pass in hDlg as lparam so we can get to this prop page's data
if( DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_PRIVACY_ADVANCED),
hDlg, PrivAdvancedDlgProc, (LPARAM)hDlg))
{
}
return 0;
}
case IDC_PRIVACY_IMPORT:
return 0;
case IDC_PRIVACY_EDIT:
// DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_PRIVACY_PERSITE),
// hDlg, PrivPerSiteDlgProc);
return 0;
}
break;
}
return FALSE;
}