kfw fix: restructure low ticket warning popup code to workaround mfc bug
authorTom Yu <tlyu@mit.edu>
Mon, 12 Dec 2011 20:45:55 +0000 (20:45 +0000)
committerTom Yu <tlyu@mit.edu>
Mon, 12 Dec 2011 20:45:55 +0000 (20:45 +0000)
mfc bug causes assertions when dialog is generated from
within PreTranslateMessages() (MSG input param points to a global
variable which is corrupted in the dialog message loop).  So we need
to instead PostMessage() to cause the popup later.
Also fixed logic to cause warning dialog to actually be modal as intended
when the leash window is not minimized.

Signed-off-by: Kevin Wasserman <kevin.wasserman@painless-security.com>
ticket: 7050

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25561 dc483132-0cff-0310-8789-dd5450dbe970

src/windows/leash/LeashView.cpp
src/windows/leash/LeashView.h

index c16feeff1b3790af480b9a47f25586400f96d44e..1b67937c5141a8961b692564de062bd09dcbc343 100644 (file)
@@ -44,6 +44,7 @@ IMPLEMENT_DYNCREATE(CLeashView, CFormView)
 
 BEGIN_MESSAGE_MAP(CLeashView, CFormView)
        //{{AFX_MSG_MAP(CLeashView)
+    ON_MESSAGE(WM_WARNINGPOPUP, OnWarningPopup)
        ON_MESSAGE(WM_GOODBYE, OnGoodbye)
     ON_MESSAGE(WM_TRAYICON, OnTrayIcon)
     ON_NOTIFY(TVN_ITEMEXPANDED, IDC_TREEVIEW, OnItemexpandedTreeview)
@@ -172,7 +173,7 @@ CFormView(CLeashView::IDD)
     m_publicIPAddress = 0;
     m_autoRenewTickets = 0;
     m_autoRenewalAttempted = 0;
-
+    m_pWarningMessage = NULL;
     m_bIconAdded = FALSE;
     m_bIconDeleted = FALSE;
 #ifndef KRB5_TC_NOTICKET
@@ -2073,6 +2074,27 @@ void CLeashView::SetTrayIcon(int nim, int state)
         m_bIconDeleted = TRUE;
 }
 
+BOOL CLeashView::PostWarningMessage(const CString& message)
+{
+    if (m_pWarningMessage)
+    {
+        return FALSE; // can't post more than one warning at a time
+    }
+    m_pWarningMessage = new CString(message);
+    PostMessage(WM_WARNINGPOPUP);
+    return TRUE;
+}
+
+LRESULT CLeashView::OnWarningPopup(WPARAM wParam, LPARAM lParam)
+{
+    CLeashMessageBox leashMessageBox(CMainFrame::m_isMinimum ? GetDesktopWindow() : NULL,
+                                        *m_pWarningMessage, 100000);
+    leashMessageBox.DoModal();
+    delete m_pWarningMessage;
+    m_pWarningMessage = NULL;
+    return 0L;
+}
+
 BOOL CLeashView::PreTranslateMessage(MSG* pMsg)
 {
        if ( pMsg->message == ID_OBTAIN_TGT_WITH_LPARAM )
@@ -2464,9 +2486,7 @@ BOOL CLeashView::PreTranslateMessage(MSG* pMsg)
 
                 ReleaseMutex(ticketinfo.lockObj);
                 AlarmBeep();
-                CLeashMessageBox leashMessageBox(!CMainFrame::m_isMinimum ? GetDesktopWindow() : NULL,
-                                                  lowTicketWarning, 100000);
-                leashMessageBox.DoModal();
+                PostWarningMessage(lowTicketWarning);
                 if (WaitForSingleObject( ticketinfo.lockObj, 100 ) != WAIT_OBJECT_0)
                     throw("Unable to lock ticketinfo");
             }
index e469058ae0393152176c9853aea0e6260e62bf7d..0d9009a34cbaf3241dfffcebf588f7c3d540218d 100644 (file)
@@ -59,6 +59,7 @@
 #endif
 
 #define WM_TRAYICON (WM_USER+100)
+#define WM_WARNINGPOPUP (WM_USER+101)
 
 enum ticketTimeLeft{NO_TICKETS, ZERO_MINUTES_LEFT, FIVE_MINUTES_LEFT, TEN_MINUTES_LEFT,
                                        FIFTEEN_MINUTES_LEFT, TWENTY_MINUTES_LEFT, PLENTY_OF_TIME,
@@ -106,6 +107,7 @@ private:
 #endif
        INT                                     m_hKerb5State;
        INT                                     m_hAFSState;
+    CString*            m_pWarningMessage;
     BOOL                m_bIconAdded;
     BOOL                m_bIconDeleted;
 
@@ -154,6 +156,12 @@ private:
     static UINT InitTicket(void *);
     static UINT RenewTicket(void *);
     static UINT ImportTicket(void *);
+    // Queue a warning popup message.
+    // This is a workaround to the MFC deficiency that you cannot safely create
+    // a modal dialog while processing messages within AfxPreTranslateMessage()
+    // returns TRUE if message is queued successfully.
+    BOOL PostWarningMessage(const CString& message);
+    afx_msg LRESULT OnWarningPopup(WPARAM wParam, LPARAM lParam);
 
 protected: // create from serialization only
        DECLARE_DYNCREATE(CLeashView)