Initial IBM OpenAFS 1.0 tree
[openafs.git] / src / WINNT / afsusrmgr / helpfunc.cpp
1 extern "C" {
2 #include <afs/param.h>
3 #include <afs/stds.h>
4 }
5
6 #include "TaAfsUsrMgr.h"
7 #include "helpfunc.h"
8
9 #ifndef iswhite
10 #define iswhite(_ch) ( ((_ch) == TEXT(' ')) || ((_ch) == TEXT('\t')) )
11 #endif
12
13
14 /*
15  * VARIABLES ________________________________________________________________
16  *
17  */
18
19 typedef enum {
20    uuUNSPECIFIED,
21    uuPTS,       // PTS commands
22    uuKAS        // KAS commands
23 } UNIXUTIL;
24
25 // One entry per help context
26 static struct {
27    UNIXUTIL uu;
28    int ids;
29    int hid;
30 } aCOMMANDS[] = {
31    { uuPTS,  IDS_COMMAND_PTS_ADDUSER,            IDH_USRMGR_COMMAND_PTS_ADDUSER              },
32    { uuPTS,  IDS_COMMAND_PTS_CHOWN,              IDH_USRMGR_COMMAND_PTS_CHOWN                },
33    { uuPTS,  IDS_COMMAND_PTS_CREATEGROUP,        IDH_USRMGR_COMMAND_PTS_CREATEGROUP          },
34    { uuPTS,  IDS_COMMAND_PTS_CREATEUSER,         IDH_USRMGR_COMMAND_PTS_CREATEUSER           },
35    { uuPTS,  IDS_COMMAND_PTS_DELETE,             IDH_USRMGR_COMMAND_PTS_DELETE               },
36    { uuPTS,  IDS_COMMAND_PTS_EXAMINE,            IDH_USRMGR_COMMAND_PTS_EXAMINE              },
37    { uuPTS,  IDS_COMMAND_PTS_LISTMAX,            IDH_USRMGR_COMMAND_PTS_LISTMAX              },
38    { uuPTS,  IDS_COMMAND_PTS_LISTOWNED,          IDH_USRMGR_COMMAND_PTS_LISTOWNED            },
39    { uuPTS,  IDS_COMMAND_PTS_MEMBERSHIP,         IDH_USRMGR_COMMAND_PTS_MEMBERSHIP           },
40    { uuPTS,  IDS_COMMAND_PTS_REMOVEUSER,         IDH_USRMGR_COMMAND_PTS_REMOVEUSER           },
41    { uuPTS,  IDS_COMMAND_PTS_RENAME,             IDH_USRMGR_COMMAND_PTS_RENAME               },
42    { uuPTS,  IDS_COMMAND_PTS_SETFIELDS,          IDH_USRMGR_COMMAND_PTS_SETFIELDS            },
43    { uuPTS,  IDS_COMMAND_PTS_SETMAX,             IDH_USRMGR_COMMAND_PTS_SETMAX               },
44    { uuKAS,  IDS_COMMAND_KAS_CREATE,             IDH_USRMGR_COMMAND_KAS_CREATE               },
45    { uuKAS,  IDS_COMMAND_KAS_DELETE,             IDH_USRMGR_COMMAND_KAS_DELETE               },
46    { uuKAS,  IDS_COMMAND_KAS_EXAMINE,            IDH_USRMGR_COMMAND_KAS_EXAMINE              },
47    { uuKAS,  IDS_COMMAND_KAS_GETRANDOMKEY,       IDH_USRMGR_COMMAND_KAS_GETRANDOMKEY         },
48    { uuKAS,  IDS_COMMAND_KAS_LIST,               IDH_USRMGR_COMMAND_KAS_LIST                 },
49    { uuKAS,  IDS_COMMAND_KAS_SETFIELDS,          IDH_USRMGR_COMMAND_KAS_SETFIELDS            },
50    { uuKAS,  IDS_COMMAND_KAS_SETKEY,             IDH_USRMGR_COMMAND_KAS_SETKEY               },
51    { uuKAS,  IDS_COMMAND_KAS_SETPASSWORD,        IDH_USRMGR_COMMAND_KAS_SETPASSWORD          },
52    { uuKAS,  IDS_COMMAND_KAS_STRINGTOKEY,        IDH_USRMGR_COMMAND_KAS_STRINGTOKEY          },
53    { uuKAS,  IDS_COMMAND_KAS_UNLOCK,             IDH_USRMGR_COMMAND_KAS_UNLOCK               },
54 };
55
56 // Precalculated hashing values for faster searching through help topics
57 static DWORD aSEARCHVALUES[] = {
58    0x16765627, 0x02D416E6, 0xF657E647, 0x02143636,
59    0x02146435, 0x37162736, 0x452716E6, 0x45865602,
60    0xE6B30000, 0xE6967616, 0x02A45627, 0x86162746,
61    0x02259636, 0xE6022697, 0x96474756, 0xE2007527,
62    0xF6772797, 0xF62602D4, 0x26970224, 0x96563702,
63    0x26271627, 0x5602C696, 0x16479667, 0x96374727,
64    0x46D696E6, 0x00000014, 0xE64796C6, 0x96470257,
65    0x02027516, 0x561647F3, 0x723702E6, 0x02F6E656,
66    0x47869637, 0x96E6B602, 0x12004586, 0x56163756,
67    0x022756C6, 0xE6568747, 0x47865602, 0x56E60000,
68    0x22027786, 0xE616D656, 0x8696E656, 0xA3D61636,
69    0xD6F64756, 0x22F22756, 0x45279702, 0xE647A302,
70    0x12008496, 0x762716D6, 0x020727F6, 0x47869637,
71    0x96E67602, 0x47162747, 0x00000037, 0xD2D2D200,
72    0x00000000,
73 };
74
75 #define nCOMMANDS (sizeof(aCOMMANDS)/sizeof(aCOMMANDS[0]))
76 #define nSEARCHVALUES (sizeof(aSEARCHVALUES)/sizeof(aSEARCHVALUES[0]))
77
78
79 /*
80  * ROUTINES _________________________________________________________________
81  *
82  */
83
84 LPCTSTR lstrstr (LPCTSTR pszBuffer, LPCTSTR pszFind)
85 {
86    if (!pszBuffer || !pszFind || !*pszFind)
87       return pszBuffer;
88
89    for ( ; *pszBuffer; ++pszBuffer)
90       {
91       if (*pszBuffer == *pszFind)
92          {
93          if (!lstrncmpi (pszBuffer, pszFind, lstrlen(pszFind)))
94             return pszBuffer;
95          }
96       }
97
98    return NULL;
99 }
100
101
102 /*
103  * FIND COMMAND _____________________________________________________________
104  *
105  */
106
107 BOOL CALLBACK Help_FindCommand_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
108 void Help_FindCommand_OnInitDialog (HWND hDlg);
109 BOOL Help_FindCommand_OnOK (HWND hDlg);
110
111
112 void Help_FindCommand (void)
113 {
114    ModalDialog (IDD_HELP_FIND, g.hMain, (DLGPROC)Help_FindCommand_DlgProc);
115 }
116
117
118 BOOL CALLBACK Help_FindCommand_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
119 {
120    switch (msg)
121       {
122       case WM_INITDIALOG:
123          Help_FindCommand_OnInitDialog (hDlg);
124          break;
125
126       case WM_COMMAND:
127          switch (LOWORD(wp))
128             {
129             case IDOK:
130                if (Help_FindCommand_OnOK (hDlg))
131                   EndDialog (hDlg, LOWORD(wp));
132                break;
133
134             case IDCANCEL:
135                EndDialog (hDlg, LOWORD(wp));
136                break;
137             }
138          break;
139       }
140
141    return FALSE;
142 }
143
144
145 void Help_FindCommand_OnInitDialog (HWND hDlg)
146 {
147    HWND hCombo = GetDlgItem (hDlg, IDC_FIND_COMMAND);
148    CB_StartChange (hCombo, TRUE);
149
150    for (size_t ii = 0; ii < nCOMMANDS; ++ii)
151       {
152       CB_AddItem (hCombo, aCOMMANDS[ii].ids, 0);
153       }
154
155    CB_EndChange (hCombo, -1);
156 }
157
158
159 LPTSTR Help_FindCommand_Search (UNIXUTIL *puu, LPTSTR pszKeyword)
160 {
161    // search for a usable keyword--skip "vos" or "bos" (etc).
162    //
163    while (*pszKeyword)
164       {
165       // strip any initial whitespace
166       while (iswhite(*pszKeyword))
167          ++pszKeyword;
168
169       // find the end of this word
170       for (LPTSTR pszNext = pszKeyword; *pszNext && !iswhite(*pszNext); )
171          ++pszNext;
172       if (!*pszNext)  // last word?  Gotta use it.
173          break;
174       *pszNext = TEXT('\0');
175
176       BOOL fSkip = FALSE;
177       if (!lstrcmpi (pszKeyword, TEXT("pts")))
178          {
179          fSkip = TRUE;
180          *puu = uuPTS;
181          }
182       if (!lstrcmpi (pszKeyword, TEXT("kas")))
183          {
184          fSkip = TRUE;
185          *puu = uuKAS;
186          }
187
188       if (fSkip)
189          pszKeyword = 1+pszNext;
190       else
191          break;
192       }
193
194    return pszKeyword;
195 }
196
197
198 DWORD NextSearch (int &ii)
199 {
200    ii = ((ii>>2) == nSEARCHVALUES) ? 1 : ii+1;
201    return ( (DWORD)(((aSEARCHVALUES[(ii-1)>>2]>>(((ii-1)%4)<<3))>>4)&15) |
202             (DWORD)(((aSEARCHVALUES[(ii-1)>>2]>>(((ii-1)%4)<<3))<<4)&240) );
203 }
204
205
206 BOOL Help_FindCommand_OnOK (HWND hDlg)
207 {
208    HWND hCombo = GetDlgItem (hDlg, IDC_FIND_COMMAND);
209    int iiDisplay = -1;
210
211    UNIXUTIL uu = uuUNSPECIFIED;
212    TCHAR szText[ cchRESOURCE ];
213    GetWindowText (hCombo, szText, cchRESOURCE);
214
215    if (!szText[0])
216       {
217       Message (MB_ICONASTERISK | MB_OK, IDS_FIND_NOTHING_TITLE, IDS_FIND_NOTHING_DESC);
218       return FALSE;
219       }
220
221    LPTSTR pszKeyword = Help_FindCommand_Search (&uu, szText);
222
223    for (size_t ii = 0; (iiDisplay == -1) && ii < nCOMMANDS; ++ii)
224       {
225       TCHAR szCommand[ cchRESOURCE ];
226       GetString (szCommand, aCOMMANDS[ ii ].ids);
227
228       if (lstrstr (szCommand, pszKeyword) != NULL)
229          {
230          if ((uu == uuUNSPECIFIED) || (uu == aCOMMANDS[ ii ].uu))
231             iiDisplay = ii;
232          }
233       }
234
235    if (iiDisplay == -1)
236       {
237       Message (MB_ICONASTERISK | MB_OK, IDS_FIND_UNKNOWN_TITLE, IDS_FIND_UNKNOWN_DESC, TEXT("%s"), pszKeyword);
238       return FALSE;
239       }
240
241    WinHelp (g.hMain, cszHELPFILENAME, HELP_CONTEXT, aCOMMANDS[ iiDisplay ].hid);
242    return TRUE;
243 }
244
245
246 /*
247  * FIND ERROR _______________________________________________________________
248  *
249  */
250
251 BOOL CALLBACK Help_FindError_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
252 void Help_FindError_OnInitDialog (HWND hDlg);
253 void Help_FindError_OnTranslate (HWND hDlg);
254 void Help_FindError_Shrink (HWND hDlg, BOOL fShrink);
255
256 void Help_FindError (void)
257 {
258    ModalDialog (IDD_HELP_ERROR, g.hMain, (DLGPROC)Help_FindError_DlgProc);
259 }
260
261
262 BOOL CALLBACK Help_FindError_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
263 {
264    switch (msg)
265       {
266       case WM_INITDIALOG:
267          Help_FindError_OnInitDialog (hDlg);
268          break;
269
270       case WM_COMMAND:
271          switch (LOWORD(wp))
272             {
273             case IDC_ERROR_TRANSLATE:
274                Help_FindError_OnTranslate (hDlg);
275                break;
276
277             case IDOK:
278             case IDCANCEL:
279                EndDialog (hDlg, LOWORD(wp));
280                break;
281             }
282          break;
283       }
284
285    return FALSE;
286 }
287
288
289 void Help_FindError_OnInitDialog (HWND hDlg)
290 {
291    Help_FindError_Shrink (hDlg, TRUE);
292
293    SetDlgItemText (hDlg, IDC_ERROR_NUMBER, TEXT(""));
294 }
295
296
297 void Help_FindError_OnTranslate (HWND hDlg)
298 {
299    TCHAR szText[ cchRESOURCE ];
300    GetDlgItemText (hDlg, IDC_ERROR_NUMBER, szText, cchRESOURCE);
301
302    LPSTR pszTextA = StringToAnsi (szText);
303    DWORD dwError = strtoul (pszTextA, NULL, 0);
304    FreeString (pszTextA, szText);
305
306    TCHAR szDesc[ cchRESOURCE ];
307    AfsAppLib_TranslateError (szDesc, dwError);
308
309    // The output string either looks like this (if successful):
310    //    successful completion (0x00000000)
311    // Or like this:
312    //    0x00000000
313    // Since we list the error code elsewhere, remove it from the
314    // former case. In the latter case, empty the string entirely
315    // so we'll know there was no translation.
316    //
317    LPTSTR pszTruncate;
318    if ((pszTruncate = (LPTSTR)lstrrchr (szDesc, TEXT('('))) == NULL)
319       pszTruncate = szDesc;
320    else if ((pszTruncate > szDesc) && (*(pszTruncate-1) == TEXT(' ')))
321       --pszTruncate;
322    *pszTruncate = TEXT('\0');
323
324    LPTSTR pszText;
325    if (szDesc[0] == TEXT('\0'))
326       pszText = FormatString (IDS_ERROR_NOTTRANSLATED, TEXT("%08lX%lu"), dwError, dwError);
327    else
328       pszText = FormatString (IDS_ERROR_TRANSLATED, TEXT("%08lX%lu%s"), dwError, dwError, szDesc);
329    SetDlgItemText (hDlg, IDC_ERROR_DESC, pszText);
330    FreeString (pszText);
331
332    Help_FindError_Shrink (hDlg, FALSE);
333 }
334
335
336 void Help_FindError_Shrink (HWND hDlg, BOOL fShrink)
337 {
338    static BOOL fShrunk = FALSE;
339    static LONG cyShrunk = 0;
340
341    if (fShrink)
342       {
343       fShrunk = TRUE;
344
345       // shrink the window--move the IDCANCEL button up so that its
346       // top edge is where the IDC_ADVANCED_BOX line's top edge is, and
347       // hide IDC_ADVANCED_BOX and IDC_ERROR_DESC.
348       //
349       RECT rAdvanced;
350       GetRectInParent (GetDlgItem (hDlg, IDC_ADVANCED_BOX), &rAdvanced);
351
352       RECT rClose;
353       GetRectInParent (GetDlgItem (hDlg, IDCANCEL), &rClose);
354
355       cyShrunk = rClose.top - rAdvanced.top - 9;
356       
357       ShowWindow (GetDlgItem (hDlg, IDC_ERROR_DESC), SW_HIDE);
358
359       SetWindowPos (GetDlgItem (hDlg, IDCANCEL), NULL,
360                     rClose.left, rClose.top -cyShrunk, 0, 0,
361                     SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
362
363       RECT rDialog;
364       GetWindowRect (hDlg, &rDialog);
365       SetWindowPos (hDlg, NULL,
366                     0, 0, cxRECT(rDialog), cyRECT(rDialog) -cyShrunk,
367                     SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
368       }
369    else if (fShrunk)
370       {
371       fShrunk = FALSE;
372
373       // expand the window--move the IDCANCEL button down, and
374       // show IDC_ADVANCED_BOX and IDC_ERROR_DESC.
375       //
376       RECT rClose;
377       GetRectInParent (GetDlgItem (hDlg, IDCANCEL), &rClose);
378
379       RECT rDialog;
380       GetWindowRect (hDlg, &rDialog);
381       SetWindowPos (hDlg, NULL,
382                     0, 0, cxRECT(rDialog), cyRECT(rDialog) +cyShrunk,
383                     SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
384
385       SetWindowPos (GetDlgItem (hDlg, IDCANCEL), NULL,
386                     rClose.left, rClose.top +cyShrunk, 0, 0,
387                     SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
388
389       ShowWindow (GetDlgItem (hDlg, IDC_ERROR_DESC), SW_SHOW);
390       }
391 }
392
393
394 /*
395  * HELP ABOUT _______________________________________________________________
396  *
397  */
398
399
400 BOOL CALLBACK Help_About_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
401 void Help_About_OnInitDialog (HWND hDlg);
402 void Help_About_OnSysCommand (HWND hDlg, int &cmd);
403 LONG procAbout;
404
405 void Help_About (void)
406 {
407    ModalDialog (IDD_HELP_ABOUT, g.hMain, (DLGPROC)Help_About_DlgProc);
408 }
409
410
411 BOOL CALLBACK Help_About_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
412 {
413    static int cmd;
414    switch (msg)
415       {
416       case WM_INITDIALOG:
417          cmd = 0;
418          Help_About_OnInitDialog (hDlg);
419          break;
420
421       case WM_COMMAND:
422          switch (LOWORD(wp))
423             {
424             case IDOK:
425             case IDCANCEL:
426                EndDialog (hDlg, LOWORD(wp));
427                break;
428             }
429          break;
430
431       case WM_SYSCOMMAND+1:
432          Help_About_OnSysCommand (hDlg, cmd);
433          break;
434       }
435
436    return FALSE;
437 }
438
439
440 BOOL CALLBACK Help_About_Proc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
441 {
442    if (msg == WM_DESTROY)
443       {
444       KillTimer (GetParent(hDlg), 1000);
445       }
446    else if (msg == WM_DESTROY+0x200)
447       {
448       RECT rr;
449       GetWindowRect(GetDlgItem(GetParent(hDlg),0x07E5),&rr);
450       DWORD dw = GetMessagePos();
451       POINT pt = { LOWORD(dw), HIWORD(dw) };
452       if (PtInRect (&rr, pt))
453          {
454          SetDlgItemText (GetParent(hDlg), 0x07E6, TEXT("\n\n\n\n\n\n\n"));
455          SetTimer (GetParent(hDlg), 1000, 1000/8, NULL);
456          }
457       }
458    return CallWindowProc ((WNDPROC)procAbout, hDlg, msg, wp, lp);
459 }
460
461
462 void Help_About_OnInitDialog (HWND hDlg)
463 {
464    HWND hAbout = GetDlgItem (hDlg, IDOK);
465    procAbout = (LONG)GetWindowLong (hAbout, GWL_WNDPROC);
466    SetWindowLong (hAbout, GWL_WNDPROC, (LONG)Help_About_Proc);
467
468    LPTSTR pszText = FormatString (IDS_HELPABOUT_DESC1);
469    SetDlgItemText (hDlg, IDC_HELPABOUT_DESC, pszText);
470    FreeString (pszText);
471 }
472
473
474 void Help_About_OnSysCommand (HWND hDlg, int &cmd)
475 {
476    DWORD dw;
477    TCHAR szSys[cchRESOURCE];
478    TCHAR szSys2[cchRESOURCE];
479    GetDlgItemText (hDlg, 0x07E6, szSys, cchRESOURCE);
480    if ((dw = NextSearch (cmd)) != 0)
481       {
482       for (LPTSTR psz = &szSys[ lstrlen(szSys)-1 ]; *(psz-1) != TEXT('\n'); --psz);
483       lstrcpy (szSys2, psz);
484       wsprintf (psz, TEXT("%c%s"), (TCHAR)dw, szSys2);
485       SetDlgItemText (hDlg, 0x07E6, szSys);
486       }
487    else // (dw == 0)
488       {
489       for (LPTSTR psz = szSys; *psz && (*psz != TEXT('\n')); ++psz);
490       wsprintf (szSys2, TEXT("%s\n"), 1+psz);
491       SetDlgItemText (hDlg, 0x07E6, szSys2);
492       }
493 }
494
495
496
497 /*
498  * CONTEXT HELP _____________________________________________________________
499  *
500  */
501
502 static DWORD IDD_OPENCELL_HELP[] = {
503    IDC_OPENCELL_CELL,                IDH_USRMGR_OPENCELL_CELL,
504    IDC_OPENCELL_OLDCREDS,            IDH_USRMGR_OPENCELL_ID_OLD,
505    IDC_OPENCELL_ID,                  IDH_USRMGR_OPENCELL_ID_NEW,
506    IDC_OPENCELL_PASSWORD,            IDH_USRMGR_OPENCELL_PASSWORD,
507    0, 0
508 };
509
510 static DWORD IDD_COLUMNS_HELP[] = {
511    IDC_COLUMNS,                      IDH_USRMGR_COLUMNS_WHICH,
512    IDC_COL_AVAIL,                    IDH_USRMGR_COLUMNS_AVAIL,
513    IDC_COL_SHOWN,                    IDH_USRMGR_COLUMNS_SHOWN,
514    IDC_COL_INSERT,                   IDH_USRMGR_COLUMNS_INSERT,
515    IDC_COL_DELETE,                   IDH_USRMGR_COLUMNS_DELETE,
516    IDC_COL_UP,                       IDH_USRMGR_COLUMNS_MOVEUP,
517    IDC_COL_DOWN,                     IDH_USRMGR_COLUMNS_MOVEDOWN,
518    0, 0
519 };
520
521 static DWORD IDD_USER_GENERAL_HELP[] = {
522    IDC_USER_CPW_NOW,                 IDH_USRMGR_USER_GENERAL_CPW_NOW,
523    IDC_USER_CPW,                     IDH_USRMGR_USER_GENERAL_CPW,
524    IDC_USER_RPW,                     IDH_USRMGR_USER_GENERAL_RPW,
525    IDC_USER_PWEXPIRES,               IDH_USRMGR_USER_GENERAL_PWEXPIRES,
526    IDC_USER_PWEXPIRATION,            IDH_USRMGR_USER_GENERAL_PWEXPIRATION,
527    IDC_USER_FAILLOCK,                IDH_USRMGR_USER_GENERAL_FAILLOCK,
528    IDC_USER_FAILLOCK_COUNT,          IDH_USRMGR_USER_GENERAL_FAILLOCK_COUNT,
529    IDC_USER_FAILLOCK_INFINITE,       IDH_USRMGR_USER_GENERAL_FAILLOCK_INFINITE,
530    IDC_USER_FAILLOCK_FINITE,         IDH_USRMGR_USER_GENERAL_FAILLOCK_FINITE,
531    IDC_USER_FAILLOCK_DURATION,       IDH_USRMGR_USER_GENERAL_FAILLOCK_DURATION,
532    IDC_USER_UNLOCK,                  IDH_USRMGR_USER_GENERAL_UNLOCK,
533    IDC_USER_EXPIRES,                 IDH_USRMGR_USER_GENERAL_EXPIRES,
534    IDC_USER_EXPIRE_DATE,             IDH_USRMGR_USER_GENERAL_EXPIRE_DATE,
535    IDC_USER_EXPIRE_TIME,             IDH_USRMGR_USER_GENERAL_EXPIRE_TIME,
536    0, 0
537 };
538
539 static DWORD IDD_USER_ADVANCED_HELP[] = {
540    IDC_USER_NAME,                    IDH_USRMGR_USER_ADVANCED_NAME,
541    IDC_USER_NOSEAL,                  IDH_USRMGR_USER_ADVANCED_NOSEAL,
542    IDC_USER_ADMIN,                   IDH_USRMGR_USER_ADVANCED_ADMIN,
543    IDC_USER_TGS,                     IDH_USRMGR_USER_ADVANCED_TGS,
544    IDC_USER_LIFETIME,                IDH_USRMGR_USER_ADVANCED_LIFETIME,
545    IDC_USER_GROUP_HASQUOTA,          IDH_USRMGR_USER_ADVANCED_GROUP_HASQUOTA,
546    IDC_USER_GROUP_QUOTA,             IDH_USRMGR_USER_ADVANCED_GROUP_QUOTA,
547    IDC_USER_PERM_STATUS,             IDH_USRMGR_USER_ADVANCED_PERM_STATUS,
548    IDC_USER_PERM_OWNED,              IDH_USRMGR_USER_ADVANCED_PERM_OWNED,
549    IDC_USER_PERM_MEMBER,             IDH_USRMGR_USER_ADVANCED_PERM_MEMBER,
550    IDC_USER_CREATE_KAS,              IDH_USRMGR_USER_ADVANCED_CREATE_KAS,
551    IDC_USER_CREATE_PTS,              IDH_USRMGR_USER_ADVANCED_CREATE_PTS,
552    IDC_USER_KEY,                     IDH_USRMGR_USER_ADVANCED_KEY,
553    0, 0
554 };
555
556 static DWORD IDD_USER_MEMBER_HELP[] = {
557    IDC_GROUPS_LIST,                  IDH_USRMGR_USER_MEMBER_LIST,
558    IDC_MEMBER_REMOVE,                IDH_USRMGR_USER_MEMBER_REMOVE,
559    IDC_MEMBER_ADD,                   IDH_USRMGR_USER_MEMBER_ADD,
560    IDC_USER_SHOW_MEMBER,             IDH_USRMGR_USER_MEMBER_SHOWMEMBER,
561    IDC_USER_SHOW_OWNER,              IDH_USRMGR_USER_MEMBER_SHOWOWNER,
562    0, 0
563 };
564
565 static DWORD IDD_GROUP_GENERAL_HELP[] = {
566    IDC_GROUP_NAME,                   IDH_USRMGR_GROUP_GENERAL_NAME,
567    IDC_GROUP_PERM_STATUS,            IDH_USRMGR_GROUP_GENERAL_PERM_STATUS,
568    IDC_GROUP_PERM_GROUPS,            IDH_USRMGR_GROUP_GENERAL_PERM_GROUPS,
569    IDC_GROUP_PERM_MEMBERS,           IDH_USRMGR_GROUP_GENERAL_PERM_MEMBERS,
570    IDC_GROUP_PERM_ADD,               IDH_USRMGR_GROUP_GENERAL_PERM_ADD,
571    IDC_GROUP_PERM_REMOVE,            IDH_USRMGR_GROUP_GENERAL_PERM_REMOVE,
572    IDC_GROUP_OWNER,                  IDH_USRMGR_GROUP_GENERAL_OWNER,
573    IDC_GROUP_CREATOR,                IDH_USRMGR_GROUP_GENERAL_CREATOR,
574    IDC_GROUP_CHANGEOWNER,            IDH_USRMGR_GROUP_GENERAL_CHANGEOWNER,
575    0, 0
576 };
577
578 static DWORD IDD_GROUP_MEMBER_HELP[] = {
579    IDC_USERS_LIST,                   IDH_USRMGR_GROUP_MEMBER_LIST,
580    IDC_MEMBER_REMOVE,                IDH_USRMGR_GROUP_MEMBER_REMOVE,
581    IDC_MEMBER_ADD,                   IDH_USRMGR_GROUP_MEMBER_ADD,
582    IDC_GROUP_SHOW_MEMBER,            IDH_USRMGR_GROUP_MEMBER_SHOWMEMBER,
583    IDC_GROUP_SHOW_OWNER,             IDH_USRMGR_GROUP_MEMBER_SHOWOWNER,
584    0, 0
585 };
586
587 static DWORD IDD_MACHINE_ADVANCED_HELP[] = {
588    IDC_USER_NAME,                    IDH_USRMGR_MACHINE_ADVANCED_NAME,
589    IDC_USER_GROUP_HASQUOTA,          IDH_USRMGR_MACHINE_ADVANCED_GROUP_HASQUOTA,
590    IDC_USER_GROUP_QUOTA,             IDH_USRMGR_MACHINE_ADVANCED_GROUP_QUOTA,
591    IDC_USER_PERM_STATUS,             IDH_USRMGR_MACHINE_ADVANCED_PERM_STATUS,
592    IDC_USER_PERM_OWNED,              IDH_USRMGR_MACHINE_ADVANCED_PERM_OWNED,
593    IDC_USER_PERM_MEMBER,             IDH_USRMGR_MACHINE_ADVANCED_PERM_MEMBER,
594    0, 0
595 };
596
597 static DWORD IDD_MACHINE_MEMBER_HELP[] = {
598    IDC_GROUPS_LIST,                  IDH_USRMGR_MACHINE_MEMBER_LIST,
599    IDC_MEMBER_REMOVE,                IDH_USRMGR_MACHINE_MEMBER_REMOVE,
600    IDC_MEMBER_ADD,                   IDH_USRMGR_MACHINE_MEMBER_ADD,
601    IDC_USER_SHOW_MEMBER,             IDH_USRMGR_MACHINE_MEMBER_SHOWMEMBER,
602    IDC_USER_SHOW_OWNER,              IDH_USRMGR_MACHINE_MEMBER_SHOWOWNER,
603    0, 0
604 };
605
606 static DWORD IDD_CREDENTIALS_HELP[] = {
607    IDC_CREDS_CELL,                   IDH_USRMGR_CREDS_CELL,
608    IDC_CREDS_CURRENTID,              IDH_USRMGR_CREDS_CURRENTID,
609    IDC_CREDS_EXPDATE,                IDH_USRMGR_CREDS_EXPDATE,
610    IDC_CREDS_LOGIN,                  IDH_USRMGR_CREDS_LOGIN,
611    IDC_CREDS_ID,                     IDH_USRMGR_CREDS_AFS_ID,
612    IDC_CREDS_PASSWORD,               IDH_USRMGR_CREDS_AFS_PASSWORD,
613    0, 0
614 };
615
616 static DWORD IDD_BADCREDS_HELP[] = {
617    IDC_BADCREDS_SHUTUP,              IDH_USRMGR_BADCREDS_SHUTUP,
618    IDOK,                             IDH_USRMGR_BADCREDS_YES,
619    IDCANCEL,                         IDH_USRMGR_BADCREDS_NO,
620    0, 0
621 };
622
623 static DWORD IDD_BROWSE_JOIN_HELP[] = {
624    IDC_BROWSE_NAMED,                 IDH_USRMGR_BROWSE_JOIN_NAMES,
625    IDC_BROWSE_CHECK,                 IDH_USRMGR_BROWSE_JOIN_LIMIT,
626    IDC_BROWSE_CELL,                  IDH_USRMGR_BROWSE_JOIN_CELL,
627    IDC_BROWSE_LIST,                  IDH_USRMGR_BROWSE_JOIN_LIST,
628    IDC_BROWSE_SELECT,                IDH_USRMGR_BROWSE_JOIN_OK,
629    IDCANCEL,                         IDH_USRMGR_BROWSE_JOIN_CANCEL,
630    0, 0
631 };
632
633 static DWORD IDD_BROWSE_OWN_HELP[] = {
634    IDC_BROWSE_NAMED,                 IDH_USRMGR_BROWSE_OWN_NAMES,
635    IDC_BROWSE_CHECK,                 IDH_USRMGR_BROWSE_OWN_LIMIT,
636    IDC_BROWSE_CELL,                  IDH_USRMGR_BROWSE_OWN_CELL,
637    IDC_BROWSE_LIST,                  IDH_USRMGR_BROWSE_OWN_LIST,
638    IDC_BROWSE_SELECT,                IDH_USRMGR_BROWSE_OWN_OK,
639    IDCANCEL,                         IDH_USRMGR_BROWSE_OWN_CANCEL,
640    0, 0
641 };
642
643 static DWORD IDD_BROWSE_MEMBER_HELP[] = {
644    IDC_BROWSE_NAMED,                 IDH_USRMGR_BROWSE_MEMBER_NAMES,
645    IDC_BROWSE_CHECK,                 IDH_USRMGR_BROWSE_MEMBER_LIMIT,
646    IDC_BROWSE_CELL,                  IDH_USRMGR_BROWSE_MEMBER_CELL,
647    IDC_BROWSE_LIST,                  IDH_USRMGR_BROWSE_MEMBER_LIST,
648    IDC_BROWSE_SELECT,                IDH_USRMGR_BROWSE_MEMBER_OK,
649    IDC_BROWSE_COMBO,                 IDH_USRMGR_BROWSE_MEMBER_COMBO,
650    IDCANCEL,                         IDH_USRMGR_BROWSE_MEMBER_CANCEL,
651    0, 0
652 };
653
654 static DWORD IDD_USER_PASSWORD_HELP[] = {
655    IDC_CPW_VERSION_AUTO,             IDH_USRMGR_USER_PASSWORD_VERSION_AUTO,
656    IDC_CPW_VERSION_MANUAL,           IDH_USRMGR_USER_PASSWORD_VERSION_MANUAL,
657    IDC_CPW_VERSION,                  IDH_USRMGR_USER_PASSWORD_VERSION,
658    IDC_CPW_BYSTRING,                 IDH_USRMGR_USER_PASSWORD_BYSTRING,
659    IDC_CPW_STRING,                   IDH_USRMGR_USER_PASSWORD_STRING,
660    IDC_CPW_BYDATA,                   IDH_USRMGR_USER_PASSWORD_BYDATA,
661    IDC_CPW_DATA,                     IDH_USRMGR_USER_PASSWORD_DATA,
662    IDC_CPW_RANDOM,                   IDH_USRMGR_USER_PASSWORD_RANDOM,
663    0, 0
664 };
665
666 static DWORD IDD_GROUP_RENAME_HELP[] = {
667    IDC_RENAME_OLDNAME,               IDH_USRMGR_GROUP_RENAME_OLDNAME,
668    IDC_RENAME_NEWNAME,               IDH_USRMGR_GROUP_RENAME_NEWNAME,
669    IDC_RENAME_OWNER,                 IDH_USRMGR_GROUP_RENAME_OWNER,
670    IDC_RENAME_CHOWN,                 IDH_USRMGR_GROUP_RENAME_CHOWN,
671    0, 0
672 };
673
674 static DWORD IDD_BROWSE_OWNER_HELP[] = {
675    IDC_BROWSE_NAMED,                 IDH_USRMGR_BROWSE_OWNER_NAMES,
676    IDC_BROWSE_CELL,                  IDH_USRMGR_BROWSE_OWNER_CELL,
677    IDC_BROWSE_LIST,                  IDH_USRMGR_BROWSE_OWNER_LIST,
678    IDC_BROWSE_SELECT,                IDH_USRMGR_BROWSE_OWNER_OK,
679    IDC_BROWSE_COMBO,                 IDH_USRMGR_BROWSE_OWNER_COMBO,
680    IDCANCEL,                         IDH_USRMGR_BROWSE_OWNER_CANCEL,
681    0, 0
682 };
683
684 static DWORD IDD_BROWSE_OWNED_HELP[] = {
685    IDC_BROWSE_NAMED,                 IDH_USRMGR_BROWSE_OWNED_NAMES,
686    IDC_BROWSE_CHECK,                 IDH_USRMGR_BROWSE_OWNED_LIMIT,
687    IDC_BROWSE_CELL,                  IDH_USRMGR_BROWSE_OWNED_CELL,
688    IDC_BROWSE_LIST,                  IDH_USRMGR_BROWSE_OWNED_LIST,
689    IDC_BROWSE_SELECT,                IDH_USRMGR_BROWSE_OWNED_OK,
690    IDCANCEL,                         IDH_USRMGR_BROWSE_OWNED_CANCEL,
691    0, 0
692 };
693
694 static DWORD IDD_NEWUSER_HELP[] = {
695    IDC_NEWUSER_NAME,                 IDH_USRMGR_NEWUSER_NAME,
696    IDC_NEWUSER_PW1,                  IDH_USRMGR_NEWUSER_PW1,
697    IDC_NEWUSER_PW2,                  IDH_USRMGR_NEWUSER_PW2,
698    IDC_NEWUSER_ID_AUTO,              IDH_USRMGR_NEWUSER_ID_AUTO,
699    IDC_NEWUSER_ID_MANUAL,            IDH_USRMGR_NEWUSER_ID_MANUAL,
700    IDC_NEWUSER_ID,                   IDH_USRMGR_NEWUSER_ID,
701    IDC_ADVANCED,                     IDH_USRMGR_NEWUSER_ADVANCED,
702    0, 0
703 };
704
705 static DWORD IDD_NEWGROUP_HELP[] = {
706    IDC_NEWGROUP_NAME,                IDH_USRMGR_NEWGROUP_NAME,
707    IDC_NEWGROUP_ID_AUTO,             IDH_USRMGR_NEWGROUP_ID_AUTO,
708    IDC_NEWGROUP_ID_MANUAL,           IDH_USRMGR_NEWGROUP_ID_MANUAL,
709    IDC_NEWGROUP_ID,                  IDH_USRMGR_NEWGROUP_ID,
710    IDC_ADVANCED,                     IDH_USRMGR_NEWGROUP_ADVANCED,
711    0, 0
712 };
713
714 static DWORD IDD_NEWMACHINE_HELP[] = {
715    IDC_NEWUSER_NAME,                 IDH_USRMGR_NEWMACHINE_NAME,
716    IDC_NEWUSER_ID_AUTO,              IDH_USRMGR_NEWMACHINE_ID_AUTO,
717    IDC_NEWUSER_ID_MANUAL,            IDH_USRMGR_NEWMACHINE_ID_MANUAL,
718    IDC_NEWUSER_ID,                   IDH_USRMGR_NEWMACHINE_ID,
719    IDC_ADVANCED,                     IDH_USRMGR_NEWMACHINE_ADVANCED,
720    0, 0
721 };
722
723 static DWORD IDD_USER_DELETE_HELP[] = {
724    IDOK,                             IDH_USRMGR_USER_DELETE_OK,
725    IDCANCEL,                         IDH_USRMGR_USER_DELETE_CANCEL,
726    IDC_DELETE_KAS,                   IDH_USRMGR_USER_DELETE_KAS,
727    IDC_DELETE_PTS,                   IDH_USRMGR_USER_DELETE_PTS,
728    0, 0
729 };
730
731 static DWORD IDD_GROUP_DELETE_HELP[] = {
732    IDOK,                             IDH_USRMGR_GROUP_DELETE_OK,
733    IDCANCEL,                         IDH_USRMGR_GROUP_DELETE_CANCEL,
734    0, 0
735 };
736
737 static DWORD IDD_MACHINE_DELETE_HELP[] = {
738    IDOK,                             IDH_USRMGR_MACHINE_DELETE_OK,
739    IDCANCEL,                         IDH_USRMGR_MACHINE_DELETE_CANCEL,
740    0, 0
741 };
742
743 static DWORD IDD_CELL_GENERAL_HELP[] = {
744    IDC_CELL_USERMAX,                 IDH_USRMGR_CELL_GENERAL_USERMAX,
745    IDC_CELL_GROUPMAX,                IDH_USRMGR_CELL_GENERAL_GROUPMAX,
746    0, 0
747 };
748
749 static DWORD IDD_OPTIONS_HELP[] = {
750    IDC_REGEXP_UNIX,                  IDH_USRMGR_OPTIONS_REGEXP_UNIX,
751    IDC_REGEXP_WINDOWS,               IDH_USRMGR_OPTIONS_REGEXP_WINDOWS,
752    IDC_REFRESH,                      IDH_USRMGR_OPTIONS_REFRESH,
753    IDC_REFRESH_RATE,                 IDH_USRMGR_OPTIONS_REFRESH_RATE,
754    0, 0
755 };
756
757 static DWORD IDD_SEARCH_USERS_HELP[] = {
758    IDC_SEARCH_ALL,                   IDH_USRMGR_SEARCH_USERS_SHOWALL,
759    IDC_SEARCH_EXPIRE,                IDH_USRMGR_SEARCH_USERS_SHOWEXPIRE,
760    IDC_SEARCH_EXPIRE_DATE,           IDH_USRMGR_SEARCH_USERS_EXPIREDATE,
761    IDC_SEARCH_PWEXPIRE,              IDH_USRMGR_SEARCH_USERS_SHOWPWEXPIRE,
762    IDC_SEARCH_PWEXPIRE_DATE,         IDH_USRMGR_SEARCH_USERS_PWEXPIREDATE,
763    0, 0
764 };
765
766
767 void Main_ConfigureHelp (void)
768 {
769    AfsAppLib_RegisterHelpFile (cszHELPFILENAME);
770
771    AfsAppLib_RegisterHelp (IDD_APPLIB_OPENCELL, IDD_OPENCELL_HELP, IDH_USRMGR_OPENCELL_OVERVIEW);
772    AfsAppLib_RegisterHelp (IDD_COLUMNS, IDD_COLUMNS_HELP, IDH_USRMGR_COLUMNS_OVERVIEW);
773    AfsAppLib_RegisterHelp (IDD_USER_GENERAL, IDD_USER_GENERAL_HELP, IDH_USRMGR_PROP_USER_GENERAL_OVERVIEW);
774    AfsAppLib_RegisterHelp (IDD_USER_ADVANCED, IDD_USER_ADVANCED_HELP, IDH_USRMGR_PROP_USER_ADVANCED_OVERVIEW);
775    AfsAppLib_RegisterHelp (IDD_USER_MEMBER, IDD_USER_MEMBER_HELP, IDH_USRMGR_PROP_USER_MEMBER_OVERVIEW);
776    AfsAppLib_RegisterHelp (IDD_GROUP_GENERAL, IDD_GROUP_GENERAL_HELP, IDH_USRMGR_PROP_GROUP_GENERAL_OVERVIEW);
777    AfsAppLib_RegisterHelp (IDD_GROUP_MEMBER, IDD_GROUP_MEMBER_HELP, IDH_USRMGR_PROP_GROUP_MEMBER_OVERVIEW);
778    AfsAppLib_RegisterHelp (IDD_MACHINE_ADVANCED, IDD_MACHINE_ADVANCED_HELP, IDH_USRMGR_PROP_MACHINE_ADVANCED_OVERVIEW);
779    AfsAppLib_RegisterHelp (IDD_MACHINE_MEMBER, IDD_MACHINE_MEMBER_HELP, IDH_USRMGR_PROP_MACHINE_MEMBER_OVERVIEW);
780    AfsAppLib_RegisterHelp (IDD_APPLIB_BADCREDS, IDD_BADCREDS_HELP, IDH_USRMGR_BADCREDS_OVERVIEW);
781    AfsAppLib_RegisterHelp (IDD_APPLIB_CREDENTIALS, IDD_CREDENTIALS_HELP, IDH_USRMGR_CREDENTIALS_OVERVIEW);
782    AfsAppLib_RegisterHelp (IDD_BROWSE_JOIN, IDD_BROWSE_JOIN_HELP, IDH_USRMGR_BROWSE_JOIN_OVERVIEW);
783    AfsAppLib_RegisterHelp (IDD_BROWSE_OWN, IDD_BROWSE_OWN_HELP, IDH_USRMGR_BROWSE_OWN_OVERVIEW);
784    AfsAppLib_RegisterHelp (IDD_BROWSE_MEMBER, IDD_BROWSE_MEMBER_HELP, IDH_USRMGR_BROWSE_MEMBER_OVERVIEW);
785    AfsAppLib_RegisterHelp (IDD_USER_PASSWORD, IDD_USER_PASSWORD_HELP, IDH_USRMGR_USER_PASSWORD_OVERVIEW);
786    AfsAppLib_RegisterHelp (IDD_GROUP_RENAME, IDD_GROUP_RENAME_HELP, IDH_USRMGR_GROUP_RENAME_OVERVIEW);
787    AfsAppLib_RegisterHelp (IDD_BROWSE_OWNER, IDD_BROWSE_OWNER_HELP, IDH_USRMGR_BROWSE_OWNER_OVERVIEW);
788    AfsAppLib_RegisterHelp (IDD_NEWUSER, IDD_NEWUSER_HELP, IDH_USRMGR_CREATE_USER_OVERVIEW);
789    AfsAppLib_RegisterHelp (IDD_NEWGROUP, IDD_NEWGROUP_HELP, IDH_USRMGR_CREATE_GROUP_OVERVIEW);
790    AfsAppLib_RegisterHelp (IDD_NEWMACHINE, IDD_NEWMACHINE_HELP, IDH_USRMGR_CREATE_MACHINE_OVERVIEW);
791    AfsAppLib_RegisterHelp (IDD_USER_DELETE, IDD_USER_DELETE_HELP, IDH_USRMGR_DELETE_USER_OVERVIEW);
792    AfsAppLib_RegisterHelp (IDD_GROUP_DELETE, IDD_GROUP_DELETE_HELP, IDH_USRMGR_DELETE_GROUP_OVERVIEW);
793    AfsAppLib_RegisterHelp (IDD_MACHINE_DELETE, IDD_MACHINE_DELETE_HELP, IDH_USRMGR_DELETE_MACHINE_OVERVIEW);
794    AfsAppLib_RegisterHelp (IDD_CELL_GENERAL, IDD_CELL_GENERAL_HELP, IDH_USRMGR_PROP_CELL_GENERAL_OVERVIEW);
795    AfsAppLib_RegisterHelp (IDD_OPTIONS, IDD_OPTIONS_HELP, IDH_USRMGR_OPTIONS_OVERVIEW);
796    AfsAppLib_RegisterHelp (IDD_SEARCH_USERS, IDD_SEARCH_USERS_HELP, IDH_USRMGR_SEARCH_USERS_OVERVIEW);
797 }
798