// PswdDlg.cpp -- PaSsWorD DiaLoG class definition // (c) Copyright Schlumberger Technology Corp., unpublished work, created // 1999. This computer program includes Confidential, Proprietary // Information and is a Trade Secret of Schlumberger Technology Corp. All // use, disclosure, and/or reproduction is prohibited unless authorized // in writing. All Rights Reserved. // #if defined(_UNICODE) #if !defined(UNICODE) #define UNICODE #endif //!UNICODE #endif //_UNICODE #if defined(UNICODE) #if !defined(_UNICODE) #define _UNICODE #endif //!_UNICODE #endif //UNICODE #include "stdafx.h" #include #include "slbCsp.h" #include "LoginId.h" #include "AccessTok.h" #include "PswdDlg.h" #include "PromptUser.h" #include "StResource.h" #include "CspProfile.h" using namespace ProviderProfile; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif BEGIN_MESSAGE_MAP(CLogoDialog, CDialog) //{{AFX_MSG_MAP(CLogoDialog) ON_WM_PAINT() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CLogoDialog dialog CLogoDialog::CLogoDialog(CWnd* pParent /*=NULL*/) : CDialog(), m_dcMem(), m_dcMask(), m_bmpLogo(), m_bmpMask(), m_hBmpOld(), m_hBmpOldM(), m_pt(0,0), m_size() { m_pParent = pParent; } //////////////////////////////////////////////////////////////////////////// // CLogoDialog message handlers BOOL CLogoDialog::OnInitDialog() { CBitmap * pBmpOld, * pBmpOldM; HINSTANCE oldHandle = NULL; BOOL fSuccess = TRUE; try { CDialog::OnInitDialog(); // Load bitmap resource - remember to call DeleteObject when done. oldHandle = AfxGetResourceHandle(); AfxSetResourceHandle(CspProfile::Instance().Resources()); m_bmpLogo.LoadBitmap( MAKEINTRESOURCE( IDB_BITMAP_SLBLOGO ) ); m_bmpMask.LoadBitmap( MAKEINTRESOURCE( IDB_BITMAP_SLBLOGO ) ); // Get bitmap information m_bmpLogo.GetObject( sizeof(BITMAP), &m_bmInfo ); m_size.cx = m_bmInfo.bmWidth; m_size.cy = m_bmInfo.bmHeight; // Get temporary DC for dialog - Will be released in dc destructor CClientDC dc(this); // Create compatible memory DC using the dialogs DC m_dcMem.CreateCompatibleDC( &dc ); m_dcMask.CreateCompatibleDC( &dc ); // Select logo bitmap into DC. // Get pointer to original bitmap // NOTE! This is temporary - save the handle instead pBmpOld = m_dcMem.SelectObject( &m_bmpLogo ); SetBkColor(m_dcMem, RGB(255, 255, 255)); m_dcMask.BitBlt (0, 0, m_size.cx, m_size.cy, &m_dcMem, 0, 0, SRCCOPY); pBmpOldM = m_dcMask.SelectObject( &m_bmpMask ); m_hBmpOld = (HBITMAP) pBmpOld->GetSafeHandle(); m_hBmpOldM = (HBITMAP) pBmpOldM->GetSafeHandle(); } catch (...) { fSuccess = FALSE; } if (oldHandle) AfxSetResourceHandle(oldHandle); return fSuccess; } //*********************************************************************** // CLogoDialog::OnPaint() // // Purpose: // // BitBlt() bitmap stored in compatible memory DC into dialogs // DC to display at hardcoded location. // // Parameters: // // None. // // Returns: // // None. // // Comments: // // History: // //*********************************************************************** void CLogoDialog::OnPaint() { CPaintDC dc(this); // device context for painting // BitBlt logo bitmap onto dialog using transparancy masking dc.SetBkColor(RGB(255, 255, 255)); // 1s --> 0xFFFFFF dc.SetTextColor(RGB(0, 0, 0)); // 0s --> 0x000000 // Do the real work. dc.BitBlt(m_pt.x, m_pt.y, m_size.cx, m_size.cy, &m_dcMem, 0, 0, SRCINVERT); dc.BitBlt(m_pt.x, m_pt.y, m_size.cx, m_size.cy, &m_dcMask, 0, 0, SRCAND); dc.BitBlt(m_pt.x, m_pt.y, m_size.cx, m_size.cy, &m_dcMem, 0, 0, SRCINVERT); /* * First two parameters are upper left position to place bitmap. * Third and fourth parameters are width and height to copy * (could be less than actual size of bitmap) * Sixth and seventh are position in memory dc to start from * SRCCOPY specifies copy. * See BitBlt documentation for more details. */ // Do not call CDialog::OnPaint() for painting messages } //*********************************************************************** // CLogoDialog::OnDestroy() // // Purpose: // // Select old bitmap back into memory DC before it is destroyed // when CLogoDialog object is. // DeleteObject() the bitmap which had been loaded. // // Parameters: // // None. // // Returns: // // None. // // Comments: // // History: // // void CLogoDialog::OnDestroy() { CDialog::OnDestroy(); // Select old bitmap into memory dc (selecting out logo bitmap) // Need to create a temporary pointer to pass to do this if (m_hBmpOld && m_dcMem) m_dcMem.SelectObject(CBitmap::FromHandle(m_hBmpOld)); if (m_hBmpOldM && m_dcMem) m_dcMask.SelectObject(CBitmap::FromHandle(m_hBmpOldM)); // Need to DeleteObject() the bitmap that was loaded m_bmpLogo.DeleteObject(); m_bmpMask.DeleteObject(); // m_dcMem and m_dcMask destructor will handle rest of cleanup } ///////////////////////////////////////////////////////////////////////////// // CPasswordDlg dialog CPasswordDlg::CPasswordDlg(CWnd* pParent /*=NULL*/) : CLogoDialog(pParent), m_szPassword(_T("")), m_szMessage(_T("")), m_fHexCode(FALSE), m_bChangePIN(FALSE), m_lid(User), // the default m_nPasswordSizeLimit(AccessToken::MaxPinLength) { m_pParent = pParent; m_pt.x = 144; m_pt.y = 88; } BEGIN_MESSAGE_MAP(CPasswordDlg, CLogoDialog) //{{AFX_MSG_MAP(CPasswordDlg) ON_BN_CLICKED(IDC_HEXCODE, OnClickHexCode) ON_BN_CLICKED(IDC_CHANGEPIN, OnChangePINAfterLogin) ON_WM_SHOWWINDOW() //}}AFX_MSG_MAP END_MESSAGE_MAP() void CPasswordDlg::DoDataExchange(CDataExchange* pDX) { CLogoDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPasswordDlg) DDX_Control(pDX, IDC_HEXCODE, m_ctlCheckHexCode); DDX_Control(pDX, IDC_CHANGEPIN, m_ctlCheckChangePIN); // DDX_Control(pDX, IDC_EDIT_VERNEWPIN, m_ctlVerifyNewPIN); // DDX_Control(pDX, IDC_EDIT_NEWPIN, m_ctlNewPIN); // DDX_Control(pDX, IDC_STATIC_VERNEWPIN, m_ctlVerifyPINLabel); // DDX_Control(pDX, IDC_STATIC_NEWPIN, m_ctlNewPINLabel); DDX_Text(pDX, IDC_PASSWORD, m_szPassword); DDV_MaxChars(pDX, m_szPassword, m_nPasswordSizeLimit); LPCTSTR pBuffer = (LPCTSTR) m_szMessage; if(!m_szMessage.IsEmpty()) { DDX_Text(pDX, IDC_MESSAGE, (LPTSTR)pBuffer, m_szMessage.GetLength()); } DDX_Check(pDX, IDC_CHANGEPIN, m_bChangePIN); // DDX_Text(pDX, IDC_EDIT_NEWPIN, m_csNewPIN); // DDX_Text(pDX, IDC_EDIT_VERNEWPIN, m_csVerifyNewPIN); //}}AFX_DATA_MAP } ///////////////////////////////////////////////////////////////////////////// // CPasswordDlg message handlers BOOL CPasswordDlg::OnInitDialog() { CLogoDialog::OnInitDialog(); switch (m_lid) { case User: // Give the user a chance to change the PIN m_ctlCheckChangePIN.ShowWindow(SW_SHOW); { m_szMessage = StringResource(IDS_ENTER_PIN).AsCString(); } break; case Manufacturer: // Allow Hex string entry m_ctlCheckHexCode.ShowWindow(SW_SHOW); { m_szMessage = StringResource(IDS_ENTER_MANUFACTURER_KEY).AsCString(); } break; case Administrator: // Allow Hex string entry m_ctlCheckHexCode.ShowWindow(SW_SHOW); { m_szMessage = StringResource(IDS_ENTER_ADMIN_KEY).AsCString(); } break; default: break; }; // Update GUI with changes UpdateData(FALSE); SetForegroundWindow(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPasswordDlg::OnClickHexCode() { m_fHexCode = ~m_fHexCode; m_nPasswordSizeLimit = (m_fHexCode) ? AccessToken::MaxPinLength * 2 : AccessToken::MaxPinLength; UpdateData(FALSE); } void CPasswordDlg::OnOK() { UpdateData(); CString msg; bool fPrompt = true; if (m_fHexCode && m_szPassword.GetLength() != m_nPasswordSizeLimit) { msg.Format(m_fHexCode ? (LPCTSTR)StringResource(IDS_PIN_HEX_LIMIT).AsCString() : (LPCTSTR)StringResource(IDS_PIN_CHAR_LIMIT).AsCString(), m_nPasswordSizeLimit); } else if ((User == m_lid) && (0 == m_szPassword.GetLength())) { msg = (LPCTSTR)StringResource(IDS_MIN_PIN_LENGTH).AsCString(); } else fPrompt = false; if (fPrompt) { HWND hWnd = m_pParent ? m_pParent->m_hWnd : NULL; int iResponse = PromptUser(hWnd, msg, MB_OK | MB_ICONERROR); if (IDCANCEL == iResponse) throw scu::OsException(ERROR_CANCELLED); } else CLogoDialog::OnOK(); } void CPasswordDlg::OnChangePINAfterLogin() { UpdateData(); // set m_bChangePIN int nShowWindow = (m_bChangePIN) ? SW_SHOW : SW_HIDE; /* m_ctlVerifyNewPIN.ShowWindow(nShowWindow); m_ctlNewPIN.ShowWindow(nShowWindow); m_ctlVerifyPINLabel.ShowWindow(nShowWindow); m_ctlNewPINLabel.ShowWindow(nShowWindow); */ } void CPasswordDlg::OnShowWindow(BOOL bShow, UINT nStatus) { CLogoDialog::OnShowWindow(bShow, nStatus); } ///////////////////////////////////////////////////////////////////////////// // CChangePINDlg dialog CChangePINDlg::CChangePINDlg(CWnd* pParent /*=NULL*/) : CLogoDialog(pParent), m_csOldPIN(_T("")), m_csNewPIN(_T("")), m_csVerifyNewPIN(_T("")) { m_pParent = pParent; m_pt.x = 144; // 132; m_pt.y = 75; //104; } void CChangePINDlg::DoDataExchange(CDataExchange* pDX) { CLogoDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CChangePINDlg) DDX_Control(pDX, IDC_STATIC_CONFIRM_OLDPIN_LABEL, m_ctlConfirmOldPINLabel); DDX_Control(pDX, IDC_EDIT_OLDPIN, m_ctlOldPIN); DDX_Text(pDX, IDC_EDIT_OLDPIN, m_csOldPIN); DDV_MaxChars(pDX, m_csOldPIN, AccessToken::MaxPinLength); DDX_Text(pDX, IDC_EDIT_NEWPIN, m_csNewPIN); DDV_MaxChars(pDX, m_csNewPIN, AccessToken::MaxPinLength); DDX_Text(pDX, IDC_EDIT_VERNEWPIN, m_csVerifyNewPIN); DDV_MaxChars(pDX, m_csVerifyNewPIN, AccessToken::MaxPinLength); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CChangePINDlg, CLogoDialog) //{{AFX_MSG_MAP(CChangePINDlg) ON_WM_SHOWWINDOW() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CChangePINDlg message handlers // The purpose of the Change PIN dialog is for changing User Pins. // It may be invoked after having already authenticated, or prior // to authentication. In the former case it is recommended that the // caller will have set the m_csOldPIN data member prior to calling // DoModal(). This is so the user will not have to reenter a PIN // that has previously been entered. BOOL CChangePINDlg::OnInitDialog() { CLogoDialog::OnInitDialog(); SetForegroundWindow(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CChangePINDlg::OnOK() { UpdateData(); UINT uiMsgId; bool fMsgIdSet = false; // Verify that the New PIN contains only ASCII characters if(!StringResource::IsASCII((LPCTSTR)m_csNewPIN)) { uiMsgId = IDS_PIN_NONASCII; fMsgIdSet = true; } // Verify that the New PIN and Verify PIN are the same else if (m_csNewPIN != m_csVerifyNewPIN) { uiMsgId = IDS_PIN_VER_NO_MATCH; fMsgIdSet = true; } // Verify that the length of the new PIN is >= 1 else if (0 == m_csNewPIN.GetLength()) { uiMsgId = IDS_MIN_NEW_PIN_LENGTH; fMsgIdSet = true; } // Verify that the length of the old PIN is >= 1 else if (0 == m_csOldPIN.GetLength()) { uiMsgId = IDS_MIN_OLD_PIN_LENGTH; fMsgIdSet = true; } if (fMsgIdSet) { HWND hWnd = m_pParent ? m_pParent->m_hWnd : NULL; int iResponse = PromptUser(hWnd, uiMsgId, MB_OK | MB_ICONSTOP); if (IDCANCEL == iResponse) throw scu::OsException(ERROR_CANCELLED); } else CLogoDialog::OnOK(); } void CChangePINDlg::OnShowWindow(BOOL bShow, UINT nStatus) { CLogoDialog::OnShowWindow(bShow, nStatus); // if the caller placed something in the m_csOldPIN // prior to DoModal'ing, then don't show that control, // so that the user won't accidentally erase the preset, // current PIN if (m_csOldPIN.GetLength()) { m_ctlOldPIN.ShowWindow(FALSE); m_ctlConfirmOldPINLabel.ShowWindow(FALSE); } }