119407837d2dc76dbcbc0989f772aa69438304c0
[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 #include <winsock2.h>
11 #include <ws2tcpip.h>
12
13 extern "C" {
14 #include <afsconfig.h>
15 #include <afs/param.h>
16 #include <afs/stds.h>
17 #include <roken.h>
18 }
19
20 #include "afscreds.h"
21
22
23 /*
24  * PROTOTYPES _________________________________________________________________
25  *
26  */
27
28 void Creds_OnUpdate (HWND hDlg);
29 void Creds_OnCheckRemind (HWND hDlg);
30 void Creds_OnClickObtain (HWND hDlg);
31 void Creds_OnClickDestroy (HWND hDlg);
32
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);
38
39
40 /*
41  * ROUTINES ___________________________________________________________________
42  *
43  */
44
45 BOOL CALLBACK Creds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
46 {
47    switch (msg)
48       {
49       case WM_INITDIALOG:
50          RECT rTab;
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);
54
55          SetWindowLongPtr (hDlg, DWLP_USER, lp);
56          Creds_OnUpdate (hDlg);
57          break;
58
59       case WM_COMMAND:
60          switch (LOWORD(wp))
61             {
62             case IDC_CREDS_REMIND:
63                Creds_OnCheckRemind (hDlg);
64                break;
65
66             case IDC_CREDS_OBTAIN:
67                Creds_OnClickObtain (hDlg);
68                break;
69
70             case IDC_CREDS_DESTROY:
71                Creds_OnClickDestroy (hDlg);
72                break;
73
74             case IDHELP:
75                Creds_DlgProc (hDlg, WM_HELP, 0, 0);
76                break;
77             }
78          break;
79
80       case WM_HELP:
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);
87          break;
88       }
89
90    return FALSE;
91 }
92
93
94 void Creds_OnCheckRemind (HWND hDlg)
95 {
96    LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
97    lock_ObtainMutex(&g.credsLock);
98    size_t iCreds;
99    for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
100       {
101       if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
102          break;
103       }
104
105    if (iCreds != g.cCreds)
106       {
107       g.aCreds[ iCreds ].fRemind = IsDlgButtonChecked (hDlg, IDC_CREDS_REMIND);
108       SaveRemind (iCreds);
109       }
110    lock_ReleaseMutex(&g.credsLock);
111 }
112
113
114 void Creds_OnUpdate (HWND hDlg)
115 {
116    LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
117    if (!pszCell || !*pszCell)
118       {
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);
123       return;
124       }
125
126    lock_ObtainMutex(&g.credsLock);
127    size_t iCreds;
128    for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
129       {
130       if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
131          break;
132       }
133
134    TCHAR szGateway[cchRESOURCE] = TEXT("");
135    if (!g.fIsWinNT)
136       GetGatewayName (szGateway);
137
138    if (!szGateway[0])
139       {
140       SetDlgItemText (hDlg, IDC_CREDS_CELL, pszCell);
141       }
142    else
143       {
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);
149       }
150
151    if (iCreds == g.cCreds)
152       {
153       TCHAR szText[cchRESOURCE];
154       GetString (szText, IDS_NO_CREDS);
155       SetDlgItemText (hDlg, IDC_CREDS_INFO, szText);
156       }
157    else
158       {
159       // FormatString(%t) expects a date in GMT, not the local time zone...
160       //
161       FILETIME ftLocal;
162       SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftLocal);
163
164       FILETIME ftGMT;
165       LocalFileTimeToFileTime (&ftLocal, &ftGMT);
166
167       SYSTEMTIME stGMT;
168       FileTimeToSystemTime (&ftGMT, &stGMT);
169
170       SYSTEMTIME stNow;
171       GetLocalTime (&stNow);
172
173       FILETIME ftNow;
174       SystemTimeToFileTime (&stNow, &ftNow);
175
176       LONGLONG llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime);
177       LONGLONG llExpires = (((LONGLONG)ftLocal.dwHighDateTime) << 32) + (LONGLONG)(ftLocal.dwLowDateTime);
178
179       llNow /= c100ns1SECOND;
180       llExpires /= c100ns1SECOND;
181
182       LPTSTR pszCreds = NULL;
183       if (llExpires <= (llNow + (LONGLONG)cminREMIND_WARN * csec1MINUTE))
184           pszCreds = FormatString (IDS_CREDS_EXPIRED, TEXT("%s"), g.aCreds[ iCreds ].szUser);
185
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);
190       }
191
192    lock_ReleaseMutex(&g.credsLock);
193    CheckDlgButton (hDlg, IDC_CREDS_REMIND, (iCreds == g.cCreds) ? FALSE : g.aCreds[iCreds].fRemind);
194
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));
198 }
199
200
201 void Creds_OnClickObtain (HWND hDlg)
202 {
203    LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
204
205    InterlockedIncrement (&g.fShowingMessage);
206    ShowObtainCreds (FALSE, pszCell);
207 }
208
209
210 void Creds_OnClickDestroy (HWND hDlg)
211 {
212    LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
213    if (pszCell && *pszCell)
214       {
215       DestroyCurrentCredentials (pszCell);
216       Main_RepopulateTabs (FALSE);
217       Creds_OnUpdate (hDlg);
218       }
219 }
220
221
222 struct _obtaincreds {
223     DWORD type;
224     HWND  parent;
225     char * cell;
226 };
227
228 void ObtainCredsThread(void * data)
229 {
230     struct _obtaincreds * oc = (struct _obtaincreds *)data;
231
232     ModalDialogParam (oc->type, oc->parent, (DLGPROC)NewCreds_DlgProc, (LPARAM)oc->cell);
233     free(oc->cell);
234     free(oc);
235 }
236
237 void ShowObtainCreds (BOOL fExpiring, LPTSTR pszCell)
238 {
239     struct _obtaincreds * oc = (struct _obtaincreds *)malloc(sizeof(struct _obtaincreds));
240     if ( !oc )
241         return;
242     oc->parent = (IsWindowVisible (g.hMain)) ? g.hMain : NULL;
243     oc->type = fExpiring ? IDD_NEWCREDS_EXPIRE : IDD_NEWCREDS;
244     oc->cell = _strdup(pszCell);
245
246     HANDLE thread = 0;
247     ULONG  threadID = 123;
248
249     thread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)ObtainCredsThread,
250                                     oc, 0, &threadID);
251     if (thread != NULL)
252         CloseHandle(thread);
253     else {
254         free(oc->cell);
255         free(oc);
256     }
257 }
258
259
260 BOOL CALLBACK NewCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
261 {
262    switch (msg)
263       {
264       case WM_INITDIALOG:
265          SetWindowLongPtr (hDlg, DWLP_USER, lp);
266          NewCreds_OnInitDialog (hDlg);
267          break;
268
269       case WM_DESTROY:
270          InterlockedDecrement (&g.fShowingMessage);
271          break;
272
273       case WM_COMMAND:
274          switch (LOWORD(wp))
275             {
276             case IDOK:
277                if (NewCreds_OnOK (hDlg))
278                   EndDialog (hDlg, IDOK);
279                break;
280
281             case IDCANCEL:
282                NewCreds_OnCancel (hDlg);
283                EndDialog (hDlg, IDCANCEL);
284                break;
285
286             case IDC_NEWCREDS_USER:
287             case IDC_NEWCREDS_PASSWORD:
288                NewCreds_OnEnable (hDlg);
289                break;
290
291             case IDHELP:
292                NewCreds_DlgProc (hDlg, WM_HELP, 0, 0);
293                break;
294             }
295          break;
296
297       case WM_HELP:
298          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_NEWTOKENS);
299          break;
300       }
301    return FALSE;
302 }
303
304
305 void NewCreds_OnInitDialog (HWND hDlg)
306 {
307    LPTSTR pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
308    if (!pszCell)
309       pszCell = TEXT("");
310
311    if (GetDlgItem (hDlg, IDC_NEWCREDS_TITLE))
312       {
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);
318       }
319
320    if (pszCell && *pszCell)
321       {
322       SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, pszCell);
323       }
324    else
325       {
326       TCHAR szCell[ cchRESOURCE ] = TEXT("");
327       (void)GetDefaultCell (szCell);
328       SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
329       }
330
331    lock_ObtainMutex(&g.credsLock);
332    size_t iCreds;
333    for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
334       {
335       if (*pszCell && !lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
336          break;
337       }
338    if ((iCreds == g.cCreds) || (!g.aCreds[ iCreds ].szUser[0]))
339       {
340       PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_USER), TRUE);
341       }
342    else // (we have a valid username already)
343       {
344       SetDlgItemText (hDlg, IDC_NEWCREDS_USER, g.aCreds[ iCreds ].szUser);
345       PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), TRUE);
346       }
347    lock_ReleaseMutex(&g.credsLock);
348
349    NewCreds_OnEnable (hDlg);
350    SetForegroundWindow(hDlg);
351    KillTimer (g.hMain, ID_SERVICE_TIMER);
352 }
353
354
355 void NewCreds_OnEnable (HWND hDlg)
356 {
357     BOOL fEnable = TRUE;
358
359     TCHAR szUser[ cchRESOURCE ];
360     GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
361     if (!szUser[0])
362         fEnable = FALSE;
363
364     if ( !strchr(szUser, '@') ) {
365         TCHAR szPassword[ cchRESOURCE ];
366         GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
367         if (!szPassword[0])
368             fEnable = FALSE;
369     }
370     EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
371 }
372
373
374 BOOL NewCreds_OnOK (HWND hDlg)
375 {
376    TCHAR szCell[ cchRESOURCE ];
377    GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
378
379    TCHAR szUser[ cchRESOURCE ];
380    GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
381
382    TCHAR szPassword[ cchRESOURCE ];
383    GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
384
385    int rc;
386    if ((rc = ObtainNewCredentials (szCell, szUser, szPassword, FALSE)) != 0)
387       {
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);
393       return FALSE;
394       }
395
396    Main_RepopulateTabs (FALSE);
397    return TRUE;
398 }
399
400
401 void NewCreds_OnCancel (HWND hDlg)
402 {
403    TCHAR szText[ cchRESOURCE ] = "";
404    LPTSTR pszCell = NULL;
405
406    if (GetDlgItem (hDlg, IDC_NEWCREDS_CELL))
407    {
408        GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
409        if ( szText[0] )
410            pszCell = szText;
411    }
412
413    if ( !pszCell )
414        pszCell = (LPTSTR)GetWindowLongPtr (hDlg, DWLP_USER);
415    if (pszCell)
416       {
417       HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
418       LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
419       HWND hChildDlg = NULL;
420
421       lock_ObtainMutex(&g.credsLock);
422       for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
423          {
424          if (!lstrcmpi (g.aCreds[ iCreds ].szCell, pszCell))
425             {
426             g.aCreds[ iCreds ].fRemind = FALSE;
427             SaveRemind (iCreds);
428
429             // Check the active tab, and fix its checkbox if necessary
430             //
431             if (pszTab && HIWORD(pszTab) && (!lstrcmpi (pszTab, pszCell)))
432                {
433                hChildDlg = GetTabChild (hTab);
434                }
435             }
436          }
437       lock_ReleaseMutex(&g.credsLock);
438
439       if (hChildDlg)
440          CheckDlgButton (hChildDlg, IDC_CREDS_REMIND, FALSE);
441       }
442 }
443