|
|
/****************************************************************************\
* * MSLUDLG.C * * Updated: Ann McCurdy * Updated: Mark Hammond (t-markh) 8/98 * \****************************************************************************/
/*INCLUDES--------------------------------------------------------------------*/ #include "msrating.h"
#include "ratings.h"
#include "mslubase.h"
#include "msluprop.h"
#include "commctrl.h"
#include "commdlg.h"
#include "debug.h"
#include "buffer.h"
#include "picsrule.h"
#include "picsdlg.h" // CPicsDialog
#include "apprdlg.h" // CApprovedSitesDialog
#include "gendlg.h" // CGeneralDialog
#include "advdlg.h" // CAdvancedDialog
#include "introdlg.h" // CIntroDialog
#include "passdlg.h" // CPasswordDialog
#include "chngdlg.h" // CChangePasswordDialog
#include "toffdlg.h" // CTurnOffDialog
#include <shlwapip.h>
#include <shellapi.h>
#include <wininet.h>
#include <contxids.h>
#include <mluisupp.h>
extern array<PICSRulesRatingSystem*> g_arrpPRRS; extern PICSRulesRatingSystem * g_pPRRS; extern PICSRulesRatingSystem * g_pApprovedPRRS;
extern HMODULE g_hURLMON,g_hWININET;
extern HANDLE g_HandleGlobalCounter,g_ApprovedSitesHandleGlobalCounter; extern long g_lGlobalCounterValue,g_lApprovedSitesGlobalCounterValue;
PICSRulesRatingSystem * g_pApprovedPRRSPreApply; array<PICSRulesRatingSystem*> g_arrpPICSRulesPRRSPreApply;
extern bool IsRegistryModifiable( HWND p_hwndParent );
//The FN_INTERNETCRACKURL type describes the URLMON function InternetCrackUrl
typedef BOOL (*FN_INTERNETCRACKURL)(LPCTSTR lpszUrl,DWORD dwUrlLength,DWORD dwFlags,LPURL_COMPONENTS lpUrlComponents);
#define NUM_PAGES 4
// Initialize the Specialized Common Controls (tree controls, etc.)
void InitializeCommonControls( void ) { INITCOMMONCONTROLSEX ex;
ex.dwSize = sizeof(ex); ex.dwICC = ICC_NATIVEFNTCTL_CLASS;
InitCommonControlsEx(&ex); }
BOOL PicsOptionsDialog( HWND hwnd, PicsRatingSystemInfo * pPRSI, PicsUser * pPU ) { PropSheet ps; PRSD *pPRSD; char pszBuf[MAXPATHLEN]; BOOL fRet = FALSE;
InitializeCommonControls();
MLLoadStringA(IDS_GENERIC, pszBuf, sizeof(pszBuf));
ps.Init( hwnd, NUM_PAGES, pszBuf, TRUE );
pPRSD = new PRSD; if (!pPRSD) return FALSE;
pPRSD->pPU = pPU; pPRSD->pTempRatings = NULL; pPRSD->hwndBitmapCategory = NULL; pPRSD->hwndBitmapLabel = NULL; pPRSD->pPRSI = pPRSI; pPRSD->fNewProviders = FALSE;
HPROPSHEETPAGE hPage;
CPicsDialog picsDialog( pPRSD ); hPage = picsDialog.Create(); ps.MakePropPage( hPage );
CApprovedSitesDialog approvedSitesDialog( pPRSD ); hPage = approvedSitesDialog.Create(); ps.MakePropPage( hPage );
CGeneralDialog generalDialog( pPRSD ); hPage = generalDialog.Create(); ps.MakePropPage( hPage );
CAdvancedDialog advancedDialog( pPRSD ); hPage = advancedDialog.Create(); ps.MakePropPage( hPage );
if ( ps.PropPageCount() == NUM_PAGES ) { fRet = ps.Run(); }
delete pPRSD; pPRSD = NULL;
return fRet; }
INT_PTR DoPasswordConfirm(HWND hDlg) { if ( SUCCEEDED( VerifySupervisorPassword() ) ) { CPasswordDialog passDlg( IDS_PASSWORD_LABEL );
return passDlg.DoModal( hDlg ); } else { CChangePasswordDialog<IDD_CREATE_PASSWORD> createPassDlg;
return createPassDlg.DoModal( hDlg ) ? PASSCONFIRM_NEW : PASSCONFIRM_FAIL; } }
#define NO_EXISTING_PASSWORD PASSCONFIRM_NEW
UINT_PTR DoExistingPasswordConfirm(HWND hDlg,BOOL * fExistingPassword) { if ( SUCCEEDED( VerifySupervisorPassword() ) ) { *fExistingPassword=TRUE;
CPasswordDialog passDlg( IDS_PASSWORD_LABEL );
return passDlg.DoModal( hDlg ); } else { *fExistingPassword=FALSE;
return(NO_EXISTING_PASSWORD); } }
STDAPI RatingSetupUI(HWND hDlg, LPCSTR pszUsername) { BOOL fExistingPassword;
UINT_PTR passConfirm = DoExistingPasswordConfirm(hDlg,&fExistingPassword);
if (passConfirm == PASSCONFIRM_FAIL) { TraceMsg( TF_WARNING, "RatingSetupUI() - Failed Existing Password Confirmation!" ); return E_ACCESSDENIED; }
HRESULT hres = NOERROR;
BOOL fFreshInstall = FALSE; if (!gPRSI->fRatingInstalled) { gPRSI->FreshInstall(); fFreshInstall = TRUE; }
if ( ! PicsOptionsDialog( hDlg, gPRSI, GetUserObject(pszUsername) ) ) { /* If we have no saved settings and they cancelled the settings UI, and
* they just entered a new supervisor password, then we need to remove * the supervisor password too, otherwise it looks like there's been * tampering. The other option would be to actually commit the * settings in that case but disable enforcement, but the case we're * looking to treat here is the casual exploring user who goes past * entering the password but decides he doesn't want ratings after all. * If we leave the password and ratings settings there, then he's not * going to remember what the password was when he decides he does want * ratings a year from now. Best to just remove the password and let * him enter and confirm a new one next time. */ if (fFreshInstall) { if (passConfirm == PASSCONFIRM_NEW) { RemoveSupervisorPassword(); } }
TraceMsg( TF_WARNING, "RatingSetupUI() - PicsOptionsDialog() Failed!" ); return E_FAIL; }
if ( ! IsRegistryModifiable( hDlg ) ) { TraceMsg( TF_WARNING, "RatingSetupUI() - Registry is Not Modifiable!" ); return E_ACCESSDENIED; }
if ( FAILED( VerifySupervisorPassword() ) ) { passConfirm = DoPasswordConfirm(hDlg);
if(passConfirm==PASSCONFIRM_FAIL) { TraceMsg( TF_WARNING, "RatingSetupUI() - PicsOptionsDialog() Failed Password Confirmation!" ); gPRSI->fRatingInstalled = FALSE; return E_FAIL; } }
gPRSI->fSettingsValid = TRUE; gPRSI->SaveRatingSystemInfo();
return NOERROR; }
CIntroDialog g_introDialog;
STDAPI RatingAddPropertyPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lparam, DWORD dwPageFlags) { HRESULT hr = NOERROR;
ASSERT( pfnAddPage );
if ( ! pfnAddPage ) { TraceMsg( TF_ERROR, "RatingAddPropertyPages() - pfnAddPage is NULL!" ); return E_INVALIDARG; }
// Initialize the Property Page DLL Instance
g_introDialog.m_psp.hInstance = MLGetHinst();
HPROPSHEETPAGE hPage;
hPage = g_introDialog.Create();
if ( hPage ) { if ( ! pfnAddPage( hPage, lparam ) ) { DestroyPropertySheetPage( hPage );
hr = E_FAIL; } } else { hr = E_OUTOFMEMORY; }
return hr; }
STDAPI RatingEnable(HWND hwndParent, LPCSTR pszUsername, BOOL fEnable) { // Display the Ratings UI if the Ratings are not fully installed or settings are not valid.
if (!gPRSI || !gPRSI->fRatingInstalled || !gPRSI->fSettingsValid) { if (!fEnable) { TraceMsg( TF_WARNING, "RatingEnable() - Ratings are disabled by not being installed!" ); return NOERROR; /* ratings are disabled by not being installed */ }
HRESULT hres = RatingSetupUI(hwndParent, pszUsername);
/* User clicked "Turn On" but we installed and let him choose his
* settings, so give him friendly confirmation that we set things * up for him and he can click Settings later to change things * (therefore implying that he doesn't need to click Settings now). */ if (SUCCEEDED(hres)) { MyMessageBox(hwndParent, IDS_NOWENABLED, IDS_ENABLE_WARNING, IDS_GENERIC, MB_ICONINFORMATION | MB_OK); }
return hres; }
if ( ! IsRegistryModifiable( hwndParent ) ) { TraceMsg( TF_WARNING, "RatingEnable() - Registry is Not Modifiable!" ); return E_ACCESSDENIED; }
PicsUser *pUser = ::GetUserObject(pszUsername); if (pUser == NULL) { return HRESULT_FROM_WIN32(ERROR_BAD_USERNAME); }
/* !a == !b to normalize non-zero values */ if (!fEnable == !pUser->fEnabled) { return NOERROR; /* already in state caller wants */ }
if (DoPasswordConfirm(hwndParent)) { PicsUser *pUser = ::GetUserObject(); if (pUser != NULL) { pUser->fEnabled = !pUser->fEnabled; gPRSI->SaveRatingSystemInfo(); if (pUser->fEnabled) { MyMessageBox(hwndParent, IDS_NOW_ON, IDS_ENABLE_WARNING, IDS_GENERIC, MB_OK); } else { CRegKey keyRatings;
if ( keyRatings.Open( HKEY_LOCAL_MACHINE, szRATINGS ) == ERROR_SUCCESS ) { DWORD dwFlag;
if ( keyRatings.QueryValue( dwFlag, szTURNOFF ) == ERROR_SUCCESS ) { if ( dwFlag != 1 ) { CTurnOffDialog turnOffDialog;
turnOffDialog.DoModal( hwndParent ); } } else { CTurnOffDialog turnOffDialog;
turnOffDialog.DoModal( hwndParent ); } } } } return NOERROR; } else { return E_ACCESSDENIED; } }
STDAPI_(int) ClickedOnPRF(HWND hWndOwner,HINSTANCE p_hInstance,PSTR lpszFileName,int nShow) { BOOL bExists=FALSE,fPICSRulesSaved=FALSE,fExistingPassword; int iReplaceInstalled=IDYES; char szTitle[MAX_PATH],szMessage[MAX_PATH]; PropSheet ps; PRSD *pPRSD; char pszBuf[MAXPATHLEN]; BOOL fRet=FALSE; UINT_PTR passConfirm;
if ( ! IsRegistryModifiable( hWndOwner ) ) { TraceMsg( TF_WARNING, "ClickedOnPRF() - Registry is Not Modifiable!" ); return E_ACCESSDENIED; }
InitializeCommonControls();
//Make sure the user wants to do this
if( SUCCEEDED( VerifySupervisorPassword() ) ) { fExistingPassword=TRUE;
CPasswordDialog passDlg( IDS_PICS_RULES_LABEL, true );
passConfirm = passDlg.DoModal( hWndOwner ); } else { fExistingPassword=FALSE;
CPasswordDialog passDlg( IDS_PICS_RULES_LABEL, false );
passConfirm = passDlg.DoModal( hWndOwner ); }
if(passConfirm==PASSCONFIRM_FAIL) { TraceMsg( TF_WARNING, "ClickedOnPRF() - Password Confirmation Failed!" ); return E_ACCESSDENIED; }
if(fExistingPassword==FALSE) { passConfirm=NO_EXISTING_PASSWORD; }
BOOL fFreshInstall=FALSE;
if(!gPRSI->fRatingInstalled) { gPRSI->FreshInstall(); fFreshInstall=TRUE; }
gPRSI->lpszFileName=lpszFileName;
MLLoadStringA(IDS_GENERIC,pszBuf,sizeof(pszBuf));
ps.Init( hWndOwner, NUM_PAGES, pszBuf, TRUE );
pPRSD=new PRSD; if (!pPRSD) { TraceMsg( TF_ERROR, "ClickedOnPRF() - Failed PRSD Creation!" ); return FALSE; }
pPRSD->pPU =GetUserObject((LPCTSTR) NULL); pPRSD->pTempRatings =NULL; pPRSD->hwndBitmapCategory =NULL; pPRSD->hwndBitmapLabel =NULL; pPRSD->pPRSI =gPRSI; pPRSD->fNewProviders =FALSE;
HPROPSHEETPAGE hPage;
CPicsDialog picsDialog( pPRSD ); hPage = picsDialog.Create(); ps.MakePropPage( hPage );
CApprovedSitesDialog approvedSitesDialog( pPRSD ); hPage = approvedSitesDialog.Create(); ps.MakePropPage( hPage );
CGeneralDialog generalDialog( pPRSD ); hPage = generalDialog.Create(); ps.MakePropPage( hPage );
CAdvancedDialog advancedDialog( pPRSD ); hPage = advancedDialog.Create(); ps.MakePropPage( hPage );
if ( ps.PropPageCount() == NUM_PAGES ) { if(fExistingPassword==FALSE) { picsDialog.InstallDefaultProvider(); picsDialog.PicsDlgSave(); }
ps.SetStartPage( ps.PropPageCount() - 1 ); fRet=ps.Run(); }
delete pPRSD; pPRSD = NULL;
if(!fRet) { // If we have no saved settings and they cancelled the settings UI, and
// they just entered a new supervisor password, then we need to remove
// the supervisor password too, otherwise it looks like there's been
// tampering. The other option would be to actually commit the
// settings in that case but disable enforcement, but the case we're
// looking to treat here is the casual exploring user who goes past
// entering the password but decides he doesn't want ratings after all.
// If we leave the password and ratings settings there, then he's not
// going to remember what the password was when he decides he does want
// ratings a year from now. Best to just remove the password and let
// him enter and confirm a new one next time.
if(fFreshInstall) { if(passConfirm==PASSCONFIRM_NEW) { RemoveSupervisorPassword(); } }
return(FALSE); }
if ( FAILED( VerifySupervisorPassword() ) ) { passConfirm=DoPasswordConfirm(hWndOwner);
if(passConfirm==PASSCONFIRM_FAIL) { gPRSI->fRatingInstalled=FALSE; return(FALSE); } }
gPRSI->fSettingsValid=TRUE; gPRSI->SaveRatingSystemInfo();
MLLoadString(IDS_PICSRULES_CLICKIMPORTTITLE,(LPTSTR) szTitle,MAX_PATH); MLLoadString(IDS_PICSRULES_CLICKFINISHED,(LPTSTR) szMessage,MAX_PATH);
MessageBox(hWndOwner,(LPCTSTR) szMessage,(LPCTSTR) szTitle,MB_OK);
return(TRUE); }
STDAPI_(int) ClickedOnRAT(HWND hWndOwner,HINSTANCE p_hInstance,PSTR lpszFileName,int nShow) { BOOL bExists=FALSE,fPICSRulesSaved=FALSE,fExistingPassword; int iReplaceInstalled=IDYES; char szTitle[MAX_PATH],szMessage[MAX_PATH],szNewFile[MAX_PATH]; char *lpszFile,*lpszTemp; PropSheet ps; PRSD *pPRSD; char pszBuf[MAXPATHLEN]; BOOL fRet=FALSE; UINT_PTR passConfirm;
if ( ! IsRegistryModifiable( hWndOwner ) ) { TraceMsg( TF_WARNING, "ClickedOnRAT() - Registry is Not Modifiable!" ); return E_ACCESSDENIED; }
InitializeCommonControls();
//Make sure the user wants to do this
if ( SUCCEEDED ( VerifySupervisorPassword() ) ) { fExistingPassword=TRUE; CPasswordDialog passDlg( IDS_RATING_SYSTEM_LABEL, true );
passConfirm = passDlg.DoModal( hWndOwner ); } else { fExistingPassword=FALSE;
CPasswordDialog passDlg( IDS_RATING_SYSTEM_LABEL, false );
passConfirm = passDlg.DoModal( hWndOwner ); }
if(passConfirm==PASSCONFIRM_FAIL) { TraceMsg( TF_WARNING, "ClickedOnRAT() - Password Confirmation Failed!" ); return E_ACCESSDENIED; }
if(fExistingPassword==FALSE) { passConfirm=NO_EXISTING_PASSWORD; }
//Copy the file to the windows system directory
GetSystemDirectory(szNewFile,MAX_PATH); lpszTemp=lpszFileName;
do{ lpszFile=lpszTemp; } while((lpszTemp=strchrf(lpszTemp+1,'\\'))!=NULL); lstrcat(szNewFile,lpszFile); CopyFile(lpszFileName,szNewFile,FALSE);
BOOL fFreshInstall = FALSE; if (!gPRSI->fRatingInstalled) { gPRSI->FreshInstall(); fFreshInstall = TRUE; }
gPRSI->lpszFileName=szNewFile;
MLLoadStringA(IDS_GENERIC,pszBuf,sizeof(pszBuf));
ps.Init( hWndOwner, NUM_PAGES, pszBuf, TRUE );
pPRSD=new PRSD; if (!pPRSD) { TraceMsg( TF_ERROR, "ClickedOnRAT() - Failed PRSD Creation!" ); return FALSE; }
pPRSD->pPU =GetUserObject((LPCTSTR) NULL); pPRSD->pTempRatings =NULL; pPRSD->hwndBitmapCategory =NULL; pPRSD->hwndBitmapLabel =NULL; pPRSD->pPRSI =gPRSI; pPRSD->fNewProviders =FALSE;
HPROPSHEETPAGE hPage;
CPicsDialog picsDialog( pPRSD ); hPage = picsDialog.Create(); ps.MakePropPage( hPage );
CApprovedSitesDialog approvedSitesDialog( pPRSD ); hPage = approvedSitesDialog.Create(); ps.MakePropPage( hPage );
CGeneralDialog generalDialog( pPRSD ); hPage = generalDialog.Create(); ps.MakePropPage( hPage );
CAdvancedDialog advancedDialog( pPRSD ); hPage = advancedDialog.Create(); ps.MakePropPage( hPage );
if ( ps.PropPageCount() == NUM_PAGES ) { if(fExistingPassword==FALSE) { picsDialog.InstallDefaultProvider(); picsDialog.PicsDlgSave(); }
ps.SetStartPage( ps.PropPageCount() - 2 ); fRet=ps.Run(); }
delete pPRSD; pPRSD = NULL;
if(!fRet) { // If we have no saved settings and they cancelled the settings UI, and
// they just entered a new supervisor password, then we need to remove
// the supervisor password too, otherwise it looks like there's been
// tampering. The other option would be to actually commit the
// settings in that case but disable enforcement, but the case we're
// looking to treat here is the casual exploring user who goes past
// entering the password but decides he doesn't want ratings after all.
// If we leave the password and ratings settings there, then he's not
// going to remember what the password was when he decides he does want
// ratings a year from now. Best to just remove the password and let
// him enter and confirm a new one next time.
if(fFreshInstall) { if(passConfirm==PASSCONFIRM_NEW) { RemoveSupervisorPassword(); } }
return(FALSE); }
if ( FAILED( VerifySupervisorPassword() ) ) { passConfirm=DoPasswordConfirm(hWndOwner);
if(passConfirm==PASSCONFIRM_FAIL) { gPRSI->fRatingInstalled=FALSE; return(FALSE); } }
gPRSI->fSettingsValid=TRUE; gPRSI->SaveRatingSystemInfo();
MLLoadString(IDS_PICSRULES_CLICKIMPORTTITLE,(LPTSTR) szTitle,MAX_PATH); MLLoadString(IDS_PICSRULES_CLICKFINISHED,(LPTSTR) szMessage,MAX_PATH);
MessageBox(hWndOwner,(LPCTSTR) szMessage,(LPCTSTR) szTitle,MB_OK);
return(TRUE); }
|