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:
parent
f246144c44
commit
182a511ec3
@ -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;
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -21,8 +21,6 @@
|
||||
|
||||
#define DEFAULT_KEYSIZE 1024
|
||||
|
||||
static int requested_help;
|
||||
|
||||
static char *cmdline_keyfile = NULL;
|
||||
|
||||
/*
|
||||
|
@ -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. */
|
||||
|
@ -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 ***);
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user