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)
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 + 8;
+ 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);
+
+ SetWindowLong(hwnd, BOXFLAGS, 0); /* flags */
+ SetWindowLong(hwnd, BOXRESULT, 0); /* result from SaneEndDialog */
+
+ while ((gm=GetMessage(&msg, NULL, 0, 0)) > 0) {
+ flags=GetWindowLong(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=GetWindowLong(hwnd, BOXRESULT);
+ DestroyWindow(hwnd);
+ return ret;
+}
+
+static void SaneEndDialog(HWND hwnd, int ret)
+{
+ SetWindowLong(hwnd, BOXRESULT, ret);
+ SetWindowLong(hwnd, BOXFLAGS, DF_END);
+}
+
/*
* Null dialog procedure.
*/
/*
* 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)
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);
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);
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);
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)
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.
*/
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;
}
}
* Ask whether to wipe a session log file before writing to it.
* Returns 2 for wipe, 1 for append, 0 for cancel (don't log).
*/
-int askappend(void *frontend, Filename filename)
+int askappend(void *frontend, Filename filename,
+ void (*callback)(void *ctx, int result), void *ctx)
{
static const char msgtemplate[] =
"The session log file \"%.*s\" already exists.\n"
{
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"