mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-04-18 03:28:07 -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 char **events = NULL;
|
||||||
static int nevents = 0, negsize = 0;
|
static int nevents = 0, negsize = 0;
|
||||||
|
|
||||||
static int requested_help;
|
|
||||||
|
|
||||||
extern Config cfg; /* defined in window.c */
|
extern Config cfg; /* defined in window.c */
|
||||||
|
|
||||||
struct sesslist sesslist; /* exported to window.c */
|
struct sesslist sesslist; /* exported to window.c */
|
||||||
@ -752,28 +750,6 @@ void showabout(HWND hwnd)
|
|||||||
DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc);
|
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,
|
int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
|
||||||
char *keystr, char *fingerprint,
|
char *keystr, char *fingerprint,
|
||||||
void (*callback)(void *ctx, int result), void *ctx)
|
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";
|
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.
|
* 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;
|
return 1;
|
||||||
if (ret == 2) { /* key was different */
|
if (ret == 2) { /* key was different */
|
||||||
int mbret;
|
int mbret;
|
||||||
mbox.lpszText = dupprintf(wrongmsg, appname, keytype, fingerprint,
|
char *text = dupprintf(wrongmsg, appname, keytype, fingerprint,
|
||||||
appname);
|
appname);
|
||||||
mbox.lpszCaption = dupprintf(mbtitle, appname);
|
char *caption = dupprintf(mbtitle, appname);
|
||||||
mbox.dwContextHelpId = HELPCTXID(errors_hostkey_changed);
|
mbret = message_box(text, caption,
|
||||||
mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 |
|
MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3,
|
||||||
help_button;
|
HELPCTXID(errors_hostkey_changed));
|
||||||
mbret = MessageBoxIndirect(&mbox);
|
|
||||||
assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL);
|
assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL);
|
||||||
sfree((void *)mbox.lpszText);
|
sfree(text);
|
||||||
sfree((void *)mbox.lpszCaption);
|
sfree(caption);
|
||||||
if (mbret == IDYES) {
|
if (mbret == IDYES) {
|
||||||
store_host_key(host, port, keytype, keystr);
|
store_host_key(host, port, keytype, keystr);
|
||||||
return 1;
|
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 */
|
if (ret == 1) { /* key was absent */
|
||||||
int mbret;
|
int mbret;
|
||||||
mbox.lpszText = dupprintf(absentmsg, keytype, fingerprint, appname);
|
char *text = dupprintf(absentmsg, keytype, fingerprint, appname);
|
||||||
mbox.lpszCaption = dupprintf(mbtitle, appname);
|
char *caption = dupprintf(mbtitle, appname);
|
||||||
mbox.dwContextHelpId = HELPCTXID(errors_hostkey_absent);
|
mbret = message_box(text, caption,
|
||||||
mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 |
|
MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3,
|
||||||
help_button;
|
HELPCTXID(errors_hostkey_absent));
|
||||||
mbret = MessageBoxIndirect(&mbox);
|
|
||||||
assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL);
|
assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL);
|
||||||
sfree((void *)mbox.lpszText);
|
sfree(text);
|
||||||
sfree((void *)mbox.lpszCaption);
|
sfree(caption);
|
||||||
if (mbret == IDYES)
|
if (mbret == IDYES) {
|
||||||
store_host_key(host, port, keytype, keystr);
|
store_host_key(host, port, keytype, keystr);
|
||||||
if (mbret == IDNO)
|
return 1;
|
||||||
|
} else if (mbret == IDNO)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
* the \cfg{winhelp-topic} directives in the Halibut source.
|
* the \cfg{winhelp-topic} directives in the Halibut source.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define WINHELP_CTX_MAXLEN 80
|
||||||
|
|
||||||
/* These are used in the cross-platform configuration dialog code. */
|
/* These are used in the cross-platform configuration dialog code. */
|
||||||
|
|
||||||
#define HELPCTX(x) P(WINHELP_CTX_ ## x)
|
#define HELPCTX(x) P(WINHELP_CTX_ ## x)
|
||||||
@ -130,6 +132,7 @@
|
|||||||
|
|
||||||
#define HELPCTXID(x) WINHELP_CTXID_ ## x
|
#define HELPCTXID(x) WINHELP_CTXID_ ## x
|
||||||
|
|
||||||
|
#define WINHELP_CTXID_no_help 0
|
||||||
#define WINHELP_CTX_errors_hostkey_absent "errors.hostkey.absent"
|
#define WINHELP_CTX_errors_hostkey_absent "errors.hostkey.absent"
|
||||||
#define WINHELP_CTXID_errors_hostkey_absent 1
|
#define WINHELP_CTXID_errors_hostkey_absent 1
|
||||||
#define WINHELP_CTX_errors_hostkey_changed "errors.hostkey.changed"
|
#define WINHELP_CTX_errors_hostkey_changed "errors.hostkey.changed"
|
||||||
|
@ -21,8 +21,6 @@
|
|||||||
|
|
||||||
#define DEFAULT_KEYSIZE 1024
|
#define DEFAULT_KEYSIZE 1024
|
||||||
|
|
||||||
static int requested_help;
|
|
||||||
|
|
||||||
static char *cmdline_keyfile = NULL;
|
static char *cmdline_keyfile = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
|
#define PUTTY_DO_GLOBALS
|
||||||
|
|
||||||
#include "putty.h"
|
#include "putty.h"
|
||||||
#include "ssh.h"
|
#include "ssh.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
@ -54,9 +56,7 @@ static HWND keylist;
|
|||||||
static HWND aboutbox;
|
static HWND aboutbox;
|
||||||
static HMENU systray_menu, session_menu;
|
static HMENU systray_menu, session_menu;
|
||||||
static int already_running;
|
static int already_running;
|
||||||
static int requested_help;
|
|
||||||
|
|
||||||
char *help_path;
|
|
||||||
static char *putty_path;
|
static char *putty_path;
|
||||||
|
|
||||||
/* CWD for "add key" file requester. */
|
/* CWD for "add key" file requester. */
|
||||||
|
@ -85,6 +85,7 @@ GLOBAL HINSTANCE hinst;
|
|||||||
*/
|
*/
|
||||||
GLOBAL char *help_path;
|
GLOBAL char *help_path;
|
||||||
GLOBAL int help_has_contents;
|
GLOBAL int help_has_contents;
|
||||||
|
GLOBAL int requested_help;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The terminal and logging context are notionally local to the
|
* 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);
|
BOOL request_file(filereq *state, OPENFILENAME *of, int preserve, int save);
|
||||||
filereq *filereq_new(void);
|
filereq *filereq_new(void);
|
||||||
void filereq_free(filereq *state);
|
void filereq_free(filereq *state);
|
||||||
|
int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid);
|
||||||
void split_into_argv(char *, int *, char ***, char ***);
|
void split_into_argv(char *, int *, char ***, char ***);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -88,6 +88,57 @@ void filereq_free(filereq *state)
|
|||||||
sfree(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
|
* Split a complete command line into argc/argv, attempting to do
|
||||||
* it exactly the same way Windows itself would do it (so that
|
* it exactly the same way Windows itself would do it (so that
|
||||||
|
Loading…
x
Reference in New Issue
Block a user