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 <afs/param.h>
24 #include <afs\afskfw.h>
27 * OPENCELL DIALOG ____________________________________________________________
31 void OpenCell_OnSubset (HWND hDlg)
36 if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_MON_ONE)))
38 if (!IsDlgButtonChecked (hDlg, IDC_MON_ONE))
40 EnableWindow (GetDlgItem (hDlg, IDC_MON_SERVER), fEnable);
43 if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_MON_SOME)))
45 if (!IsDlgButtonChecked (hDlg, IDC_MON_SOME))
47 EnableWindow (GetDlgItem (hDlg, IDC_MON_SUBSET), fEnable);
51 void OpenCell_Hook_Enable (HWND hDlg, BOOL fEnable)
53 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
54 EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable);
55 EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable);
56 EnableWindow (GetDlgItem (hDlg, IDC_ADVANCED), fEnable);
57 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_CELL), fEnable);
58 EnableWindow (GetDlgItem (hDlg, IDC_MON_ALL), fEnable);
59 EnableWindow (GetDlgItem (hDlg, IDC_MON_ONE), fEnable);
60 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_ID), fEnable);
61 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_PASSWORD), fEnable);
65 BOOL fAnySubsets = !!SendDlgItemMessage (hDlg, IDC_MON_SUBSET, CB_GETCOUNT, 0, 0);
66 EnableWindow (GetDlgItem (hDlg, IDC_MON_SOME), fAnySubsets);
70 EnableWindow (GetDlgItem (hDlg, IDC_MON_SOME), FALSE);
73 OpenCell_OnSubset (hDlg);
77 void OpenCellDlg_Hook_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp)
80 OpenCell_Hook_Enable (hDlg, FALSE);
83 // Remember what cell the user chose to edit
85 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME);
87 // Try to obtain the credentials specified by the user.
89 TCHAR szCell[ cchNAME ];
90 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
92 TCHAR szUser[ cchRESOURCE ];
93 GetDlgItemText (hDlg, IDC_OPENCELL_ID, szUser, cchNAME);
95 TCHAR szPassword[ cchRESOURCE ];
96 GetDlgItemText (hDlg, IDC_OPENCELL_PASSWORD, szPassword, cchNAME);
100 if ( KFW_is_available() ) {
101 // KFW_AFS_get_cred() parses the szNameA field as complete
102 // princial including potentially
103 // a different realm then the specified cell name.
107 CopyStringToAnsi (szCellA, lpp->szCell);
110 CopyStringToAnsi (szUserA, szUser);
112 char szPasswordA[ 256 ];
113 CopyStringToAnsi (szPasswordA, szPassword);
115 rc = !KFW_AFS_get_cred(szUserA, szCellA, szPasswordA, 0, NULL, &Result);
117 if ((lpp->hCreds = AfsAppLib_GetCredentials (lpp->szCell, &status)) == NULL) {
118 ErrorDialog (status, IDS_SVR_ERROR_BAD_CREDENTIALS);
122 if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL)
124 ErrorDialog (status, IDS_SVR_ERROR_BAD_CREDENTIALS);
128 // See if those credentials are sufficient
130 CHECKCREDS_PARAMS pp;
131 memset (&pp, 0x00, sizeof(pp));
132 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
133 pp.bcdp.hParent = hDlg;
134 pp.hCreds = lpp->hCreds;
135 pp.fShowWarning = TRUE;
137 if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE)
139 SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin"));
140 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE);
148 g.hCreds = lpp->hCreds;
150 // Instead of closing the dialog, start an taskOPENCELL task;
151 // we'll wait for that to complete successfully before we'll
154 LPOPENCELL_PACKET lpocp = New (OPENCELL_PACKET);
155 memset (lpocp, 0x00, sizeof(OPENCELL_PACKET));
156 lstrcpy (lpocp->szCell, lpp->szCell);
157 lpocp->fCloseAppOnFail = FALSE;
158 lpocp->hCreds = lpp->hCreds;
160 if (IsDlgButtonChecked (hDlg, IDC_MON_ALL))
164 else if (IsDlgButtonChecked (hDlg, IDC_MON_ONE))
166 TCHAR szServer[ cchNAME ];
167 GetDlgItemText (hDlg, IDC_MON_SERVER, szServer, cchNAME);
168 lpocp->sub = New (SUBSET);
169 memset (lpocp->sub, 0x0, sizeof(SUBSET));
171 FormatMultiString (&lpocp->sub->pszMonitored, TRUE, TEXT("%1"), TEXT("%s"), szServer);
174 lpocp->sub->pszMonitored = AllocateString (2);
175 lpocp->sub->pszMonitored[0] = TEXT('\0');
176 lpocp->sub->pszMonitored[1] = TEXT('\0');
179 else // (IsDlgButtonChecked (hDlg, IDC_MON_SOME))
181 TCHAR szSubset[ cchNAME ];
182 GetDlgItemText (hDlg, IDC_MON_SUBSET, szSubset, cchNAME);
183 lpocp->sub = Subsets_LoadSubset (szCell, szSubset);
186 StartTask (taskOPENCELL, hDlg, lpocp);
190 OpenCell_Hook_Enable (hDlg, TRUE);
195 void OpenCell_OnCellChange (HWND hDlg, BOOL fMoveCaret)
197 HWND hCombo = GetDlgItem (hDlg, IDC_MON_SUBSET);
198 CB_StartChange (hCombo, TRUE);
200 BOOL fAddedAny = FALSE;
202 TCHAR szCell[ cchNAME ];
203 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
205 if (szCell[0] != TEXT('\0'))
207 BOOL fSelectedCurrentCell = FALSE;
210 TCHAR szCurrentCell[ cchNAME ];
211 g.lpiCell->GetCellName (szCurrentCell);
213 if (!lstrcmpi (szCell, szCurrentCell))
214 fSelectedCurrentCell = TRUE;
216 if (g.sub && g.sub->pszMonitored)
217 SetDlgItemText (hDlg, IDC_MON_SERVER, g.sub->pszMonitored);
219 SetDlgItemText (hDlg, IDC_MON_SERVER, TEXT(""));
222 TCHAR szSubset[ cchNAME ];
223 for (size_t iIndex = 0; Subsets_EnumSubsets (szCell, iIndex, szSubset); ++iIndex)
225 CB_AddItem (hCombo, szSubset, (LPARAM)iIndex+1);
228 if (fSelectedCurrentCell && !lstrcmpi (szSubset, g.sub->szSubset))
233 CB_EndChange (hCombo, (LPARAM)(iSel == 0) ? 1 : iSel);
235 if (fAddedAny && iSel)
237 CheckDlgButton (hDlg, IDC_MON_ALL, FALSE);
238 CheckDlgButton (hDlg, IDC_MON_ONE, FALSE);
239 CheckDlgButton (hDlg, IDC_MON_SOME, TRUE);
241 else if (!fAddedAny && IsDlgButtonChecked (hDlg, IDC_MON_SOME))
243 CheckDlgButton (hDlg, IDC_MON_ALL, FALSE);
244 CheckDlgButton (hDlg, IDC_MON_SOME, FALSE);
245 CheckDlgButton (hDlg, IDC_MON_ONE, TRUE);
248 BOOL fEnable = fAddedAny;
249 if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_MON_ALL)))
251 EnableWindow (GetDlgItem (hDlg, IDC_MON_SOME), fEnable);
253 OpenCell_OnSubset (hDlg);
257 void OpenCell_OnAdvanced (HWND hDlg)
259 HWND hGroup = GetDlgItem (hDlg, IDC_ADVANCED_GROUP);
265 GetWindowRect (hDlg, &rWindow);
266 GetClientRect (hDlg, &rClient);
267 GetRectInParent (hGroup, &rGroup);
269 if (cyRECT(rClient) <= rGroup.top) // closed now?
271 SetWindowPos (hDlg, NULL,
274 cyRECT(rWindow) + cyRECT(rGroup) + 14,
275 SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
277 TCHAR szText[ cchRESOURCE ];
278 GetString (szText, IDS_ADVANCEDIN_BUTTON);
279 SetDlgItemText (hDlg, IDC_ADVANCED, szText);
283 SetWindowPos (hDlg, NULL,
286 cyRECT(rWindow) - cyRECT(rGroup) - 14,
287 SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
289 TCHAR szText[ cchRESOURCE ];
290 GetString (szText, IDS_ADVANCEDOUT_BUTTON);
291 SetDlgItemText (hDlg, IDC_ADVANCED, szText);
296 void OpenCellDlg_Hook_OnEndTask_OpenCell (HWND hDlg, LPTASKPACKET ptp)
300 EndDialog (hDlg, IDOK);
304 OpenCell_Hook_Enable (hDlg, TRUE);
306 TCHAR szCell[ cchNAME ];
307 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
308 ErrorDialog (ptp->status, IDS_ERROR_CANT_OPEN_CELL, TEXT("%s"), szCell);
313 BOOL CALLBACK OpenCellDlg_Hook (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
318 CheckDlgButton (hDlg, IDC_MON_ALL, TRUE);
319 CheckDlgButton (hDlg, IDC_MON_ONE, FALSE);
320 CheckDlgButton (hDlg, IDC_MON_SOME, FALSE);
321 OpenCell_OnSubset (hDlg);
322 OpenCell_OnAdvanced (hDlg);
323 OpenCell_OnCellChange (hDlg, TRUE);
328 if ((ptp = (LPTASKPACKET)lp) != NULL)
330 if (ptp->idTask == taskOPENCELL)
331 OpenCellDlg_Hook_OnEndTask_OpenCell (hDlg, ptp);
332 FreeTaskPacket (ptp);
340 OpenCellDlg_Hook_OnOK (hDlg, (LPOPENCELLDLG_PARAMS)GetWindowLongPtr (hDlg, DWLP_USER));
343 case IDC_OPENCELL_CELL:
347 TCHAR szCell[ cchNAME ];
348 SendDlgItemMessage (hDlg, IDC_OPENCELL_CELL, CB_GETLBTEXT, CB_GetSelected(GetDlgItem (hDlg, IDC_OPENCELL_CELL)), (LPARAM)szCell);
349 SetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell);
350 OpenCell_OnCellChange (hDlg, FALSE);
354 OpenCell_OnCellChange (hDlg, FALSE);
360 OpenCell_OnAdvanced (hDlg);
366 OpenCell_OnSubset (hDlg);
377 * CREDENTIALS ________________________________________________________________
381 void GetBadCredsDlgParams (LPBADCREDSDLG_PARAMS lpp)
383 memset (lpp, 0x00, sizeof(BADCREDSDLG_PARAMS));
384 lpp->pfShowWarningEver = &gr.fWarnBadCreds;
385 lpp->idsDesc = IDS_BADCREDS_DESC;
389 void GetCredentialsDlgParams (LPCREDENTIALSDLG_PARAMS lpp)
391 memset (lpp, 0x00, sizeof(CREDENTIALSDLG_PARAMS));
392 lpp->hParent = g.hMain;
394 g.lpiCell->GetCellName (lpp->szCell);
396 AfsAppLib_GetLocalCell (lpp->szCell);
397 lpp->hCreds = g.hCreds;
398 GetBadCredsDlgParams (&lpp->bcdp);
403 * OPERATIONS _________________________________________________________________
407 BOOL OpenCellDialog (void)
409 if (!Subsets_SaveIfDirty (g.sub))
412 OPENCELLDLG_PARAMS pp;
413 memset (&pp, 0x00, sizeof(pp));
414 pp.idd = IDD_OPENCELL;
415 pp.hookproc = (DLGPROC)OpenCellDlg_Hook;
416 pp.hParent = g.hMain;
418 pp.lpcl = AfsAppLib_GetCellList (HKCU, REGSTR_SETTINGS_CELLS);
419 pp.hCreds = g.hCreds;
420 GetBadCredsDlgParams (&pp.bcdp);
422 BOOL rc = AfsAppLib_ShowOpenCellDialog (&pp);
424 AfsAppLib_FreeCellList (pp.lpcl);
429 BOOL NewCredsDialog (void)
431 CREDENTIALSDLG_PARAMS pp;
432 GetCredentialsDlgParams (&pp);
433 return AfsAppLib_ShowCredentialsDialog (&pp);
437 void CheckForExpiredCredentials (void)
439 CREDENTIALSDLG_PARAMS pp;
440 GetCredentialsDlgParams (&pp);
441 AfsAppLib_CheckForExpiredCredentials (&pp);
445 BOOL CheckCredentials (BOOL fComplain)
447 CHECKCREDS_PARAMS pp;
448 memset (&pp, 0x00, sizeof(pp));
449 pp.fShowWarning = fComplain;
450 pp.hCreds = g.hCreds;
451 GetBadCredsDlgParams (&pp.bcdp);
453 return AfsAppLib_CheckCredentials (&pp);