|
|
#include "mslocusr.h"
#include "msluglob.h"
#include "resource.h"
#include "profiles.h"
#include <npmsg.h>
#include <shellapi.h>
#include "contxids.h"
HRESULT GetLBItemText(HWND hDlg, UINT idCtrl, int iItem, NLS_STR *pnls) { HWND hCtrl = GetDlgItem(hDlg, idCtrl); UINT cch = (UINT)SendMessage(hCtrl, LB_GETTEXTLEN, iItem, 0); if (pnls->realloc(cch + 1)) { SendMessage(hCtrl, LB_GETTEXT, iItem, (LPARAM)(LPSTR)pnls->Party()); pnls->DonePartying(); return NOERROR; } return E_OUTOFMEMORY; }
void SetErrorFocus(HWND hDlg, UINT idCtrl, BOOL fClear /* = TRUE */) { HWND hCtrl = ::GetDlgItem(hDlg, idCtrl); ::SetFocus(hCtrl); if (fClear) ::SetWindowText(hCtrl, ""); else ::SendMessage(hCtrl, EM_SETSEL, 0, -1); }
INT_PTR CALLBACK PasswordDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static DWORD aIds[] = { IDC_STATIC1, IDH_RATINGS_SUPERVISOR_PASSWORD, IDC_STATIC2, IDH_RATINGS_SUPERVISOR_PASSWORD, IDC_PASSWORD, IDH_RATINGS_SUPERVISOR_PASSWORD, 0,0 };
CHAR pszPassword[MAX_PATH]; HRESULT hRet;
switch (uMsg) { case WM_INITDIALOG: { HWND hwndCheckbox = GetDlgItem(hDlg, IDC_CACHE_PASSWORD);
IUserDatabase *pDB = (IUserDatabase *)lParam; SetWindowLongPtr(hDlg, DWLP_USER, lParam); IUser *pCurrentUser; HRESULT hres; hres = pDB->GetCurrentUser(&pCurrentUser); if (SUCCEEDED(hres)) { DWORD cbBuffer = sizeof(pszPassword); hres = pCurrentUser->GetName(pszPassword, &cbBuffer); if (SUCCEEDED(hres)) { NLS_STR nlsName(STR_OWNERALLOC, pszPassword); NLS_STR nlsTemp(MAX_RES_STR_LEN); const NLS_STR *apnls[] = { &nlsName, NULL }; hres = HRESULT_FROM_WIN32(nlsTemp.LoadString(IDS_CACHE_PASSWORD, apnls)); if (SUCCEEDED(hres)) SetWindowText(hwndCheckbox, nlsTemp.QueryPch()); } pCurrentUser->Release(); } if (FAILED(hres)) { ShowWindow(hwndCheckbox, SW_HIDE); EnableWindow(hwndCheckbox, FALSE); } CheckDlgButton(hDlg, IDC_CACHE_PASSWORD, 0); } return TRUE; /* we did not set the focus */
case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hDlg, FALSE); break;
case IDOK: GetDlgItemText(hDlg, IDC_PASSWORD, pszPassword, sizeof(pszPassword)); hRet = VerifySupervisorPassword(pszPassword);
if (hRet == (NOERROR)) { IUserDatabase *pDB = (IUserDatabase *)GetWindowLongPtr(hDlg, DWLP_USER); IUser *pCurrentUser; if (SUCCEEDED(pDB->GetCurrentUser(&pCurrentUser))) { if (IsDlgButtonChecked(hDlg, IDC_CACHE_PASSWORD)) { pCurrentUser->SetSupervisorPrivilege(TRUE, pszPassword); } else { pCurrentUser->MakeTempSupervisor(TRUE, pszPassword); } pCurrentUser->Release(); }
EndDialog(hDlg, TRUE); } else { MsgBox(hDlg, IDS_BADPASSWORD, MB_OK | MB_ICONSTOP); SetErrorFocus(hDlg, IDC_PASSWORD); } break;
default: return FALSE; } break;
case WM_HELP: WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, ::szRatingsHelpFile, HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds); break;
case WM_CONTEXTMENU: WinHelp((HWND)wParam, ::szRatingsHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds); break;
default: return FALSE; } return TRUE; }
INT_PTR CALLBACK ChangePasswordDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static DWORD aIds[] = { IDC_STATIC1, IDH_OLD_PASSWORD, IDC_OLD_PASSWORD, IDH_OLD_PASSWORD, IDC_STATIC2, IDH_NEW_PASSWORD, IDC_PASSWORD, IDH_NEW_PASSWORD, IDC_STATIC3, IDH_CONFIRM_PASSWORD, IDC_CONFIRM_PASSWORD, IDH_CONFIRM_PASSWORD, 0,0 };
CHAR pszPassword[MAX_PATH]; CHAR pszTempPassword[MAX_PATH]; CHAR *p = NULL; HRESULT hRet; HWND hwndPassword;
switch (uMsg) { case WM_INITDIALOG: SetWindowLongPtr(hDlg, DWLP_USER, lParam); return TRUE; /* we didn't set the focus */
case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hDlg, FALSE); break;
case IDOK: { IUser *pUser = (IUser *)GetWindowLongPtr(hDlg, DWLP_USER);
hwndPassword = ::GetDlgItem(hDlg, IDC_PASSWORD); GetWindowText(hwndPassword, pszPassword, sizeof(pszPassword)); GetDlgItemText(hDlg, IDC_CONFIRM_PASSWORD, pszTempPassword, sizeof(pszTempPassword));
/* if they've typed just the first password but not the
* second, let Enter take them to the second field */ if (*pszPassword && !*pszTempPassword && GetFocus() == hwndPassword) { SetErrorFocus(hDlg, IDC_CONFIRM_PASSWORD); break; }
if (strcmpf(pszPassword, pszTempPassword)) { MsgBox(hDlg, IDS_NO_MATCH, MB_OK | MB_ICONSTOP); SetErrorFocus(hDlg, IDC_CONFIRM_PASSWORD); break; }
GetDlgItemText(hDlg, IDC_OLD_PASSWORD, pszTempPassword, sizeof(pszTempPassword)); hRet = pUser->ChangePassword(pszTempPassword, pszPassword); if (SUCCEEDED(hRet)) EndDialog(hDlg, TRUE); else { MsgBox(hDlg, IDS_BADPASSWORD, MB_OK | MB_ICONSTOP); SetErrorFocus(hDlg, IDC_OLD_PASSWORD); } break; }
default: return FALSE; } break;
case WM_HELP: WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, ::szHelpFile, HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds); break;
case WM_CONTEXTMENU: WinHelp((HWND)wParam, ::szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds); break;
default: return FALSE; } return TRUE; }
BOOL DoPasswordConfirm(HWND hwndParent, IUserDatabase *pDB) { return (BOOL)DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_PASSWORD), hwndParent, PasswordDialogProc, (LPARAM)pDB); }
const UINT MAX_PAGES = 1;
class CCPLData { public: IUserDatabase *m_pDB; LPCSTR m_pszNameToDelete; };
void CPLUserSelected(HWND hwndLB, int iItem) { HWND hDlg = GetParent(hwndLB); BOOL fEnableButtons = (iItem != LB_ERR);
EnableWindow(GetDlgItem(hDlg, IDC_Delete), fEnableButtons); EnableWindow(GetDlgItem(hDlg, IDC_Clone), fEnableButtons); EnableWindow(GetDlgItem(hDlg, IDC_SetPassword), fEnableButtons); EnableWindow(GetDlgItem(hDlg, IDC_OpenProfileFolder), fEnableButtons);
NLS_STR nlsTemp(MAX_RES_STR_LEN);
if (fEnableButtons) { NLS_STR nlsName; if (SUCCEEDED(GetLBItemText(hDlg, IDC_USERNAME, iItem, &nlsName))) { const NLS_STR *apnls[] = { &nlsName, NULL }; if (nlsTemp.LoadString(IDS_SETTINGS_FOR, apnls) != ERROR_SUCCESS) nlsTemp = szNULL; } } else { if (nlsTemp.LoadString(IDS_SELECTED_USER) != ERROR_SUCCESS) nlsTemp = szNULL; } if (nlsTemp.strlen()) SetDlgItemText(hDlg, IDC_MAIN_CAPTION, nlsTemp.QueryPch()); }
void ReInitUserList(HWND hDlg, CCPLData *pcpld) { HWND hwndLB = GetDlgItem(hDlg, IDC_USERNAME);
SendMessage(hwndLB, WM_SETREDRAW, FALSE, 0); DestroyUserList(hwndLB); SendMessage(hwndLB, LB_RESETCONTENT, 0, 0); FillUserList(hwndLB, pcpld->m_pDB, NULL, FALSE, CPLUserSelected); SendMessage(hwndLB, WM_SETREDRAW, TRUE, 0); InvalidateRect(hwndLB, NULL, TRUE); }
void DoCloneUser(HWND hDlg, CCPLData *pcpld, IUser *pUserToClone) { DoAddUserWizard(hDlg, pcpld->m_pDB, FALSE, pUserToClone);
ReInitUserList(hDlg, pcpld); }
HRESULT DeleteProgressFunc(LPARAM lParam) { CCPLData *pcpld = (CCPLData *)lParam;
return pcpld->m_pDB->DeleteUser(pcpld->m_pszNameToDelete); }
void DoDeleteUser(HWND hDlg, CCPLData *pcpld, int iItem) { NLS_STR nlsName; if (FAILED(GetLBItemText(hDlg, IDC_USERNAME, iItem, &nlsName))) return;
const NLS_STR *apnls[] = { &nlsName, NULL }; if (MsgBox(hDlg, IDS_CONFIRM_DELETE_USER, MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2, apnls) == IDNO) return;
pcpld->m_pszNameToDelete = nlsName.QueryPch(); HRESULT hres = CallWithinProgressDialog(hDlg, IDD_DeleteProgress, DeleteProgressFunc, (LPARAM)pcpld);
if (SUCCEEDED(hres)) { ReInitUserList(hDlg, pcpld); } else { ReportUserError(hDlg, hres); } }
void DoSetPassword(HWND hDlg, CCPLData *pcpld, int iItem) { /* Note, getting pUser this way does not automatically AddRef it */ IUser *pUser = (IUser *)::SendDlgItemMessage(hDlg, IDC_USERNAME, LB_GETITEMDATA, iItem, 0);
if (pUser != NULL) { pUser->AddRef(); /* extra AddRef for life of dialog */ if (DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CHANGE_PASSWORD), hDlg, ChangePasswordDialogProc, (LPARAM)pUser)) MsgBox(hDlg, IDS_PASSWORD_CHANGED, MB_OK | MB_ICONINFORMATION); pUser->Release(); /* undo above AddRef */ } }
INT_PTR CALLBACK FoldersDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static DWORD aIds[] = { IDC_CHECK_DESKTOP, IDH_DESKTOP_NETHOOD, IDC_CHECK_STARTMENU, IDH_START_MENU, IDC_CHECK_FAVORITES, IDH_FAVORITES, IDC_CHECK_CACHE, IDH_TEMP_FILES, IDC_CHECK_MYDOCS, IDH_MY_DOCS, IDC_RADIO_EMPTY, IDH_EMPTY_FOLDERS, IDC_RADIO_COPY, IDH_EXISTING_FILES, 0,0 };
switch(message) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hDlg, FALSE); break;
case IDOK: { CWizData *pwd = (CWizData *)GetWindowLongPtr(hDlg, DWLP_USER);
pwd->m_fdwCloneFromDefault = IsDlgButtonChecked(hDlg, IDC_RADIO_EMPTY) ? 0 : 0xffffffff; pwd->m_fdwNewPerUserFolders = 0; if (IsDlgButtonChecked(hDlg, IDC_CHECK_DESKTOP)) pwd->m_fdwNewPerUserFolders |= FOLDER_DESKTOP | FOLDER_NETHOOD | FOLDER_RECENT; else pwd->m_fdwNewPerUserFolders &= ~(FOLDER_DESKTOP | FOLDER_NETHOOD | FOLDER_RECENT);
if (IsDlgButtonChecked(hDlg, IDC_CHECK_STARTMENU)) pwd->m_fdwNewPerUserFolders |= FOLDER_STARTMENU | FOLDER_PROGRAMS | FOLDER_STARTUP; else pwd->m_fdwNewPerUserFolders &= ~(FOLDER_STARTMENU | FOLDER_PROGRAMS | FOLDER_STARTUP);
if (IsDlgButtonChecked(hDlg, IDC_CHECK_FAVORITES)) pwd->m_fdwNewPerUserFolders |= FOLDER_FAVORITES; else pwd->m_fdwNewPerUserFolders &= ~(FOLDER_FAVORITES);
if (IsDlgButtonChecked(hDlg, IDC_CHECK_CACHE)) pwd->m_fdwNewPerUserFolders |= FOLDER_CACHE; else pwd->m_fdwNewPerUserFolders &= ~(FOLDER_CACHE);
if (IsDlgButtonChecked(hDlg, IDC_CHECK_MYDOCS)) pwd->m_fdwNewPerUserFolders |= FOLDER_MYDOCS; else pwd->m_fdwNewPerUserFolders &= ~(FOLDER_MYDOCS);
FinishChooseFolders(hDlg, pwd); } break;
default: return FALSE; } break;
case WM_INITDIALOG: { SetWindowLongPtr(hDlg, DWLP_USER, lParam); CWizData *pwd = (CWizData *)GetWindowLongPtr(hDlg, DWLP_USER);
InitFolderCheckboxes(hDlg, pwd); CheckRadioButton(hDlg, IDC_RADIO_COPY, IDC_RADIO_EMPTY, IDC_RADIO_COPY); } break;
case WM_HELP: WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, ::szHelpFile, HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds); break;
case WM_CONTEXTMENU: WinHelp((HWND)wParam, ::szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds); break;
default: return FALSE;
} // end of switch on message
return TRUE; }
void DoOpenProfileFolder(HWND hDlg, CCPLData *pcpld, int iItem) { /* Note, getting pUser this way does not automatically AddRef it */ IUser *pUser = (IUser *)::SendDlgItemMessage(hDlg, IDC_USERNAME, LB_GETITEMDATA, iItem, 0);
#if 0 /* old code to launch Explorer on the user's profile dir */
if (pUser != NULL) { CHAR szHomeDir[MAX_PATH]; DWORD cbBuffer = sizeof(szHomeDir);
if (SUCCEEDED(pUser->GetProfileDirectory(szHomeDir, &cbBuffer)) && cbBuffer > 0) { TCHAR szArgs[MAX_PATH+4]; lstrcpy(szArgs, "/e,"); lstrcat(szArgs, szHomeDir);
SHELLEXECUTEINFO ei;
ei.lpFile = "explorer.exe"; ei.cbSize = sizeof(SHELLEXECUTEINFO); ei.hwnd = NULL; ei.lpVerb = NULL; ei.lpParameters = szArgs; ei.lpDirectory = szHomeDir; ei.nShow = SW_SHOWNORMAL; ei.fMask = SEE_MASK_NOCLOSEPROCESS;
if (ShellExecuteEx(&ei)) { CloseHandle(ei.hProcess); } } } #else
if (pUser != NULL) { CWizData wd; wd.m_pDB = pcpld->m_pDB; wd.m_pUserToClone = pUser; pUser->AddRef();
DialogBoxParam(::hInstance, MAKEINTRESOURCE(IDD_ChooseFolders), hDlg, FoldersDlgProc, (LPARAM)&wd); }
#endif
}
INT_PTR CALLBACK UserCPLDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static DWORD aIds[] = { IDC_USERNAME, IDH_USERS_LIST, IDC_Add, IDH_NEW_USER, IDC_Delete, IDH_REMOVE_USER, IDC_Clone, IDH_COPY_USER, IDC_SetPassword, IDH_SET_PASSWORD, IDC_OpenProfileFolder, IDH_CHANGE_DESKTOP, 0,0 };
NMHDR FAR *lpnm;
switch(message) { case WM_NOTIFY: lpnm = (NMHDR FAR *)lParam; switch(lpnm->code) { case PSN_SETACTIVE: { int iItem = (int)::SendDlgItemMessage(hDlg, IDC_USERNAME, LB_GETCURSEL, 0, 0); CPLUserSelected((HWND)lParam, iItem); } break;
default: return FALSE; } break;
case WM_INITDIALOG: { PropSheet_CancelToClose(GetParent(hDlg)); InitWizDataPtr(hDlg, lParam); CCPLData *pcpld = (CCPLData *)(((LPPROPSHEETPAGE)lParam)->lParam); FillUserList(GetDlgItem(hDlg, IDC_USERNAME), pcpld->m_pDB, NULL, FALSE, CPLUserSelected); } break;
case WM_DESTROY: DestroyUserList(GetDlgItem(hDlg, IDC_USERNAME)); break;
case WM_COMMAND: { CCPLData *pcpld = (CCPLData *)GetWindowLongPtr(hDlg, DWLP_USER); int iItem = (int)::SendDlgItemMessage(hDlg, IDC_USERNAME, LB_GETCURSEL, 0, 0);
switch (LOWORD(wParam)) { case IDC_USERNAME: if (HIWORD(wParam) == LBN_SELCHANGE) { CPLUserSelected((HWND)lParam, iItem); } break;
case IDC_Add: DoCloneUser(hDlg, pcpld, NULL); break;
case IDC_Clone: { if (iItem != LB_ERR) { IUser *pUser = (IUser *)::SendDlgItemMessage(hDlg, IDC_USERNAME, LB_GETITEMDATA, iItem, 0); DoCloneUser(hDlg, pcpld, pUser); } } break;
case IDC_Delete: DoDeleteUser(hDlg, pcpld, iItem); break;
case IDC_SetPassword: DoSetPassword(hDlg, pcpld, iItem); break;
case IDC_OpenProfileFolder: DoOpenProfileFolder(hDlg, pcpld, iItem); break;
default: return FALSE; } /* switch */ } break;
case WM_HELP: WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, ::szHelpFile, HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds); break;
case WM_CONTEXTMENU: WinHelp((HWND)wParam, ::szHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds); break;
default: return FALSE;
} // end of switch on message
return TRUE; }
STDMETHODIMP CLUDatabase::UserCPL(HWND hwndParent) { if (ProfileUIRestricted()) { ReportRestrictionError(hwndParent); return E_ACCESSDENIED; }
CCPLData cpld; cpld.m_pDB = this;
if (!UseUserProfiles() || FAILED(VerifySupervisorPassword(szNULL))) { return InstallWizard(hwndParent); } else { BOOL fContinue = TRUE;
if (IsCurrentUserSupervisor(this) != S_OK) { fContinue = DoPasswordConfirm(hwndParent, this); }
if (fContinue) { LPPROPSHEETHEADER ppsh;
// Allocate the property sheet header
//
if ((ppsh = (LPPROPSHEETHEADER)LocalAlloc(LMEM_FIXED, sizeof(PROPSHEETHEADER)+ (MAX_PAGES * sizeof(HPROPSHEETPAGE)))) != NULL) { ppsh->dwSize = sizeof(*ppsh); ppsh->dwFlags = PSH_NOAPPLYNOW; ppsh->hwndParent = hwndParent; ppsh->hInstance = ::hInstance; ppsh->pszCaption = (LPSTR)IDS_MSGTITLE; ppsh->nPages = 0; ppsh->nStartPage = 0; ppsh->phpage = (HPROPSHEETPAGE *)(ppsh+1);
AddPage(ppsh, IDD_Users, UserCPLDlgProc, &cpld);
PropertySheet(ppsh);
LocalFree((HLOCAL)ppsh); } } }
return NOERROR; }
void DoUserCPL(HWND hwndParent) { IUserDatabase *pDB = NULL; if (FAILED(::CreateUserDatabase(IID_IUserDatabase, (void **)&pDB))) return;
pDB->UserCPL(hwndParent);
pDB->Release(); }
extern "C" void UserCPL(HWND hwndParent, HINSTANCE hinstEXE, LPSTR pszCmdLine, int nCmdShow) { DoUserCPL(hwndParent); }
|