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

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;
}