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>
19 * PROTOTYPES _________________________________________________________________
23 void Creds_OnUpdate (HWND hDlg);
24 void Creds_OnCheckRemind (HWND hDlg);
25 void Creds_OnClickObtain (HWND hDlg);
26 void Creds_OnClickDestroy (HWND hDlg);
28 BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
29 void NewCreds_OnInitDialog (HWND hDlg);
30 void NewCreds_OnEnable (HWND hDlg);
31 BOOL NewCreds_OnOK (HWND hDlg);
32 void NewCreds_OnCancel (HWND hDlg);
36 * ROUTINES ___________________________________________________________________
40 BOOL CALLBACK Creds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
46 GetClientRect (GetParent(hDlg), &rTab);
47 TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab);
48 SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
50 SetWindowLong (hDlg, DWL_USER, lp);
51 Creds_OnUpdate (hDlg);
57 case IDC_CREDS_REMIND:
58 Creds_OnCheckRemind (hDlg);
61 case IDC_CREDS_OBTAIN:
62 Creds_OnClickObtain (hDlg);
65 case IDC_CREDS_DESTROY:
66 Creds_OnClickDestroy (hDlg);
70 Creds_DlgProc (hDlg, WM_HELP, 0, 0);
76 if (IsWindow (GetDlgItem (hDlg, IDC_CREDS_REMIND)))
77 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_TOKENS);
78 else if (IsServiceRunning())
79 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_NOTOKENS_RUNNING);
80 else // (!IsServiceRunning())
81 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_NOTOKENS_STOPPED);
89 void Creds_OnCheckRemind (HWND hDlg)
91 LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
92 lock_ObtainMutex(&g.credsLock);
94 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
96 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
100 if (iCreds != g.cCreds)
102 g.aCreds[ iCreds ].fRemind = IsDlgButtonChecked (hDlg, IDC_CREDS_REMIND);
105 lock_ReleaseMutex(&g.credsLock);
109 void Creds_OnUpdate (HWND hDlg)
111 LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
112 if (!pszCell || !*pszCell)
114 BOOL fRunning = IsServiceRunning();
115 ShowWindow (GetDlgItem (hDlg, IDC_RUNNING), fRunning);
116 ShowWindow (GetDlgItem (hDlg, IDC_STOPPED), !fRunning);
117 ShowWindow (GetDlgItem (hDlg, IDC_CREDS_OBTAIN), fRunning);
121 lock_ObtainMutex(&g.credsLock);
123 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
125 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
129 TCHAR szGateway[cchRESOURCE] = TEXT("");
131 GetGatewayName (szGateway);
135 SetDlgItemText (hDlg, IDC_CREDS_CELL, pszCell);
139 TCHAR szCell[ cchRESOURCE ];
140 TCHAR szFormat[ cchRESOURCE ];
141 GetString (szFormat, IDS_CELL_GATEWAY);
142 wsprintf (szCell, szFormat, pszCell, szGateway);
143 SetDlgItemText (hDlg, IDC_CREDS_CELL, szCell);
146 if (iCreds == g.cCreds)
148 TCHAR szText[cchRESOURCE];
149 GetString (szText, IDS_NO_CREDS);
150 SetDlgItemText (hDlg, IDC_CREDS_INFO, szText);
154 // FormatString(%t) expects a date in GMT, not the local time zone...
157 SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftLocal);
160 LocalFileTimeToFileTime (&ftLocal, &ftGMT);
163 FileTimeToSystemTime (&ftGMT, &stGMT);
165 LPTSTR pszCreds = FormatString (IDS_CREDS, TEXT("%s%t"), g.aCreds[ iCreds ].szUser, &stGMT);
166 SetDlgItemText (hDlg, IDC_CREDS_INFO, pszCreds);
167 FreeString (pszCreds);
170 lock_ReleaseMutex(&g.credsLock);
171 CheckDlgButton (hDlg, IDC_CREDS_REMIND, (iCreds == g.cCreds) ? FALSE : g.aCreds[iCreds].fRemind);
173 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_OBTAIN), IsServiceRunning());
174 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_REMIND), (iCreds != g.cCreds));
175 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_DESTROY), (iCreds != g.cCreds));
179 void Creds_OnClickObtain (HWND hDlg)
181 LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
183 InterlockedIncrement (&g.fShowingMessage);
184 ShowObtainCreds (FALSE, pszCell);
188 void Creds_OnClickDestroy (HWND hDlg)
190 LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
191 if (pszCell && *pszCell)
193 DestroyCurrentCredentials (pszCell);
194 Main_RepopulateTabs (FALSE);
195 Creds_OnUpdate (hDlg);
200 struct _obtaincreds {
206 void ObtainCredsThread(void * data)
208 struct _obtaincreds * oc = (struct _obtaincreds *)data;
210 ModalDialogParam (oc->type, oc->parent, (DLGPROC)NewCreds_DlgProc, (LPARAM)oc->cell);
215 void ShowObtainCreds (BOOL fExpiring, LPTSTR pszCell)
217 struct _obtaincreds * oc = (struct _obtaincreds *)malloc(sizeof(struct _obtaincreds));
220 oc->parent = (IsWindowVisible (g.hMain)) ? g.hMain : NULL;
221 oc->type = fExpiring ? IDD_NEWCREDS_EXPIRE : IDD_NEWCREDS;
222 oc->cell = _strdup(pszCell);
225 ULONG threadID = 123;
227 thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)ObtainCredsThread,
238 BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
243 SetWindowLong (hDlg, DWL_USER, lp);
244 NewCreds_OnInitDialog (hDlg);
248 InterlockedDecrement (&g.fShowingMessage);
255 if (NewCreds_OnOK (hDlg))
256 EndDialog (hDlg, IDOK);
260 NewCreds_OnCancel (hDlg);
261 EndDialog (hDlg, IDCANCEL);
264 case IDC_NEWCREDS_USER:
265 case IDC_NEWCREDS_PASSWORD:
266 NewCreds_OnEnable (hDlg);
270 NewCreds_DlgProc (hDlg, WM_HELP, 0, 0);
276 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_NEWTOKENS);
283 void NewCreds_OnInitDialog (HWND hDlg)
285 LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
289 if (GetDlgItem (hDlg, IDC_NEWCREDS_TITLE))
291 TCHAR szText[ cchRESOURCE ];
292 GetDlgItemText (hDlg, IDC_NEWCREDS_TITLE, szText, cchRESOURCE);
293 LPTSTR pszText = FormatString (szText, TEXT("%s"), pszCell);
294 SetDlgItemText (hDlg, IDC_NEWCREDS_TITLE, pszText);
295 FreeString (pszText);
298 if (pszCell && *pszCell)
300 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, pszCell);
304 TCHAR szCell[ cchRESOURCE ] = TEXT("");
305 (void)GetDefaultCell (szCell);
306 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
309 lock_ObtainMutex(&g.credsLock);
311 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
313 if (*pszCell && !lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
316 if ((iCreds == g.cCreds) || (!g.aCreds[ iCreds ].szUser[0]))
318 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE);
320 else // (we have a valid username already)
322 SetDlgItemText (hDlg, IDC_NEWCREDS_USER, g.aCreds[ iCreds ].szUser);
323 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE);
325 lock_ReleaseMutex(&g.credsLock);
327 NewCreds_OnEnable (hDlg);
328 SetForegroundWindow(hDlg);
329 KillTimer (g.hMain, ID_SERVICE_TIMER);
333 void NewCreds_OnEnable (HWND hDlg)
337 TCHAR szUser[ cchRESOURCE ];
338 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
342 if ( !strchr(szUser, '@') ) {
343 TCHAR szPassword[ cchRESOURCE ];
344 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
348 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
352 BOOL NewCreds_OnOK (HWND hDlg)
354 TCHAR szCell[ cchRESOURCE ];
355 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
357 TCHAR szUser[ cchRESOURCE ];
358 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
360 TCHAR szPassword[ cchRESOURCE ];
361 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
364 if ((rc = ObtainNewCredentials (szCell, szUser, szPassword, FALSE)) != 0)
366 EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
367 EnableWindow (GetDlgItem (hDlg, IDCANCEL), TRUE);
368 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), TRUE);
369 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE);
370 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE);
374 Main_RepopulateTabs (FALSE);
379 void NewCreds_OnCancel (HWND hDlg)
381 TCHAR szText[ cchRESOURCE ] = "";
382 LPTSTR pszCell = NULL;
384 if (GetDlgItem (hDlg, IDC_NEWCREDS_CELL))
386 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
392 pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
395 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
396 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
397 HWND hChildDlg = NULL;
399 lock_ObtainMutex(&g.credsLock);
400 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
402 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
404 g.aCreds[ iCreds ].fRemind = FALSE;
407 // Check the active tab, and fix its checkbox if necessary
409 if (pszTab && HIWORD(pszTab) && (!lstrcmpi (pszTab, pszCell)))
411 hChildDlg = GetTabChild (hTab);
415 lock_ReleaseMutex(&g.credsLock);
418 CheckDlgButton (hChildDlg, IDC_CREDS_REMIND, FALSE);