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
11 #include <afs/param.h>
16 #include "svr_security.h"
17 #include "propcache.h"
22 * DEFINITIONS ________________________________________________________________
26 #define ISKEYINUSE(_pkey) ((_pkey)->keyInfo.timeLastModification.wYear != 0)
32 LPADMINLIST lpAdmList;
34 } SVR_SECURITY_PARAMS, *LPSVR_SECURITY_PARAMS;
38 * PROTOTYPES _________________________________________________________________
42 void Server_Security_Free (LPSVR_SECURITY_PARAMS lpp);
44 BOOL CALLBACK Server_Lists_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
46 void Server_Lists_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
47 void Server_Lists_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp);
48 void Server_Lists_OnApply (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
49 void Server_Lists_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
50 void Server_Lists_OnAddEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
51 void Server_Lists_OnDelEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
53 BOOL CALLBACK Server_Keys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
54 void Server_Keys_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
55 void Server_Keys_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp);
56 void Server_Keys_OnEndTask_CreateKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp);
57 void Server_Keys_OnEndTask_DeleteKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp);
58 void Server_Keys_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
59 void Server_Keys_OnAddKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
60 void Server_Keys_OnDelKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp);
62 void FormatServerKey (LPTSTR psz, LPENCRYPTIONKEY pKey);
63 BOOL ScanServerKey (LPENCRYPTIONKEY pKey, LPTSTR psz);
65 BOOL CALLBACK CreateKey_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
66 void CreateKey_OnInitDialog (HWND hDlg, LPKEY_CREATE_PARAMS lpp);
67 void CreateKey_OnSelect (HWND hDlg);
68 void CreateKey_OnType (HWND hDlg);
69 void CreateKey_OnRandom (HWND hDlg, LPKEY_CREATE_PARAMS lpp);
70 BOOL CreateKey_OnOK (HWND hDlg, LPKEY_CREATE_PARAMS lpp);
71 void CreateKey_OnEndTask_Random (HWND hDlg, LPTASKPACKET ptp);
75 * SERVER-KEY COLUMNS _________________________________________________________
79 void Server_Key_SetDefaultView (LPVIEWINFO lpvi)
81 lpvi->lvsView = FLS_VIEW_LIST;
82 lpvi->nColsAvail = nSERVERKEYCOLUMNS;
84 for (size_t iCol = 0; iCol < nSERVERKEYCOLUMNS; ++iCol)
86 lpvi->cxColumns[ iCol ] = SERVERKEYCOLUMNS[ iCol ].cxWidth;
87 lpvi->idsColumns[ iCol ] = SERVERKEYCOLUMNS[ iCol ].idsColumn;
90 lpvi->iSort = svrkeyVERSION;
93 lpvi->aColumns[0] = (int)svrkeyVERSION;
94 lpvi->aColumns[1] = (int)svrkeyDATA;
95 lpvi->aColumns[2] = (int)svrkeyCHECKSUM;
100 * ROUTINES ___________________________________________________________________
104 void Server_Security (LPIDENT lpiServer, BOOL fJumpToKeys)
107 if ((hCurrent = PropCache_Search (pcSVR_SECURITY, lpiServer)) != NULL)
114 if ((hTab = GetDlgItem (hCurrent, IDC_PROPSHEET_TABCTRL)) != NULL)
116 int nTabs = TabCtrl_GetItemCount (hTab);
117 TabCtrl_SetCurSel (hTab, nTabs-1);
121 nm.idFrom = IDC_PROPSHEET_TABCTRL;
122 nm.code = TCN_SELCHANGE;
123 SendMessage (hCurrent, WM_NOTIFY, 0, (LPARAM)&nm);
129 LPSVR_SECURITY_PARAMS lpp = New (SVR_SECURITY_PARAMS);
130 memset (lpp, 0x00, sizeof(SVR_SECURITY_PARAMS));
131 lpp->lpiServer = lpiServer;
133 TCHAR szServer[ cchNAME ];
134 lpiServer->GetServerName (szServer);
135 LPTSTR pszTitle = FormatString (IDS_SVR_SECURITY_TITLE, TEXT("%s"), szServer);
136 LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE);
137 PropSheet_AddTab (psh, IDS_SVR_LIST_TAB, IDD_SVR_LISTS, (DLGPROC)Server_Lists_DlgProc, (LONG)lpp, TRUE, !fJumpToKeys);
138 PropSheet_AddTab (psh, IDS_SVR_KEY_TAB, IDD_SVR_KEYS, (DLGPROC)Server_Keys_DlgProc, (LONG)lpp, TRUE, fJumpToKeys);
139 PropSheet_ShowModeless (psh);
140 FreeString (pszTitle);
145 void Server_Security_Free (LPSVR_SECURITY_PARAMS lpp)
148 AfsClass_AdminList_Free (lpp->lpAdmList);
150 AfsClass_KeyList_Free (lpp->lpKeyList);
155 BOOL CALLBACK Server_Lists_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
157 if (AfsAppLib_HandleHelp (IDD_SVR_LISTS, hDlg, msg, wp, lp))
160 LPSVR_SECURITY_PARAMS lpp;
161 if ((msg == WM_INITDIALOG_SHEET) || (msg == WM_DESTROY_SHEET))
162 lpp = (LPSVR_SECURITY_PARAMS)lp;
164 lpp = (LPSVR_SECURITY_PARAMS)PropSheet_FindTabParam (hDlg);
168 case WM_INITDIALOG_SHEET:
169 InterlockedIncrement (&lpp->cRef);
170 PropCache_Add (pcSVR_SECURITY, lpp->lpiServer, hDlg);
173 case WM_DESTROY_SHEET:
174 PropCache_Delete (hDlg);
175 if ((InterlockedDecrement (&lpp->cRef)) == 0)
176 Server_Security_Free (lpp);
180 Server_Lists_OnInitDialog (hDlg, lpp);
185 if ((ptp = (LPTASKPACKET)lp) != NULL)
187 if (ptp->idTask == taskSVR_ADMLIST_OPEN)
188 Server_Lists_OnEndTask_ListOpen (hDlg, lpp, ptp);
189 FreeTaskPacket (ptp);
197 Server_Lists_OnApply (hDlg, lpp);
201 Server_Lists_OnAddEntry (hDlg, lpp);
202 PropSheetChanged (hDlg);
205 case IDC_LIST_REMOVE:
206 Server_Lists_OnDelEntry (hDlg, lpp);
207 PropSheetChanged (hDlg);
213 switch (((LPNMHDR)lp)->code)
216 if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_LIST_LIST))
218 Server_Lists_OnSelect (hDlg, lpp);
229 void Server_Lists_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
231 TCHAR szOld[ cchRESOURCE ];
232 GetDlgItemText (hDlg, IDC_LIST_NAME, szOld, cchRESOURCE);
234 TCHAR szServer[ cchNAME ];
235 lpp->lpiServer->GetServerName (szServer);
237 LPTSTR pszText = FormatString (szOld, TEXT("%s"), szServer);
238 SetDlgItemText (hDlg, IDC_LIST_NAME, pszText);
239 FreeString (pszText);
241 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
243 // We'll need an imagelist, if we want icons in the list.
246 if ((hLarge = ImageList_Create (32, 32, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0)
247 AfsAppLib_AddToImageList (hLarge, IDI_USER, TRUE);
250 if ((hSmall = ImageList_Create (16, 16, ILC_COLOR4 | ILC_MASK, 1, 1)) != 0)
251 AfsAppLib_AddToImageList (hSmall, IDI_USER, FALSE);
253 FastList_SetImageLists (hList, hSmall, hLarge);
255 // Start loading the admin list
257 StartTask (taskSVR_ADMLIST_OPEN, hDlg, lpp->lpiServer);
259 EnableWindow (hList, FALSE);
260 EnableWindow (GetDlgItem (hDlg, IDC_LIST_ADD), FALSE);
261 EnableWindow (GetDlgItem (hDlg, IDC_LIST_REMOVE), FALSE);
265 void Server_Lists_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp)
267 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
269 lpp->lpAdmList = TASKDATA(ptp)->lpAdmList;
273 FL_StartChange (hList, TRUE);
277 for (size_t iEntry = 0; iEntry < lpp->lpAdmList->cEntries; ++iEntry)
279 LPADMINLISTENTRY pEntry = &lpp->lpAdmList->aEntries[ iEntry ];
280 if (pEntry->szAdmin[0] == TEXT('\0'))
283 FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pEntry->szAdmin);
287 FL_EndChange (hList, 0);
288 EnableWindow (hList, (lpp->lpAdmList != NULL));
289 EnableWindow (GetDlgItem (hDlg, IDC_LIST_ADD), (lpp->lpAdmList != NULL));
291 Server_Lists_OnSelect (hDlg, lpp);
295 void Server_Lists_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
297 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
299 BOOL fEnableRemove = TRUE;
301 if (!IsWindowEnabled (hList))
302 fEnableRemove = FALSE;
304 if (FastList_FindFirstSelected (hList) == NULL)
305 fEnableRemove = FALSE;
307 EnableWindow (GetDlgItem (hDlg, IDC_LIST_REMOVE), fEnableRemove);
311 void Server_Lists_OnApply (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
313 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_LIST_LIST)))
315 // Increment the reference counter on this admin list before handing
316 // it off to the Save task. When the Save task is done, it will attempt
317 // to free the list--which will decrement the counter again, and
318 // actually free the list if the counter hits zero.
320 InterlockedIncrement (&lpp->lpAdmList->cRef);
321 StartTask (taskSVR_ADMLIST_SAVE, NULL, lpp->lpAdmList);
326 void Server_Lists_OnAddEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
328 TCHAR szLocalCell[ cchNAME ];
329 g.lpiCell->GetCellName (szLocalCell);
332 memset (&pp, 0x00, sizeof(BROWSEDLG_PARAMS));
334 pp.idsTitle = IDS_TITLE_BROWSE_USER;
335 pp.idsPrompt = IDS_PROMPT_BROWSE_USER;
336 pp.bt = btLOCAL_USER;
337 lstrcpy (pp.szCell, szLocalCell);
338 pp.lpcl = AfsAppLib_GetCellList (HKCU, REGSTR_SETTINGS_CELLS);
339 pp.szNamed[0] = TEXT('\0');
340 pp.hCreds = g.hCreds;
342 if (!AfsAppLib_ShowBrowseDialog (&pp))
344 AfsAppLib_FreeCellList (pp.lpcl);
348 AfsAppLib_FreeCellList (pp.lpcl);
350 for (size_t iEntry = 0; iEntry < lpp->lpAdmList->cEntries; ++iEntry)
352 LPADMINLISTENTRY pEntry = &lpp->lpAdmList->aEntries[ iEntry ];
353 if (pEntry->szAdmin[0] == TEXT('\0'))
356 if (!lstrcmpi (pEntry->szAdmin, pp.szNamed))
360 if (iEntry >= lpp->lpAdmList->cEntries)
362 iEntry = AfsClass_AdminList_AddEntry (lpp->lpAdmList, pp.szNamed);
365 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
366 FL_StartChange (hList, FALSE);
369 if ((hItem = FastList_FindItem (hList, (LPARAM)iEntry)) == NULL)
371 hItem = FL_AddItem (hList, 1, (LPARAM)iEntry, 0, pp.szNamed);
374 FL_EndChange (hList, (LPARAM)hItem);
378 void Server_Lists_OnDelEntry (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
380 HWND hList = GetDlgItem (hDlg, IDC_LIST_LIST);
381 FL_StartChange (hList, FALSE);
384 while ((hItem = FastList_FindFirstSelected (hList)) != NULL)
386 size_t iEntry = (size_t)FL_GetData (hList, hItem);
387 AfsClass_AdminList_DelEntry (lpp->lpAdmList, iEntry);
388 FastList_RemoveItem (hList, hItem);
391 FL_EndChange (hList);
395 BOOL CALLBACK Server_Keys_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
397 if (AfsAppLib_HandleHelp (IDD_SVR_KEYS, hDlg, msg, wp, lp))
400 LPSVR_SECURITY_PARAMS lpp;
401 if ((msg == WM_INITDIALOG_SHEET) || (msg == WM_DESTROY_SHEET))
402 lpp = (LPSVR_SECURITY_PARAMS)lp;
404 lpp = (LPSVR_SECURITY_PARAMS)PropSheet_FindTabParam (hDlg);
408 case WM_INITDIALOG_SHEET:
409 InterlockedIncrement (&lpp->cRef);
412 case WM_DESTROY_SHEET:
413 if ((InterlockedDecrement (&lpp->cRef)) == 0)
414 Server_Security_Free (lpp);
418 Server_Keys_OnInitDialog (hDlg, lpp);
422 FL_StoreView (GetDlgItem (hDlg, IDC_KEY_LIST), &gr.viewKey);
427 if ((ptp = (LPTASKPACKET)lp) != NULL)
429 if (ptp->idTask == taskSVR_KEYLIST_OPEN)
430 Server_Keys_OnEndTask_ListOpen (hDlg, lpp, ptp);
431 else if (ptp->idTask == taskSVR_KEY_CREATE)
432 Server_Keys_OnEndTask_CreateKey (hDlg, lpp, ptp);
433 else if (ptp->idTask == taskSVR_KEY_DELETE)
434 Server_Keys_OnEndTask_DeleteKey (hDlg, lpp, ptp);
435 FreeTaskPacket (ptp);
443 Server_Keys_OnAddKey (hDlg, lpp);
447 Server_Keys_OnDelKey (hDlg, lpp);
453 switch (((LPNMHDR)lp)->code)
456 if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_KEY_LIST))
458 Server_Keys_OnSelect (hDlg, lpp);
469 void Server_Keys_OnInitDialog (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
471 TCHAR szServer[ cchNAME ];
472 lpp->lpiServer->GetServerName (szServer);
474 LPTSTR pszText = FormatString (IDS_KEYNAME_NOTIME, TEXT("%s"), szServer);
475 SetDlgItemText (hDlg, IDC_KEY_NAME, pszText);
476 FreeString (pszText);
478 HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST);
479 FL_RestoreView (hList, &gr.viewKey);
480 FastList_SetSortFunction (hList, FastList_SortFunc_Numeric);
481 FastList_SetSortStyle (hList, 0, FALSE);
483 // We'll need an imagelist, if we want icons in the list.
485 HIMAGELIST hSmall = AfsAppLib_CreateImageList (FALSE);
486 FastList_SetImageLists (hList, hSmall, NULL);
488 // Start loading the server keys
490 StartTask (taskSVR_KEYLIST_OPEN, hDlg, lpp->lpiServer);
492 EnableWindow (hList, FALSE);
493 EnableWindow (GetDlgItem (hDlg, IDC_KEY_ADD), FALSE);
494 EnableWindow (GetDlgItem (hDlg, IDC_KEY_REMOVE), FALSE);
498 void Server_Keys_OnEndTask_CreateKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp)
500 StartTask (taskSVR_KEYLIST_OPEN, hDlg, lpp->lpiServer);
504 void Server_Keys_OnEndTask_DeleteKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp)
506 StartTask (taskSVR_KEYLIST_OPEN, hDlg, lpp->lpiServer);
510 void Server_Keys_OnEndTask_ListOpen (HWND hDlg, LPSVR_SECURITY_PARAMS lpp, LPTASKPACKET ptp)
512 HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST);
515 AfsClass_KeyList_Free (lpp->lpKeyList);
516 lpp->lpKeyList = TASKDATA(ptp)->lpKeyList;
520 LPARAM iVerSelect = FL_StartChange (hList, TRUE);
522 SYSTEMTIME stLastMod;
523 memset (&stLastMod, 0x00, sizeof(stLastMod));
527 for (size_t iKey = 0; iKey < lpp->lpKeyList->cKeys; ++iKey)
529 LPSERVERKEY pKey = &lpp->lpKeyList->aKeys[ iKey ];
530 if (!ISKEYINUSE(pKey))
533 TCHAR szVersion[ cchRESOURCE ];
534 wsprintf (szVersion, TEXT("%lu"), pKey->keyVersion);
536 TCHAR szValue[ cchRESOURCE ];
537 FormatServerKey (szValue, &pKey->keyData);
539 TCHAR szChecksum[ cchRESOURCE ];
540 wsprintf (szChecksum, TEXT("%lu"), pKey->keyInfo.dwChecksum);
542 FL_AddItem (hList, &gr.viewKey, (LPARAM)pKey->keyVersion, imageSERVERKEY, szVersion, szValue, szChecksum);
544 stLastMod = pKey->keyInfo.timeLastModification;
548 FL_EndChange (hList, iVerSelect);
549 EnableWindow (hList, (lpp->lpKeyList != NULL));
550 EnableWindow (GetDlgItem (hDlg, IDC_KEY_ADD), (lpp->lpKeyList != NULL));
554 if (lpp->lpKeyList && stLastMod.wYear)
556 TCHAR szServer[ cchNAME ];
557 lpp->lpiServer->GetServerName (szServer);
559 LPTSTR pszText = FormatString (IDS_KEYNAME_WITHTIME, TEXT("%s%t"), szServer, &stLastMod);
560 SetDlgItemText (hDlg, IDC_KEY_NAME, pszText);
561 FreeString (pszText);
564 Server_Lists_OnSelect (hDlg, lpp);
568 void Server_Keys_OnSelect (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
570 HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST);
572 BOOL fEnableRemove = TRUE;
574 if (!IsWindowEnabled (hList))
575 fEnableRemove = FALSE;
577 if (FastList_FindFirstSelected (hList) == NULL)
578 fEnableRemove = FALSE;
580 EnableWindow (GetDlgItem (hDlg, IDC_KEY_REMOVE), fEnableRemove);
584 void Server_Keys_OnAddKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
586 LPKEY_CREATE_PARAMS lpCreate = New (KEY_CREATE_PARAMS);
587 memset (lpCreate, 0x00, sizeof(KEY_CREATE_PARAMS));
588 lpCreate->lpiServer = lpp->lpiServer;
589 lpCreate->keyVersion = 0;
591 for (size_t iKey = 0; iKey < lpp->lpKeyList->cKeys; ++iKey)
593 LPSERVERKEY pKey = &lpp->lpKeyList->aKeys[ iKey ];
594 if (!ISKEYINUSE(pKey))
596 lpCreate->keyVersion = max (lpCreate->keyVersion, 1+pKey->keyVersion);
599 if (ModalDialogParam (IDD_SVR_CREATEKEY, hDlg, (DLGPROC)CreateKey_DlgProc, (LPARAM)lpCreate) != IDOK)
605 StartTask (taskSVR_KEY_CREATE, hDlg, lpCreate);
610 void Server_Keys_OnDelKey (HWND hDlg, LPSVR_SECURITY_PARAMS lpp)
612 HWND hList = GetDlgItem (hDlg, IDC_KEY_LIST);
615 if ((hItem = FastList_FindFirstSelected (hList)) != NULL)
617 LPKEY_DELETE_PARAMS lpDel = New (KEY_DELETE_PARAMS);
618 lpDel->lpiServer = lpp->lpiServer;
619 lpDel->keyVersion = (int)FL_GetData (hList, hItem);
620 StartTask (taskSVR_KEY_DELETE, hDlg, lpDel);
625 void FormatServerKey (LPTSTR psz, LPENCRYPTIONKEY pKey)
627 for (size_t ii = 0; ii < ENCRYPTIONKEY_LEN; ++ii)
632 if (ii == ENCRYPTIONKEY_LEN)
634 GetString (psz, IDS_SVRKEY_DATA_UNKNOWN);
638 for (ii = 0; ii < ENCRYPTIONKEY_LEN; ++ii)
640 WORD ch1 = (WORD)(pKey->key[ii]) / 64;
641 WORD ch2 = ((WORD)(pKey->key[ii]) - (ch1 * 64)) / 8;
642 WORD ch3 = ((WORD)(pKey->key[ii]) - (ch1 * 64) - (ch2 * 8));
643 wsprintf (psz, TEXT("\\%0d%0d%0d"), ch1, ch2, ch3);
651 BOOL ScanServerKey (LPENCRYPTIONKEY pKey, LPTSTR psz)
653 for (size_t ich = 0; psz && *psz; )
655 if (ich == ENCRYPTIONKEY_LEN)
660 pKey->key[ ich++ ] = (BYTE)*psz++;
664 if ((lstrlen(psz) < 4) || (!isdigit(*(1+psz))))
667 ++psz; // skip the backslash
668 WORD ch1 = (WORD)((*psz++) - TEXT('0'));
669 WORD ch2 = (WORD)((*psz++) - TEXT('0'));
670 WORD ch3 = (WORD)((*psz++) - TEXT('0'));
671 pKey->key[ ich++ ] = (BYTE)( ch1 * 64 + ch2 * 8 + ch3 );
674 return (ich == ENCRYPTIONKEY_LEN) ? TRUE : FALSE;
678 BOOL CALLBACK CreateKey_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
680 static LPKEY_CREATE_PARAMS lpp = NULL;
685 lpp = (LPKEY_CREATE_PARAMS)lp;
686 CreateKey_OnInitDialog (hDlg, lpp);
695 if ((ptp = (LPTASKPACKET)lp) != NULL)
697 if (ptp->idTask == taskSVR_GETRANDOMKEY)
698 CreateKey_OnEndTask_Random (hDlg, ptp);
699 FreeTaskPacket (ptp);
707 if (CreateKey_OnOK (hDlg, lpp))
708 EndDialog (hDlg, IDOK);
712 EndDialog (hDlg, IDCANCEL);
715 case IDC_KEY_BYSTRING:
717 CreateKey_OnSelect (hDlg);
722 CreateKey_OnType (hDlg);
726 CreateKey_OnRandom (hDlg, lpp);
736 void CreateKey_OnInitDialog (HWND hDlg, LPKEY_CREATE_PARAMS lpp)
738 TCHAR szOld[ cchRESOURCE ];
739 GetDlgItemText (hDlg, IDC_KEY_TITLE, szOld, cchRESOURCE);
741 TCHAR szServer[ cchNAME ];
742 lpp->lpiServer->GetServerName (szServer);
744 LPTSTR pszText = FormatString (szOld, TEXT("%s"), szServer);
745 SetDlgItemText (hDlg, IDC_KEY_TITLE, pszText);
746 FreeString (pszText);
748 CheckDlgButton (hDlg, IDC_KEY_BYSTRING, TRUE);
749 SetDlgItemText (hDlg, IDC_KEY_STRING, lpp->szString);
751 CreateSpinner (GetDlgItem (hDlg, IDC_KEY_VERSION), 10, FALSE, 0, lpp->keyVersion, 255);
752 CreateKey_OnSelect (hDlg);
756 void CreateKey_OnSelect (HWND hDlg)
758 EnableWindow (GetDlgItem (hDlg, IDC_KEY_STRING), IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING));
759 EnableWindow (GetDlgItem (hDlg, IDC_KEY_DATA), IsDlgButtonChecked (hDlg, IDC_KEY_BYDATA));
760 EnableWindow (GetDlgItem (hDlg, IDC_KEY_RANDOM), IsDlgButtonChecked (hDlg, IDC_KEY_BYDATA));
761 CreateKey_OnType (hDlg);
765 void CreateKey_OnType (HWND hDlg)
767 BOOL fEnable = FALSE;
769 if (IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING))
771 TCHAR szKey[ cchRESOURCE ];
772 GetDlgItemText (hDlg, IDC_KEY_STRING, szKey, cchRESOURCE);
773 if (szKey[0] != TEXT('\0'))
776 else // (IsDlgButtonChecked (hDlg, IDC_KEY_BYDATA))
778 TCHAR szKey[ cchRESOURCE ];
779 GetDlgItemText (hDlg, IDC_KEY_DATA, szKey, cchRESOURCE);
782 if (ScanServerKey (&key, szKey))
786 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
790 void CreateKey_OnRandom (HWND hDlg, LPKEY_CREATE_PARAMS lpp)
792 StartTask (taskSVR_GETRANDOMKEY, hDlg, lpp->lpiServer);
796 BOOL CreateKey_OnOK (HWND hDlg, LPKEY_CREATE_PARAMS lpp)
798 if (IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING))
800 GetDlgItemText (hDlg, IDC_KEY_STRING, lpp->szString, cchRESOURCE);
802 else // (!IsDlgButtonChecked (hDlg, IDC_KEY_BYSTRING))
804 TCHAR szKey[ cchRESOURCE ];
805 GetDlgItemText (hDlg, IDC_KEY_DATA, szKey, cchRESOURCE);
807 if (!ScanServerKey (&lpp->key, szKey))
811 lpp->keyVersion = SP_GetPos (GetDlgItem (hDlg, IDC_KEY_VERSION));
816 void CreateKey_OnEndTask_Random (HWND hDlg, LPTASKPACKET ptp)
820 EnableWindow (GetDlgItem (hDlg, IDC_KEY_RANDOM), FALSE);
824 TCHAR szKey[ cchRESOURCE ];
825 FormatServerKey (szKey, &TASKDATA(ptp)->key);
826 SetDlgItemText (hDlg, IDC_KEY_DATA, szKey);