[Ttssh2-commit] [5931] チケット #35165

Back to archive index

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
 /////////////////////////////////////////////////////////////////////////////
 



Ttssh2-commit メーリングリストの案内
Back to archive index