2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
14 #include <afsconfig.h>
15 #include <afs/param.h>
20 #include <WINNT/afsapplib.h>
21 #include "al_dynlink.h"
22 #include <WINNT/TaAfsAdmSvrClient.h>
26 * DEFINITIONS ________________________________________________________________
32 * VARIABLES __________________________________________________________________
38 * PROTOTYPES _________________________________________________________________
42 void OnExpiredCredentials (WPARAM wp, LPARAM lp);
44 HRESULT CALLBACK OpenCell_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
45 void OpenCell_OnInitDialog (HWND hDlg, LPOPENCELLDLG_PARAMS lpp);
46 BOOL OpenCell_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp);
47 void OpenCell_OnCell (HWND hDlg);
48 void OpenCell_Enable (HWND hDlg, BOOL fEnable);
49 void OpenCell_OnGotCreds (HWND hDlg, LPARAM lp);
51 HRESULT CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
52 void NewCreds_OnInitDialog (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp);
53 BOOL NewCreds_OnOK (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp);
54 void NewCreds_OnLogin (HWND hDlg);
55 void NewCreds_Enable (HWND hDlg, BOOL fEnable);
56 void NewCreds_GetOutParams (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp);
58 HRESULT CALLBACK BadCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
62 * ROUTINES ___________________________________________________________________
66 BOOL AfsAppLib_CrackCredentials (UINT_PTR hCreds, LPTSTR pszCell, LPTSTR pszUser, LPSYSTEMTIME pst, ULONG *pStatus)
72 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
74 rc = asc_CredentialsCrack (idClient, (PVOID) hCreds, pszCell, pszUser, pst, &status);
77 if (OpenClientLibrary())
79 char szUserA[ cchRESOURCE ], szUser2A[ cchRESOURCE ];
80 char szCellA[ cchRESOURCE ];
81 unsigned long dateExpire;
84 if (afsclient_TokenQuery ((PVOID)hCreds, &dateExpire, szUserA, szUser2A, szCellA, &fHasKasToken, (afs_status_p)&status))
87 CopyAnsiToString (pszUser, szUserA);
88 CopyAnsiToString (pszCell, szCellA);
89 AfsAppLib_UnixTimeToSystemTime (pst, dateExpire);
95 if (!hCreds && pStatus)
101 UINT_PTR AfsAppLib_GetCredentials (LPCTSTR pszCell, ULONG *pStatus)
107 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
109 hCreds = asc_CredentialsGet (idClient, pszCell, &status);
112 if (OpenClientLibrary())
114 LPSTR pszCellA = StringToAnsi (pszCell);
116 afsclient_TokenGetExisting (pszCellA, (PVOID *)&hCreds, (afs_status_p)&status);
118 FreeString (pszCellA, pszCell);
119 CloseClientLibrary();
122 if (!hCreds && pStatus)
128 UINT_PTR AfsAppLib_SetCredentials (LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, ULONG *pStatus)
134 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
136 hCreds = asc_CredentialsSet (idClient, pszCell, pszUser, pszPassword, &status);
139 if (OpenClientLibrary())
141 char szCellA[ cchRESOURCE ];
142 char szUserA[ cchRESOURCE ];
143 char szPasswordA[ cchRESOURCE ];
144 CopyStringToAnsi (szCellA, pszCell);
145 CopyStringToAnsi (szUserA, pszUser);
146 CopyStringToAnsi (szPasswordA, pszPassword);
148 afsclient_TokenGetNew (szCellA, szUserA, szPasswordA, (PVOID *)&hCreds, (afs_status_p)&status);
150 CloseClientLibrary();
155 PostMessage (AfsAppLib_GetMainWindow(), WM_REFRESHED_CREDENTIALS, 0, (LPARAM)hCreds);
158 if (!hCreds && pStatus)
165 * OPEN CELL DIALOG ___________________________________________________________
169 BOOL AfsAppLib_ShowOpenCellDialog (LPOPENCELLDLG_PARAMS lpp)
171 HINSTANCE hInst = APP_HINST;
174 hInst = APPLIB_HINST;
175 lpp->idd = IDD_APPLIB_OPENCELL;
177 if (lpp->hCreds == 0)
180 lpp->hCreds = AfsAppLib_GetCredentials (lpp->szCell);
182 lpp->hCreds = AfsAppLib_GetCredentials (NULL);
185 INT_PTR rc = ModalDialogParam (lpp->idd, lpp->hParent, (DLGPROC)OpenCell_DlgProc, (LPARAM)lpp);
187 return (rc == IDOK) ? TRUE : FALSE;
191 HRESULT CALLBACK OpenCell_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
193 LPOPENCELLDLG_PARAMS lpp;
194 if (msg == WM_INITDIALOG)
195 SetWindowLongPtr (hDlg, DWLP_USER, lp);
197 if ((lpp = (LPOPENCELLDLG_PARAMS)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL)
201 if (CallWindowProc ((WNDPROC)lpp->hookproc, hDlg, msg, wp, lp))
208 if (AfsAppLib_HandleHelp (lpp->idd, hDlg, msg, wp, lp))
215 OpenCell_OnInitDialog (hDlg, lpp);
222 EndDialog (hDlg, IDCANCEL);
226 if (OpenCell_OnOK (hDlg, lpp))
227 EndDialog (hDlg, IDOK);
230 case IDC_OPENCELL_CELL:
234 TCHAR szCell[ cchNAME ];
235 SendDlgItemMessage (hDlg, IDC_OPENCELL_CELL, CB_GETLBTEXT, CB_GetSelected(GetDlgItem (hDlg, IDC_OPENCELL_CELL)), (LPARAM)szCell);
236 SetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell);
237 OpenCell_OnCell (hDlg);
241 OpenCell_OnCell (hDlg);
248 case WM_REFRESHED_CREDENTIALS:
249 OpenCell_OnGotCreds (hDlg, lp);
257 void OpenCell_OnInitDialog (HWND hDlg, LPOPENCELLDLG_PARAMS lpp)
259 // Fix the title of the dialog (unless the caller has supplied a
260 // custom dialog template)
262 if (lpp && (lpp->idd == IDD_APPLIB_OPENCELL))
264 TCHAR szApplication[ cchNAME ];
265 AfsAppLib_GetAppName (szApplication);
266 if (szApplication[0] != TEXT('\0'))
268 TCHAR szTitle[ cchRESOURCE ];
269 GetWindowText (hDlg, szTitle, cchRESOURCE);
270 lstrcat (szTitle, TEXT(" - "));
271 lstrcat (szTitle, szApplication);
272 SetWindowText (hDlg, szTitle);
276 // Fill in the 'Cell:' combobox; we'll list the default cell, and any
277 // cell which the user has specified before.
279 CB_StartChange (GetDlgItem (hDlg, IDC_OPENCELL_CELL), TRUE);
283 TCHAR szDefCell[ cchNAME ];
284 if (AfsAppLib_GetLocalCell (szDefCell) && *szDefCell)
286 CB_AddItem (GetDlgItem (hDlg, IDC_OPENCELL_CELL), szDefCell, 1);
289 else for (size_t ii = 0; ii < lpp->lpcl->nCells; ++ii)
291 CB_AddItem (GetDlgItem (hDlg, IDC_OPENCELL_CELL), lpp->lpcl->aCells[ii], 1+ii);
294 CB_EndChange (GetDlgItem (hDlg, IDC_OPENCELL_CELL), 1);
296 // Set up the "Credentials" box; if the user needs credentials to edit
297 // this default cell, jump the cursor to the appropriate field
299 SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin"));
301 OpenCell_OnCell (hDlg);
305 BOOL OpenCell_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp)
308 OpenCell_Enable (hDlg, FALSE);
311 // Remember what cell the user chose to edit
313 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME);
315 // Try to obtain the credentials specified by the user.
317 TCHAR szCell[ cchNAME ];
318 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
320 TCHAR szUser[ cchRESOURCE ];
321 GetDlgItemText (hDlg, IDC_OPENCELL_ID, szUser, cchNAME);
323 TCHAR szPassword[ cchRESOURCE ];
324 GetDlgItemText (hDlg, IDC_OPENCELL_PASSWORD, szPassword, cchNAME);
327 if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL)
329 ErrorDialog (status, IDS_ERROR_BAD_CREDENTIALS);
333 // See if those credentials are sufficient
335 CHECKCREDS_PARAMS pp;
336 memset (&pp, 0x00, sizeof(pp));
337 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
338 pp.bcdp.hParent = hDlg;
339 pp.hCreds = lpp->hCreds;
340 pp.fShowWarning = TRUE;
342 if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE)
344 SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin"));
345 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE);
350 OpenCell_Enable (hDlg, TRUE);
359 TCHAR szCell[ cchNAME ];
360 TCHAR szUser[ cchNAME ];
364 } OPENCELL_ONCELL_PARAMS, *LPOPENCELL_ONCELL_PARAMS;
366 DWORD WINAPI OpenCell_OnCell_ThreadProc (PVOID lp)
368 LPOPENCELL_ONCELL_PARAMS lpp;
369 if ((lpp = (LPOPENCELL_ONCELL_PARAMS)lp) != NULL)
371 UINT_PTR hCreds = AfsAppLib_GetCredentials (lpp->szCell);
372 lpp->fGotCreds = AfsAppLib_CrackCredentials (hCreds, lpp->szCell, lpp->szUser, &lpp->stExpire)?TRUE:FALSE;
373 lpp->fValidCreds = FALSE;
375 if (lpp->fGotCreds && AfsAppLib_IsTimeInFuture (&lpp->stExpire))
377 CHECKCREDS_PARAMS pp;
378 memset (&pp, 0x00, sizeof(pp));
380 lpp->fValidCreds = AfsAppLib_CheckCredentials(&pp);
383 // Post our results; we'll return the same packet we got.
385 if (IsWindow (lpp->hDlg))
386 PostMessage (lpp->hDlg, WM_REFRESHED_CREDENTIALS, 0, (LPARAM)lpp);
395 void OpenCell_OnCell (HWND hDlg)
397 // Fire up a background thread to query our current credentials in the
400 LPOPENCELL_ONCELL_PARAMS lpp = New (OPENCELL_ONCELL_PARAMS);
401 memset (lpp, 0x00, sizeof(lpp));
402 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME);
406 CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)OpenCell_OnCell_ThreadProc, lpp, 0, &dwThreadID);
410 void OpenCell_OnGotCreds (HWND hDlg, LPARAM lp)
412 LPOPENCELL_ONCELL_PARAMS lpp;
413 if ((lpp = (LPOPENCELL_ONCELL_PARAMS)lp) != NULL)
415 // Don't do anything to the dialog if the user has chosen a different
416 // cell than that for which we just queried credentials.
418 TCHAR szCell[ cchNAME ];
419 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
421 if (!lstrcmpi (szCell, lpp->szCell))
423 TCHAR szPrevCreds[ cchRESOURCE ];
424 GetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, szPrevCreds, cchRESOURCE);
428 LPTSTR psz = FormatString (IDS_CREDS_NONE, TEXT("%s"), lpp->szCell);
429 SetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, psz);
432 else if (!AfsAppLib_IsTimeInFuture (&lpp->stExpire))
434 LPTSTR pszCreds = FormatString (IDS_CREDS_EXPIRED, TEXT("%s%s%t"), lpp->szCell, lpp->szUser, &lpp->stExpire);
435 SetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, pszCreds);
436 FreeString (pszCreds);
440 LPTSTR pszCreds = FormatString (IDS_CREDS_VALID, TEXT("%s%s%t"), lpp->szCell, lpp->szUser, &lpp->stExpire);
441 SetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, pszCreds);
442 FreeString (pszCreds);
445 SetDlgItemText (hDlg, IDC_OPENCELL_ID, (lpp->fGotCreds) ? lpp->szUser : TEXT("admin"));
447 if (!lpp->fValidCreds && !szPrevCreds[0])
448 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE);
456 void OpenCell_Enable (HWND hDlg, BOOL fEnable)
458 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
459 EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable);
460 EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable);
461 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_CELL), fEnable);
462 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_ID), fEnable);
463 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_PASSWORD), fEnable);
468 * NEW CREDENTIALS DIALOG _____________________________________________________
472 BOOL AfsAppLib_ShowCredentialsDialog (LPCREDENTIALSDLG_PARAMS lpp)
474 HINSTANCE hInst = APP_HINST;
477 hInst = APPLIB_HINST;
478 lpp->idd = IDD_APPLIB_CREDENTIALS;
480 if (lpp->hCreds == 0)
483 lpp->hCreds = AfsAppLib_GetCredentials (lpp->szCell);
485 lpp->hCreds = AfsAppLib_GetCredentials (NULL);
488 INT_PTR rc = ModalDialogParam (lpp->idd, lpp->hParent, (DLGPROC)NewCreds_DlgProc, (LPARAM)lpp);
490 return (rc == IDOK) ? TRUE : FALSE;
494 HRESULT CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
496 LPCREDENTIALSDLG_PARAMS lpp;
497 if (msg == WM_INITDIALOG)
498 SetWindowLongPtr (hDlg, DWLP_USER, lp);
500 if ((lpp = (LPCREDENTIALSDLG_PARAMS)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL)
504 if (CallWindowProc ((WNDPROC)lpp->hookproc, hDlg, msg, wp, lp))
511 if (AfsAppLib_HandleHelp (lpp->idd, hDlg, msg, wp, lp))
518 NewCreds_OnInitDialog (hDlg, lpp);
525 EndDialog (hDlg, IDCANCEL);
529 if (NewCreds_OnOK (hDlg, lpp))
530 EndDialog (hDlg, IDOK);
533 case IDC_CREDS_LOGIN:
534 NewCreds_OnLogin (hDlg);
544 void NewCreds_OnInitDialog (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp)
546 // Fix the title of the dialog (unless the caller has supplied a
547 // custom dialog template)
549 if (lpp && (lpp->idd == IDD_APPLIB_CREDENTIALS))
551 TCHAR szApplication[ cchNAME ];
552 AfsAppLib_GetAppName (szApplication);
553 if (szApplication[0] != TEXT('\0'))
555 TCHAR szTitle[ cchRESOURCE ];
556 GetWindowText (hDlg, szTitle, cchRESOURCE);
557 lstrcat (szTitle, TEXT(" - "));
558 lstrcat (szTitle, szApplication);
559 SetWindowText (hDlg, szTitle);
563 // Set up the "Credentials" boxes
565 TCHAR szUser[ cchRESOURCE ];
568 BOOL fValidCreds = TRUE;
569 BOOL fShowCreds = TRUE;
570 CHECKCREDS_PARAMS pp;
571 memset (&pp, 0x00, sizeof(pp));
572 pp.hCreds = lpp->hCreds;
573 pp.fShowWarning = FALSE;
574 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
575 pp.bcdp.hParent = hDlg;
577 if (!AfsAppLib_CrackCredentials (lpp->hCreds, lpp->szCell, szUser, &st))
582 if (!AfsAppLib_IsTimeInFuture (&st))
587 if (!AfsAppLib_CheckCredentials (&pp))
592 CheckDlgButton (hDlg, IDC_CREDS_LOGIN, !fValidCreds);
594 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_CREDS_PASSWORD), TRUE);
596 SetDlgItemText (hDlg, IDC_CREDS_CELL, lpp->szCell);
600 SetDlgItemText (hDlg, IDC_CREDS_CURRENTID, szUser);
602 LPTSTR pszDate = FormatString (TEXT("%1"), TEXT("%t"), &st);
603 SetDlgItemText (hDlg, IDC_CREDS_EXPDATE, pszDate);
604 FreeString (pszDate);
607 SetDlgItemText (hDlg, IDC_CREDS_ID, TEXT("admin"));
609 NewCreds_OnLogin (hDlg);
613 BOOL NewCreds_OnOK (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp)
615 NewCreds_GetOutParams (hDlg, lpp);
616 if (!IsDlgButtonChecked (hDlg, IDC_CREDS_LOGIN))
621 NewCreds_Enable (hDlg, FALSE);
623 // Try to obtain the credentials specified by the user.
625 TCHAR szUser[ cchRESOURCE ];
626 GetDlgItemText (hDlg, IDC_CREDS_ID, szUser, cchNAME);
628 TCHAR szPassword[ cchRESOURCE ];
629 GetDlgItemText (hDlg, IDC_CREDS_PASSWORD, szPassword, cchNAME);
632 if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL)
634 ErrorDialog (status, IDS_ERROR_BAD_CREDENTIALS);
638 // See if those credentials are sufficient
640 CHECKCREDS_PARAMS pp;
641 memset (&pp, 0x00, sizeof(pp));
642 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
643 pp.bcdp.hParent = hDlg;
644 pp.hCreds = lpp->hCreds;
645 pp.fShowWarning = TRUE;
647 if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE)
649 SetDlgItemText (hDlg, IDC_CREDS_ID, TEXT("admin"));
650 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_CREDS_PASSWORD), TRUE);
655 NewCreds_Enable (hDlg, TRUE);
661 void NewCreds_OnLogin (HWND hDlg)
663 BOOL fEnable = IsDlgButtonChecked (hDlg, IDC_CREDS_LOGIN);
665 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_ID), fEnable);
666 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_PASSWORD), fEnable);
670 void NewCreds_Enable (HWND hDlg, BOOL fEnable)
672 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
673 EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable);
674 EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable);
675 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_LOGIN), fEnable);
678 NewCreds_OnLogin (hDlg);
681 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_ID), fEnable);
682 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_PASSWORD), fEnable);
687 void NewCreds_GetOutParams (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp)
689 if (!IsDlgButtonChecked (hDlg, IDC_CREDS_LOGIN))
691 lpp->szIdentity[0] = TEXT('\0');
692 lpp->szPassword[0] = TEXT('\0');
696 GetDlgItemText (hDlg, IDC_CREDS_ID, lpp->szIdentity, cchNAME);
697 GetDlgItemText (hDlg, IDC_CREDS_PASSWORD, lpp->szPassword, cchNAME);
703 * TEST CREDENTIALS ___________________________________________________________
708 BOOL AfsAppLib_IsUserAdmin (UINT_PTR hCreds, LPTSTR pszUser)
717 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
719 TCHAR szCell[ cchRESOURCE ];
720 TCHAR szUser[ cchRESOURCE ];
722 if (asc_CredentialsCrack (idClient, hCreds, szCell, szUser, &stExpire, (ULONG*)&status))
725 if (asc_CellOpen (idClient, hCreds, szCell, AFSADMSVR_SCOPE_USERS, &idCell, (ULONG*)&status))
728 if (asc_ObjectFind (idClient, idCell, TYPE_USER, pszUser, &idUser, (ULONG*)&status))
731 if (asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idUser, &Info, (ULONG*)&status))
733 if (Info.u.UserProperties.fHaveKasInfo)
735 rc = Info.u.UserProperties.KASINFO.fIsAdmin;
739 asc_CellClose (idClient, idCell, (ULONG*)&status);
743 else if (OpenClientLibrary())
745 if (OpenKasLibrary())
747 char szUserA[ cchRESOURCE ], szUser2A[ cchRESOURCE ];
748 char szCellA[ cchRESOURCE ];
749 unsigned long dateExpire;
752 if (afsclient_TokenQuery (hCreds, &dateExpire, szUserA, szUser2A, szCellA, &fHasKasToken, (afs_status_p)&status))
755 if (afsclient_CellOpen (szCellA, hCreds, &hCell, &status))
757 kas_identity_t Identity;
758 memset (&Identity, 0x00, sizeof(Identity));
759 CopyStringToAnsi (Identity.principal, pszUser);
761 kas_principalEntry_t Entry;
762 if (kas_PrincipalGet (hCell, NULL, &Identity, &Entry, &status))
764 if (Entry.adminSetting == KAS_ADMIN)
768 afsclient_CellClose (hCell, (afs_status_p)&status);
775 CloseClientLibrary();
779 #endif /* USE_KASERVER */
785 BADCREDSDLG_PARAMS bcdp;
788 } REALBADCREDSDLG_PARAMS, *LPREALBADCREDSDLG_PARAMS;
790 BOOL AfsAppLib_CheckCredentials (LPCHECKCREDS_PARAMS lpp)
792 BOOL fCredsOK = TRUE;
793 int idsWarning = IDS_BADCREDS_DESC_GENERAL;
795 TCHAR szCell[ cchNAME ];
796 TCHAR szUser[ cchNAME ];
799 if (!AfsAppLib_CrackCredentials (lpp->hCreds, szCell, szUser, &stExpire))
803 else if (!AfsAppLib_IsUserAdmin (lpp->hCreds, szUser))
806 idsWarning = IDS_BADCREDS_DESC_BADCHOICE;
808 else if (!AfsAppLib_IsTimeInFuture (&stExpire))
811 idsWarning = IDS_BADCREDS_DESC_EXPIRED;
814 if (!fCredsOK && lpp->fShowWarning)
816 if (lpp->bcdp.pfShowWarningEver && !(*lpp->bcdp.pfShowWarningEver))
818 fCredsOK = TRUE; // user says always ignore bad credentials.
823 AfsAppLib_GetLocalCell (szCell);
825 int idsDesc = (lpp->bcdp.idsDesc) ? lpp->bcdp.idsDesc : IDS_BADCREDS_DESC2;
826 LPTSTR pszDesc = FormatString (idsDesc, TEXT("%s"), szCell);
827 LPTSTR pszFullText = FormatString (idsWarning, TEXT("%s%s%m"), szCell, pszDesc, IDS_BADCREDS_DESC3);
828 FreeString (pszDesc);
830 REALBADCREDSDLG_PARAMS pp;
831 memset (&pp, 0x00, sizeof(pp));
832 pp.pszFullText = pszFullText;
833 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
835 HINSTANCE hInst = APP_HINST;
836 if (pp.bcdp.idd == 0)
838 hInst = APPLIB_HINST;
839 pp.bcdp.idd = IDD_APPLIB_BADCREDS;
842 INT_PTR rc = ModalDialogParam (pp.bcdp.idd, pp.bcdp.hParent, (DLGPROC)BadCreds_DlgProc, (LPARAM)&pp);
845 fCredsOK = TRUE; // user says ignore bad credentials this time.
848 FreeString (pszFullText);
856 HRESULT CALLBACK BadCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
858 LPREALBADCREDSDLG_PARAMS lpp;
859 if (msg == WM_INITDIALOG)
860 SetWindowLongPtr (hDlg, DWLP_USER, lp);
861 if ((lpp = (LPREALBADCREDSDLG_PARAMS)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL)
863 if (lpp->bcdp.hookproc)
865 if (CallWindowProc ((WNDPROC)lpp->bcdp.hookproc, hDlg, msg, wp, lp))
868 if (AfsAppLib_HandleHelp (lpp->bcdp.idd, hDlg, msg, wp, lp))
875 TCHAR szApplication[ cchNAME ];
876 AfsAppLib_GetAppName (szApplication);
877 if (szApplication[0] != TEXT('\0'))
879 TCHAR szTitle[ cchRESOURCE ];
880 GetWindowText (hDlg, szTitle, cchRESOURCE);
881 lstrcat (szTitle, TEXT(" - "));
882 lstrcat (szTitle, szApplication);
883 SetWindowText (hDlg, szTitle);
885 if (!lpp || !lpp->bcdp.pfShowWarningEver)
886 DestroyWindow (GetWindow (hDlg, IDC_BADCREDS_SHUTUP));
888 SetDlgItemText (hDlg, IDC_BADCREDS_DESC, lpp->pszFullText);
896 if (lpp && lpp->bcdp.pfShowWarningEver)
897 *lpp->bcdp.pfShowWarningEver = !IsDlgButtonChecked (hDlg, IDC_BADCREDS_SHUTUP);
898 EndDialog (hDlg, LOWORD(wp));
909 * EXPIRED CREDENTIALS ________________________________________________________
913 void AfsAppLib_CheckForExpiredCredentials (LPCREDENTIALSDLG_PARAMS lpp)
915 static UINT_PTR hCredsPrevious = 0;
916 static BOOL fHadGoodCredentials;
918 TCHAR szCell[ cchNAME ];
919 TCHAR szUser[ cchNAME ];
922 BOOL fHaveCredentials;
923 fHaveCredentials = AfsAppLib_CrackCredentials (lpp->hCreds, szCell, szUser, &stExpire)?TRUE:FALSE;
925 if (hCredsPrevious && (hCredsPrevious != lpp->hCreds))
927 if (!fHaveCredentials)
928 fHadGoodCredentials = FALSE;
929 else if (!AfsAppLib_IsTimeInFuture (&stExpire))
930 fHadGoodCredentials = FALSE;
932 fHadGoodCredentials = TRUE;
933 hCredsPrevious = lpp->hCreds;
935 else if (fHaveCredentials && AfsAppLib_IsTimeInFuture (&stExpire))
937 fHadGoodCredentials = TRUE;
939 else if (fHadGoodCredentials) // used to have good credentials, but now don't
941 fHadGoodCredentials = FALSE;
943 LPCREDENTIALSDLG_PARAMS lppCopy = New (CREDENTIALSDLG_PARAMS);
944 memcpy (lppCopy, lpp, sizeof(CREDENTIALSDLG_PARAMS));
946 if (!AfsAppLib_GetMainWindow())
947 OnExpiredCredentials ((WPARAM)(!AfsAppLib_IsTimeInFuture(&stExpire)), (LPARAM)lppCopy);
949 PostMessage (AfsAppLib_GetMainWindow(), WM_EXPIRED_CREDENTIALS, (WPARAM)(!AfsAppLib_IsTimeInFuture(&stExpire)), (LPARAM)lppCopy);
954 void OnExpiredCredentials (WPARAM wp, LPARAM lp)
956 BOOL fExpired = (BOOL)wp;
957 LPCREDENTIALSDLG_PARAMS lpp = (LPCREDENTIALSDLG_PARAMS)lp;
959 if (lpp && lpp->bcdp.pfShowWarningEver && *(lpp->bcdp.pfShowWarningEver))
961 int idsWarning = (wp) ? IDS_BADCREDS_DESC_EXPIRED : IDS_BADCREDS_DESC_DESTROYED;
963 int idsDesc = (lpp->bcdp.idsDesc) ? lpp->bcdp.idsDesc : IDS_BADCREDS_DESC2;
964 LPTSTR pszDesc = FormatString (idsDesc, TEXT("%s"), lpp->szCell);
965 LPTSTR pszFullText = FormatString (idsWarning, TEXT("%s%s%m"), lpp->szCell, pszDesc, IDS_BADCREDS_DESC3);
966 FreeString (pszDesc);
968 REALBADCREDSDLG_PARAMS pp;
969 memset (&pp, 0x00, sizeof(pp));
970 pp.pszFullText = pszFullText;
971 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
973 if (ModalDialogParam (IDD_APPLIB_BADCREDS, NULL, (DLGPROC)BadCreds_DlgProc, (LPARAM)&pp) != IDCANCEL)
975 AfsAppLib_ShowCredentialsDialog (lpp);
978 FreeString (pszFullText);