windows-vs2005b2-20050706
[openafs.git] / src / WINNT / client_creds / credstab.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
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
8  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include "afscreds.h"
16
17
18 /*
19  * PROTOTYPES _________________________________________________________________
20  *
21  */
22
23 void Creds_OnUpdate (HWND hDlg);
24 void Creds_OnCheckRemind (HWND hDlg);
25 void Creds_OnClickObtain (HWND hDlg);
26 void Creds_OnClickDestroy (HWND hDlg);
27
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);
33
34
35 /*
36  * ROUTINES ___________________________________________________________________
37  *
38  */
39
40 BOOL CALLBACK Creds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
41 {
42    switch (msg)
43       {
44       case WM_INITDIALOG:
45          RECT rTab;
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);
49
50          SetWindowLong (hDlg, DWL_USER, lp);
51          Creds_OnUpdate (hDlg);
52          break;
53
54       case WM_COMMAND:
55          switch (LOWORD(wp))
56             {
57             case IDC_CREDS_REMIND:
58                Creds_OnCheckRemind (hDlg);
59                break;
60
61             case IDC_CREDS_OBTAIN:
62                Creds_OnClickObtain (hDlg);
63                break;
64
65             case IDC_CREDS_DESTROY:
66                Creds_OnClickDestroy (hDlg);
67                break;
68
69             case IDHELP:
70                Creds_DlgProc (hDlg, WM_HELP, 0, 0);
71                break;
72             }
73          break;
74
75       case WM_HELP:
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);
82          break;
83       }
84
85    return FALSE;
86 }
87
88
89 void Creds_OnCheckRemind (HWND hDlg)
90 {
91    LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
92    lock_ObtainMutex(&g.credsLock);
93    size_t iCreds;
94    for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
95       {
96       if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
97          break;
98       }
99
100    if (iCreds != g.cCreds)
101       {
102       g.aCreds[ iCreds ].fRemind = IsDlgButtonChecked (hDlg, IDC_CREDS_REMIND);
103       SaveRemind (iCreds);
104       }
105    lock_ReleaseMutex(&g.credsLock);
106 }
107
108
109 void Creds_OnUpdate (HWND hDlg)
110 {
111    LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
112    if (!pszCell || !*pszCell)
113       {
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);
118       return;
119       }
120
121    lock_ObtainMutex(&g.credsLock);
122    size_t iCreds;
123    for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
124       {
125       if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
126          break;
127       }
128
129    TCHAR szGateway[cchRESOURCE] = TEXT("");
130    if (!g.fIsWinNT)
131       GetGatewayName (szGateway);
132
133    if (!szGateway[0])
134       {
135       SetDlgItemText (hDlg, IDC_CREDS_CELL, pszCell);
136       }
137    else
138       {
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);
144       }
145
146    if (iCreds == g.cCreds)
147       {
148       TCHAR szText[cchRESOURCE];
149       GetString (szText, IDS_NO_CREDS);
150       SetDlgItemText (hDlg, IDC_CREDS_INFO, szText);
151       }
152    else
153       {
154       // FormatString(%t) expects a date in GMT, not the local time zone...
155       //
156       FILETIME ftLocal;
157       SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftLocal);
158
159       FILETIME ftGMT;
160       LocalFileTimeToFileTime (&ftLocal, &ftGMT);
161
162       SYSTEMTIME stGMT;
163       FileTimeToSystemTime (&ftGMT, &stGMT);
164
165       LPTSTR pszCreds = FormatString (IDS_CREDS, TEXT("%s%t"), g.aCreds[ iCreds ].szUser, &stGMT);
166       SetDlgItemText (hDlg, IDC_CREDS_INFO, pszCreds);
167       FreeString (pszCreds);
168       }
169
170    lock_ReleaseMutex(&g.credsLock);
171    CheckDlgButton (hDlg, IDC_CREDS_REMIND, (iCreds == g.cCreds) ? FALSE : g.aCreds[iCreds].fRemind);
172
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));
176 }
177
178
179 void Creds_OnClickObtain (HWND hDlg)
180 {
181    LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
182
183    InterlockedIncrement (&g.fShowingMessage);
184    ShowObtainCreds (FALSE, pszCell);
185 }
186
187
188 void Creds_OnClickDestroy (HWND hDlg)
189 {
190    LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
191    if (pszCell && *pszCell)
192       {
193       DestroyCurrentCredentials (pszCell);
194       Main_RepopulateTabs (FALSE);
195       Creds_OnUpdate (hDlg);
196       }
197 }
198
199
200 struct _obtaincreds {
201     DWORD type;
202     HWND  parent;
203     char * cell;
204 };
205
206 void ObtainCredsThread(void * data)
207 {
208     struct _obtaincreds * oc = (struct _obtaincreds *)data;
209
210     ModalDialogParam (oc->type, oc->parent, (DLGPROC)NewCreds_DlgProc, (LPARAM)oc->cell);
211     free(oc->cell);
212     free(oc);
213 }
214
215 void ShowObtainCreds (BOOL fExpiring, LPTSTR pszCell)
216 {
217     struct _obtaincreds * oc = (struct _obtaincreds *)malloc(sizeof(struct _obtaincreds));
218     if ( !oc )
219         return;
220     oc->parent = (IsWindowVisible (g.hMain)) ? g.hMain : NULL;
221     oc->type = fExpiring ? IDD_NEWCREDS_EXPIRE : IDD_NEWCREDS;
222     oc->cell = _strdup(pszCell);
223
224     HANDLE thread = 0;
225     ULONG  threadID = 123;
226
227     thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)ObtainCredsThread,
228                                     oc, 0, &threadID);
229     if (thread != NULL)
230         CloseHandle(thread);
231         else {
232                 free(oc->cell);
233                 free(oc);
234         }
235 }
236
237
238 BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
239 {
240    switch (msg)
241       {
242       case WM_INITDIALOG:
243          SetWindowLong (hDlg, DWL_USER, lp);
244          NewCreds_OnInitDialog (hDlg);
245          break;
246
247       case WM_DESTROY:
248          InterlockedDecrement (&g.fShowingMessage);
249          break;
250
251       case WM_COMMAND:
252          switch (LOWORD(wp))
253             {
254             case IDOK:
255                if (NewCreds_OnOK (hDlg))
256                   EndDialog (hDlg, IDOK);
257                break;
258
259             case IDCANCEL:
260                NewCreds_OnCancel (hDlg);
261                EndDialog (hDlg, IDCANCEL);
262                break;
263
264             case IDC_NEWCREDS_USER:
265             case IDC_NEWCREDS_PASSWORD:
266                NewCreds_OnEnable (hDlg);
267                break;
268
269             case IDHELP:
270                NewCreds_DlgProc (hDlg, WM_HELP, 0, 0);
271                break;
272             }
273          break;
274
275       case WM_HELP:
276          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_NEWTOKENS);
277          break;
278       }
279    return FALSE;
280 }
281
282
283 void NewCreds_OnInitDialog (HWND hDlg)
284 {
285    LPTSTR pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
286    if (!pszCell)
287       pszCell = TEXT("");
288
289    if (GetDlgItem (hDlg, IDC_NEWCREDS_TITLE))
290       {
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);
296       }
297
298    if (pszCell && *pszCell)
299       {
300       SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, pszCell);
301       }
302    else
303       {
304       TCHAR szCell[ cchRESOURCE ] = TEXT("");
305       (void)GetDefaultCell (szCell);
306       SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
307       }
308
309    lock_ObtainMutex(&g.credsLock);
310    size_t iCreds;
311    for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
312       {
313       if (*pszCell && !lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
314          break;
315       }
316    if ((iCreds == g.cCreds) || (!g.aCreds[ iCreds ].szUser[0]))
317       {
318       PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE);
319       }
320    else // (we have a valid username already)
321       {
322       SetDlgItemText (hDlg, IDC_NEWCREDS_USER, g.aCreds[ iCreds ].szUser);
323       PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE);
324       }
325    lock_ReleaseMutex(&g.credsLock);
326
327    NewCreds_OnEnable (hDlg);
328    SetForegroundWindow(hDlg);
329    KillTimer (g.hMain, ID_SERVICE_TIMER);
330 }
331
332
333 void NewCreds_OnEnable (HWND hDlg)
334 {
335     BOOL fEnable = TRUE;
336
337     TCHAR szUser[ cchRESOURCE ];
338     GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
339     if (!szUser[0])
340         fEnable = FALSE;
341
342     if ( !strchr(szUser, '@') ) {
343         TCHAR szPassword[ cchRESOURCE ];
344         GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
345         if (!szPassword[0])
346             fEnable = FALSE;
347     }
348     EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
349 }
350
351
352 BOOL NewCreds_OnOK (HWND hDlg)
353 {
354    TCHAR szCell[ cchRESOURCE ];
355    GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
356
357    TCHAR szUser[ cchRESOURCE ];
358    GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
359
360    TCHAR szPassword[ cchRESOURCE ];
361    GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
362
363    int rc;
364    if ((rc = ObtainNewCredentials (szCell, szUser, szPassword, FALSE)) != 0)
365       {
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);
371       return FALSE;
372       }
373
374    Main_RepopulateTabs (FALSE);
375    return TRUE;
376 }
377
378
379 void NewCreds_OnCancel (HWND hDlg)
380 {
381    TCHAR szText[ cchRESOURCE ] = "";
382    LPTSTR pszCell = NULL;
383
384    if (GetDlgItem (hDlg, IDC_NEWCREDS_CELL))
385    {
386        GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
387        if ( szText[0] )
388            pszCell = szText;
389    }
390
391    if ( !pszCell )
392        pszCell = (LPTSTR)GetWindowLong (hDlg, DWL_USER);
393    if (pszCell)
394       {
395       HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
396       LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
397       HWND hChildDlg = NULL;
398
399       lock_ObtainMutex(&g.credsLock);
400       for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
401          {
402          if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
403             {
404             g.aCreds[ iCreds ].fRemind = FALSE;
405             SaveRemind (iCreds);
406
407             // Check the active tab, and fix its checkbox if necessary
408             //
409             if (pszTab && HIWORD(pszTab) && (!lstrcmpi (pszTab, pszCell)))
410                {
411                hChildDlg = GetTabChild (hTab);
412                }
413             }
414          }
415       lock_ReleaseMutex(&g.credsLock);
416
417       if (hChildDlg)
418          CheckDlgButton (hChildDlg, IDC_CREDS_REMIND, FALSE);
419       }
420 }
421