X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/919baedb34e9f6e351d70820529398181d8d0ea6..158cb9b1b46a7b1a7f8c01171f5b32d6526a4367:/windows/windlg.c diff --git a/windows/windlg.c b/windows/windlg.c index c88e72d7..019f6155 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -40,12 +40,8 @@ static struct dlgparam dp; static char **events = NULL; static int nevents = 0, negsize = 0; -static int requested_help; - extern Config cfg; /* defined in window.c */ -struct sesslist sesslist; /* exported to window.c */ - #define PRINTER_DISABLED_STRING "None (printing disabled)" void force_normal(HWND hwnd) @@ -229,6 +225,57 @@ static int CALLBACK AboutProc(HWND hwnd, UINT msg, return 0; } +static int SaneDialogBox(HINSTANCE hinst, + LPCTSTR tmpl, + HWND hwndparent, + DLGPROC lpDialogFunc) +{ + WNDCLASS wc; + HWND hwnd; + MSG msg; + int flags; + int ret; + int gm; + + wc.style = CS_DBLCLKS | CS_SAVEBITS | CS_BYTEALIGNWINDOW; + wc.lpfnWndProc = DefDlgProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = DLGWINDOWEXTRA + 2*sizeof(LONG_PTR); + wc.hInstance = hinst; + wc.hIcon = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH) (COLOR_BACKGROUND +1); + wc.lpszMenuName = NULL; + wc.lpszClassName = "PuTTYConfigBox"; + RegisterClass(&wc); + + hwnd = CreateDialog(hinst, tmpl, hwndparent, lpDialogFunc); + + SetWindowLongPtr(hwnd, BOXFLAGS, 0); /* flags */ + SetWindowLongPtr(hwnd, BOXRESULT, 0); /* result from SaneEndDialog */ + + while ((gm=GetMessage(&msg, NULL, 0, 0)) > 0) { + flags=GetWindowLongPtr(hwnd, BOXFLAGS); + if (!(flags & DF_END) && !IsDialogMessage(hwnd, &msg)) + DispatchMessage(&msg); + if (flags & DF_END) + break; + } + + if (gm == 0) + PostQuitMessage(msg.wParam); /* We got a WM_QUIT, pass it on */ + + ret=GetWindowLongPtr(hwnd, BOXRESULT); + DestroyWindow(hwnd); + return ret; +} + +static void SaneEndDialog(HWND hwnd, int ret) +{ + SetWindowLongPtr(hwnd, BOXRESULT, ret); + SetWindowLongPtr(hwnd, BOXFLAGS, DF_END); +} + /* * Null dialog procedure. */ @@ -313,6 +360,8 @@ static void create_controls(HWND hwnd, char *path) /* * This function is the configuration box. + * (Being a dialog procedure, in general it returns 0 if the default + * dialog processing should be performed, and 1 if it should not.) */ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) @@ -326,10 +375,11 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg, dp.hwnd = hwnd; create_controls(hwnd, ""); /* Open and Cancel buttons etc */ SetWindowText(hwnd, dp.wintitle); - SetWindowLong(hwnd, GWL_USERDATA, 0); + SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); if (help_path) - SetWindowLong(hwnd, GWL_EXSTYLE, - GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP); + SetWindowLongPtr(hwnd, GWL_EXSTYLE, + GetWindowLongPtr(hwnd, GWL_EXSTYLE) | + WS_EX_CONTEXTHELP); else { HWND item = GetDlgItem(hwnd, IDC_HELPBTN); if (item) @@ -463,7 +513,7 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg, } } - SetWindowLong(hwnd, GWL_USERDATA, 1); + SetWindowLongPtr(hwnd, GWLP_USERDATA, 1); return 0; case WM_LBUTTONUP: /* @@ -524,7 +574,7 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg, /* * Only process WM_COMMAND once the dialog is fully formed. */ - if (GetWindowLong(hwnd, GWL_USERDATA) == 1) { + if (GetWindowLongPtr(hwnd, GWLP_USERDATA) == 1) { ret = winctrl_handle_command(&dp, msg, wParam, lParam); if (dp.ended && GetCapture() != hwnd) SaneEndDialog(hwnd, dp.endresult ? 1 : 0); @@ -598,7 +648,7 @@ int do_config(void) int ret; ctrlbox = ctrl_new_box(); - setup_config_box(ctrlbox, &sesslist, FALSE, 0, 0); + setup_config_box(ctrlbox, FALSE, 0, 0); win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), FALSE); dp_init(&dp); winctrl_init(&ctrls_base); @@ -610,11 +660,9 @@ int do_config(void) dp.data = &cfg; dp.shortcuts['g'] = TRUE; /* the treeview: `Cate&gory' */ - get_sesslist(&sesslist, TRUE); ret = SaneDialogBox(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL, GenericMainDlgProc); - get_sesslist(&sesslist, FALSE); ctrl_free_box(ctrlbox); winctrl_cleanup(&ctrls_panel); @@ -632,7 +680,7 @@ int do_reconfig(HWND hwnd, int protcfginfo) backup_cfg = cfg; /* structure copy */ ctrlbox = ctrl_new_box(); - setup_config_box(ctrlbox, &sesslist, TRUE, cfg.protocol, protcfginfo); + setup_config_box(ctrlbox, TRUE, cfg.protocol, protcfginfo); win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), TRUE); dp_init(&dp); winctrl_init(&ctrls_base); @@ -701,28 +749,6 @@ void showabout(HWND hwnd) DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); } -/* Helper function for verify_ssh_host_key(). */ -static VOID CALLBACK verify_ssh_host_key_help(LPHELPINFO lpHelpInfo) -{ - if (help_path) { - char *context = NULL; -#define CHECK_CTX(name) \ - do { \ - if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \ - context = WINHELP_CTX_ ## name; \ - } while (0) - CHECK_CTX(errors_hostkey_absent); - CHECK_CTX(errors_hostkey_changed); -#undef CHECK_CTX - if (context) { - char *cmd = dupprintf("JI(`',`%s')", context); - WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); - sfree(cmd); - requested_help = TRUE; - } - } -} - int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint, void (*callback)(void *ctx, int result), void *ctx) @@ -761,22 +787,6 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, static const char mbtitle[] = "%s Security Alert"; - UINT help_button = 0; - MSGBOXPARAMS mbox; - - /* - * We use MessageBoxIndirect() because it allows us to specify a - * callback function for the Help button. - */ - mbox.cbSize = sizeof(mbox); - mbox.hwndOwner = hwnd; - mbox.lpfnMsgBoxCallback = &verify_ssh_host_key_help; - mbox.dwLanguageId = LANG_NEUTRAL; - - /* Do we have a help file? */ - if (help_path) - help_button = MB_HELP; - /* * Verify the key against the registry. */ @@ -786,36 +796,38 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, return 1; if (ret == 2) { /* key was different */ int mbret; - mbox.lpszText = dupprintf(wrongmsg, appname, keytype, fingerprint, - appname); - mbox.lpszCaption = dupprintf(mbtitle, appname); - mbox.dwContextHelpId = HELPCTXID(errors_hostkey_changed); - mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 | - help_button; - mbret = MessageBoxIndirect(&mbox); - sfree((void *)mbox.lpszText); - sfree((void *)mbox.lpszCaption); - if (mbret == IDYES) + char *text = dupprintf(wrongmsg, appname, keytype, fingerprint, + appname); + char *caption = dupprintf(mbtitle, appname); + mbret = message_box(text, caption, + MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3, + HELPCTXID(errors_hostkey_changed)); + assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); + sfree(text); + sfree(caption); + if (mbret == IDYES) { store_host_key(host, port, keytype, keystr); - if (mbret == IDCANCEL) - return 0; - return 1; + return 1; + } else if (mbret == IDNO) + return 1; + return 0; } if (ret == 1) { /* key was absent */ int mbret; - mbox.lpszText = dupprintf(absentmsg, keytype, fingerprint, appname); - mbox.lpszCaption = dupprintf(mbtitle, appname); - mbox.dwContextHelpId = HELPCTXID(errors_hostkey_absent); - mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 | - help_button; - mbret = MessageBoxIndirect(&mbox); - sfree((void *)mbox.lpszText); - sfree((void *)mbox.lpszCaption); - if (mbret == IDYES) + char *text = dupprintf(absentmsg, keytype, fingerprint, appname); + char *caption = dupprintf(mbtitle, appname); + mbret = message_box(text, caption, + MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3, + HELPCTXID(errors_hostkey_absent)); + assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); + sfree(text); + sfree(caption); + if (mbret == IDYES) { store_host_key(host, port, keytype, keystr); - if (mbret == IDCANCEL) - return 0; - return 1; + return 1; + } else if (mbret == IDNO) + return 1; + return 0; } } @@ -896,7 +908,7 @@ void old_keyfile_warning(void) { static const char mbtitle[] = "%s Key File Warning"; static const char message[] = - "You are loading an SSH 2 private key which has an\n" + "You are loading an SSH-2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "%s may stop supporting this private key format,\n"