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>
26 #include <afs\afskfw.h>
29 * OPENCELL DIALOG ____________________________________________________________
33 void OpenCell_OnSubset (HWND hDlg)
38 if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_MON_ONE)))
40 if (!IsDlgButtonChecked (hDlg, IDC_MON_ONE))
42 EnableWindow (GetDlgItem (hDlg, IDC_MON_SERVER), fEnable);
45 if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_MON_SOME)))
47 if (!IsDlgButtonChecked (hDlg, IDC_MON_SOME))
49 EnableWindow (GetDlgItem (hDlg, IDC_MON_SUBSET), fEnable);
53 void OpenCell_Hook_Enable (HWND hDlg, BOOL fEnable)
55 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
56 EnableWindow (GetDlgItem (hDlg, IDHELP), fEnable);
57 EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable);
58 EnableWindow (GetDlgItem (hDlg, IDC_ADVANCED), fEnable);
59 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_CELL), fEnable);
60 EnableWindow (GetDlgItem (hDlg, IDC_MON_ALL), fEnable);
61 EnableWindow (GetDlgItem (hDlg, IDC_MON_ONE), fEnable);
62 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_ID), fEnable);
63 EnableWindow (GetDlgItem (hDlg, IDC_OPENCELL_PASSWORD), fEnable);
67 BOOL fAnySubsets = !!SendDlgItemMessage (hDlg, IDC_MON_SUBSET, CB_GETCOUNT, 0, 0);
68 EnableWindow (GetDlgItem (hDlg, IDC_MON_SOME), fAnySubsets);
72 EnableWindow (GetDlgItem (hDlg, IDC_MON_SOME), FALSE);
75 OpenCell_OnSubset (hDlg);
79 void OpenCellDlg_Hook_OnOK (HWND hDlg, LPOPENCELLDLG_PARAMS lpp)
82 OpenCell_Hook_Enable (hDlg, FALSE);
85 // Remember what cell the user chose to edit
87 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, lpp->szCell, cchNAME);
89 // Try to obtain the credentials specified by the user.
91 TCHAR szCell[ cchNAME ];
92 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
94 TCHAR szUser[ cchRESOURCE ];
95 GetDlgItemText (hDlg, IDC_OPENCELL_ID, szUser, cchNAME);
97 TCHAR szPassword[ cchRESOURCE ];
98 GetDlgItemText (hDlg, IDC_OPENCELL_PASSWORD, szPassword, cchNAME);
102 if ( KFW_is_available() ) {
103 // KFW_AFS_get_cred() parses the szNameA field as complete
104 // princial including potentially
105 // a different realm then the specified cell name.
109 CopyStringToAnsi (szCellA, lpp->szCell);
112 CopyStringToAnsi (szUserA, szUser);
114 char szPasswordA[ 256 ];
115 CopyStringToAnsi (szPasswordA, szPassword);
117 rc = !KFW_AFS_get_cred(szUserA, szCellA, szPasswordA, 0, NULL, &Result);
119 if ((lpp->hCreds = AfsAppLib_GetCredentials (lpp->szCell, &status)) == NULL) {
120 ErrorDialog (status, IDS_SVR_ERROR_BAD_CREDENTIALS);
124 if ((lpp->hCreds = AfsAppLib_SetCredentials (lpp->szCell, szUser, szPassword, &status)) == NULL)
126 ErrorDialog (status, IDS_SVR_ERROR_BAD_CREDENTIALS);
130 // See if those credentials are sufficient
132 CHECKCREDS_PARAMS pp;
133 memset (&pp, 0x00, sizeof(pp));
134 memcpy (&pp.bcdp, &lpp->bcdp, sizeof(BADCREDSDLG_PARAMS));
135 pp.bcdp.hParent = hDlg;
136 pp.hCreds = lpp->hCreds;
137 pp.fShowWarning = TRUE;
139 if ((rc = AfsAppLib_CheckCredentials (&pp)) == FALSE)
141 SetDlgItemText (hDlg, IDC_OPENCELL_ID, TEXT("admin"));
142 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg,IDC_OPENCELL_PASSWORD), TRUE);
150 g.hCreds = lpp->hCreds;
152 // Instead of closing the dialog, start an taskOPENCELL task;
153 // we'll wait for that to complete successfully before we'll
156 LPOPENCELL_PACKET lpocp = New (OPENCELL_PACKET);
157 memset (lpocp, 0x00, sizeof(OPENCELL_PACKET));
158 lstrcpy (lpocp->szCell, lpp->szCell);
159 lpocp->fCloseAppOnFail = FALSE;
160 lpocp->hCreds = lpp->hCreds;
162 if (IsDlgButtonChecked (hDlg, IDC_MON_ALL))
166 else if (IsDlgButtonChecked (hDlg, IDC_MON_ONE))
168 TCHAR szServer[ cchNAME ];
169 GetDlgItemText (hDlg, IDC_MON_SERVER, szServer, cchNAME);
170 lpocp->sub = New (SUBSET);
171 memset (lpocp->sub, 0x0, sizeof(SUBSET));
173 FormatMultiString (&lpocp->sub->pszMonitored, TRUE, TEXT("%1"), TEXT("%s"), szServer);
176 lpocp->sub->pszMonitored = AllocateString (2);
177 lpocp->sub->pszMonitored[0] = TEXT('\0');
178 lpocp->sub->pszMonitored[1] = TEXT('\0');
181 else // (IsDlgButtonChecked (hDlg, IDC_MON_SOME))
183 TCHAR szSubset[ cchNAME ];
184 GetDlgItemText (hDlg, IDC_MON_SUBSET, szSubset, cchNAME);
185 lpocp->sub = Subsets_LoadSubset (szCell, szSubset);
188 StartTask (taskOPENCELL, hDlg, lpocp);
192 OpenCell_Hook_Enable (hDlg, TRUE);
197 void OpenCell_OnCellChange (HWND hDlg, BOOL fMoveCaret)
199 HWND hCombo = GetDlgItem (hDlg, IDC_MON_SUBSET);
200 CB_StartChange (hCombo, TRUE);
202 BOOL fAddedAny = FALSE;
204 TCHAR szCell[ cchNAME ];
205 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
207 if (szCell[0] != TEXT('\0'))
209 BOOL fSelectedCurrentCell = FALSE;
212 TCHAR szCurrentCell[ cchNAME ];
213 g.lpiCell->GetCellName (szCurrentCell);
215 if (!lstrcmpi (szCell, szCurrentCell))
216 fSelectedCurrentCell = TRUE;
218 if (g.sub && g.sub->pszMonitored)
219 SetDlgItemText (hDlg, IDC_MON_SERVER, g.sub->pszMonitored);
221 SetDlgItemText (hDlg, IDC_MON_SERVER, TEXT(""));
224 TCHAR szSubset[ cchNAME ];
225 for (size_t iIndex = 0; Subsets_EnumSubsets (szCell, iIndex, szSubset); ++iIndex)
227 CB_AddItem (hCombo, szSubset, (LPARAM)iIndex+1);
230 if (fSelectedCurrentCell && !lstrcmpi (szSubset, g.sub->szSubset))
235 CB_EndChange (hCombo, (LPARAM)(iSel == 0) ? 1 : iSel);
237 if (fAddedAny && iSel)
239 CheckDlgButton (hDlg, IDC_MON_ALL, FALSE);
240 CheckDlgButton (hDlg, IDC_MON_ONE, FALSE);
241 CheckDlgButton (hDlg, IDC_MON_SOME, TRUE);
243 else if (!fAddedAny && IsDlgButtonChecked (hDlg, IDC_MON_SOME))
245 CheckDlgButton (hDlg, IDC_MON_ALL, FALSE);
246 CheckDlgButton (hDlg, IDC_MON_SOME, FALSE);
247 CheckDlgButton (hDlg, IDC_MON_ONE, TRUE);
250 BOOL fEnable = fAddedAny;
251 if (!IsWindowEnabled (GetDlgItem (hDlg, IDC_MON_ALL)))
253 EnableWindow (GetDlgItem (hDlg, IDC_MON_SOME), fEnable);
255 OpenCell_OnSubset (hDlg);
259 void OpenCell_OnAdvanced (HWND hDlg)
261 HWND hGroup = GetDlgItem (hDlg, IDC_ADVANCED_GROUP);
267 GetWindowRect (hDlg, &rWindow);
268 GetClientRect (hDlg, &rClient);
269 GetRectInParent (hGroup, &rGroup);
271 if (cyRECT(rClient) <= rGroup.top) // closed now?
273 SetWindowPos (hDlg, NULL,
276 cyRECT(rWindow) + cyRECT(rGroup) + 14,
277 SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
279 TCHAR szText[ cchRESOURCE ];
280 GetString (szText, IDS_ADVANCEDIN_BUTTON);
281 SetDlgItemText (hDlg, IDC_ADVANCED, szText);
285 SetWindowPos (hDlg, NULL,
288 cyRECT(rWindow) - cyRECT(rGroup) - 14,
289 SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
291 TCHAR szText[ cchRESOURCE ];
292 GetString (szText, IDS_ADVANCEDOUT_BUTTON);
293 SetDlgItemText (hDlg, IDC_ADVANCED, szText);
298 void OpenCellDlg_Hook_OnEndTask_OpenCell (HWND hDlg, LPTASKPACKET ptp)
302 EndDialog (hDlg, IDOK);
306 OpenCell_Hook_Enable (hDlg, TRUE);
308 TCHAR szCell[ cchNAME ];
309 GetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell, cchNAME);
310 ErrorDialog (ptp->status, IDS_ERROR_CANT_OPEN_CELL, TEXT("%s"), szCell);
315 BOOL CALLBACK OpenCellDlg_Hook (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
320 CheckDlgButton (hDlg, IDC_MON_ALL, TRUE);
321 CheckDlgButton (hDlg, IDC_MON_ONE, FALSE);
322 CheckDlgButton (hDlg, IDC_MON_SOME, FALSE);
323 OpenCell_OnSubset (hDlg);
324 OpenCell_OnAdvanced (hDlg);
325 OpenCell_OnCellChange (hDlg, TRUE);
330 if ((ptp = (LPTASKPACKET)lp) != NULL)
332 if (ptp->idTask == taskOPENCELL)
333 OpenCellDlg_Hook_OnEndTask_OpenCell (hDlg, ptp);
334 FreeTaskPacket (ptp);
342 OpenCellDlg_Hook_OnOK (hDlg, (LPOPENCELLDLG_PARAMS)GetWindowLongPtr (hDlg, DWLP_USER));
345 case IDC_OPENCELL_CELL:
349 TCHAR szCell[ cchNAME ];
350 SendDlgItemMessage (hDlg, IDC_OPENCELL_CELL, CB_GETLBTEXT, CB_GetSelected(GetDlgItem (hDlg, IDC_OPENCELL_CELL)), (LPARAM)szCell);
351 SetDlgItemText (hDlg, IDC_OPENCELL_CELL, szCell);
352 OpenCell_OnCellChange (hDlg, FALSE);
356 OpenCell_OnCellChange (hDlg, FALSE);
362 OpenCell_OnAdvanced (hDlg);
368 OpenCell_OnSubset (hDlg);
379 * CREDENTIALS ________________________________________________________________
383 void GetBadCredsDlgParams (LPBADCREDSDLG_PARAMS lpp)
385 memset (lpp, 0x00, sizeof(BADCREDSDLG_PARAMS));
386 lpp->pfShowWarningEver = &gr.fWarnBadCreds;
387 lpp->idsDesc = IDS_BADCREDS_DESC;
391 void GetCredentialsDlgParams (LPCREDENTIALSDLG_PARAMS lpp)
393 memset (lpp, 0x00, sizeof(CREDENTIALSDLG_PARAMS));
394 lpp->hParent = g.hMain;
396 g.lpiCell->GetCellName (lpp->szCell);
398 AfsAppLib_GetLocalCell (lpp->szCell);
399 lpp->hCreds = g.hCreds;
400 GetBadCredsDlgParams (&lpp->bcdp);
405 * OPERATIONS _________________________________________________________________
409 BOOL OpenCellDialog (void)
411 if (!Subsets_SaveIfDirty (g.sub))
414 OPENCELLDLG_PARAMS pp;
415 memset (&pp, 0x00, sizeof(pp));
416 pp.idd = IDD_OPENCELL;
417 pp.hookproc = (DLGPROC)OpenCellDlg_Hook;
418 pp.hParent = g.hMain;
420 pp.lpcl = AfsAppLib_GetCellList (HKCU, REGSTR_SETTINGS_CELLS);
421 pp.hCreds = g.hCreds;
422 GetBadCredsDlgParams (&pp.bcdp);
424 BOOL rc = AfsAppLib_ShowOpenCellDialog (&pp);
426 AfsAppLib_FreeCellList (pp.lpcl);
431 BOOL NewCredsDialog (void)
433 CREDENTIALSDLG_PARAMS pp;
434 GetCredentialsDlgParams (&pp);
435 return AfsAppLib_ShowCredentialsDialog (&pp);
439 void CheckForExpiredCredentials (void)
441 CREDENTIALSDLG_PARAMS pp;
442 GetCredentialsDlgParams (&pp);
443 AfsAppLib_CheckForExpiredCredentials (&pp);
447 BOOL CheckCredentials (BOOL fComplain)
449 CHECKCREDS_PARAMS pp;
450 memset (&pp, 0x00, sizeof(pp));
451 pp.fShowWarning = fComplain;
452 pp.hCreds = g.hCreds;
453 GetBadCredsDlgParams (&pp.bcdp);
455 return AfsAppLib_CheckCredentials (&pp);