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>
24 * PROTOTYPES _________________________________________________________________
28 void Creds_OnUpdate (HWND hDlg);
29 void Creds_OnCheckRemind (HWND hDlg);
30 void Creds_OnClickObtain (HWND hDlg);
31 void Creds_OnClickDestroy (HWND hDlg);
33 BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
34 void NewCreds_OnInitDialog (HWND hDlg);
35 void NewCreds_OnEnable (HWND hDlg);
36 BOOL NewCreds_OnOK (HWND hDlg);
37 void NewCreds_OnCancel (HWND hDlg);
41 * ROUTINES ___________________________________________________________________
45 BOOL CALLBACK Creds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
51 GetClientRect (GetParent(hDlg), &rTab);
52 TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab);
53 SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
55 SetWindowLongPtr (hDlg, DWLP_USER, lp);
56 Creds_OnUpdate (hDlg);
62 case IDC_CREDS_REMIND:
63 Creds_OnCheckRemind (hDlg);
66 case IDC_CREDS_OBTAIN:
67 Creds_OnClickObtain (hDlg);
70 case IDC_CREDS_DESTROY:
71 Creds_OnClickDestroy (hDlg);
75 Creds_DlgProc (hDlg, WM_HELP, 0, 0);
81 if (IsWindow (GetDlgItem (hDlg, IDC_CREDS_REMIND)))
82 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_TOKENS);
83 else if (IsServiceRunning())
84 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_NOTOKENS_RUNNING);
85 else // (!IsServiceRunning())
86 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_NOTOKENS_STOPPED);
94 void Creds_OnCheckRemind (HWND hDlg)
96 LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
97 lock_ObtainMutex(&g.credsLock);
99 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
101 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
105 if (iCreds != g.cCreds)
107 g.aCreds[ iCreds ].fRemind = IsDlgButtonChecked (hDlg, IDC_CREDS_REMIND);
110 lock_ReleaseMutex(&g.credsLock);
114 void Creds_OnUpdate (HWND hDlg)
116 LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
117 if (!pszCell || !*pszCell)
119 BOOL fRunning = IsServiceRunning();
120 ShowWindow (GetDlgItem (hDlg, IDC_RUNNING), fRunning);
121 ShowWindow (GetDlgItem (hDlg, IDC_STOPPED), !fRunning);
122 ShowWindow (GetDlgItem (hDlg, IDC_CREDS_OBTAIN), fRunning);
126 lock_ObtainMutex(&g.credsLock);
128 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
130 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
134 TCHAR szGateway[cchRESOURCE] = TEXT("");
136 GetGatewayName (szGateway);
140 SetDlgItemText (hDlg, IDC_CREDS_CELL, pszCell);
144 TCHAR szCell[ cchRESOURCE ];
145 TCHAR szFormat[ cchRESOURCE ];
146 GetString (szFormat, IDS_CELL_GATEWAY);
147 wsprintf (szCell, szFormat, pszCell, szGateway);
148 SetDlgItemText (hDlg, IDC_CREDS_CELL, szCell);
151 if (iCreds == g.cCreds)
153 TCHAR szText[cchRESOURCE];
154 GetString (szText, IDS_NO_CREDS);
155 SetDlgItemText (hDlg, IDC_CREDS_INFO, szText);
159 // FormatString(%t) expects a date in GMT, not the local time zone...
162 SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftLocal);
165 LocalFileTimeToFileTime (&ftLocal, &ftGMT);
168 FileTimeToSystemTime (&ftGMT, &stGMT);
171 GetLocalTime (&stNow);
174 SystemTimeToFileTime (&stNow, &ftNow);
176 LONGLONG llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime);
177 LONGLONG llExpires = (((LONGLONG)ftLocal.dwHighDateTime) << 32) + (LONGLONG)(ftLocal.dwLowDateTime);
179 llNow /= c100ns1SECOND;
180 llExpires /= c100ns1SECOND;
182 LPTSTR pszCreds = NULL;
183 if (llExpires <= (llNow + (LONGLONG)cminREMIND_WARN * csec1MINUTE))
184 pszCreds = FormatString (IDS_CREDS_EXPIRED, TEXT("%s"), g.aCreds[ iCreds ].szUser);
186 if (!pszCreds || !pszCreds[0])
187 pszCreds = FormatString (IDS_CREDS, TEXT("%s%t"), g.aCreds[ iCreds ].szUser, &stGMT);
188 SetDlgItemText (hDlg, IDC_CREDS_INFO, pszCreds);
189 FreeString (pszCreds);
192 lock_ReleaseMutex(&g.credsLock);
193 CheckDlgButton (hDlg, IDC_CREDS_REMIND, (iCreds == g.cCreds) ? FALSE : g.aCreds[iCreds].fRemind);
195 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_OBTAIN), IsServiceRunning());
196 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_REMIND), (iCreds != g.cCreds));
197 EnableWindow (GetDlgItem (hDlg, IDC_CREDS_DESTROY), (iCreds != g.cCreds));
201 void Creds_OnClickObtain (HWND hDlg)
203 LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
205 InterlockedIncrement (&g.fShowingMessage);
206 ShowObtainCreds (FALSE, pszCell);
210 void Creds_OnClickDestroy (HWND hDlg)
212 LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
213 if (pszCell && *pszCell)
215 DestroyCurrentCredentials (pszCell);
216 Main_RepopulateTabs (FALSE);
217 Creds_OnUpdate (hDlg);
222 struct _obtaincreds {
228 void ObtainCredsThread(void * data)
230 struct _obtaincreds * oc = (struct _obtaincreds *)data;
232 ModalDialogParam (oc->type, oc->parent, (DLGPROC)NewCreds_DlgProc, (LPARAM)oc->cell);
237 void ShowObtainCreds (BOOL fExpiring, LPTSTR pszCell)
239 struct _obtaincreds * oc = (struct _obtaincreds *)malloc(sizeof(struct _obtaincreds));
242 oc->parent = (IsWindowVisible (g.hMain)) ? g.hMain : NULL;
243 oc->type = fExpiring ? IDD_NEWCREDS_EXPIRE : IDD_NEWCREDS;
244 oc->cell = _strdup(pszCell);
247 ULONG threadID = 123;
249 thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)ObtainCredsThread,
260 BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
265 SetWindowLongPtr (hDlg, DWLP_USER, lp);
266 NewCreds_OnInitDialog (hDlg);
270 InterlockedDecrement (&g.fShowingMessage);
277 if (NewCreds_OnOK (hDlg))
278 EndDialog (hDlg, IDOK);
282 NewCreds_OnCancel (hDlg);
283 EndDialog (hDlg, IDCANCEL);
286 case IDC_NEWCREDS_USER:
287 case IDC_NEWCREDS_PASSWORD:
288 NewCreds_OnEnable (hDlg);
292 NewCreds_DlgProc (hDlg, WM_HELP, 0, 0);
298 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_NEWTOKENS);
305 void NewCreds_OnInitDialog (HWND hDlg)
307 LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
311 if (GetDlgItem (hDlg, IDC_NEWCREDS_TITLE))
313 TCHAR szText[ cchRESOURCE ];
314 GetDlgItemText (hDlg, IDC_NEWCREDS_TITLE, szText, cchRESOURCE);
315 LPTSTR pszText = FormatString (szText, TEXT("%s"), pszCell);
316 SetDlgItemText (hDlg, IDC_NEWCREDS_TITLE, pszText);
317 FreeString (pszText);
320 if (pszCell && *pszCell)
322 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, pszCell);
326 TCHAR szCell[ cchRESOURCE ] = TEXT("");
327 (void)GetDefaultCell (szCell);
328 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
331 lock_ObtainMutex(&g.credsLock);
333 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
335 if (*pszCell && !lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
338 if ((iCreds == g.cCreds) || (!g.aCreds[ iCreds ].szUser[0]))
340 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE);
342 else // (we have a valid username already)
344 SetDlgItemText (hDlg, IDC_NEWCREDS_USER, g.aCreds[ iCreds ].szUser);
345 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE);
347 lock_ReleaseMutex(&g.credsLock);
349 NewCreds_OnEnable (hDlg);
350 SetForegroundWindow(hDlg);
351 KillTimer (g.hMain, ID_SERVICE_TIMER);
355 void NewCreds_OnEnable (HWND hDlg)
359 TCHAR szUser[ cchRESOURCE ];
360 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
364 if ( !strchr(szUser, '@') ) {
365 TCHAR szPassword[ cchRESOURCE ];
366 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
370 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
374 BOOL NewCreds_OnOK (HWND hDlg)
376 TCHAR szCell[ cchRESOURCE ];
377 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
379 TCHAR szUser[ cchRESOURCE ];
380 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
382 TCHAR szPassword[ cchRESOURCE ];
383 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
386 if ((rc = ObtainNewCredentials (szCell, szUser, szPassword, FALSE)) != 0)
388 EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
389 EnableWindow (GetDlgItem (hDlg, IDCANCEL), TRUE);
390 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), TRUE);
391 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE);
392 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE);
396 Main_RepopulateTabs (FALSE);
401 void NewCreds_OnCancel (HWND hDlg)
403 TCHAR szText[ cchRESOURCE ] = "";
404 LPTSTR pszCell = NULL;
406 if (GetDlgItem (hDlg, IDC_NEWCREDS_CELL))
408 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
414 pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
417 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
418 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
419 HWND hChildDlg = NULL;
421 lock_ObtainMutex(&g.credsLock);
422 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
424 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
426 g.aCreds[ iCreds ].fRemind = FALSE;
429 // Check the active tab, and fix its checkbox if necessary
431 if (pszTab && HIWORD(pszTab) && (!lstrcmpi (pszTab, pszCell)))
433 hChildDlg = GetTabChild (hTab);
437 lock_ReleaseMutex(&g.credsLock);
440 CheckDlgButton (hChildDlg, IDC_CREDS_REMIND, FALSE);