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 <afs/param.h>
19 #include "svr_security.h"
20 #include "propcache.h"
25 * DEFINITIONS ________________________________________________________________
29 #define ISKEYINUSE(_pkey) ((_pkey)->keyInfo.timeLastModification.wYear != 0)
35 LPADMINLIST lpAdmList;
37 } SVR_SECURITY_PARAMS, *LPSVR_SECURITY_PARAMS;
41 * PROTOTYPES _________________________________________________________________
45 void Server_Security_Free (LPSVR_SECURITY_PARAMS lpp);
47 BOOL CALLBACK Server_Lists_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
49 void Server_Lists_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
50 void Server_Lists_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp);
51 void Server_Lists_OnApply (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
52 void Server_Lists_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
53 void Server_Lists_OnAddEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
54 void Server_Lists_OnDelEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
56 BOOL CALLBACK Server_Keys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
57 void Server_Keys_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
58 void Server_Keys_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp);
59 void Server_Keys_OnEndTask_CreateKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp);
60 void Server_Keys_OnEndTask_DeleteKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp);
61 void Server_Keys_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
62 void Server_Keys_OnAddKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
63 void Server_Keys_OnDelKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
65 void FormatServerKey (LPTSTR psz, LPENCRYPTIONKEY pKey);
66 BOOL ScanServerKey (LPENCRYPTIONKEY pKey, LPTSTR psz);
68 BOOL CALLBACK CreateKey_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
69 void CreateKey_OnInitDialog (HWND hDlg, LPKEY_CREATE_PARAMS lpp);
70 void CreateKey_OnSelect (HWND hDlg);
71 void CreateKey_OnType (HWND hDlg);
72 void CreateKey_OnRandom (HWND hDlg, LPKEY_CREATE_PARAMS lpp);
73 BOOL CreateKey_OnOK (HWND hDlg, LPKEY_CREATE_PARAMS lpp);
74 void CreateKey_OnEndTask_Random (HWND hDlg, LPTASKPACKET ptp);
78 * SERVER-KEY COLUMNS _________________________________________________________
82 void Server_Key_SetDefaultView (LPVIEWINFO lpvi)
84 lpvi->lvsView = FLS_VIEW_LIST;
85 lpvi->nColsAvail = nSERVERKEYCOLUMNS;
87 for (size_t iCol = 0; iCol < nSERVERKEYCOLUMNS; ++iCol)
89 lpvi->cxColumns[ iCol ] = SERVERKEYCOLUMNS[ iCol ].cxWidth;
90 lpvi->idsColumns[ iCol ] = SERVERKEYCOLUMNS[ iCol ].idsColumn;
93 lpvi->iSort = svrkeyVERSION;
96 lpvi->aColumns[0] = (int)svrkeyVERSION;
97 lpvi->aColumns[1] = (int)svrkeyDATA;
98 lpvi->aColumns[2] = (int)svrkeyCHECKSUM;
103 * ROUTINES ___________________________________________________________________
107 void Server_Security (LPIDENT lpiServer, BOOL fJumpToKeys)
110 if ((hCurrent = PropCache_Search (pcSVR_SECURITY, lpiServer)) != NULL)
117 if ((hTab = GetDlgItem (hCurrent, IDC_PROPSHEET_TABCTRL)) != NULL)
119 int nTabs = TabCtrl_GetItemCount (hTab);
120 TabCtrl_SetCurSel (hTab, nTabs-1);
124 nm.idFrom = IDC_PROPSHEET_TABCTRL;
125 nm.code = TCN_SELCHANGE;
126 SendMessage (hCurrent, WM_NOTIFY, 0, (LPARAM)&nm);
132 LPSVR_SECURITY_PARAMS lpp = New (SVR_SECURITY_PARAMS);
133 memset (lpp, 0x00, sizeof(SVR_SECURITY_PARAMS));
134 lpp->lpiServer = lpiServer;
136 TCHAR szServer[ cchNAME ];
137 lpiServer->GetServerName (szServer);
138 LPTSTR pszTitle = FormatString (IDS_SVR_SECURITY_TITLE, TEXT("%s"), szServer);
139 LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE);
140 PropSheet_AddTab (psh, IDS_SVR_LIST_TAB, IDD_SVR_LISTS, (DLGPROC)Server_Lists_DlgProc, (LONG_PTR)lpp, TRUE, !fJumpToKeys);
141 PropSheet_AddTab (psh, IDS_SVR_KEY_TAB, IDD_SVR_KEYS, (DLGPROC)Server_Keys_DlgProc, (LONG_PTR)lpp, TRUE, fJumpToKeys);
142 PropSheet_ShowModeless (psh);
143 FreeString (pszTitle);
148 void Server_Security_Free (LPSVR_SECURITY_PARAMS lpp)
151 AfsClass_AdminList_Free (lpp->lpAdmList);
153 AfsClass_KeyList_Free (lpp->lpKeyList);
158 BOOL CALLBACK Server_Lists_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
160 if (AfsAppLib_HandleHelp (IDD_SVR_LISTS, hDlg, msg, wp, lp))
163 LPSVR_SECURITY_PARAMS lpp;
164 if ((msg == WM_INITDIALOG_SHEET) || (msg == WM_DESTROY_SHEET))
165 lpp = (LPSVR_SECURITY_PARAMS)lp;
167 lpp = (LPSVR_SECURITY_PARAMS)PropSheet_FindTabParam (hDlg);
171 case WM_INITDIALOG_SHEET:
172 InterlockedIncrement (&lpp->cRef);
173 PropCache_Add (pcSVR_SECURITY, lpp->lpiServer, hDlg);
176 case WM_DESTROY_SHEET:
177 PropCache_Delete (hDlg);
178 if ((InterlockedDecrement (&lpp->cRef)) == 0)
179 Server_Security_Free (lpp);
183 Server_Lists_OnInitDialog (hDlg, lpp);
188 if ((ptp = (LPTASKPACKET)lp) != NULL)
190 if (ptp->idTask == taskSVR_ADMLIST_OPEN)
191 Server_Lists_OnEndTask_ListOpen (hDlg, lpp, ptp);
192 FreeTaskPacket (ptp);
200 Server_Lists_OnApply (hDlg, lpp);
204 Server_Lists_OnAddEntry (hDlg, lpp);
205 PropSheetChanged (hDlg);
208 case IDC_LIST_REMOVE:
209 Server_Lists_OnDelEntry (hDlg, lpp);
210 PropSheetChanged (hDlg);
216 switch (((LPNMHDR)lp)->code)
219 if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_LIST_LIST))
221 Server_Lists_OnSelect (hDlg, lpp);
232 void Server_Lists_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
234 TCHAR szOld[ cchRESOURCE ];
235 GetDlgItemText (hDlg, IDC_LIST_NAME, szOld, cchRESOURCE);
237 TCHAR szServer[ cchNAME ];
238 lpp->lpiServer->GetServerName (szServer);
240 LPTSTR pszText = FormatString (szOld, TEXT("%s"), szServer);
241 SetDlgItemText (hDlg, IDC_LIST_NAME, pszText);
242 FreeString (pszText);
244 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
246 // We'll need an imagelist, if we want icons in the list.
249 if ((hLarge = ImageList_Create (32, 32, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0)
250 AfsAppLib_AddToImageList (hLarge, IDI_USER, TRUE);
253 if ((hSmall = ImageList_Create (16, 16, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0)
254 AfsAppLib_AddToImageList (hSmall, IDI_USER, FALSE);
256 FastList_SetImageLists (hList, hSmall, hLarge);
258 // Start loading the admin list
260 StartTask (taskSVR_ADMLIST_OPEN, hDlg, lpp->lpiServer);
262 EnableWindow (hList, FALSE);
263 EnableWindow (GetDlgItem (hDlg, IDC_LIST_ADD), FALSE);
264 EnableWindow (GetDlgItem (hDlg, IDC_LIST_REMOVE), FALSE);
268 void Server_Lists_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp)
270 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
272 lpp->lpAdmList = TASKDATA(ptp)->lpAdmList;
276 FL_StartChange (hList, TRUE);
280 for (size_t iEntry = 0; iEntry < lpp->lpAdmList->cEntries; ++iEntry)
282 LPADMINLISTENTRY pEntry = &lpp->lpAdmList->aEntries[ iEntry ];
283 if (pEntry->szAdmin[0] == TEXT('\0'))
286 FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pEntry->szAdmin);
290 FL_EndChange (hList, 0);
291 EnableWindow (hList, (lpp->lpAdmList != NULL));
292 EnableWindow (GetDlgItem (hDlg, IDC_LIST_ADD), (lpp->lpAdmList != NULL));
294 Server_Lists_OnSelect (hDlg, lpp);
298 void Server_Lists_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
300 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
302 BOOL fEnableRemove = TRUE;
304 if (!IsWindowEnabled (hList))
305 fEnableRemove = FALSE;
307 if (FastList_FindFirstSelected (hList) == NULL)
308 fEnableRemove = FALSE;
310 EnableWindow (GetDlgItem (hDlg, IDC_LIST_REMOVE), fEnableRemove);
314 void Server_Lists_OnApply (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
316 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_LIST_LIST)))
318 // Increment the reference counter on this admin list before handing
319 // it off to the Save task. When the Save task is done, it will attempt
320 // to free the list--which will decrement the counter again, and
321 // actually free the list if the counter hits zero.
323 InterlockedIncrement (&lpp->lpAdmList->cRef);
324 StartTask (taskSVR_ADMLIST_SAVE, NULL, lpp->lpAdmList);
329 void Server_Lists_OnAddEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
331 TCHAR szLocalCell[ cchNAME ];
332 g.lpiCell->GetCellName (szLocalCell);
335 memset (&pp, 0x00, sizeof(BROWSEDLG_PARAMS));
337 pp.idsTitle = IDS_TITLE_BROWSE_USER;
338 pp.idsPrompt = IDS_PROMPT_BROWSE_USER;
339 pp.bt = btLOCAL_USER;
340 lstrcpy (pp.szCell, szLocalCell);
341 pp.lpcl = AfsAppLib_GetCellList (HKCU, REGSTR_SETTINGS_CELLS);
342 pp.szNamed[0] = TEXT('\0');
343 pp.hCreds = g.hCreds;
345 if (!AfsAppLib_ShowBrowseDialog (&pp))
347 AfsAppLib_FreeCellList (pp.lpcl);
351 AfsAppLib_FreeCellList (pp.lpcl);
354 for (iEntry = 0; iEntry < lpp->lpAdmList->cEntries; ++iEntry)
356 LPADMINLISTENTRY pEntry = &lpp->lpAdmList->aEntries[ iEntry ];
357 if (pEntry->szAdmin[0] == TEXT('\0'))
360 if (!lstrcmpi (pEntry->szAdmin, pp.szNamed))
364 if (iEntry >= lpp->lpAdmList->cEntries)
366 iEntry = AfsClass_AdminList_AddEntry (lpp->lpAdmList, pp.szNamed);
369 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
370 FL_StartChange (hList, FALSE);
373 if ((hItem = FastList_FindItem (hList, (LPARAM)iEntry)) == NULL)
375 hItem = FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pp.szNamed);
378 FL_EndChange (hList, (LPARAM)hItem);
382 void Server_Lists_OnDelEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
384 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
385 FL_StartChange (hList, FALSE);
388 while ((hItem = FastList_FindFirstSelected (hList)) != NULL)
390 size_t iEntry = (size_t)FL_GetData (hList, hItem);
391 AfsClass_AdminList_DelEntry (lpp->lpAdmList, iEntry);
392 FastList_RemoveItem (hList, hItem);
395 FL_EndChange (hList);
399 BOOL CALLBACK Server_Keys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
401 if (AfsAppLib_HandleHelp (IDD_SVR_KEYS, hDlg, msg, wp, lp))
404 LPSVR_SECURITY_PARAMS lpp;
405 if ((msg == WM_INITDIALOG_SHEET) || (msg == WM_DESTROY_SHEET))
406 lpp = (LPSVR_SECURITY_PARAMS)lp;
408 lpp = (LPSVR_SECURITY_PARAMS)PropSheet_FindTabParam (hDlg);
412 case WM_INITDIALOG_SHEET:
413 InterlockedIncrement (&lpp->cRef);
416 case WM_DESTROY_SHEET:
417 if ((InterlockedDecrement (&lpp->cRef)) == 0)
418 Server_Security_Free (lpp);
422 Server_Keys_OnInitDialog (hDlg, lpp);
426 FL_StoreView (GetDlgItem (hDlg, IDC_KEY_LIST), &gr.viewKey);
431 if ((ptp = (LPTASKPACKET)lp) != NULL)
433 if (ptp->idTask == taskSVR_KEYLIST_OPEN)
434 Server_Keys_OnEndTask_ListOpen (hDlg, lpp, ptp);
435 else if (ptp->idTask == taskSVR_KEY_CREATE)
436 Server_Keys_OnEndTask_CreateKey (hDlg, lpp, ptp);
437 else if (ptp->idTask == taskSVR_KEY_DELETE)
438 Server_Keys_OnEndTask_DeleteKey (hDlg, lpp, ptp);
439 FreeTaskPacket (ptp);
447 Server_Keys_OnAddKey (hDlg, lpp);
451 Server_Keys_OnDelKey (hDlg, lpp);
457 switch (((LPNMHDR)lp)->code)
460 if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_KEY_LIST))
462 Server_Keys_OnSelect (hDlg, lpp);
473 void Server_Keys_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
475 TCHAR szServer[ cchNAME ];
476 lpp->lpiServer->GetServerName (szServer);
478 LPTSTR pszText = FormatString (IDS_KEYNAME_NOTIME, TEXT("%s"), szServer);
479 SetDlgItemText (hDlg, IDC_KEY_NAME, pszText);
480 FreeString (pszText);
482 HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST);
483 FL_RestoreView (hList, &gr.viewKey);
484 FastList_SetSortFunction (hList, FastList_SortFunc_Numeric);
485 FastList_SetSortStyle (hList, 0, FALSE);
487 // We'll need an imagelist, if we want icons in the list.
489 HIMAGELIST hSmall = AfsAppLib_CreateImageList (FALSE);
490 FastList_SetImageLists (hList, hSmall, NULL);
492 // Start loading the server keys
494 StartTask (taskSVR_KEYLIST_OPEN, hDlg, lpp->lpiServer);
496 EnableWindow (hList, FALSE);
497 EnableWindow (GetDlgItem (hDlg, IDC_KEY_ADD), FALSE);
498 EnableWindow (GetDlgItem (hDlg, IDC_KEY_REMOVE), FALSE);
502 void Server_Keys_OnEndTask_CreateKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp)
504 StartTask (taskSVR_KEYLIST_OPEN, hDlg, lpp->lpiServer);
508 void Server_Keys_OnEndTask_DeleteKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp)
510 StartTask (taskSVR_KEYLIST_OPEN, hDlg, lpp->lpiServer);
514 void Server_Keys_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp)
516 HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST);
519 AfsClass_KeyList_Free (lpp->lpKeyList);
520 lpp->lpKeyList = TASKDATA(ptp)->lpKeyList;
524 LPARAM iVerSelect = FL_StartChange (hList, TRUE);
526 SYSTEMTIME stLastMod;
527 memset (&stLastMod, 0x00, sizeof(stLastMod));
531 for (size_t iKey = 0; iKey < lpp->lpKeyList->cKeys; ++iKey)
533 LPSERVERKEY pKey = &lpp->lpKeyList->aKeys[ iKey ];
534 if (!ISKEYINUSE(pKey))
537 TCHAR szVersion[ cchRESOURCE ];
538 wsprintf (szVersion, TEXT("%lu"), pKey->keyVersion);
540 TCHAR szValue[ cchRESOURCE ];
541 FormatServerKey (szValue, &pKey->keyData);
543 TCHAR szChecksum[ cchRESOURCE ];
544 wsprintf (szChecksum, TEXT("%lu"), pKey->keyInfo.dwChecksum);
546 FL_AddItem (hList, &gr.viewKey, (LPARAM)pKey->keyVersion, imageSERVERKEY, szVersion, szValue, szChecksum);
548 stLastMod = pKey->keyInfo.timeLastModification;
552 FL_EndChange (hList, iVerSelect);
553 EnableWindow (hList, (lpp->lpKeyList != NULL));
554 EnableWindow (GetDlgItem (hDlg, IDC_KEY_ADD), (lpp->lpKeyList != NULL));
558 if (lpp->lpKeyList && stLastMod.wYear)
560 TCHAR szServer[ cchNAME ];
561 lpp->lpiServer->GetServerName (szServer);
563 LPTSTR pszText = FormatString (IDS_KEYNAME_WITHTIME, TEXT("%s%t"), szServer, &stLastMod);
564 SetDlgItemText (hDlg, IDC_KEY_NAME, pszText);
565 FreeString (pszText);
568 Server_Lists_OnSelect (hDlg, lpp);
572 void Server_Keys_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
574 HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST);
576 BOOL fEnableRemove = TRUE;
578 if (!IsWindowEnabled (hList))
579 fEnableRemove = FALSE;
581 if (FastList_FindFirstSelected (hList) == NULL)
582 fEnableRemove = FALSE;
584 EnableWindow (GetDlgItem (hDlg, IDC_KEY_REMOVE), fEnableRemove);
588 void Server_Keys_OnAddKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
590 LPKEY_CREATE_PARAMS lpCreate = New (KEY_CREATE_PARAMS);
591 memset (lpCreate, 0x00, sizeof(KEY_CREATE_PARAMS));
592 lpCreate->lpiServer = lpp->lpiServer;
593 lpCreate->keyVersion = 0;
595 for (size_t iKey = 0; iKey < lpp->lpKeyList->cKeys; ++iKey)
597 LPSERVERKEY pKey = &lpp->lpKeyList->aKeys[ iKey ];
598 if (!ISKEYINUSE(pKey))
600 lpCreate->keyVersion = max (lpCreate->keyVersion, 1+pKey->keyVersion);
603 if (ModalDialogParam (IDD_SVR_CREATEKEY, hDlg, (DLGPROC)CreateKey_DlgProc, (LPARAM)lpCreate) != IDOK)
609 StartTask (taskSVR_KEY_CREATE, hDlg, lpCreate);
614 void Server_Keys_OnDelKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
616 HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST);
619 if ((hItem = FastList_FindFirstSelected (hList)) != NULL)
621 LPKEY_DELETE_PARAMS lpDel = New (KEY_DELETE_PARAMS);
622 lpDel->lpiServer = lpp->lpiServer;
623 lpDel->keyVersion = (int)FL_GetData (hList, hItem);
624 StartTask (taskSVR_KEY_DELETE, hDlg, lpDel);
629 void FormatServerKey (LPTSTR psz, LPENCRYPTIONKEY pKey)
632 for (ii = 0; ii < ENCRYPTIONKEY_LEN; ++ii)
637 if (ii == ENCRYPTIONKEY_LEN)
639 GetString (psz, IDS_SVRKEY_DATA_UNKNOWN);
643 for (ii = 0; ii < ENCRYPTIONKEY_LEN; ++ii)
645 WORD ch1 = (WORD)(pKey->key[ii]) / 64;
646 WORD ch2 = ((WORD)(pKey->key[ii]) - (ch1 * 64)) / 8;
647 WORD ch3 = ((WORD)(pKey->key[ii]) - (ch1 * 64) - (ch2 * 8));
648 wsprintf (psz, TEXT("\\%0d%0d%0d"), ch1, ch2, ch3);
656 BOOL ScanServerKey (LPENCRYPTIONKEY pKey, LPTSTR psz)
659 for (ich = 0; psz && *psz; )
661 if (ich == ENCRYPTIONKEY_LEN)
666 pKey->key[ ich++ ] = (BYTE)*psz++;
670 if ((lstrlen(psz) < 4) || (!isdigit(*(1+psz))))
673 ++psz; // skip the backslash
674 WORD ch1 = (WORD)((*psz++) - TEXT('0'));
675 WORD ch2 = (WORD)((*psz++) - TEXT('0'));
676 WORD ch3 = (WORD)((*psz++) - TEXT('0'));
677 pKey->key[ ich++ ] = (BYTE)( ch1 * 64 + ch2 * 8 + ch3 );
680 return (ich == ENCRYPTIONKEY_LEN) ? TRUE : FALSE;
684 BOOL CALLBACK CreateKey_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
686 static LPKEY_CREATE_PARAMS lpp = NULL;
691 lpp = (LPKEY_CREATE_PARAMS)lp;
692 CreateKey_OnInitDialog (hDlg, lpp);
701 if ((ptp = (LPTASKPACKET)lp) != NULL)
703 if (ptp->idTask == taskSVR_GETRANDOMKEY)
704 CreateKey_OnEndTask_Random (hDlg, ptp);
705 FreeTaskPacket (ptp);
713 if (CreateKey_OnOK (hDlg, lpp))
714 EndDialog (hDlg, IDOK);
718 EndDialog (hDlg, IDCANCEL);
721 case IDC_KEY_BYSTRING:
723 CreateKey_OnSelect (hDlg);
728 CreateKey_OnType (hDlg);
732 CreateKey_OnRandom (hDlg, lpp);
742 void CreateKey_OnInitDialog (HWND hDlg, LPKEY_CREATE_PARAMS lpp)
744 TCHAR szOld[ cchRESOURCE ];
745 GetDlgItemText (hDlg, IDC_KEY_TITLE, szOld, cchRESOURCE);
747 TCHAR szServer[ cchNAME ];
748 lpp->lpiServer->GetServerName (szServer);
750 LPTSTR pszText = FormatString (szOld, TEXT("%s"), szServer);
751 SetDlgItemText (hDlg, IDC_KEY_TITLE, pszText);
752 FreeString (pszText);
754 CheckDlgButton (hDlg, IDC_KEY_BYSTRING, TRUE);
755 SetDlgItemText (hDlg, IDC_KEY_STRING, lpp->szString);
757 CreateSpinner (GetDlgItem (hDlg, IDC_KEY_VERSION), 10, FALSE, 0, lpp->keyVersion, 255);
758 CreateKey_OnSelect (hDlg);
762 void CreateKey_OnSelect (HWND hDlg)
764 EnableWindow (GetDlgItem (hDlg, IDC_KEY_STRING), IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING));
765 EnableWindow (GetDlgItem (hDlg, IDC_KEY_DATA), IsDlgButtonChecked (hDlg, IDC_KEY_BYDATA));
766 EnableWindow (GetDlgItem (hDlg, IDC_KEY_RANDOM), IsDlgButtonChecked (hDlg, IDC_KEY_BYDATA));
767 CreateKey_OnType (hDlg);
771 void CreateKey_OnType (HWND hDlg)
773 BOOL fEnable = FALSE;
775 if (IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING))
777 TCHAR szKey[ cchRESOURCE ];
778 GetDlgItemText (hDlg, IDC_KEY_STRING, szKey, cchRESOURCE);
779 if (szKey[0] != TEXT('\0'))
782 else // (IsDlgButtonChecked (hDlg, IDC_KEY_BYDATA))
784 TCHAR szKey[ cchRESOURCE ];
785 GetDlgItemText (hDlg, IDC_KEY_DATA, szKey, cchRESOURCE);
788 if (ScanServerKey (&key, szKey))
792 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
796 void CreateKey_OnRandom (HWND hDlg, LPKEY_CREATE_PARAMS lpp)
798 StartTask (taskSVR_GETRANDOMKEY, hDlg, lpp->lpiServer);
802 BOOL CreateKey_OnOK (HWND hDlg, LPKEY_CREATE_PARAMS lpp)
804 if (IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING))
806 GetDlgItemText (hDlg, IDC_KEY_STRING, lpp->szString, cchRESOURCE);
808 else // (!IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING))
810 TCHAR szKey[ cchRESOURCE ];
811 GetDlgItemText (hDlg, IDC_KEY_DATA, szKey, cchRESOURCE);
813 if (!ScanServerKey (&lpp->key, szKey))
817 lpp->keyVersion = (int) SP_GetPos (GetDlgItem (hDlg, IDC_KEY_VERSION));
822 void CreateKey_OnEndTask_Random (HWND hDlg, LPTASKPACKET ptp)
826 EnableWindow (GetDlgItem (hDlg, IDC_KEY_RANDOM), FALSE);
830 TCHAR szKey[ cchRESOURCE ];
831 FormatServerKey (szKey, &TASKDATA(ptp)->key);
832 SetDlgItemText (hDlg, IDC_KEY_DATA, szKey);