* Otherwise, we're creating the controls for a particular
* panel.
*/
- ctlposinit(&cp, hwnd, 80, 3, 13);
+ ctlposinit(&cp, hwnd, 100, 3, 13);
wc = &ctrls_panel;
base_id = IDCX_PANELBASE;
}
HWND tvstatic;
r.left = 3;
- r.right = r.left + 75;
+ r.right = r.left + 95;
r.top = 3;
r.bottom = r.top + 10;
MapDialogRect(hwnd, &r);
SendMessage(tvstatic, WM_SETFONT, font, MAKELPARAM(TRUE, 0));
r.left = 3;
- r.right = r.left + 75;
+ r.right = r.left + 95;
r.top = 13;
r.bottom = r.top + 219;
MapDialogRect(hwnd, &r);
int ret;
ctrlbox = ctrl_new_box();
- setup_config_box(ctrlbox, &sesslist, FALSE, 0);
+ setup_config_box(ctrlbox, &sesslist, FALSE, 0, 0);
win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), FALSE);
dp_init(&dp);
winctrl_init(&ctrls_base);
return ret;
}
-int do_reconfig(HWND hwnd)
+int do_reconfig(HWND hwnd, int protcfginfo)
{
Config backup_cfg;
int ret;
backup_cfg = cfg; /* structure copy */
ctrlbox = ctrl_new_box();
- setup_config_box(ctrlbox, NULL, TRUE, cfg.protocol);
+ setup_config_box(ctrlbox, &sesslist, TRUE, cfg.protocol, protcfginfo);
win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), TRUE);
dp_init(&dp);
winctrl_init(&ctrls_base);
void logevent(void *frontend, const char *string)
{
char timebuf[40];
- time_t t;
+ struct tm tm;
log_eventlog(logctx, string);
events = sresize(events, negsize, char *);
}
- time(&t);
- strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t",
- localtime(&t));
+ tm=ltime();
+ strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", &tm);
events[nevents] = snewn(strlen(timebuf) + strlen(string) + 1, char);
strcpy(events[nevents], timebuf);
DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc);
}
-void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
- char *keystr, char *fingerprint)
+/* 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)
{
int ret;
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.
*/
ret = verify_host_key(host, port, keytype, keystr);
if (ret == 0) /* success - key matched OK */
- return;
+ return 1;
if (ret == 2) { /* key was different */
int mbret;
- char *message, *title;
- message = dupprintf(wrongmsg, appname, keytype, fingerprint, appname);
- title = dupprintf(mbtitle, appname);
- mbret = MessageBox(NULL, message, title,
- MB_ICONWARNING | MB_YESNOCANCEL);
- sfree(message);
- sfree(title);
+ 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)
store_host_key(host, port, keytype, keystr);
if (mbret == IDCANCEL)
- cleanup_exit(0);
+ return 0;
+ return 1;
}
if (ret == 1) { /* key was absent */
int mbret;
- char *message, *title;
- message = dupprintf(absentmsg, keytype, fingerprint, appname);
- title = dupprintf(mbtitle, appname);
- mbret = MessageBox(NULL, message, title,
- MB_ICONWARNING | MB_YESNOCANCEL);
- sfree(message);
- sfree(title);
+ 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)
store_host_key(host, port, keytype, keystr);
if (mbret == IDCANCEL)
- cleanup_exit(0);
+ return 0;
+ return 1;
}
}
/*
- * Ask whether the selected cipher is acceptable (since it was
+ * Ask whether the selected algorithm is acceptable (since it was
* below the configured 'warn' threshold).
- * cs: 0 = both ways, 1 = client->server, 2 = server->client
*/
-void askcipher(void *frontend, char *ciphername, int cs)
+int askalg(void *frontend, const char *algtype, const char *algname,
+ void (*callback)(void *ctx, int result), void *ctx)
{
static const char mbtitle[] = "%s Security Alert";
static const char msg[] =
- "The first %.35scipher supported by the server\n"
+ "The first %s supported by the server\n"
"is %.64s, which is below the configured\n"
"warning threshold.\n"
"Do you want to continue with this connection?\n";
char *message, *title;
int mbret;
- message = dupprintf(msg, ((cs == 0) ? "" :
- (cs == 1) ? "client-to-server " :
- "server-to-client "), ciphername);
+ message = dupprintf(msg, algtype, algname);
title = dupprintf(mbtitle, appname);
mbret = MessageBox(NULL, message, title,
- MB_ICONWARNING | MB_YESNO);
+ MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2);
sfree(message);
sfree(title);
if (mbret == IDYES)
- return;
+ return 1;
else
- cleanup_exit(0);
+ 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"
mbtitle = dupprintf("%s Log to File", appname);
mbret = MessageBox(NULL, message, mbtitle,
- MB_ICONQUESTION | MB_YESNOCANCEL);
+ MB_ICONQUESTION | MB_YESNOCANCEL | MB_DEFBUTTON3);
sfree(message);
sfree(mbtitle);