windows-nt/Source/XPSP1/NT/shell/ext/ratings/msrating/msludlg.cpp
2020-09-26 16:20:57 +08:00

679 lines
19 KiB
C++

/****************************************************************************\
*
* 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);
}