1593 lines
51 KiB
C++
1593 lines
51 KiB
C++
//*********************************************************************
|
|
//* Microsoft Windows **
|
|
//* Copyright(c) Microsoft Corp., 1995 **
|
|
//*********************************************************************
|
|
|
|
//
|
|
// PRIVACY.cpp - "Privacy" Property Sheet and support dialogs
|
|
//
|
|
|
|
// HISTORY:
|
|
//
|
|
// 2/26/2001 darrenmi new code
|
|
// 4/05/2001 jeffdav did per-site cookie dialog ui stuff
|
|
|
|
#include "inetcplp.h"
|
|
|
|
#include <urlmon.h>
|
|
#include <mluisupp.h>
|
|
|
|
#include <htmlhelp.h>
|
|
|
|
BOOL DeleteCacheCookies();
|
|
INT_PTR CALLBACK EmptyCacheCookiesDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
|
|
#define REGSTR_PATH_SETTINGS TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings")
|
|
#define REGSTR_VAL_PRIVADV TEXT("PrivacyAdvanced")
|
|
|
|
#define REGSTR_PRIVACYPS_PATHEDIT TEXT("Software\\Policies\\Microsoft\\Internet Explorer")
|
|
#define REGSTR_PRIVACYPS_VALUEDIT TEXT("PrivacyAddRemoveSites") // this key is duplicated in shdocvw\privacyui.cpp
|
|
|
|
#define REGSTR_PRIVACYPS_PATHPANE TEXT("Software\\Policies\\Microsoft\\Internet Explorer\\Control Panel")
|
|
#define REGSTR_PRIVACYPS_VALUPANE TEXT("Privacy Settings") // this key is duplicated in shdocvw\privacyui.cpp
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Per-site list dialog
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Per-site list utility function to minimize the domain name
|
|
//
|
|
|
|
WCHAR *GetMinCookieDomainFromUrl(WCHAR *bstrFullUrl)
|
|
{
|
|
WCHAR *pMinimizedDomain = NULL;
|
|
|
|
if(bstrFullUrl == NULL)
|
|
goto doneGetMinimizedCookieDomain;
|
|
|
|
if(bstrFullUrl[0] == '\0')
|
|
goto doneGetMinimizedCookieDomain;
|
|
|
|
WCHAR *pBeginUrl = bstrFullUrl;
|
|
|
|
WCHAR *pEndUrl = pBeginUrl; // pEndUrl will find the '/path/path..' and clip it from pBeginUrl
|
|
|
|
while(*pEndUrl != L'\0' && *pEndUrl != L'/')
|
|
pEndUrl++;
|
|
|
|
*pEndUrl = L'\0';
|
|
pMinimizedDomain = pEndUrl;
|
|
|
|
do
|
|
{
|
|
pMinimizedDomain--;
|
|
while(pBeginUrl < pMinimizedDomain
|
|
&& *(pMinimizedDomain-1) != L'.')
|
|
{
|
|
pMinimizedDomain--;
|
|
}
|
|
} while(!IsDomainLegalCookieDomain( pMinimizedDomain, pBeginUrl)
|
|
&& pBeginUrl < pMinimizedDomain);
|
|
|
|
doneGetMinimizedCookieDomain:
|
|
|
|
return pMinimizedDomain;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Per-site list sorting function and data structure
|
|
//
|
|
|
|
struct LVCOMPAREINFO
|
|
{
|
|
HWND hwndLV; //hwnd for listview
|
|
int iCol; //column (0 based)
|
|
BOOL fAscending; //true if ascending, false if descending
|
|
};
|
|
|
|
int CALLBACK CompareByAlpha(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
{
|
|
struct LVCOMPAREINFO *plvci = (struct LVCOMPAREINFO *)lParamSort;
|
|
WCHAR wz1[INTERNET_MAX_URL_LENGTH];
|
|
WCHAR wz2[INTERNET_MAX_URL_LENGTH];
|
|
|
|
ListView_GetItemText(plvci->hwndLV, lParam1, plvci->iCol, wz1, ARRAYSIZE(wz1));
|
|
ListView_GetItemText(plvci->hwndLV, lParam2, plvci->iCol, wz2, ARRAYSIZE(wz2));
|
|
|
|
int iVal = _wcsicmp(wz1, wz2);
|
|
|
|
if (iVal < 0)
|
|
return (plvci->fAscending ? -1 : 1);
|
|
|
|
if (iVal == 0)
|
|
return (0);
|
|
|
|
// only thing left is if (iVal > 0)...
|
|
return (plvci->fAscending ? 1 : -1);
|
|
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Per-site list defines and prototypes
|
|
//
|
|
|
|
#define PRIVACYPS_ACTION_ACCEPT 0
|
|
#define PRIVACYPS_ACTION_REJECT 1
|
|
#define PRIVACYPS_ACTION_NOACTION 2
|
|
|
|
void OnContextMenu(HWND hDlg, LPARAM lParam);
|
|
void OnInvalidDomain(HWND hDlg);
|
|
void OnSiteSet(HWND hDlg);
|
|
void OnSiteDelete(HWND hDlg);
|
|
void OnSiteClear(HWND hDlg);
|
|
void PerSiteInit(HWND hDlg);
|
|
|
|
LRESULT CALLBACK PrivPerSiteEBProc(HWND hWnd, UINT uMsg, WPARAM wParam,LPARAM lParam);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Per-site list functions
|
|
//
|
|
|
|
void OnContextMenu(HWND hWnd, int iIndex, POINT pointClick)
|
|
{
|
|
|
|
HMENU hMenu0 = LoadMenu(MLGetHinst(), MAKEINTRESOURCE(IDR_PERSITE_CONTEXT_MENU));
|
|
HMENU hMenu1 = GetSubMenu(hMenu0, 0);
|
|
DWORD dwAction = PRIVACYPS_ACTION_NOACTION;
|
|
WCHAR wzUrl[INTERNET_MAX_URL_LENGTH];
|
|
WCHAR wzAction[32];
|
|
LVITEM lvi;
|
|
|
|
if(!hMenu1)
|
|
return;
|
|
|
|
if(pointClick.x == -1 && pointClick.y == -1)
|
|
{
|
|
RECT rectListRect;
|
|
RECT rectSelectionRect;
|
|
if( 0 != GetWindowRect(hWnd, &rectListRect) &&
|
|
TRUE == ListView_GetItemRect(hWnd, iIndex, &rectSelectionRect, LVIR_LABEL))
|
|
{
|
|
pointClick.x = rectListRect.left + (rectSelectionRect.left + rectSelectionRect.right) / 2;
|
|
pointClick.y = rectListRect.top + (rectSelectionRect.top + rectSelectionRect.bottom) / 2;
|
|
}
|
|
else
|
|
return;
|
|
}
|
|
|
|
// display it, get choice (if any)
|
|
int iPick = TrackPopupMenu(hMenu1,
|
|
TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
|
|
pointClick.x,
|
|
pointClick.y,
|
|
0,
|
|
hWnd,
|
|
(RECT *)NULL);
|
|
|
|
DestroyMenu(hMenu0);
|
|
DestroyMenu(hMenu1);
|
|
|
|
if (iPick)
|
|
{
|
|
switch(iPick)
|
|
{
|
|
case IDM_PRIVACYPS_CTXM_ACCEPT:
|
|
|
|
// set the action...
|
|
dwAction = PRIVACYPS_ACTION_ACCEPT;
|
|
MLLoadString(IDS_PRIVACYPS_ACCEPT, wzAction, ARRAYSIZE(wzAction));
|
|
|
|
// then fall-through...
|
|
|
|
case IDM_PRIVACYPS_CTXM_REJECT:
|
|
|
|
// set the action IFF its reject
|
|
if (PRIVACYPS_ACTION_NOACTION == dwAction)
|
|
{
|
|
dwAction = PRIVACYPS_ACTION_REJECT;
|
|
MLLoadString(IDS_PRIVACYPS_REJECT, wzAction, ARRAYSIZE(wzAction));
|
|
}
|
|
|
|
// update the ui...
|
|
lvi.iItem = iIndex;
|
|
lvi.iSubItem = 1;
|
|
lvi.mask = LVIF_TEXT;
|
|
lvi.pszText = wzAction;
|
|
ListView_SetItem(hWnd, &lvi);
|
|
|
|
// get the text...
|
|
ListView_GetItemText(hWnd, iIndex, 0, wzUrl, ARRAYSIZE(wzUrl));
|
|
|
|
// update the internal list...
|
|
InternetSetPerSiteCookieDecisionW(
|
|
wzUrl,
|
|
((PRIVACYPS_ACTION_ACCEPT == dwAction) ? COOKIE_STATE_ACCEPT : COOKIE_STATE_REJECT)
|
|
);
|
|
|
|
break;
|
|
|
|
case IDM_PRIVACYPS_CTXM_DELETE:
|
|
OnSiteDelete(GetParent(hWnd));
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void OnInvalidDomain(HWND hDlg)
|
|
{
|
|
|
|
WCHAR szError[256];
|
|
WCHAR szTitle[64];
|
|
|
|
// error message here
|
|
MLLoadString(IDS_PRIVACYPS_ERRORTTL, szTitle, ARRAYSIZE(szTitle));
|
|
MLLoadString(IDS_PRIVACYPS_ERRORTXT, szError, ARRAYSIZE(szError));
|
|
MessageBox(hDlg, szError, szTitle, MB_ICONEXCLAMATION | MB_OK);
|
|
|
|
// select the editbox text so the user can try again...
|
|
SendMessage(GetDlgItem(hDlg, IDC_PRIVACYPS_SITETOSET), EM_SETSEL, (WPARAM)0, (LPARAM)-1);
|
|
}
|
|
|
|
void AutosizeStatusColumnWidth(HWND hwndList)
|
|
{
|
|
int iColWidth = 0;
|
|
RECT rc;
|
|
|
|
if (0 == ListView_GetItemCount(hwndList))
|
|
{
|
|
// auto size it based on header text...
|
|
ListView_SetColumnWidth(hwndList, 1, LVSCW_AUTOSIZE_USEHEADER);
|
|
}
|
|
else
|
|
{
|
|
// auto size it based on content...
|
|
ListView_SetColumnWidth(hwndList, 1, LVSCW_AUTOSIZE);
|
|
}
|
|
|
|
// see how big that was...
|
|
iColWidth = ListView_GetColumnWidth(hwndList, 1);
|
|
|
|
// size the 1st col...
|
|
GetClientRect(hwndList, &rc);
|
|
ListView_SetColumnWidth(hwndList, 0, rc.right-rc.left-iColWidth-GetSystemMetrics(SM_CXVSCROLL));
|
|
|
|
}
|
|
|
|
void OnSiteSet(HWND hDlg, UINT uiChoice)
|
|
{
|
|
WCHAR wzUrl[INTERNET_MAX_URL_LENGTH];
|
|
WCHAR wzUrlDomain[INTERNET_MAX_URL_LENGTH];
|
|
WCHAR wzUrlMinimized[INTERNET_MAX_URL_LENGTH];
|
|
WCHAR wzSchema[INTERNET_MAX_URL_LENGTH];
|
|
WCHAR wzAction[32];
|
|
LVFINDINFO lvfi;
|
|
LVITEM lvi;
|
|
DWORD dwAction = 0;
|
|
DWORD dwCount = 0;
|
|
int iIndex;
|
|
HWND hwndList = GetDlgItem(hDlg, IDC_PRIVACYPS_LISTBOX);
|
|
|
|
// the enter key and dbl click should do the same thing, so if the listbox has focus
|
|
// and we got called, then they hit enter in the listbox, so let the listbox process
|
|
// a WM_KEYDOWN/VK_RETURN message.
|
|
if (GetFocus() == hwndList)
|
|
{
|
|
INT_PTR iIndx = ListView_GetSelectionMark(GetDlgItem(hDlg, IDC_PRIVACYPS_LISTBOX));
|
|
if (-1 != iIndx)
|
|
{
|
|
SendMessage(hwndList, WM_KEYDOWN, VK_RETURN, NULL);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// read url and setting from ui
|
|
GetWindowText(GetDlgItem(hDlg, IDC_PRIVACYPS_SITETOSET), wzUrl, INTERNET_MAX_URL_LENGTH);
|
|
|
|
// if it came from AutoComplete it'll have an http:// or https:// in it...
|
|
if(wcsstr(_wcslwr(wzUrl), TEXT("http://")) ||
|
|
wcsstr(_wcslwr(wzUrl), TEXT("https://")))
|
|
{
|
|
// ...and we found it, so get just the domain name...
|
|
if(S_OK != CoInternetParseUrl(wzUrl, PARSE_DOMAIN, NULL, wzUrlDomain, ARRAYSIZE(wzUrlDomain), &dwCount, 0))
|
|
{
|
|
OnInvalidDomain(hDlg);
|
|
return;
|
|
}
|
|
else if(wcslen(wzUrlDomain) < 2)
|
|
{
|
|
OnInvalidDomain(hDlg);
|
|
return;
|
|
}
|
|
}
|
|
else if (wcslen(wzUrl) < 2)
|
|
{
|
|
// we don't want null strings. in fact, the smallest a domain could theoretically be would be something like "f."
|
|
// so, to avoid null strings and stuff we check...
|
|
OnInvalidDomain(hDlg);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
// ...otherwise just use it
|
|
wcsncpy(wzUrlDomain, wzUrl, wcslen(wzUrl)+1);
|
|
}
|
|
|
|
// only http:// or https:// domains in the internet zone are valid, so if we still have a schema after asking for just
|
|
// the domain (see above) then we must have something like file:/// or some junk like that.
|
|
CoInternetParseUrl(wzUrlDomain, PARSE_SCHEMA, NULL, wzSchema, ARRAYSIZE(wzSchema), &dwCount, 0);
|
|
if (wcslen(wzSchema) != 0)
|
|
{
|
|
OnInvalidDomain(hDlg);
|
|
return;
|
|
}
|
|
|
|
// minimize the domain
|
|
wcsncpy(wzUrlMinimized, GetMinCookieDomainFromUrl(wzUrlDomain), wcslen(wzUrlDomain)+1);
|
|
|
|
for (unsigned int i=0;i<wcslen(wzUrlMinimized);i++)
|
|
{
|
|
if (iswalnum(wzUrlMinimized[i]))
|
|
{
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
switch(wzUrlMinimized[i])
|
|
{
|
|
case L'.':
|
|
if (i >= 1)
|
|
if (L'.' == wzUrlMinimized[i-1]) //prevent duplicate periods like "www..net"
|
|
break;
|
|
// (fallthrough)
|
|
|
|
case L'-':
|
|
if (i == 0) // first character cannot be a dash
|
|
break;
|
|
// (fallthrough)
|
|
|
|
case L'/':
|
|
continue;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
OnInvalidDomain(hDlg);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!wcschr(_wcslwr(wzUrlMinimized), L'.'))
|
|
{
|
|
OnInvalidDomain(hDlg);
|
|
return;
|
|
}
|
|
|
|
// valid domain?
|
|
if(FALSE == IsDomainLegalCookieDomainW(wzUrlMinimized, wzUrlMinimized))
|
|
{
|
|
OnInvalidDomain(hDlg);
|
|
return;
|
|
}
|
|
|
|
// are we accepting or rejecting this site?
|
|
if (IDC_PRIVACYPS_ACCEPTBTN == uiChoice)
|
|
{
|
|
dwAction = PRIVACYPS_ACTION_ACCEPT;
|
|
MLLoadString(IDS_PRIVACYPS_ACCEPT, wzAction, ARRAYSIZE(wzAction));
|
|
}
|
|
else
|
|
if (IDC_PRIVACYPS_REJECTBTN == uiChoice)
|
|
{
|
|
dwAction = PRIVACYPS_ACTION_REJECT;
|
|
MLLoadString(IDS_PRIVACYPS_REJECT, wzAction, ARRAYSIZE(wzAction));
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
|
|
// update UI...
|
|
lvfi.flags = LVFI_STRING;
|
|
lvfi.psz = wzUrlMinimized;
|
|
iIndex = ListView_FindItem(hwndList, -1, &lvfi);
|
|
|
|
if(iIndex != -1)
|
|
{
|
|
// found it, ensure correct subitem...
|
|
lvi.iItem = iIndex;
|
|
lvi.iSubItem = 1;
|
|
lvi.pszText = wzAction;
|
|
lvi.mask = LVIF_TEXT;
|
|
ListView_SetItem(hwndList, &lvi);
|
|
|
|
AutosizeStatusColumnWidth(hwndList);
|
|
}
|
|
else
|
|
{
|
|
// add a new item...
|
|
lvi.iItem = 0;
|
|
lvi.iSubItem = 0;
|
|
lvi.mask = LVIF_TEXT;
|
|
lvi.pszText = wzUrlMinimized;
|
|
iIndex = ListView_InsertItem(hwndList, &lvi);
|
|
|
|
lvi.iItem = iIndex;
|
|
lvi.iSubItem = 1;
|
|
lvi.mask = LVIF_TEXT;
|
|
lvi.pszText = wzAction;
|
|
ListView_SetItem(hwndList, &lvi);
|
|
|
|
AutosizeStatusColumnWidth(hwndList);
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEALLBTN), TRUE);
|
|
}
|
|
|
|
// update internal list...
|
|
InternetSetPerSiteCookieDecisionW(
|
|
wzUrlMinimized,
|
|
((PRIVACYPS_ACTION_ACCEPT == dwAction) ? COOKIE_STATE_ACCEPT : COOKIE_STATE_REJECT)
|
|
);
|
|
|
|
// clear the edit box...
|
|
SetWindowText(GetDlgItem(hDlg, IDC_PRIVACYPS_SITETOSET), TEXT(""));
|
|
SetFocus(GetDlgItem(hDlg, IDC_PRIVACYPS_SITETOSET));
|
|
}
|
|
|
|
void OnSiteDelete(HWND hDlg)
|
|
{
|
|
WCHAR wzUrl[INTERNET_MAX_URL_LENGTH];
|
|
HWND hwndList = GetDlgItem(hDlg, IDC_PRIVACYPS_LISTBOX);
|
|
INT_PTR iIndex;
|
|
|
|
// get the current selection in the list view...
|
|
iIndex = ListView_GetSelectionMark(hwndList);
|
|
|
|
// if we got something get the URL and delete it...
|
|
if(iIndex != -1)
|
|
{
|
|
// remove from listview...
|
|
ListView_GetItemText(hwndList, iIndex, 0, wzUrl, ARRAYSIZE(wzUrl));
|
|
ListView_DeleteItem(hwndList, iIndex);
|
|
|
|
// disable buttons if the listbox is now empty...
|
|
if(0 == ListView_GetItemCount(hwndList))
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEBTN), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEALLBTN), FALSE);
|
|
}
|
|
|
|
InternetSetPerSiteCookieDecisionW(wzUrl, COOKIE_STATE_UNKNOWN);
|
|
|
|
// clear selection
|
|
SetFocus(GetDlgItem(hDlg, IDC_PRIVACYPS_LISTBOX));
|
|
iIndex = ListView_GetSelectionMark(hwndList);
|
|
ListView_SetItemState(hwndList, iIndex, NULL, LVIS_FOCUSED | LVIS_SELECTED);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEBTN), FALSE);
|
|
}
|
|
}
|
|
|
|
void OnSiteClear(HWND hDlg)
|
|
{
|
|
// empty the list...
|
|
ListView_DeleteAllItems(GetDlgItem(hDlg, IDC_PRIVACYPS_LISTBOX));
|
|
InternetClearAllPerSiteCookieDecisions();
|
|
|
|
// disable the remove buttons...
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEBTN), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEALLBTN), FALSE);
|
|
|
|
// set focus back to the edit box so they can add more if they feel like it...
|
|
SetFocus(GetDlgItem(hDlg, IDC_PRIVACYPS_SITETOSET));
|
|
}
|
|
|
|
void PerSiteInit(HWND hDlg)
|
|
{
|
|
|
|
HWND hwndList = GetDlgItem(hDlg, IDC_PRIVACYPS_LISTBOX);
|
|
LVITEM lviEntry;
|
|
DWORD dwSizeOfBuffer = 0; // in bytes
|
|
DWORD dwDecision = 0;
|
|
DWORD dwIndex = 0;
|
|
WCHAR wzSiteNameBuffer[INTERNET_MAX_URL_LENGTH];
|
|
LONG_PTR wndprocOld = NULL;
|
|
WCHAR wzTitle[64];
|
|
WCHAR wzAccept[32];
|
|
WCHAR wzReject[32];
|
|
int iItem;
|
|
DWORD dwRet, dwType, dwValue, dwSize;
|
|
|
|
// subclass the editbox
|
|
wndprocOld = SetWindowLongPtr(GetDlgItem(hDlg, IDC_PRIVACYPS_SITETOSET), GWLP_WNDPROC, (LONG_PTR)PrivPerSiteEBProc);
|
|
|
|
// put a pointer to the old proc in GWLP_USERDATA so we can call it...
|
|
SetWindowLongPtr(GetDlgItem(hDlg, IDC_PRIVACYPS_SITETOSET), GWLP_USERDATA, wndprocOld);
|
|
|
|
|
|
if (!hwndList)
|
|
return;
|
|
|
|
// empty the listview...
|
|
ListView_DeleteAllItems(hwndList);
|
|
|
|
// initialize domain column in the listview...
|
|
LV_COLUMN lvColumn;
|
|
RECT rc;
|
|
|
|
// load the accept and reject strings...
|
|
MLLoadString(IDS_PRIVACYPS_ACCEPT, wzAccept, ARRAYSIZE(wzAccept));
|
|
MLLoadString(IDS_PRIVACYPS_REJECT, wzReject, ARRAYSIZE(wzReject));
|
|
|
|
lvColumn.mask = LVCF_FMT | LVCF_TEXT;
|
|
lvColumn.fmt = LVCFMT_LEFT;
|
|
|
|
if( 0 != GetClientRect( hwndList, &rc))
|
|
{
|
|
lvColumn.cx = rc.right - rc.left - GetSystemMetrics(SM_CXVSCROLL) - 75;
|
|
lvColumn.mask |= LVCF_WIDTH;
|
|
}
|
|
|
|
MLLoadString(IDS_PRIVACYPS_COLSITE, wzTitle, ARRAYSIZE(wzTitle));
|
|
lvColumn.pszText = wzTitle;
|
|
|
|
ListView_InsertColumn(hwndList, 0, &lvColumn);
|
|
|
|
// initialize setting column
|
|
lvColumn.mask = LVCF_FMT | LVCF_TEXT;
|
|
lvColumn.fmt = LVCFMT_LEFT;
|
|
|
|
if( 0 != GetClientRect( hwndList, &rc))
|
|
{
|
|
lvColumn.cx = 75;
|
|
lvColumn.mask |= LVCF_WIDTH;
|
|
}
|
|
|
|
MLLoadString(IDS_PRIVACYPS_COLSET, wzTitle, ARRAYSIZE(wzTitle));
|
|
lvColumn.pszText = wzTitle;
|
|
|
|
ListView_InsertColumn(hwndList, 1, &lvColumn);
|
|
|
|
// enumerate elements...
|
|
while((dwSizeOfBuffer = ARRAYSIZE(wzSiteNameBuffer)) &&
|
|
InternetEnumPerSiteCookieDecision(wzSiteNameBuffer,&dwSizeOfBuffer,&dwDecision,dwIndex))
|
|
{
|
|
|
|
lviEntry.iItem = dwIndex;
|
|
lviEntry.iSubItem = 0;
|
|
lviEntry.mask = LVIF_TEXT /*| LVIF_IMAGE*/;
|
|
lviEntry.pszText = wzSiteNameBuffer;
|
|
|
|
// don't display crap users may hack into the registry themselves, or hosed entries we may write :)
|
|
if(FALSE == IsDomainLegalCookieDomainW(wzSiteNameBuffer, wzSiteNameBuffer))
|
|
{
|
|
dwIndex++;
|
|
continue;
|
|
}
|
|
|
|
iItem = ListView_InsertItem(hwndList, &lviEntry);
|
|
|
|
lviEntry.iItem = iItem;
|
|
lviEntry.iSubItem = 1;
|
|
lviEntry.mask = LVIF_TEXT;
|
|
if (dwDecision == COOKIE_STATE_ACCEPT)
|
|
lviEntry.pszText = wzAccept;
|
|
else if (dwDecision == COOKIE_STATE_REJECT)
|
|
lviEntry.pszText = wzReject;
|
|
else
|
|
{
|
|
dwIndex++;
|
|
continue;
|
|
}
|
|
|
|
ListView_SetItem(hwndList, &lviEntry);
|
|
|
|
dwIndex++;
|
|
}
|
|
|
|
AutosizeStatusColumnWidth(hwndList);
|
|
|
|
// enable the remove all button if we enumerated anything...
|
|
if (dwIndex > 0)
|
|
{
|
|
ListView_SetItemState(hwndList, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEALLBTN), TRUE);
|
|
}
|
|
|
|
// enable autocomplete for the editbox...
|
|
SHAutoComplete(GetDlgItem(hDlg, IDC_PRIVACYPS_SITETOSET), SHACF_DEFAULT);
|
|
|
|
// check for policy to make this dialog read-only...
|
|
dwSize = sizeof(dwValue);
|
|
dwRet = SHGetValue(HKEY_CURRENT_USER, REGSTR_PRIVACYPS_PATHPANE, REGSTR_PRIVACYPS_VALUPANE, &dwType, &dwValue, &dwSize);
|
|
|
|
if (ERROR_SUCCESS == dwRet && dwValue && REG_DWORD == dwType)
|
|
{
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)TRUE);
|
|
|
|
// disable all buttons and stuff...
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_SITETOSET), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REJECTBTN), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_ACCEPTBTN), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEBTN), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEALLBTN), FALSE);
|
|
}
|
|
}
|
|
|
|
void OnDoubleClick(HWND hWnd)
|
|
{
|
|
|
|
int iIndex = ListView_GetSelectionMark(hWnd);
|
|
WCHAR wzUrl[INTERNET_MAX_URL_LENGTH];
|
|
|
|
// on dbl clicks we want to enter the item in the edit box so the user can edit it, or cut & paste, or whatever
|
|
// but only if we actually have a selected item...
|
|
if (-1 == iIndex)
|
|
return;
|
|
|
|
// get the current selection...
|
|
ListView_GetItemText(hWnd, iIndex, 0, wzUrl, ARRAYSIZE(wzUrl));
|
|
|
|
// enter the text into the edit box...
|
|
SetDlgItemText(GetParent(hWnd), IDC_PRIVACYPS_SITETOSET, wzUrl);
|
|
|
|
// select it for the user...
|
|
SendMessage(GetDlgItem(GetParent(hWnd), IDC_PRIVACYPS_SITETOSET), EM_SETSEL, (WPARAM)0, (LPARAM)-1);
|
|
|
|
// set focus to the edit box...
|
|
SetFocus(GetDlgItem(GetParent(hWnd), IDC_PRIVACYPS_SITETOSET));
|
|
|
|
// unselect the listview item...
|
|
ListView_SetItemState(hWnd, iIndex, NULL, LVIS_FOCUSED | LVIS_SELECTED);
|
|
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Per-site list window proc's
|
|
//
|
|
|
|
LRESULT CALLBACK PrivPerSiteEBProc(HWND hWnd, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
|
{
|
|
HWND hDlg = GetParent(hWnd);
|
|
HWND hwndList = GetDlgItem(hDlg, IDC_PRIVACYPS_LISTBOX);
|
|
int iIndex = ListView_GetSelectionMark(hwndList);
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_SETFOCUS:
|
|
// disable the remove button and unselect whatever in the listview...
|
|
EnableWindow(GetDlgItem(GetParent(hWnd), IDC_PRIVACYPS_REMOVEBTN), FALSE);
|
|
ListView_SetItemState(hwndList, iIndex, NULL, LVIS_FOCUSED | LVIS_SELECTED);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return (CallWindowProc((WNDPROC)GetWindowLongPtr(hWnd, GWLP_USERDATA), hWnd, uMsg, wParam, lParam));
|
|
}
|
|
|
|
INT_PTR CALLBACK PrivPerSiteDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
|
{
|
|
|
|
HWND hwndList = GetDlgItem(hDlg, IDC_PRIVACYPS_LISTBOX);
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
PerSiteInit(hDlg);
|
|
|
|
if( IsOS(OS_WHISTLERORGREATER))
|
|
{
|
|
HICON hIcon = LoadIcon(MLGetHinst(), MAKEINTRESOURCE(IDI_PRIVACY_XP));
|
|
if( hIcon != NULL)
|
|
SendDlgItemMessage(hDlg, IDC_PRIVACY_ICON, STM_SETICON, (WPARAM)hIcon, 0);
|
|
// icons loaded with LoadIcon never need to be released
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDCANCEL:
|
|
case IDOK:
|
|
return EndDialog(hDlg, 0);
|
|
|
|
case IDC_PRIVACYPS_REMOVEALLBTN:
|
|
OnSiteClear(hDlg);
|
|
return TRUE;
|
|
|
|
case IDC_PRIVACYPS_REMOVEBTN:
|
|
OnSiteDelete(hDlg);
|
|
return TRUE;
|
|
|
|
case IDC_PRIVACYPS_ACCEPTBTN:
|
|
OnSiteSet(hDlg, IDC_PRIVACYPS_ACCEPTBTN);
|
|
return TRUE;
|
|
|
|
case IDC_PRIVACYPS_REJECTBTN:
|
|
OnSiteSet(hDlg, IDC_PRIVACYPS_REJECTBTN);
|
|
return TRUE;
|
|
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
if (IDC_PRIVACYPS_LISTBOX == ((LPNMHDR)lParam)->idFrom)
|
|
{
|
|
switch (((LPNMHDR)lParam)->code)
|
|
{
|
|
case NM_KILLFOCUS:
|
|
|
|
// lost focus, turn off remove button
|
|
if ((GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEBTN) != GetFocus()) ||
|
|
(-1 == ListView_GetSelectionMark(hwndList)))
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEBTN), FALSE);
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
case NM_SETFOCUS:
|
|
{
|
|
// if there is nothing in the list we have nothing to do
|
|
if (0 == ListView_GetItemCount(hwndList))
|
|
break;
|
|
|
|
// if this is true a policy has been set making per-site list read-only, so do nothing...
|
|
if ((BOOL)GetWindowLongPtr(hDlg, DWLP_USER))
|
|
break;
|
|
|
|
int iIndex = ListView_GetSelectionMark(hwndList);
|
|
|
|
if (-1 == iIndex)
|
|
{
|
|
iIndex = 0;
|
|
}
|
|
|
|
// select|focus the correct item...
|
|
ListView_SetItemState(hwndList, iIndex, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEBTN), TRUE);
|
|
|
|
}
|
|
return TRUE;
|
|
|
|
case NM_CLICK:
|
|
|
|
if (-1 != ListView_GetSelectionMark(hwndList) &&
|
|
!((BOOL)GetWindowLongPtr(hDlg, DWLP_USER)))
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEBTN), TRUE);
|
|
}
|
|
else
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACYPS_REMOVEBTN), FALSE);
|
|
}
|
|
return TRUE;
|
|
|
|
case NM_DBLCLK:
|
|
|
|
OnDoubleClick(hwndList);
|
|
return TRUE;
|
|
|
|
case NM_RCLICK:
|
|
{
|
|
// if this is true a policy has been set making per-site list read-only, so don't show the context menu,
|
|
// since all it does is allow you to change or remove things...
|
|
if ((BOOL)GetWindowLongPtr(hDlg, DWLP_USER))
|
|
break;
|
|
|
|
int iItem = ((LPNMITEMACTIVATE)lParam)->iItem;
|
|
|
|
if (-1 != iItem)
|
|
{
|
|
POINT pointClick = ((LPNMITEMACTIVATE)lParam)->ptAction;
|
|
RECT rc;
|
|
|
|
if(0 != GetWindowRect(hwndList, &rc))
|
|
{
|
|
pointClick.x += rc.left;
|
|
pointClick.y += rc.top;
|
|
}
|
|
else
|
|
{
|
|
pointClick.x = -1;
|
|
pointClick.y = -1;
|
|
}
|
|
|
|
OnContextMenu(hwndList, iItem, pointClick);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
case LVN_KEYDOWN:
|
|
|
|
switch (((LPNMLVKEYDOWN)lParam)->wVKey)
|
|
{
|
|
case VK_DELETE:
|
|
|
|
OnSiteDelete(hDlg);
|
|
return TRUE;
|
|
|
|
case VK_RETURN:
|
|
|
|
OnDoubleClick(hwndList);
|
|
return TRUE;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case LVN_COLUMNCLICK:
|
|
{
|
|
struct LVCOMPAREINFO lvci;
|
|
static BOOL fAscending = TRUE;
|
|
|
|
fAscending = !fAscending;
|
|
|
|
lvci.fAscending = fAscending;
|
|
lvci.hwndLV = hwndList;
|
|
lvci.iCol = ((LPNMLISTVIEW)lParam)->iSubItem;
|
|
|
|
return ListView_SortItemsEx(hwndList, CompareByAlpha, &lvci);
|
|
}
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
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
|
|
if ((HWND)wParam != hwndList)
|
|
{
|
|
ResWinHelp((HWND) wParam, IDS_HELPFILE, HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs);
|
|
}
|
|
else if (-1 == GET_X_LPARAM(lParam) && -1 == GET_Y_LPARAM(lParam))
|
|
{
|
|
POINT pointClick;
|
|
pointClick.x = -1; pointClick.y = -1;
|
|
OnContextMenu(hwndList, ListView_GetSelectionMark(hwndList), pointClick);
|
|
}
|
|
break;
|
|
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Advanced privacy settings dialog
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL IsAdvancedMode(void)
|
|
{
|
|
DWORD dwTemplate, dwError;
|
|
BOOL fAdvanced = FALSE;
|
|
|
|
dwError = PrivacyGetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_FIRST_PARTY,
|
|
&dwTemplate,
|
|
NULL,
|
|
NULL);
|
|
|
|
if(ERROR_SUCCESS == dwError && PRIVACY_TEMPLATE_ADVANCED == dwTemplate)
|
|
{
|
|
fAdvanced = TRUE;
|
|
}
|
|
|
|
return fAdvanced;
|
|
}
|
|
|
|
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)
|
|
{
|
|
BOOL fSession = FALSE;
|
|
DWORD dwFirst = IDC_FIRST_ACCEPT;
|
|
DWORD dwThird = IDC_THIRD_ACCEPT;
|
|
|
|
if(IsAdvancedMode())
|
|
{
|
|
WCHAR szBuffer[MAX_PATH];
|
|
// MAX_PATH is sufficent for advanced mode setting strings, MaxPrivacySettings is overkill.
|
|
WCHAR *pszAlways;
|
|
DWORD dwBufferSize, dwTemplate;
|
|
DWORD dwError;
|
|
|
|
//
|
|
// turn on advanced check box
|
|
//
|
|
CheckDlgButton(hDlg, IDC_USE_ADVANCED, TRUE);
|
|
|
|
//
|
|
// Figure out first party setting and session
|
|
//
|
|
dwBufferSize = ARRAYSIZE( szBuffer);
|
|
dwError = PrivacyGetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_FIRST_PARTY,
|
|
&dwTemplate,
|
|
szBuffer,
|
|
&dwBufferSize);
|
|
|
|
if(ERROR_SUCCESS == dwError)
|
|
{
|
|
pszAlways = StrStrW(szBuffer, L"always=");
|
|
if(pszAlways)
|
|
{
|
|
dwFirst = IDC_FIRST_ACCEPT + MapPrefToIndex(*(pszAlways + 7));
|
|
}
|
|
|
|
if(StrStrW(szBuffer, L"session"))
|
|
{
|
|
fSession = TRUE;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Figure out third party setting
|
|
//
|
|
dwBufferSize = ARRAYSIZE( szBuffer);
|
|
dwError = PrivacyGetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_THIRD_PARTY,
|
|
&dwTemplate,
|
|
szBuffer,
|
|
&dwBufferSize);
|
|
|
|
if(ERROR_SUCCESS == dwError)
|
|
{
|
|
WCHAR *pszAlways;
|
|
|
|
pszAlways = StrStrW(szBuffer, 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 OnAdvancedOk(HWND hDlg)
|
|
{
|
|
BOOL fWasAdvanced = IsAdvancedMode();
|
|
BOOL fAdvanced = IsDlgButtonChecked(hDlg, IDC_USE_ADVANCED);
|
|
|
|
// if advanced, build first and third party strings
|
|
if(fAdvanced)
|
|
{
|
|
WCHAR szBuffer[MAX_PATH];
|
|
|
|
wnsprintf(szBuffer, ARRAYSIZE( szBuffer), L"IE6-P3PV1/settings: always=%c%s",
|
|
MapRadioToPref(hDlg, IDC_FIRST_ACCEPT),
|
|
IsDlgButtonChecked(hDlg, IDC_SESSION_OVERRIDE) ? L" session=a" : L""
|
|
);
|
|
|
|
PrivacySetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_FIRST_PARTY,
|
|
PRIVACY_TEMPLATE_ADVANCED,
|
|
szBuffer);
|
|
|
|
wnsprintf(szBuffer, ARRAYSIZE( szBuffer), L"IE6-P3PV1/settings: always=%c%s",
|
|
MapRadioToPref(hDlg, IDC_THIRD_ACCEPT),
|
|
IsDlgButtonChecked(hDlg, IDC_SESSION_OVERRIDE) ? L" session=a" : L""
|
|
);
|
|
|
|
PrivacySetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_THIRD_PARTY,
|
|
PRIVACY_TEMPLATE_ADVANCED,
|
|
szBuffer);
|
|
|
|
// tell wininet to refresh itself
|
|
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
|
|
}
|
|
else if ( fWasAdvanced && !fAdvanced)
|
|
{
|
|
PrivacySetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_FIRST_PARTY,
|
|
PRIVACY_TEMPLATE_MEDIUM, NULL);
|
|
PrivacySetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_THIRD_PARTY,
|
|
PRIVACY_TEMPLATE_MEDIUM, NULL);
|
|
|
|
// tell wininet to refresh itself
|
|
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
|
|
}
|
|
}
|
|
|
|
void OnAdvancedEnable(HWND hDlg)
|
|
{
|
|
BOOL fEnabled = IsDlgButtonChecked(hDlg, IDC_USE_ADVANCED);
|
|
|
|
// if restricted, disable checkbox and force all others disabled
|
|
if(g_restrict.fPrivacySettings)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_USE_ADVANCED), FALSE);
|
|
fEnabled = FALSE;
|
|
}
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_FIRST_ACCEPT), fEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_FIRST_DENY), fEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_FIRST_PROMPT), fEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_THIRD_ACCEPT), fEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_THIRD_DENY), fEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_THIRD_PROMPT), fEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SESSION_OVERRIDE), fEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_TX_FIRST), fEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_TX_THIRD), fEnabled);
|
|
}
|
|
|
|
INT_PTR CALLBACK PrivAdvancedDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
|
{
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
OnAdvancedInit(hDlg);
|
|
OnAdvancedEnable(hDlg);
|
|
|
|
if( IsOS(OS_WHISTLERORGREATER))
|
|
{
|
|
HICON hIcon = LoadIcon(MLGetHinst(), MAKEINTRESOURCE(IDI_PRIVACY_XP));
|
|
if( hIcon != NULL)
|
|
SendDlgItemMessage(hDlg, IDC_PRIVACY_ICON, STM_SETICON, (WPARAM)hIcon, 0);
|
|
// icons loaded with LoadIcon never need to be released
|
|
}
|
|
|
|
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:
|
|
if(FALSE == g_restrict.fPrivacySettings)
|
|
{
|
|
OnAdvancedOk(hDlg);
|
|
}
|
|
// 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][400];
|
|
|
|
typedef struct _privslider {
|
|
|
|
DWORD_PTR dwLevel;
|
|
BOOL fAdvanced;
|
|
BOOL fCustom;
|
|
HFONT hfontBolded;
|
|
BOOL fEditDisabled;
|
|
|
|
} PRIVSLIDER, *PPRIVSLIDER;
|
|
|
|
void EnablePrivacyControls(HWND hDlg, BOOL fCustom)
|
|
{
|
|
WCHAR szBuffer[256];
|
|
|
|
if( fCustom)
|
|
MLLoadString( IDS_PRIVACY_SLIDERCOMMANDDEF, szBuffer, ARRAYSIZE( szBuffer));
|
|
else
|
|
MLLoadString( 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);
|
|
|
|
// default button enabled with custom
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_DEFAULT), fCustom);
|
|
|
|
// if restricted, force slider and defaults disabled
|
|
if(g_restrict.fPrivacySettings)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_DEFAULT), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_LEVEL_SLIDER), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_IMPORT), FALSE);
|
|
}
|
|
}
|
|
|
|
PPRIVSLIDER OnPrivacyInit(HWND hDlg)
|
|
{
|
|
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 = -1;
|
|
pData->hfontBolded = NULL;
|
|
pData->fAdvanced = IsAdvancedMode();
|
|
pData->fCustom = FALSE;
|
|
pData->fEditDisabled = FALSE;
|
|
|
|
//
|
|
// 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++)
|
|
{
|
|
MLLoadString(IDS_PRIVACY_LEVEL_NO_COOKIE + i, szPrivacyLevel[i], ARRAYSIZE(szPrivacyLevel[i]));
|
|
MLLoadString(IDS_PRIVACY_DESC_NO_COOKIE + i, szPrivacyDescription[i], ARRAYSIZE(szPrivacyDescription[i]));
|
|
}
|
|
|
|
//
|
|
// Get current internet privacy level
|
|
//
|
|
DWORD dwError, dwTemplateFirst, dwTemplateThird;
|
|
|
|
|
|
// read first party setting
|
|
dwError = PrivacyGetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_FIRST_PARTY,
|
|
&dwTemplateFirst,
|
|
NULL,
|
|
NULL);
|
|
|
|
if(dwError != ERROR_SUCCESS)
|
|
{
|
|
dwTemplateFirst = PRIVACY_TEMPLATE_CUSTOM;
|
|
}
|
|
|
|
// read third party setting
|
|
dwError = PrivacyGetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_THIRD_PARTY,
|
|
&dwTemplateThird,
|
|
NULL,
|
|
NULL);
|
|
|
|
if(dwError != ERROR_SUCCESS)
|
|
{
|
|
dwTemplateThird = PRIVACY_TEMPLATE_CUSTOM;
|
|
}
|
|
|
|
if(dwTemplateFirst == dwTemplateThird && dwTemplateFirst != PRIVACY_TEMPLATE_CUSTOM)
|
|
{
|
|
// matched template values, set slider to template level
|
|
pData->dwLevel = dwTemplateFirst;
|
|
|
|
if(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);
|
|
|
|
dwSize = sizeof(dwValue);
|
|
dwRet = SHGetValue(HKEY_CURRENT_USER, REGSTR_PRIVACYPS_PATHEDIT, REGSTR_PRIVACYPS_VALUEDIT, &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 OnPrivacyApply(HWND hDlg, PPRIVSLIDER pData)
|
|
{
|
|
if(pData->fCustom || pData->fAdvanced)
|
|
{
|
|
// nothing else to do
|
|
return;
|
|
}
|
|
|
|
DWORD_PTR dwPos = SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_GETPOS, 0, 0);
|
|
|
|
if(pData->dwLevel != dwPos)
|
|
{
|
|
DWORD dwCookieAction = URLPOLICY_DISALLOW;
|
|
|
|
// Set privacy settings
|
|
PrivacySetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_FIRST_PARTY,
|
|
(DWORD)dwPos,
|
|
NULL);
|
|
|
|
PrivacySetZonePreferenceW(
|
|
URLZONE_INTERNET,
|
|
PRIVACY_TYPE_THIRD_PARTY,
|
|
(DWORD)dwPos,
|
|
NULL);
|
|
|
|
// tell wininet to refresh itself
|
|
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
|
|
|
|
// save new level as "current"
|
|
pData->dwLevel = dwPos;
|
|
}
|
|
}
|
|
|
|
void OnPrivacySlider(HWND hDlg, PPRIVSLIDER pData)
|
|
{
|
|
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);
|
|
}
|
|
|
|
// enable default button if slider moved off medium
|
|
BOOL fEnable = FALSE;
|
|
|
|
if(dwPos != PRIVACY_TEMPLATE_MEDIUM && FALSE == g_restrict.fPrivacySettings)
|
|
{
|
|
fEnable = TRUE;
|
|
}
|
|
EnableWindow(GetDlgItem(hDlg, IDC_PRIVACY_DEFAULT), fEnable);
|
|
}
|
|
|
|
if (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]);
|
|
}
|
|
|
|
void OnPrivacyDefault( HWND hDlg, PPRIVSLIDER pData)
|
|
{
|
|
// enable controls correctly
|
|
pData->fAdvanced = FALSE;
|
|
pData->fCustom = FALSE;
|
|
EnablePrivacyControls(hDlg, FALSE);
|
|
|
|
// set slider to medium
|
|
SendDlgItemMessage(hDlg, IDC_LEVEL_SLIDER, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)PRIVACY_TEMPLATE_MEDIUM);
|
|
|
|
// update descriptions
|
|
pData->dwLevel = SLIDER_LEVEL_CUSTOM; // difference from medium so we get apply button
|
|
OnPrivacySlider(hDlg, pData);
|
|
|
|
// Give slider focus (if default button has focus and gets disabled,
|
|
// alt-key dialog control breaks)
|
|
SendMessage( hDlg, WM_NEXTDLGCTL,
|
|
(WPARAM)GetDlgItem( hDlg, IDC_LEVEL_SLIDER),
|
|
MAKELPARAM( TRUE, 0));
|
|
|
|
}
|
|
|
|
INT_PTR CALLBACK PrivacyDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
PPRIVSLIDER pData = (PPRIVSLIDER)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
// initialize slider
|
|
pData = OnPrivacyInit(hDlg);
|
|
if(pData)
|
|
{
|
|
OnPrivacySlider(hDlg, pData);
|
|
}
|
|
|
|
if( IsOS(OS_WHISTLERORGREATER))
|
|
{
|
|
HICON hIcon = LoadIcon(MLGetHinst(), MAKEINTRESOURCE(IDI_PRIVACY_XP));
|
|
if( hIcon != NULL)
|
|
SendDlgItemMessage(hDlg, IDC_PRIVACY_ICON, STM_SETICON, (WPARAM)hIcon, 0);
|
|
// icons loaded with LoadIcon never need to be released
|
|
}
|
|
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:
|
|
// Hitting the apply button runs this code
|
|
OnPrivacyApply(hDlg, pData);
|
|
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:
|
|
OnPrivacyDefault( hDlg, pData);
|
|
return 0;
|
|
|
|
case IDC_PRIVACY_ADVANCED:
|
|
{
|
|
BOOL fWasAdvanced = IsAdvancedMode();
|
|
|
|
// show advanced
|
|
if( DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_PRIVACY_ADVANCED),
|
|
hDlg, PrivAdvancedDlgProc))
|
|
{
|
|
// refresh advanced and reset slider/controls
|
|
pData->fAdvanced = IsAdvancedMode();
|
|
if(pData->fAdvanced)
|
|
{
|
|
// no longer have a slider template
|
|
pData->fCustom = FALSE;
|
|
pData->dwLevel = SLIDER_LEVEL_CUSTOM;
|
|
|
|
EnablePrivacyControls(hDlg, (pData->fCustom || pData->fAdvanced));
|
|
OnPrivacySlider(hDlg, pData);
|
|
|
|
// Give advanced button focus (if slider has focus and gets disabled,
|
|
// alt-key dialog control breaks)
|
|
SendMessage( hDlg, WM_NEXTDLGCTL,
|
|
(WPARAM)GetDlgItem( hDlg, IDC_PRIVACY_ADVANCED),
|
|
MAKELPARAM( TRUE, 0));
|
|
}
|
|
else if (!pData->fAdvanced && fWasAdvanced)
|
|
{
|
|
OnPrivacyDefault( hDlg, pData);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
case IDC_PRIVACY_IMPORT:
|
|
{
|
|
WCHAR szDialogTitle[MAX_PATH_URL];
|
|
WCHAR szFileExpr[MAX_PATH_URL];
|
|
MLLoadString( IDS_PRIVACYIMPORT_TITLE, szDialogTitle, ARRAYSIZE(szDialogTitle));
|
|
int iFileExprLength = MLLoadString( IDS_PRIVACYIMPORT_FILEEXPR, szFileExpr, ARRAYSIZE(szFileExpr));
|
|
szFileExpr[ iFileExprLength + 1] = L'\0'; // the extra \0 in the resource gets clipped.. replace it.
|
|
WCHAR szFile[MAX_PATH_URL];
|
|
szFile[0] = L'\0';
|
|
OPENFILENAME ofn;
|
|
memset((void*)&ofn, 0, sizeof(ofn));
|
|
ofn.lStructSize = sizeof( ofn);
|
|
ofn.hwndOwner = hDlg;
|
|
ofn.lpstrFilter = szFileExpr;
|
|
ofn.lpstrFile = szFile;
|
|
ofn.nMaxFile = ARRAYSIZE(szFile);
|
|
ofn.lpstrTitle = szDialogTitle;
|
|
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
|
|
|
|
if( 0 != GetOpenFileName(&ofn))
|
|
{
|
|
BOOL fParsePrivacyPreferences = TRUE;
|
|
BOOL fParsePerSiteRules = TRUE;
|
|
BOOL fResults;
|
|
|
|
fResults = ImportPrivacySettings( ofn.lpstrFile,
|
|
&fParsePrivacyPreferences, &fParsePerSiteRules);
|
|
|
|
if( fResults == FALSE
|
|
|| (fParsePrivacyPreferences == FALSE
|
|
&& fParsePerSiteRules == FALSE))
|
|
{
|
|
MLShellMessageBox( hDlg, MAKEINTRESOURCE(IDS_PRIVACYIMPORT_FAILURE),
|
|
MAKEINTRESOURCE(IDS_PRIVACYIMPORT_TITLE),
|
|
MB_OK | MB_APPLMODAL | MB_ICONEXCLAMATION | MB_SETFOREGROUND);
|
|
}
|
|
else
|
|
{
|
|
if( fParsePrivacyPreferences)
|
|
{
|
|
pData->fCustom = TRUE;
|
|
pData->fAdvanced = FALSE;
|
|
EnablePrivacyControls( hDlg, pData->fCustom);
|
|
OnPrivacySlider(hDlg, pData);
|
|
}
|
|
MLShellMessageBox( hDlg, MAKEINTRESOURCE(IDS_PRIVACYIMPORT_SUCCESS),
|
|
MAKEINTRESOURCE(IDS_PRIVACYIMPORT_TITLE),
|
|
MB_OK | MB_APPLMODAL | MB_SETFOREGROUND);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
case IDC_PRIVACY_EDIT:
|
|
DialogBox(MLGetHinst(), MAKEINTRESOURCE(IDD_PRIVACY_PERSITE),
|
|
hDlg, PrivPerSiteDlgProc);
|
|
return 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|