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
11 #include <afs/param.h>
15 #include <WINNT/afsapplib.h>
16 #include "al_dynlink.h"
17 #include <WINNT/TaAfsAdmSvrClient.h>
21 * DEFINITIONS ________________________________________________________________
27 * VARIABLES __________________________________________________________________
33 * PROTOTYPES _________________________________________________________________
37 void OnExpiredCredentials (WPARAM wp, LPARAM lp);
39 BOOL CALLBACK OpenCell_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
40 void OpenCell_OnInitDialog (HWND hDlg, LPOPENCELLDLG_PARAMS lpp);
41 BOOL OpenCell_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp);
42 void OpenCell_OnCell (HWND hDlg);
43 void OpenCell_Enable (HWND hDlg, BOOL fEnable);
44 void OpenCell_OnGotCreds (HWND hDlg, LPARAM lp);
46 BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
47 void NewCreds_OnInitDialog (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp);
48 BOOL NewCreds_OnOK (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp);
49 void NewCreds_OnLogin (HWND hDlg);
50 void NewCreds_Enable (HWND hDlg, BOOL fEnable);
51 void NewCreds_GetOutParams (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp);
53 BOOL CALLBACK BadCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
57 * ROUTINES ___________________________________________________________________
61 BOOL AfsAppLib_CrackCredentials (PVOID hCreds, LPTSTR pszCell, LPTSTR pszUser, LPSYSTEMTIME pst, ULONG *pStatus)
67 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
69 rc = asc_CredentialsCrack (idClient, hCreds, pszCell, pszUser, pst, &status);
71 else if (OpenClientLibrary())
73 char szUserA[ cchRESOURCE ], szUser2A[ cchRESOURCE ];
74 char szCellA[ cchRESOURCE ];
75 unsigned long dateExpire;
78 if (afsclient_TokenQuery (hCreds, &dateExpire, szUserA, szUser2A, szCellA, &fHasKasToken, (afs_status_p)&status))
81 CopyAnsiToString (pszUser, szUserA);
82 CopyAnsiToString (pszCell, szCellA);
83 AfsAppLib_UnixTimeToSystemTime (pst, dateExpire);
89 if (!hCreds && pStatus)
95 PVOID AfsAppLib_GetCredentials (LPCTSTR pszCell, ULONG *pStatus)
101 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
103 hCreds = asc_CredentialsGet (idClient, pszCell, &status);
105 else if (OpenClientLibrary())
107 LPSTR pszCellA = StringToAnsi (pszCell);
109 afsclient_TokenGetExisting (pszCellA, &hCreds, (afs_status_p)&status);
111 FreeString (pszCellA, pszCell);
112 CloseClientLibrary();
115 if (!hCreds && pStatus)
121 PVOID AfsAppLib_SetCredentials (LPCTSTR pszCell, LPCTSTR pszUser, LPCTSTR pszPassword, ULONG *pStatus)
127 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
129 hCreds = asc_CredentialsSet (idClient, pszCell, pszUser, pszPassword, &status);
131 else if (OpenClientLibrary())
133 char szCellA[ cchRESOURCE ];
134 char szUserA[ cchRESOURCE ];
135 char szPasswordA[ cchRESOURCE ];
136 CopyStringToAnsi (szCellA, pszCell);
137 CopyStringToAnsi (szUserA, pszUser);
138 CopyStringToAnsi (szPasswordA, pszPassword);
140 afsclient_TokenGetNew (szCellA, szUserA, szPasswordA, &hCreds, (afs_status_p)&status);
142 CloseClientLibrary();
147 PostMessage (AfsAppLib_GetMainWindow(), WM_REFRESHED_CREDENTIALS, 0, (LPARAM)hCreds);
150 if (!hCreds && pStatus)
157 * OPEN CELL DIALOG ___________________________________________________________
161 BOOL AfsAppLib_ShowOpenCellDialog (LPOPENCELLDLG_PARAMS lpp)
163 HINSTANCE hInst = APP_HINST;
166 hInst = APPLIB_HINST;
167 lpp->idd = IDD_APPLIB_OPENCELL;
169 if (lpp->hCreds == 0)
172 lpp->hCreds = AfsAppLib_GetCredentials (lpp->szCell);
174 lpp->hCreds = AfsAppLib_GetCredentials (NULL);
177 int rc = ModalDialogParam (lpp->idd, lpp->hParent, (DLGPROC)OpenCell_DlgProc, (LPARAM)lpp);
179 return (rc == IDOK) ? TRUE : FALSE;
183 BOOL CALLBACK OpenCell_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
185 LPOPENCELLDLG_PARAMS lpp;
186 if (msg == WM_INITDIALOG)
187 SetWindowLong (hDlg, DWL_USER, lp);
189 if ((lpp = (LPOPENCELLDLG_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
193 if (CallWindowProc ((WNDPROC)lpp->hookproc, hDlg, msg, wp, lp))
200 if (AfsAppLib_HandleHelp (lpp->idd, hDlg, msg, wp, lp))
207 OpenCell_OnInitDialog (hDlg, lpp);
214 EndDialog (hDlg, IDCANCEL);
218 if (OpenCell_OnOK (hDlg, lpp))
219 EndDialog (hDlg, IDOK);
222 case IDC_OPENCELL_CELL:
226 TCHAR szCell[ cchNAME ];
227 SendDlgItemMessage (hDlg, IDC_OPENCELL_CELL, CB_GETLBTEXT, CB_GetSelected(GetDlgItem (hDlg, IDC_OPENCELL_CELL)), (LPARAM)szCell);
228 SetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell);
229 OpenCell_OnCell (hDlg);
233 OpenCell_OnCell (hDlg);
240 case WM_REFRESHED_CREDENTIALS:
241 OpenCell_OnGotCreds (hDlg, lp);
249 void OpenCell_OnInitDialog (HWND hDlg, LPOPENCELLDLG_PARAMS lpp)
251 // Fix the title of the dialog (unless the caller has supplied a
252 // custom dialog template)
254 if (lpp && (lpp->idd == IDD_APPLIB_OPENCELL))
256 TCHAR szApplication[ cchNAME ];
257 AfsAppLib_GetAppName (szApplication);
258 if (szApplication[0] != TEXT('\0'))
260 TCHAR szTitle[ cchRESOURCE ];
261 GetWindowText (hDlg, szTitle, cchRESOURCE);
262 lstrcat (szTitle, TEXT(" - "));
263 lstrcat (szTitle, szApplication);
264 SetWindowText (hDlg, szTitle);
268 // Fill in the 'Cell:' combobox; we'll list the default cell, and any
269 // cell which the user has specified before.
271 CB_StartChange (GetDlgItem (hDlg, IDC_OPENCELL_CELL), TRUE);
275 TCHAR szDefCell[ cchNAME ];
276 if (AfsAppLib_GetLocalCell (szDefCell) && *szDefCell)
278 CB_AddItem (GetDlgItem (hDlg, IDC_OPENCELL_CELL), szDefCell, 1);
281 else for (size_t ii = 0; ii < lpp->lpcl->nCells; ++ii)
283 CB_AddItem (GetDlgItem (hDlg, IDC_OPENCELL_CELL), lpp->lpcl->aCells[ii], 1+ii);
286 CB_EndChange (GetDlgItem (hDlg, IDC_OPENCELL_CELL), 1);
288 // Set up the "Credentials" box; if the user needs credentials to edit
289 // this default cell, jump the cursor to the appropriate field
291 SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin"));
293 OpenCell_OnCell (hDlg);
297 BOOL OpenCell_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp)
300 OpenCell_Enable (hDlg, FALSE);
303 // Remember what cell the user chose to edit
305 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME);
307 // Try to obtain the credentials specified by the user.
309 TCHAR szCell[ cchNAME ];
310 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
312 TCHAR szUser[ cchRESOURCE ];
313 GetDlgItemText (hDlg, IDC_OPENCELL_ID, szUser, cchNAME);
315 TCHAR szPassword[ cchRESOURCE ];
316 GetDlgItemText (hDlg, IDC_OPENCELL_PASSWORD, szPassword, cchNAME);
319 if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL)
321 ErrorDialog (status, IDS_ERROR_BAD_CREDENTIALS);
325 // See if those credentials are sufficient
327 CHECKCREDS_PARAMS pp;
328 memset (&pp, 0x00, sizeof(pp));
329 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
330 pp.bcdp.hParent = hDlg;
331 pp.hCreds = lpp->hCreds;
332 pp.fShowWarning = TRUE;
334 if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE)
336 SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin"));
337 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE);
342 OpenCell_Enable (hDlg, TRUE);
351 TCHAR szCell[ cchNAME ];
352 TCHAR szUser[ cchNAME ];
356 } OPENCELL_ONCELL_PARAMS, *LPOPENCELL_ONCELL_PARAMS;
358 DWORD WINAPI OpenCell_OnCell_ThreadProc (PVOID lp)
360 LPOPENCELL_ONCELL_PARAMS lpp;
361 if ((lpp = (LPOPENCELL_ONCELL_PARAMS)lp) != NULL)
363 PVOID hCreds = AfsAppLib_GetCredentials (lpp->szCell);
364 lpp->fGotCreds = AfsAppLib_CrackCredentials (hCreds, lpp->szCell, lpp->szUser, &lpp->stExpire);
365 lpp->fValidCreds = FALSE;
367 if (lpp->fGotCreds && AfsAppLib_IsTimeInFuture (&lpp->stExpire))
369 CHECKCREDS_PARAMS pp;
370 memset (&pp, 0x00, sizeof(pp));
372 lpp->fValidCreds = AfsAppLib_CheckCredentials(&pp);
375 // Post our results; we'll return the same packet we got.
377 if (IsWindow (lpp->hDlg))
378 PostMessage (lpp->hDlg, WM_REFRESHED_CREDENTIALS, 0, (LPARAM)lpp);
387 void OpenCell_OnCell (HWND hDlg)
389 // Fire up a background thread to query our current credentials in the
392 LPOPENCELL_ONCELL_PARAMS lpp = New (OPENCELL_ONCELL_PARAMS);
393 memset (lpp, 0x00, sizeof(lpp));
394 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME);
398 CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)OpenCell_OnCell_ThreadProc, lpp, 0, &dwThreadID);
402 void OpenCell_OnGotCreds (HWND hDlg, LPARAM lp)
404 LPOPENCELL_ONCELL_PARAMS lpp;
405 if ((lpp = (LPOPENCELL_ONCELL_PARAMS)lp) != NULL)
407 // Don't do anything to the dialog if the user has chosen a different
408 // cell than that for which we just queried credentials.
410 TCHAR szCell[ cchNAME ];
411 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
413 if (!lstrcmpi (szCell, lpp->szCell))
415 TCHAR szPrevCreds[ cchRESOURCE ];
416 GetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, szPrevCreds, cchRESOURCE);
420 LPTSTR psz = FormatString (IDS_CREDS_NONE, TEXT("%s"), lpp->szCell);
421 SetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, psz);
424 else if (!AfsAppLib_IsTimeInFuture (&lpp->stExpire))
426 LPTSTR pszCreds = FormatString (IDS_CREDS_EXPIRED, TEXT("%s%s%t"), lpp->szCell, lpp->szUser, &lpp->stExpire);
427 SetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, pszCreds);
428 FreeString (pszCreds);
432 LPTSTR pszCreds = FormatString (IDS_CREDS_VALID, TEXT("%s%s%t"), lpp->szCell, lpp->szUser, &lpp->stExpire);
433 SetDlgItemText (hDlg, IDC_OPENCELL_OLDCREDS, pszCreds);
434 FreeString (pszCreds);
437 SetDlgItemText (hDlg, IDC_OPENCELL_ID, (lpp->fGotCreds) ? lpp->szUser : TEXT("admin"));
439 if (!lpp->fValidCreds && !szPrevCreds[0])
440 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE);
448 void OpenCell_Enable (HWND hDlg, BOOL fEnable)
450 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
451 EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable);
452 EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable);
453 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_CELL), fEnable);
454 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_ID), fEnable);
455 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_PASSWORD), fEnable);
460 * NEW CREDENTIALS DIALOG _____________________________________________________
464 BOOL AfsAppLib_ShowCredentialsDialog (LPCREDENTIALSDLG_PARAMS lpp)
466 HINSTANCE hInst = APP_HINST;
469 hInst = APPLIB_HINST;
470 lpp->idd = IDD_APPLIB_CREDENTIALS;
472 if (lpp->hCreds == 0)
475 lpp->hCreds = AfsAppLib_GetCredentials (lpp->szCell);
477 lpp->hCreds = AfsAppLib_GetCredentials (NULL);
480 int rc = ModalDialogParam (lpp->idd, lpp->hParent, (DLGPROC)NewCreds_DlgProc, (LPARAM)lpp);
482 return (rc == IDOK) ? TRUE : FALSE;
486 BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
488 LPCREDENTIALSDLG_PARAMS lpp;
489 if (msg == WM_INITDIALOG)
490 SetWindowLong (hDlg, DWL_USER, lp);
492 if ((lpp = (LPCREDENTIALSDLG_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
496 if (CallWindowProc ((WNDPROC)lpp->hookproc, hDlg, msg, wp, lp))
503 if (AfsAppLib_HandleHelp (lpp->idd, hDlg, msg, wp, lp))
510 NewCreds_OnInitDialog (hDlg, lpp);
517 EndDialog (hDlg, IDCANCEL);
521 if (NewCreds_OnOK (hDlg, lpp))
522 EndDialog (hDlg, IDOK);
525 case IDC_CREDS_LOGIN:
526 NewCreds_OnLogin (hDlg);
536 void NewCreds_OnInitDialog (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp)
538 // Fix the title of the dialog (unless the caller has supplied a
539 // custom dialog template)
541 if (lpp && (lpp->idd == IDD_APPLIB_CREDENTIALS))
543 TCHAR szApplication[ cchNAME ];
544 AfsAppLib_GetAppName (szApplication);
545 if (szApplication[0] != TEXT('\0'))
547 TCHAR szTitle[ cchRESOURCE ];
548 GetWindowText (hDlg, szTitle, cchRESOURCE);
549 lstrcat (szTitle, TEXT(" - "));
550 lstrcat (szTitle, szApplication);
551 SetWindowText (hDlg, szTitle);
555 // Set up the "Credentials" boxes
557 TCHAR szUser[ cchRESOURCE ];
560 BOOL fValidCreds = TRUE;
561 BOOL fShowCreds = TRUE;
562 CHECKCREDS_PARAMS pp;
563 memset (&pp, 0x00, sizeof(pp));
564 pp.hCreds = lpp->hCreds;
565 pp.fShowWarning = FALSE;
566 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
567 pp.bcdp.hParent = hDlg;
569 if (!AfsAppLib_CrackCredentials (lpp->hCreds, lpp->szCell, szUser, &st))
574 if (!AfsAppLib_IsTimeInFuture (&st))
579 if (!AfsAppLib_CheckCredentials (&pp))
584 CheckDlgButton (hDlg, IDC_CREDS_LOGIN, !fValidCreds);
586 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_CREDS_PASSWORD), TRUE);
588 SetDlgItemText (hDlg, IDC_CREDS_CELL, lpp->szCell);
592 SetDlgItemText (hDlg, IDC_CREDS_CURRENTID, szUser);
594 LPTSTR pszDate = FormatString (TEXT("%1"), TEXT("%t"), &st);
595 SetDlgItemText (hDlg, IDC_CREDS_EXPDATE, pszDate);
596 FreeString (pszDate);
599 SetDlgItemText (hDlg, IDC_CREDS_ID, TEXT("admin"));
601 NewCreds_OnLogin (hDlg);
605 BOOL NewCreds_OnOK (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp)
607 NewCreds_GetOutParams (hDlg, lpp);
608 if (!IsDlgButtonChecked (hDlg, IDC_CREDS_LOGIN))
613 NewCreds_Enable (hDlg, FALSE);
615 // Try to obtain the credentials specified by the user.
617 TCHAR szUser[ cchRESOURCE ];
618 GetDlgItemText (hDlg, IDC_CREDS_ID, szUser, cchNAME);
620 TCHAR szPassword[ cchRESOURCE ];
621 GetDlgItemText (hDlg, IDC_CREDS_PASSWORD, szPassword, cchNAME);
624 if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL)
626 ErrorDialog (status, IDS_ERROR_BAD_CREDENTIALS);
630 // See if those credentials are sufficient
632 CHECKCREDS_PARAMS pp;
633 memset (&pp, 0x00, sizeof(pp));
634 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
635 pp.bcdp.hParent = hDlg;
636 pp.hCreds = lpp->hCreds;
637 pp.fShowWarning = TRUE;
639 if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE)
641 SetDlgItemText (hDlg, IDC_CREDS_ID, TEXT("admin"));
642 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_CREDS_PASSWORD), TRUE);
647 NewCreds_Enable (hDlg, TRUE);
653 void NewCreds_OnLogin (HWND hDlg)
655 BOOL fEnable = IsDlgButtonChecked (hDlg, IDC_CREDS_LOGIN);
657 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_ID), fEnable);
658 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_PASSWORD), fEnable);
662 void NewCreds_Enable (HWND hDlg, BOOL fEnable)
664 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
665 EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable);
666 EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable);
667 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_LOGIN), fEnable);
670 NewCreds_OnLogin (hDlg);
673 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_ID), fEnable);
674 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_PASSWORD), fEnable);
679 void NewCreds_GetOutParams (HWND hDlg, LPCREDENTIALSDLG_PARAMS lpp)
681 if (!IsDlgButtonChecked (hDlg, IDC_CREDS_LOGIN))
683 lpp->szIdentity[0] = TEXT('\0');
684 lpp->szPassword[0] = TEXT('\0');
688 GetDlgItemText (hDlg, IDC_CREDS_ID, lpp->szIdentity, cchNAME);
689 GetDlgItemText (hDlg, IDC_CREDS_PASSWORD, lpp->szPassword, cchNAME);
695 * TEST CREDENTIALS ___________________________________________________________
701 BADCREDSDLG_PARAMS bcdp;
704 } REALBADCREDSDLG_PARAMS, *LPREALBADCREDSDLG_PARAMS;
706 BOOL AfsAppLib_CheckCredentials (LPCHECKCREDS_PARAMS lpp)
708 BOOL fCredsOK = TRUE;
709 int idsWarning = IDS_BADCREDS_DESC_GENERAL;
711 TCHAR szCell[ cchNAME ];
712 TCHAR szUser[ cchNAME ];
715 if (!AfsAppLib_CrackCredentials (lpp->hCreds, szCell, szUser, &stExpire))
719 else if (!AfsAppLib_IsUserAdmin (lpp->hCreds, szUser))
722 idsWarning = IDS_BADCREDS_DESC_BADCHOICE;
724 else if (!AfsAppLib_IsTimeInFuture (&stExpire))
727 idsWarning = IDS_BADCREDS_DESC_EXPIRED;
730 if (!fCredsOK && lpp->fShowWarning)
732 if (lpp->bcdp.pfShowWarningEver && !(*lpp->bcdp.pfShowWarningEver))
734 fCredsOK = TRUE; // user says always ignore bad credentials.
739 AfsAppLib_GetLocalCell (szCell);
741 int idsDesc = (lpp->bcdp.idsDesc) ? lpp->bcdp.idsDesc : IDS_BADCREDS_DESC2;
742 LPTSTR pszDesc = FormatString (idsDesc, TEXT("%s"), szCell);
743 LPTSTR pszFullText = FormatString (idsWarning, TEXT("%s%s%m"), szCell, pszDesc, IDS_BADCREDS_DESC3);
744 FreeString (pszDesc);
746 REALBADCREDSDLG_PARAMS pp;
747 memset (&pp, 0x00, sizeof(pp));
748 pp.pszFullText = pszFullText;
749 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
751 HINSTANCE hInst = APP_HINST;
752 if (pp.bcdp.idd == 0)
754 hInst = APPLIB_HINST;
755 pp.bcdp.idd = IDD_APPLIB_BADCREDS;
758 int rc = ModalDialogParam (pp.bcdp.idd, pp.bcdp.hParent, (DLGPROC)BadCreds_DlgProc, (LPARAM)&pp);
761 fCredsOK = TRUE; // user says ignore bad credentials this time.
764 FreeString (pszFullText);
772 BOOL CALLBACK BadCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
774 LPREALBADCREDSDLG_PARAMS lpp;
775 if (msg == WM_INITDIALOG)
776 SetWindowLong (hDlg, DWL_USER, lp);
777 if ((lpp = (LPREALBADCREDSDLG_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
779 if (lpp->bcdp.hookproc)
781 if (CallWindowProc ((WNDPROC)lpp->bcdp.hookproc, hDlg, msg, wp, lp))
784 if (AfsAppLib_HandleHelp (lpp->bcdp.idd, hDlg, msg, wp, lp))
791 TCHAR szApplication[ cchNAME ];
792 AfsAppLib_GetAppName (szApplication);
793 if (szApplication[0] != TEXT('\0'))
795 TCHAR szTitle[ cchRESOURCE ];
796 GetWindowText (hDlg, szTitle, cchRESOURCE);
797 lstrcat (szTitle, TEXT(" - "));
798 lstrcat (szTitle, szApplication);
799 SetWindowText (hDlg, szTitle);
801 if (!lpp || !lpp->bcdp.pfShowWarningEver)
802 DestroyWindow (GetWindow (hDlg, IDC_BADCREDS_SHUTUP));
804 SetDlgItemText (hDlg, IDC_BADCREDS_DESC, lpp->pszFullText);
812 if (lpp && lpp->bcdp.pfShowWarningEver)
813 *lpp->bcdp.pfShowWarningEver = !IsDlgButtonChecked (hDlg, IDC_BADCREDS_SHUTUP);
814 EndDialog (hDlg, LOWORD(wp));
825 * EXPIRED CREDENTIALS ________________________________________________________
829 void AfsAppLib_CheckForExpiredCredentials (LPCREDENTIALSDLG_PARAMS lpp)
831 static PVOID hCredsPrevious = NULL;
832 static BOOL fHadGoodCredentials;
834 TCHAR szCell[ cchNAME ];
835 TCHAR szUser[ cchNAME ];
838 BOOL fHaveCredentials;
839 fHaveCredentials = AfsAppLib_CrackCredentials (lpp->hCreds, szCell, szUser, &stExpire);
841 if (hCredsPrevious && (hCredsPrevious != lpp->hCreds))
843 if (!fHaveCredentials)
844 fHadGoodCredentials = FALSE;
845 else if (!AfsAppLib_IsTimeInFuture (&stExpire))
846 fHadGoodCredentials = FALSE;
848 fHadGoodCredentials = TRUE;
849 hCredsPrevious = lpp->hCreds;
851 else if (fHaveCredentials && AfsAppLib_IsTimeInFuture (&stExpire))
853 fHadGoodCredentials = TRUE;
855 else if (fHadGoodCredentials) // used to have good credentials, but now don't
857 fHadGoodCredentials = FALSE;
859 LPCREDENTIALSDLG_PARAMS lppCopy = New (CREDENTIALSDLG_PARAMS);
860 memcpy (lppCopy, lpp, sizeof(CREDENTIALSDLG_PARAMS));
862 if (!AfsAppLib_GetMainWindow())
863 OnExpiredCredentials ((WPARAM)(!AfsAppLib_IsTimeInFuture(&stExpire)), (LPARAM)lppCopy);
865 PostMessage (AfsAppLib_GetMainWindow(), WM_EXPIRED_CREDENTIALS, (WPARAM)(!AfsAppLib_IsTimeInFuture(&stExpire)), (LPARAM)lppCopy);
870 void OnExpiredCredentials (WPARAM wp, LPARAM lp)
872 BOOL fExpired = (BOOL)wp;
873 LPCREDENTIALSDLG_PARAMS lpp = (LPCREDENTIALSDLG_PARAMS)lp;
875 if (lpp && lpp->bcdp.pfShowWarningEver && *(lpp->bcdp.pfShowWarningEver))
877 int idsWarning = (wp) ? IDS_BADCREDS_DESC_EXPIRED : IDS_BADCREDS_DESC_DESTROYED;
879 int idsDesc = (lpp->bcdp.idsDesc) ? lpp->bcdp.idsDesc : IDS_BADCREDS_DESC2;
880 LPTSTR pszDesc = FormatString (idsDesc, TEXT("%s"), lpp->szCell);
881 LPTSTR pszFullText = FormatString (idsWarning, TEXT("%s%s%m"), lpp->szCell, pszDesc, IDS_BADCREDS_DESC3);
882 FreeString (pszDesc);
884 REALBADCREDSDLG_PARAMS pp;
885 memset (&pp, 0x00, sizeof(pp));
886 pp.pszFullText = pszFullText;
887 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
889 if (ModalDialogParam (IDD_APPLIB_BADCREDS, NULL, (DLGPROC)BadCreds_DlgProc, (LPARAM)&pp) != IDCANCEL)
891 AfsAppLib_ShowCredentialsDialog (lpp);
894 FreeString (pszFullText);
904 BOOL AfsAppLib_IsUserAdmin (PVOID hCreds, LPTSTR pszUser)
910 if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0)
912 TCHAR szCell[ cchRESOURCE ];
913 TCHAR szUser[ cchRESOURCE ];
915 if (asc_CredentialsCrack (idClient, hCreds, szCell, szUser, &stExpire, (ULONG*)&status))
918 if (asc_CellOpen (idClient, hCreds, szCell, AFSADMSVR_SCOPE_USERS, &idCell, (ULONG*)&status))
921 if (asc_ObjectFind (idClient, idCell, TYPE_USER, pszUser, &idUser, (ULONG*)&status))
924 if (asc_ObjectPropertiesGet (idClient, GET_ALL_DATA, idCell, idUser, &Info, (ULONG*)&status))
926 if (Info.u.UserProperties.fHaveKasInfo)
928 rc = Info.u.UserProperties.KASINFO.fIsAdmin;
932 asc_CellClose (idClient, idCell, (ULONG*)&status);
936 else if (OpenClientLibrary())
938 if (OpenKasLibrary())
940 char szUserA[ cchRESOURCE ], szUser2A[ cchRESOURCE ];
941 char szCellA[ cchRESOURCE ];
942 unsigned long dateExpire;
945 if (afsclient_TokenQuery (hCreds, &dateExpire, szUserA, szUser2A, szCellA, &fHasKasToken, (afs_status_p)&status))
948 if (afsclient_CellOpen (szCellA, hCreds, &hCell, &status))
950 kas_identity_t Identity;
951 memset (&Identity, 0x00, sizeof(Identity));
952 CopyStringToAnsi (Identity.principal, pszUser);
954 kas_principalEntry_t Entry;
955 if (kas_PrincipalGet (hCell, NULL, &Identity, &Entry, &status))
957 if (Entry.adminSetting == KAS_ADMIN)
961 afsclient_CellClose (hCell, (afs_status_p)&status);
968 CloseClientLibrary();