/****************************************************************************\ * * 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 #include #include #include #include extern array 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 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 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); }