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);
93 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
95 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
99 if (iCreds != g.cCreds)
101 g.aCreds[ iCreds ].fRemind = IsDlgButtonChecked (hDlg, IDC_CREDS_REMIND);
104 lock_ReleaseMutex(&g.credsLock);
108 void Creds_OnUpdate (HWND hDlg)
110 LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
111 if (!pszCell || !*pszCell)
113 BOOL fRunning = IsServiceRunning();
114 ShowWindow (GetDlgItem (hDlg, IDC_RUNNING), fRunning);
115 ShowWindow (GetDlgItem (hDlg, IDC_STOPPED), !fRunning);
116 ShowWindow (GetDlgItem (hDlg, IDC_CREDS_OBTAIN), fRunning);
120 lock_ObtainMutex(&g.credsLock);
121 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
123 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
127 TCHAR szGateway[cchRESOURCE] = TEXT("");
129 GetGatewayName (szGateway);
133 SetDlgItemText (hDlg, IDC_CREDS_CELL, pszCell);
137 TCHAR szCell[ cchRESOURCE ];
138 TCHAR szFormat[ cchRESOURCE ];
139 GetString (szFormat, IDS_CELL_GATEWAY);
140 wsprintf (szCell, szFormat, pszCell, szGateway);
141 SetDlgItemText (hDlg, IDC_CREDS_CELL, szCell);
144 if (iCreds == g.cCreds)
146 TCHAR szText[cchRESOURCE];
147 GetString (szText, IDS_NO_CREDS);
148 SetDlgItemText (hDlg, IDC_CREDS_INFO, szText);
152 // FormatString(%t) expects a date in GMT, not the local time zone...
155 SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftLocal);
158 LocalFileTimeToFileTime (&ftLocal, &ftGMT);
161 FileTimeToSystemTime (&ftGMT, &stGMT);
163 LPTSTR pszCreds = FormatString (IDS_CREDS, TEXT("%s%t"), g.aCreds[ iCreds ].szUser, &stGMT);
164 SetDlgItemText (hDlg, IDC_CREDS_INFO, pszCreds);
165 FreeString (pszCreds);
168 lock_ReleaseMutex(&g.credsLock);
169 CheckDlgButton (hDlg, IDC_CREDS_REMIND, (iCreds == g.cCreds) ? FALSE : g.aCreds[iCreds].fRemind);
171 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_OBTAIN), IsServiceRunning());
172 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_REMIND), (iCreds != g.cCreds));
173 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_DESTROY), (iCreds != g.cCreds));
177 void Creds_OnClickObtain (HWND hDlg)
179 LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
181 InterlockedIncrement (&g.fShowingMessage);
182 ShowObtainCreds (FALSE, pszCell);
186 void Creds_OnClickDestroy (HWND hDlg)
188 LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
189 if (pszCell && *pszCell)
191 DestroyCurrentCredentials (pszCell);
192 Main_RepopulateTabs (FALSE);
193 Creds_OnUpdate (hDlg);
198 struct _obtaincreds {
204 void ObtainCredsThread(void * data)
206 struct _obtaincreds * oc = (struct _obtaincreds *)data;
208 ModalDialogParam (oc->type, oc->parent, (DLGPROC)NewCreds_DlgProc, (LPARAM)oc->cell);
213 void ShowObtainCreds (BOOL fExpiring, LPTSTR pszCell)
215 struct _obtaincreds * oc = (struct _obtaincreds *)malloc(sizeof(struct _obtaincreds));
218 oc->parent = (IsWindowVisible (g.hMain)) ? g.hMain : NULL;
219 oc->type = fExpiring ? IDD_NEWCREDS_EXPIRE : IDD_NEWCREDS;
220 oc->cell = _strdup(pszCell);
223 ULONG threadID = 123;
225 thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)ObtainCredsThread,
236 BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
241 SetWindowLong (hDlg, DWL_USER, lp);
242 NewCreds_OnInitDialog (hDlg);
246 InterlockedDecrement (&g.fShowingMessage);
253 if (NewCreds_OnOK (hDlg))
254 EndDialog (hDlg, IDOK);
258 NewCreds_OnCancel (hDlg);
259 EndDialog (hDlg, IDCANCEL);
262 case IDC_NEWCREDS_USER:
263 case IDC_NEWCREDS_PASSWORD:
264 NewCreds_OnEnable (hDlg);
268 NewCreds_DlgProc (hDlg, WM_HELP, 0, 0);
274 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_NEWTOKENS);
281 void NewCreds_OnInitDialog (HWND hDlg)
283 LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
287 if (GetDlgItem (hDlg, IDC_NEWCREDS_TITLE))
289 TCHAR szText[ cchRESOURCE ];
290 GetDlgItemText (hDlg, IDC_NEWCREDS_TITLE, szText, cchRESOURCE);
291 LPTSTR pszText = FormatString (szText, TEXT("%s"), pszCell);
292 SetDlgItemText (hDlg, IDC_NEWCREDS_TITLE, pszText);
293 FreeString (pszText);
296 if (pszCell && *pszCell)
298 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, pszCell);
302 TCHAR szCell[ cchRESOURCE ] = TEXT("");
303 (void)GetDefaultCell (szCell);
304 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
307 lock_ObtainMutex(&g.credsLock);
308 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
310 if (*pszCell && !lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
313 if ((iCreds == g.cCreds) || (!g.aCreds[ iCreds ].szUser[0]))
315 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE);
317 else // (we have a valid username already)
319 SetDlgItemText (hDlg, IDC_NEWCREDS_USER, g.aCreds[ iCreds ].szUser);
320 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE);
322 lock_ReleaseMutex(&g.credsLock);
324 NewCreds_OnEnable (hDlg);
325 SetForegroundWindow(hDlg);
326 KillTimer (g.hMain, ID_SERVICE_TIMER);
330 void NewCreds_OnEnable (HWND hDlg)
334 TCHAR szUser[ cchRESOURCE ];
335 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
339 if ( !strchr(szUser, '@') ) {
340 TCHAR szPassword[ cchRESOURCE ];
341 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
345 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
349 BOOL NewCreds_OnOK (HWND hDlg)
351 TCHAR szCell[ cchRESOURCE ];
352 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
354 TCHAR szUser[ cchRESOURCE ];
355 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
357 TCHAR szPassword[ cchRESOURCE ];
358 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
361 if ((rc = ObtainNewCredentials (szCell, szUser, szPassword, FALSE)) != 0)
363 EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
364 EnableWindow (GetDlgItem (hDlg, IDCANCEL), TRUE);
365 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), TRUE);
366 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE);
367 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE);
371 Main_RepopulateTabs (FALSE);
376 void NewCreds_OnCancel (HWND hDlg)
378 TCHAR szText[ cchRESOURCE ] = "";
379 LPTSTR pszCell = NULL;
381 if (GetDlgItem (hDlg, IDC_NEWCREDS_CELL))
383 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
389 pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
392 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
393 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
394 HWND hChildDlg = NULL;
396 lock_ObtainMutex(&g.credsLock);
397 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
399 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
401 g.aCreds[ iCreds ].fRemind = FALSE;
404 // Check the active tab, and fix its checkbox if necessary
406 if (pszTab && HIWORD(pszTab) && (!lstrcmpi (pszTab, pszCell)))
408 hChildDlg = GetTabChild (hTab);
412 lock_ReleaseMutex(&g.credsLock);
415 CheckDlgButton (hChildDlg, IDC_CREDS_REMIND, FALSE);