svnno****@sourc*****
svnno****@sourc*****
2015年 8月 9日 (日) 02:42:07 JST
Revision: 5931 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/5931 Author: yutakapon Date: 2015-08-09 02:42:07 +0900 (Sun, 09 Aug 2015) Log Message: ----------- チケット #35165 ホスト鍵自動更新の確認ダイアログ MessageBox API からダイアログボックスに変更した。 Ticket Links: ------------ http://sourceforge.jp/projects/ttssh2/tracker/detail/35165 Modified Paths: -------------- trunk/ttssh2/ttxssh/key.c trunk/ttssh2/ttxssh/resource.h trunk/ttssh2/ttxssh/ttxssh.h trunk/ttssh2/ttxssh/ttxssh.rc -------------- next part -------------- Modified: trunk/ttssh2/ttxssh/key.c =================================================================== --- trunk/ttssh2/ttxssh/key.c 2015-08-06 09:17:53 UTC (rev 5930) +++ trunk/ttssh2/ttxssh/key.c 2015-08-08 17:42:07 UTC (rev 5931) @@ -27,6 +27,7 @@ */ #include "key.h" #include "kex.h" +#include "resource.h" #include <openssl/rsa.h> #include <openssl/dsa.h> @@ -1912,67 +1913,139 @@ return (ret); } -static void update_known_hosts(PTInstVar pvar, struct hostkeys_update_ctx *ctx) +static BOOL CALLBACK hosts_updatekey_dlg_proc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) { + static HFONT DlgHostsAddFont; + PTInstVar pvar; + LOGFONT logfont; + HFONT font; + char buf[1024]; + char *host; + struct hostkeys_update_ctx *ctx; + char *fp; size_t i; - int dlgresult; - char msg[1024], tmp[128]; - char *fp; - char *host; - host = pvar->ssh_state.hostname; + switch (msg) { + case WM_INITDIALOG: + pvar = (PTInstVar)lParam; + SetWindowLong(dlg, DWL_USER, lParam); - // "/nosecuritywarning"\x82\xAA\x8Ew\x92肳\x82\xEA\x82Ă\xA2\x82\xE9\x8Fꍇ\x81A\x8DX\x90V\x82͈\xEA\x90؍s\x82\xED\x82Ȃ\xA2\x81B - if (pvar->nocheck_known_hosts) { - _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Hostkey was not updated because `/nosecuritywarning' option was specified."); - notify_verbose_message(pvar, msg, LOG_LEVEL_VERBOSE); - goto error; - } + host = pvar->ssh_state.hostname; + ctx = pvar->hostkey_ctx; - // known_hosts\x83t\x83@\x83C\x83\x8B\x82̍X\x90V\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x83\x86\x81[\x83U\x82ɖ₢\x8D\x87\x82킹\x82\xF0\x8Ds\x82\xA4\x81B - if (pvar->settings.UpdateHostkeys == SSH_UPDATE_HOSTKEYS_ASK) { - UTIL_get_lang_msg("DLG_HOSTKEY_ROTATION_WARNING", pvar, + UTIL_get_lang_msg("DLG_HOSTKEY_ROTATION_WARNING", pvar, "Remote server \"%s\" sent the set of host keys which are absent in your list of known hosts. \n" "The machine you have contacted may be a hostile machine pretending to be the server, or legitimate server supporting host key rotation. \n\n" "If you choose to add %u latest key(s) and remove %u obsolete key(s) from this machine to the known hosts list and continue, then you will not receive this warning again.\n\n" "Do you want to update known hosts file with new key(s)?\n\n" ); - _snprintf_s(msg, sizeof(msg), _TRUNCATE, + _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, host, ctx->nnew, ctx->nold ); + SetDlgItemText(dlg, IDC_HOSTKEY_MESSAGE, buf); - if (ctx->nnew > 0) { - _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%u latest key(s):\n", ctx->nnew); - strcat_s(msg, sizeof(msg), tmp); - for (i = 0; i < ctx->nkeys; i++) { - if (ctx->keys_seen[i]) - continue; - fp = key_fingerprint(ctx->keys[i], SSH_FP_HEX); - strcat_s(msg, sizeof(msg), get_sshname_from_key(ctx->keys[i])); - strcat_s(msg, sizeof(msg), " "); - strcat_s(msg, sizeof(msg), fp); - strcat_s(msg, sizeof(msg), "\n"); - free(fp); - } + _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%u latest key(s):\n", ctx->nnew); + SetDlgItemText(dlg, IDC_ADDKEY_TEXT, buf); + for (i = 0; i < ctx->nkeys; i++) { + if (ctx->keys_seen[i]) + continue; + fp = key_fingerprint(ctx->keys[i], SSH_FP_HEX); + buf[0] = 0; + strcat_s(buf, sizeof(buf), get_sshname_from_key(ctx->keys[i])); + strcat_s(buf, sizeof(buf), " "); + strcat_s(buf, sizeof(buf), fp); + SendDlgItemMessage(dlg, IDC_ADDKEY_EDIT, EM_REPLACESEL, 0, (LPARAM)buf); + SendDlgItemMessage(dlg, IDC_ADDKEY_EDIT, EM_REPLACESEL, 0, (LPARAM)"\r\n"); + free(fp); } - if (ctx->nold > 0) { - strcat_s(msg, sizeof(msg), "\n"); + _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%u obsolete key(s):\n", ctx->nold); + SetDlgItemText(dlg, IDC_REMOVEKEY_TEXT, buf); + for (i = 0; i < ctx->nold; i++) { + fp = key_fingerprint(ctx->old_keys[i], SSH_FP_HEX); + buf[0] = 0; + strcat_s(buf, sizeof(buf), get_sshname_from_key(ctx->old_keys[i])); + strcat_s(buf, sizeof(buf), " "); + strcat_s(buf, sizeof(buf), fp); + SendDlgItemMessage(dlg, IDC_REMOVEKEY_EDIT, EM_REPLACESEL, 0, (LPARAM)buf); + SendDlgItemMessage(dlg, IDC_REMOVEKEY_EDIT, EM_REPLACESEL, 0, (LPARAM)"\r\n"); + free(fp); + } - _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%u obsolete key(s):\n", ctx->nold); - strcat_s(msg, sizeof(msg), tmp); - for (i = 0; i < ctx->nold; i++) { - fp = key_fingerprint(ctx->old_keys[i], SSH_FP_HEX); - strcat_s(msg, sizeof(msg), get_sshname_from_key(ctx->old_keys[i])); - strcat_s(msg, sizeof(msg), " "); - strcat_s(msg, sizeof(msg), fp); - strcat_s(msg, sizeof(msg), "\n"); - free(fp); + font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0); + GetObject(font, sizeof(LOGFONT), &logfont); + if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgHostsAddFont, pvar)) { + SendDlgItemMessage(dlg, IDC_HOSTKEY_MESSAGE, WM_SETFONT, (WPARAM)DlgHostsAddFont, MAKELPARAM(TRUE, 0)); + SendDlgItemMessage(dlg, IDC_ADDKEY_TEXT, WM_SETFONT, (WPARAM)DlgHostsAddFont, MAKELPARAM(TRUE, 0)); + SendDlgItemMessage(dlg, IDC_ADDKEY_EDIT, WM_SETFONT, (WPARAM)DlgHostsAddFont, MAKELPARAM(TRUE, 0)); + SendDlgItemMessage(dlg, IDC_REMOVEKEY_TEXT, WM_SETFONT, (WPARAM)DlgHostsAddFont, MAKELPARAM(TRUE, 0)); + SendDlgItemMessage(dlg, IDC_REMOVEKEY_EDIT, WM_SETFONT, (WPARAM)DlgHostsAddFont, MAKELPARAM(TRUE, 0)); + //SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgHostsAddFont, MAKELPARAM(TRUE, 0)); + //SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgHostsAddFont, MAKELPARAM(TRUE, 0)); + } + else { + DlgHostsAddFont = NULL; + } + + return TRUE; /* because we do not set the focus */ + + case WM_COMMAND: + pvar = (PTInstVar)GetWindowLong(dlg, DWL_USER); + + switch (LOWORD(wParam)) { + case IDOK: + + EndDialog(dlg, 1); + + if (DlgHostsAddFont != NULL) { + DeleteObject(DlgHostsAddFont); } + + return TRUE; + + case IDCANCEL: /* kill the connection */ + EndDialog(dlg, 0); + + if (DlgHostsAddFont != NULL) { + DeleteObject(DlgHostsAddFont); + } + + return TRUE; + + default: + return FALSE; } - dlgresult = MessageBox(NULL, msg, "TTSSH: SECURITY WARNING", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2); - if (dlgresult != IDYES) { + default: + return FALSE; + } +} + +static void update_known_hosts(PTInstVar pvar, struct hostkeys_update_ctx *ctx) +{ + size_t i; + int dlgresult; + char msg[1024]; + char *host; + + host = pvar->ssh_state.hostname; + + // "/nosecuritywarning"\x82\xAA\x8Ew\x92肳\x82\xEA\x82Ă\xA2\x82\xE9\x8Fꍇ\x81A\x8DX\x90V\x82͈\xEA\x90؍s\x82\xED\x82Ȃ\xA2\x81B + if (pvar->nocheck_known_hosts) { + _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Hostkey was not updated because `/nosecuritywarning' option was specified."); + notify_verbose_message(pvar, msg, LOG_LEVEL_VERBOSE); + goto error; + } + + // known_hosts\x83t\x83@\x83C\x83\x8B\x82̍X\x90V\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x83\x86\x81[\x83U\x82ɖ₢\x8D\x87\x82킹\x82\xF0\x8Ds\x82\xA4\x81B + if (pvar->settings.UpdateHostkeys == SSH_UPDATE_HOSTKEYS_ASK) { + HWND cur_active = GetActiveWindow(); + + pvar->hostkey_ctx = ctx; + dlgresult = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHUPDATE_HOSTKEY), + cur_active != NULL ? cur_active : pvar->NotificationWindow, + hosts_updatekey_dlg_proc, (LPARAM)pvar); + if (dlgresult != 1) { _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Hostkey was not updated because a user cancelled."); notify_verbose_message(pvar, msg, LOG_LEVEL_VERBOSE); goto error; Modified: trunk/ttssh2/ttxssh/resource.h =================================================================== --- trunk/ttssh2/ttxssh/resource.h 2015-08-06 09:17:53 UTC (rev 5930) +++ trunk/ttssh2/ttxssh/resource.h 2015-08-08 17:42:07 UTC (rev 5931) @@ -16,6 +16,7 @@ #define IDD_SSHPASSWD_INPUT 108 #define IDD_SFTP_DIALOG 109 #define IDI_SECURETT_YELLOW 110 +#define IDD_SSHUPDATE_HOSTKEY 111 #define IDD_HOSTDLG 600 #define IDC_HOSTTCPIP 601 #define IDD_SSHDIFFERENTKEY 601 @@ -121,6 +122,7 @@ #define IDC_PASSWD 1069 #define IDC_ECDSA521_TYPE 1069 #define IDC_SFTP_EDIT 1069 +#define IDC_ADDKEY_EDIT 1069 #define IDC_STATIC1 1070 #define IDC_COMPRESSLABEL 1070 #define IDC_SSHVERSIONS 1070 @@ -202,18 +204,23 @@ #define IDC_NEW_PASSWD 1208 #define IDC_SENDFILE_TO 1208 #define IDC_SFTP_CONSOLE 1208 +#define IDC_REMOVEKEY_EDIT 1208 #define IDC_PUTTY_VERSION 1209 #define IDC_ED25519_TYPE 1211 #define IDC_HOSTKEY_ROTATION_STATIC 1212 #define IDC_LIST1 1213 +#define IDC_MESSAGE 1214 +#define IDC_HOSTKEY_MESSAGE 1214 +#define IDC_ADDKEY_TEXT 1215 +#define IDC_REMOVEKEY_TEXT 1216 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 111 +#define _APS_NEXT_RESOURCE_VALUE 113 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1214 +#define _APS_NEXT_CONTROL_VALUE 1217 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif Modified: trunk/ttssh2/ttxssh/ttxssh.h =================================================================== --- trunk/ttssh2/ttxssh/ttxssh.h 2015-08-06 09:17:53 UTC (rev 5930) +++ trunk/ttssh2/ttxssh/ttxssh.h 2015-08-08 17:42:07 UTC (rev 5931) @@ -308,6 +308,8 @@ int dns_key_check; unsigned int server_compat_flag; + + void *hostkey_ctx; } TInstVar; #define LOG_LEVEL_FATAL 5 Modified: trunk/ttssh2/ttxssh/ttxssh.rc =================================================================== --- trunk/ttssh2/ttxssh/ttxssh.rc 2015-08-06 09:17:53 UTC (rev 5930) +++ trunk/ttssh2/ttxssh/ttxssh.rc 2015-08-08 17:42:07 UTC (rev 5931) @@ -33,7 +33,21 @@ EDITTEXT IDC_SFTP_CONSOLE,7,33,252,110,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL END +IDD_SSHUPDATE_HOSTKEY DIALOGEX 0, 0, 309, 256 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "SECURITY WARNING" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + PUSHBUTTON "YES",IDOK,87,233,50,14 + DEFPUSHBUTTON "NO",IDCANCEL,159,233,50,14 + LTEXT "#####",IDC_HOSTKEY_MESSAGE,7,16,295,85 + LTEXT "latest key(s):",IDC_ADDKEY_TEXT,7,106,139,8 + EDITTEXT IDC_ADDKEY_EDIT,7,118,295,44,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL | WS_HSCROLL + LTEXT "obsolete key(s):",IDC_REMOVEKEY_TEXT,7,170,130,8 + EDITTEXT IDC_REMOVEKEY_EDIT,7,183,295,43,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL | WS_HSCROLL +END + ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO @@ -49,9 +63,28 @@ TOPMARGIN, 7 BOTTOMMARGIN, 143 END + + IDD_SSHUPDATE_HOSTKEY, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 302 + TOPMARGIN, 7 + BOTTOMMARGIN, 247 + END END #endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// AFX_DIALOG_LAYOUT +// + +IDD_SSHUPDATE_HOSTKEY AFX_DIALOG_LAYOUT +BEGIN + 0 +END + #endif // \x93\xFA\x96{\x8C\xEA (\x93\xFA\x96{) resources /////////////////////////////////////////////////////////////////////////////