1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-10 07:38:06 -05:00

Move the MessageBox-with-help function out into winutils.c, although it's

still only used for the host key popups. Side-effects:
 - requested_help is a winstuff.h global
 - Pageant now defines winstuff.h globals

(Also, my previous fix to my improved host-key dialogs only got the "changed"
case, not the "unknown" case. Some days I shouldn't be let near a keyboard.)

[originally from svn r5415]
This commit is contained in:
Jacob Nevins 2005-03-01 00:00:09 +00:00
parent f246144c44
commit 182a511ec3
6 changed files with 76 additions and 64 deletions

View File

@ -40,8 +40,6 @@ 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 */
@ -752,28 +750,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)
@ -812,23 +788,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.hInstance = hinst;
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.
*/
@ -838,16 +797,15 @@ 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);
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((void *)mbox.lpszText);
sfree((void *)mbox.lpszCaption);
sfree(text);
sfree(caption);
if (mbret == IDYES) {
store_host_key(host, port, keytype, keystr);
return 1;
@ -857,18 +815,18 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
}
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);
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((void *)mbox.lpszText);
sfree((void *)mbox.lpszCaption);
if (mbret == IDYES)
sfree(text);
sfree(caption);
if (mbret == IDYES) {
store_host_key(host, port, keytype, keystr);
if (mbret == IDNO)
return 1;
} else if (mbret == IDNO)
return 1;
return 0;
}

View File

@ -3,6 +3,8 @@
* the \cfg{winhelp-topic} directives in the Halibut source.
*/
#define WINHELP_CTX_MAXLEN 80
/* These are used in the cross-platform configuration dialog code. */
#define HELPCTX(x) P(WINHELP_CTX_ ## x)
@ -130,6 +132,7 @@
#define HELPCTXID(x) WINHELP_CTXID_ ## x
#define WINHELP_CTXID_no_help 0
#define WINHELP_CTX_errors_hostkey_absent "errors.hostkey.absent"
#define WINHELP_CTXID_errors_hostkey_absent 1
#define WINHELP_CTX_errors_hostkey_changed "errors.hostkey.changed"

View File

@ -21,8 +21,6 @@
#define DEFAULT_KEYSIZE 1024
static int requested_help;
static char *cmdline_keyfile = NULL;
/*

View File

@ -8,6 +8,8 @@
#include <assert.h>
#include <tchar.h>
#define PUTTY_DO_GLOBALS
#include "putty.h"
#include "ssh.h"
#include "misc.h"
@ -54,9 +56,7 @@ static HWND keylist;
static HWND aboutbox;
static HMENU systray_menu, session_menu;
static int already_running;
static int requested_help;
char *help_path;
static char *putty_path;
/* CWD for "add key" file requester. */

View File

@ -85,6 +85,7 @@ GLOBAL HINSTANCE hinst;
*/
GLOBAL char *help_path;
GLOBAL int help_has_contents;
GLOBAL int requested_help;
/*
* The terminal and logging context are notionally local to the
@ -177,6 +178,7 @@ typedef struct filereq_tag filereq; /* cwd for file requester */
BOOL request_file(filereq *state, OPENFILENAME *of, int preserve, int save);
filereq *filereq_new(void);
void filereq_free(filereq *state);
int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid);
void split_into_argv(char *, int *, char ***, char ***);
/*

View File

@ -88,6 +88,57 @@ void filereq_free(filereq *state)
sfree(state);
}
/*
* Message box with optional context help.
*/
/* Callback function to launch context help. */
static VOID CALLBACK message_box_help_callback(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) {
/* We avoid using malloc, in case we're in a situation where
* it would be awkward to do so. */
char cmd[WINHELP_CTX_MAXLEN+10];
sprintf(cmd, "JI(`',`%.*s')", WINHELP_CTX_MAXLEN, context);
WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
requested_help = TRUE;
}
}
}
int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid)
{
MSGBOXPARAMS mbox;
/*
* We use MessageBoxIndirect() because it allows us to specify a
* callback function for the Help button.
*/
mbox.cbSize = sizeof(mbox);
/* FIXME: assumes global hwnd and hinst are always the Right Thing;
* are they? */
mbox.hInstance = hinst;
mbox.hwndOwner = hwnd;
mbox.lpfnMsgBoxCallback = &message_box_help_callback;
mbox.dwLanguageId = LANG_NEUTRAL;
mbox.lpszText = text;
mbox.lpszCaption = caption;
mbox.dwContextHelpId = helpctxid;
mbox.dwStyle = style;
if (helpctxid != 0 && help_path) mbox.dwStyle |= MB_HELP;
return MessageBoxIndirect(&mbox);
}
/*
* Split a complete command line into argc/argv, attempting to do
* it exactly the same way Windows itself would do it (so that