273 lines
8.5 KiB
C++
273 lines
8.5 KiB
C++
#include "stdafx.h"
|
|
#include "password.h"
|
|
#pragma hdrstop
|
|
|
|
|
|
// password prompt dialog
|
|
|
|
INT_PTR CPasswordDialog::DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (uMsg)
|
|
{
|
|
HANDLE_MSG(hwnd, WM_INITDIALOG, OnInitDialog);
|
|
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CPasswordDialog::OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
|
|
{
|
|
TCHAR szMessage[MAX_PATH + MAX_DOMAIN + MAX_USER + 256 + 2]; szMessage[0] = 0;
|
|
|
|
//
|
|
// Limit the size of the edit controls + Set username/password
|
|
//
|
|
HWND hwndCredential = GetDlgItem(hwnd, IDC_CREDENTIALS);
|
|
SendMessage(hwndCredential, CRM_SETUSERNAME, NULL, (LPARAM) m_pszDomainUser);
|
|
SendMessage(hwndCredential, CRM_SETPASSWORD, NULL, (LPARAM) m_pszPassword);
|
|
SendMessage(hwndCredential, CRM_SETUSERNAMEMAX, m_cchDomainUser - 1, NULL);
|
|
SendMessage(hwndCredential, CRM_SETPASSWORDMAX, m_cchPassword - 1, NULL);
|
|
|
|
// We may need to generate a user name here to use if no user name was
|
|
// passed in
|
|
TCHAR szDomainUser[MAX_DOMAIN + MAX_USER + 2];
|
|
LPTSTR pszUserNameToUse;
|
|
|
|
if (*m_pszDomainUser)
|
|
{
|
|
pszUserNameToUse = m_pszDomainUser;
|
|
}
|
|
else
|
|
{
|
|
szDomainUser[0] = 0;
|
|
|
|
TCHAR szUser[MAX_USER + 1];
|
|
DWORD cchUser = ARRAYSIZE(szUser);
|
|
TCHAR szDomain[MAX_DOMAIN + 1];
|
|
DWORD cchDomain = ARRAYSIZE(szDomain);
|
|
|
|
GetCurrentUserAndDomainName(szUser, &cchUser, szDomain, &cchDomain);
|
|
|
|
MakeDomainUserString(szDomain, szUser, szDomainUser, ARRAYSIZE(szDomainUser));
|
|
pszUserNameToUse = szDomainUser;
|
|
}
|
|
|
|
FormatMessageString(IDS_PWD_STATIC, szMessage, ARRAYSIZE(szMessage), m_pszResourceName, pszUserNameToUse);
|
|
SetDlgItemText(hwnd, IDC_MESSAGE, szMessage);
|
|
|
|
// Now set the error message description
|
|
|
|
TCHAR szError[512];
|
|
if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, m_dwError, 0, szError, ARRAYSIZE(szError), NULL))
|
|
{
|
|
LoadString(g_hinst, IDS_ERR_UNEXPECTED, szError, ARRAYSIZE(szError));
|
|
}
|
|
SetDlgItemText(hwnd, IDC_ERROR, szError);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CPasswordDialog::OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
|
|
{
|
|
switch(id)
|
|
{
|
|
case IDOK:
|
|
{
|
|
// Read the username and password from the dialog. Note
|
|
// that we don't call FetchText for the password since it
|
|
// strips leading and trailing whitespace and, for all we
|
|
// know, that could be an important part of the password
|
|
SendDlgItemMessage(hwnd, IDC_CREDENTIALS, CRM_GETUSERNAME, (WPARAM) m_cchDomainUser - 1, (LPARAM) m_pszDomainUser);
|
|
SendDlgItemMessage(hwnd, IDC_CREDENTIALS, CRM_GETPASSWORD, (WPARAM) m_cchPassword - 1, (LPARAM) m_pszPassword);
|
|
}
|
|
// Fall through
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, id);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// page implementation - used for wizards etc
|
|
|
|
BOOL CPasswordPageBase::DoPasswordsMatch(HWND hwnd)
|
|
{
|
|
TCHAR szConfirmPW[MAX_PASSWORD + 1];
|
|
TCHAR szPassword[MAX_PASSWORD + 1];
|
|
|
|
GetWindowText(GetDlgItem(hwnd, IDC_PASSWORD), szPassword, ARRAYSIZE(szPassword));
|
|
GetWindowText(GetDlgItem(hwnd, IDC_CONFIRMPASSWORD), szConfirmPW,ARRAYSIZE(szConfirmPW));
|
|
|
|
BOOL fMatch = (StrCmp(szPassword, szConfirmPW) == 0);
|
|
if (!fMatch)
|
|
{
|
|
// Display a message saying the passwords don't match
|
|
DisplayFormatMessage(hwnd, IDS_USR_NEWUSERWIZARD_CAPTION, IDS_ERR_PWDNOMATCH, MB_OK | MB_ICONERROR);
|
|
}
|
|
|
|
return fMatch;
|
|
}
|
|
|
|
INT_PTR CPasswordWizardPage::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (uMsg)
|
|
{
|
|
HANDLE_MSG(hwndDlg, WM_INITDIALOG, OnInitDialog);
|
|
HANDLE_MSG(hwndDlg, WM_COMMAND, OnCommand);
|
|
HANDLE_MSG(hwndDlg, WM_NOTIFY, OnNotify);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CPasswordWizardPage::OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
|
|
{
|
|
Edit_LimitText(GetDlgItem(hwnd, IDC_PASSWORD), ARRAYSIZE(m_pUserInfo->m_szPasswordBuffer) - 1);
|
|
Edit_LimitText(GetDlgItem(hwnd, IDC_CONFIRMPASSWORD), ARRAYSIZE(m_pUserInfo->m_szPasswordBuffer) - 1);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CPasswordWizardPage::OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
|
|
{
|
|
switch (id)
|
|
{
|
|
case IDOK:
|
|
// Verify that the passwords match
|
|
if (DoPasswordsMatch(hwnd))
|
|
{
|
|
// Password is the same as confirm password - read password into user info
|
|
GetWindowText(GetDlgItem(hwnd, IDC_PASSWORD), m_pUserInfo->m_szPasswordBuffer,
|
|
ARRAYSIZE(m_pUserInfo->m_szPasswordBuffer));
|
|
|
|
// Hide the password
|
|
m_pUserInfo->HidePassword();
|
|
EndDialog(hwnd, IDOK);
|
|
}
|
|
else
|
|
{
|
|
m_pUserInfo->ZeroPassword();
|
|
}
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, IDCANCEL);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CPasswordWizardPage::OnNotify(HWND hwnd, int idCtrl, LPNMHDR pnmh)
|
|
{
|
|
switch (pnmh->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons(pnmh->hwndFrom, PSWIZB_NEXT | PSWIZB_BACK);
|
|
SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0);
|
|
return TRUE;
|
|
|
|
case PSN_WIZNEXT:
|
|
{
|
|
// Save the data the user has entered
|
|
if (DoPasswordsMatch(hwnd))
|
|
{
|
|
// Password is the same as confirm password - read password into user info
|
|
GetWindowText(GetDlgItem(hwnd, IDC_PASSWORD),
|
|
m_pUserInfo->m_szPasswordBuffer,
|
|
ARRAYSIZE(m_pUserInfo->m_szPasswordBuffer));
|
|
|
|
// Hide the password
|
|
m_pUserInfo->HidePassword();
|
|
SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0);
|
|
}
|
|
else
|
|
{
|
|
m_pUserInfo->ZeroPassword();
|
|
SetWindowLongPtr(hwnd, DWLP_MSGRESULT, -1);
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CChangePasswordDlg::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (uMsg)
|
|
{
|
|
HANDLE_MSG(hwndDlg, WM_INITDIALOG, OnInitDialog);
|
|
HANDLE_MSG(hwndDlg, WM_COMMAND, OnCommand);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CChangePasswordDlg::OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
|
|
{
|
|
Edit_LimitText(GetDlgItem(hwnd, IDC_PASSWORD), ARRAYSIZE(m_pUserInfo->m_szPasswordBuffer) - 1);
|
|
Edit_LimitText(GetDlgItem(hwnd, IDC_CONFIRMPASSWORD), ARRAYSIZE(m_pUserInfo->m_szPasswordBuffer) - 1);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CChangePasswordDlg::OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
|
|
{
|
|
switch (id)
|
|
{
|
|
case IDOK:
|
|
if (DoPasswordsMatch(hwnd))
|
|
{
|
|
// Password is the same as confirm password - read password into user info
|
|
GetWindowText(GetDlgItem(hwnd, IDC_PASSWORD), m_pUserInfo->m_szPasswordBuffer,
|
|
ARRAYSIZE(m_pUserInfo->m_szPasswordBuffer));
|
|
|
|
m_pUserInfo->HidePassword(); // Hide the password
|
|
|
|
// Update the password
|
|
BOOL fBadPasswordFormat;
|
|
if (SUCCEEDED(m_pUserInfo->UpdatePassword(&fBadPasswordFormat)))
|
|
{
|
|
EndDialog(hwnd, IDOK);
|
|
}
|
|
else
|
|
{
|
|
TCHAR szDomainUser[MAX_DOMAIN + MAX_USER + 2];
|
|
MakeDomainUserString(m_pUserInfo->m_szDomain, m_pUserInfo->m_szUsername,
|
|
szDomainUser, ARRAYSIZE(szDomainUser));
|
|
|
|
if (fBadPasswordFormat)
|
|
{
|
|
::DisplayFormatMessage(hwnd, IDS_USR_APPLET_CAPTION,
|
|
IDS_USR_UPDATE_PASSWORD_TOOSHORT_ERROR, MB_ICONERROR | MB_OK,
|
|
szDomainUser);
|
|
}
|
|
else
|
|
{
|
|
::DisplayFormatMessage(hwnd, IDS_USR_APPLET_CAPTION,
|
|
IDS_USR_UPDATE_PASSWORD_ERROR, MB_ICONERROR | MB_OK,
|
|
szDomainUser);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, IDCANCEL);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|