static struct prefslist cipherlist;
+struct sesslist sesslist; /* exported to window.c */
+
#define PRINTER_DISABLED_STRING "None (printing disabled)"
void force_normal(HWND hwnd)
memcpy(p, sel_nl, sizeof(sel_nl));
p += sizeof(sel_nl);
}
- write_aclip(clipdata, size, TRUE);
+ write_aclip(NULL, clipdata, size, TRUE);
sfree(clipdata);
}
sfree(selitems);
IDC_BUGD_DERIVEKEY2,
IDC_BUGS_RSAPAD2,
IDC_BUGD_RSAPAD2,
+ IDC_BUGS_DHGEX2,
+ IDC_BUGD_DHGEX2,
sshbugspanelend,
selectionpanelstart,
case IDC_BUGS_RSAPAD2:
case IDC_BUGD_RSAPAD2:
return "JI(`',`ssh.bugs.rsapad2')";
+ case IDC_BUGS_DHGEX2:
+ case IDC_BUGD_DHGEX2:
+ return "JI(`',`ssh.bugs.dhgex2')";
default:
return NULL;
n = SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_GETCOUNT, 0, 0);
for (i = n; i-- > 0;)
SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_DELETESTRING, i, 0);
- for (i = 0; i < nsessions; i++)
+ for (i = 0; i < sesslist.nsessions; i++)
SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_ADDSTRING,
- 0, (LPARAM) (sessions[i]));
+ 0, (LPARAM) (sesslist.sessions[i]));
}
SetDlgItemInt(hwnd, IDC_PORT, cfg.port, FALSE);
CheckRadioButton(hwnd, IDC_PROTRAW, IDC_PROTSSH,
SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_SETCURSEL,
cfg.sshbug_rsapad2 == BUG_ON ? 2 :
cfg.sshbug_rsapad2 == BUG_OFF ? 1 : 0, 0);
+ SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_RESETCONTENT, 0, 0);
+ SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"Auto");
+ SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"Off");
+ SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"On");
+ SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_SETCURSEL,
+ cfg.sshbug_dhgex2 == BUG_ON ? 2 :
+ cfg.sshbug_dhgex2 == BUG_OFF ? 1 : 0, 0);
}
struct treeview_faff {
IDC_BUGS_DERIVEKEY2, IDC_BUGD_DERIVEKEY2, 20);
staticddl(&cp, "Requires &padding on SSH2 RSA signatures",
IDC_BUGS_RSAPAD2, IDC_BUGD_RSAPAD2, 20);
+ staticddl(&cp, "Chokes on &Diffie-Hellman group exchange",
+ IDC_BUGS_DHGEX2, IDC_BUGD_DHGEX2, 20);
endbox(&cp);
}
}
MessageBeep(0);
return 0;
}
- isdef = !strcmp(sessions[n], "Default Settings");
- load_settings(sessions[n], !isdef, &cfg);
+ isdef = !strcmp(sesslist.sessions[n], "Default Settings");
+ load_settings(sesslist.sessions[n], !isdef, &cfg);
init_dlg_ctrls(hwnd, TRUE);
if (!isdef)
- SetDlgItemText(hwnd, IDC_SESSEDIT, sessions[n]);
+ SetDlgItemText(hwnd, IDC_SESSEDIT, sesslist.sessions[n]);
else
SetDlgItemText(hwnd, IDC_SESSEDIT, "");
/* Restore the selection, which will have been clobbered by
MessageBeep(0);
break;
}
- strcpy(str, sessions[n]);
+ strcpy(str, sesslist.sessions[n]);
}
save_settings(str, !!strcmp(str, "Default Settings"),
&cfg);
- get_sesslist(FALSE);
- get_sesslist(TRUE);
+ get_sesslist(&sesslist, FALSE);
+ get_sesslist(&sesslist, TRUE);
SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
FALSE, 0);
SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT,
0, 0);
- for (i = 0; i < nsessions; i++)
+ for (i = 0; i < sesslist.nsessions; i++)
SendDlgItemMessage(hwnd, IDC_SESSLIST,
LB_ADDSTRING, 0,
- (LPARAM) (sessions[i]));
+ (LPARAM) (sesslist.sessions[i]));
SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL,
(WPARAM) - 1, 0);
SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
MessageBeep(0);
break;
}
- del_settings(sessions[n]);
- get_sesslist(FALSE);
- get_sesslist(TRUE);
+ del_settings(sesslist.sessions[n]);
+ get_sesslist(&sesslist, FALSE);
+ get_sesslist(&sesslist, TRUE);
SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
FALSE, 0);
SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT,
0, 0);
- for (i = 0; i < nsessions; i++)
+ for (i = 0; i < sesslist.nsessions; i++)
SendDlgItemMessage(hwnd, IDC_SESSLIST,
LB_ADDSTRING, 0,
- (LPARAM) (sessions[i]));
+ (LPARAM) (sesslist.sessions[i]));
SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL,
(WPARAM) - 1, 0);
SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
index == 1 ? BUG_OFF : BUG_ON);
}
break;
+ case IDC_BUGD_DHGEX2:
+ if (HIWORD(wParam) == CBN_SELCHANGE) {
+ int index = SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2,
+ CB_GETCURSEL, 0, 0);
+ cfg.sshbug_dhgex2 = (index == 0 ? BUG_AUTO :
+ index == 1 ? BUG_OFF : BUG_ON);
+ }
+ break;
}
return 0;
case WM_HELP:
{
int ret;
- get_sesslist(TRUE);
+ get_sesslist(&sesslist, TRUE);
savedsession[0] = '\0';
ret =
DialogBox(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL, MainDlgProc);
- get_sesslist(FALSE);
+ get_sesslist(&sesslist, FALSE);
return ret;
}
return ret;
}
-void logevent(char *string)
+void logevent(void *frontend, char *string)
{
char timebuf[40];
time_t t;
- log_eventlog(string);
+ log_eventlog(logctx, string);
if (nevents >= negsize) {
negsize += 64;
DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc);
}
-void verify_ssh_host_key(char *host, int port, char *keytype,
+void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
char *keystr, char *fingerprint)
{
int ret;
* below the configured 'warn' threshold).
* cs: 0 = both ways, 1 = client->server, 2 = server->client
*/
-void askcipher(char *ciphername, int cs)
+void askcipher(void *frontend, char *ciphername, int cs)
{
static const char mbtitle[] = "PuTTY Security Alert";
static const char msg[] =
* 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(char *filename)
+int askappend(void *frontend, char *filename)
{
static const char mbtitle[] = "PuTTY Log to File";
static const char msgtemplate[] =
/*
* Warn about the obsolescent key file format.
+ *
+ * Uniquely among these functions, this one does _not_ expect a
+ * frontend handle. This means that if PuTTY is ported to a
+ * platform which requires frontend handles, this function will be
+ * an anomaly. Fortunately, the problem it addresses will not have
+ * been present on that platform, so it can plausibly be
+ * implemented as an empty function.
*/
void old_keyfile_warning(void)
{