[Ttssh2-commit] [4152] ・keyboard-interactive 認証において、パスワード変更が行えるようにした。

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 11月 11日 (木) 01:15:13 JST


Revision: 4152
          http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=4152
Author:   yutakapon
Date:     2010-11-11 01:15:13 +0900 (Thu, 11 Nov 2010)

Log Message:
-----------
・keyboard-interactive 認証において、パスワード変更が行えるようにした。
・SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ の実装。ただし、未評価のため、フタをしてある。

Modified Paths:
--------------
    trunk/ttssh2/ttxssh/buffer.c
    trunk/ttssh2/ttxssh/resource.h
    trunk/ttssh2/ttxssh/ssh.c
    trunk/ttssh2/ttxssh/ssh.h
    trunk/ttssh2/ttxssh/ttxssh.rc


-------------- next part --------------
Modified: trunk/ttssh2/ttxssh/buffer.c
===================================================================
--- trunk/ttssh2/ttxssh/buffer.c	2010-11-10 06:20:21 UTC (rev 4151)
+++ trunk/ttssh2/ttxssh/buffer.c	2010-11-10 16:15:13 UTC (rev 4152)
@@ -119,12 +119,13 @@
 {
 	char *data = *data_ptr;
 	char *ptr;
-	int buflen;
+	unsigned int buflen;
 
 	buflen = get_uint32_MSBfirst(data);
 	data += 4;
-	if (buflen <= 0)
-		return NULL;
+	// buflen == 0‚̏ꍇ‚Å‚àA'\0'•ª‚ÍŠm•Û‚µAdata_ptr‚ði‚߁AƒŠƒ^[ƒ“‚·‚éB
+//	if (buflen <= 0)
+//		return NULL;
 
 	ptr = malloc(buflen + 1);
 	if (ptr == NULL) {

Modified: trunk/ttssh2/ttxssh/resource.h
===================================================================
--- trunk/ttssh2/ttxssh/resource.h	2010-11-10 06:20:21 UTC (rev 4151)
+++ trunk/ttssh2/ttxssh/resource.h	2010-11-10 16:15:13 UTC (rev 4152)
@@ -13,6 +13,7 @@
 #define IDD_SSHSCP                      105
 #define IDD_SSHAUTH                     106
 #define IDD_SSHSCP_PROGRESS             107
+#define IDD_SSHPASSWD_INPUT             108
 #define IDD_HOSTDLG                     600
 #define IDC_HOSTTCPIP                   601
 #define IDD_SSHDIFFERENTHOST            601
@@ -96,6 +97,7 @@
 #define IDC_EDIT1                       1069
 #define IDC_FINGER_PRINT                1069
 #define IDC_SENDFILE_EDIT               1069
+#define IDC_PASSWD                      1069
 #define IDC_STATIC1                     1070
 #define IDC_COMPRESSLABEL               1070
 #define IDC_SSHVERSIONS                 1070
@@ -146,6 +148,7 @@
 #define IDC_HOSTRSAFILENAME             1103
 #define IDC_EDIT3                       1103
 #define IDC_FP_RANDOMART                1103
+#define IDC_CONFIRM_PASSWD              1103
 #define IDC_TTSSH_ICON                  1104
 #define IDC_KEYBITS_LABEL               1105
 #define IDC_KEYBITS                     1106
@@ -158,14 +161,16 @@
 #define IDC_SSHUSEPAGEANT               1205
 #define IDC_SSHUSETIS2                  1206
 #define IDC_REMEMBERPASSWORD            1207
+#define IDC_EDIT2                       1208
+#define IDC_NEW_PASSWD                  1208
 
 // Next default values for new objects
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        108
+#define _APS_NEXT_RESOURCE_VALUE        109
 #define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1208
+#define _APS_NEXT_CONTROL_VALUE         1209
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

Modified: trunk/ttssh2/ttxssh/ssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ssh.c	2010-11-10 06:20:21 UTC (rev 4151)
+++ trunk/ttssh2/ttxssh/ssh.c	2010-11-10 16:15:13 UTC (rev 4152)
@@ -1671,6 +1671,7 @@
 		enque_handler(pvar, SSH2_MSG_USERAUTH_FAILURE, handle_SSH2_userauth_failure);
 		enque_handler(pvar, SSH2_MSG_USERAUTH_BANNER, handle_SSH2_userauth_banner);
 		enque_handler(pvar, SSH2_MSG_USERAUTH_INFO_REQUEST, handle_SSH2_userauth_inforeq);
+		enque_handler(pvar, SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, handle_SSH2_userauth_passwd_changereq);
 
 		enque_handler(pvar, SSH2_MSG_UNIMPLEMENTED, handle_unimplemented);
 
@@ -6922,6 +6923,14 @@
 	SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_BANNER);
 	SSH2_dispatch_add_message(SSH2_MSG_DEBUG);  // support for authorized_keys command (2006.2.23 yutaka)
 
+	// XXX: ƒpƒXƒ[ƒh•ÏX‘ΉžB
+	// ‚½‚¾‚µAOpenSSH‚âOpenSolaris(SSH-2.0-Sun_SSH_1.3)‚ł́A‚±‚̃ƒbƒZ[ƒW‚ð‘—‚Á‚Ä‚±‚È‚¢‚½‚߁A
+	// –¢•]‰¿B‚䂦‚ɁAŽÀ‘•‚Í‚µ‚½‚ªAŠJ•ú‚Í‚µ‚È‚¢B
+	// (2010.11.11 yutaka)
+#if 0
+	SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ);
+#endif
+
 	return do_SSH2_authrequest(pvar);
 }
 
@@ -7472,6 +7481,8 @@
 		buffer_t *msg;
 		unsigned char *outmsg;
 		int i;
+		char *name, *inst, *lang;
+		char lprompt[512];
 
 		notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_REQUEST was received.", LOG_LEVEL_VERBOSE);
 
@@ -7484,23 +7495,22 @@
 
 		///////// step1
 		// get string
-		slen = get_uint32_MSBfirst(data);
-		data += 4;
-		s = data;  // name
-		data += slen;
+		name = buffer_get_string(&data, NULL);
+		inst = buffer_get_string(&data, NULL);
+		lang = buffer_get_string(&data, NULL);
+		lprompt[0] = 0;
+		if (strlen(inst) > 0) {
+			strncat_s(lprompt, sizeof(lprompt), inst, _TRUNCATE);
+			strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE);
+		}
+		if (strlen(lang) > 0) {
+			strncat_s(lprompt, sizeof(lprompt), lang, _TRUNCATE);
+			strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE);
+		}
+		free(name);
+		free(inst);
+		free(lang);
 
-		// get string
-		slen = get_uint32_MSBfirst(data);
-		data += 4;
-		s = data;  // instruction
-		data += slen;
-
-		// get string
-		slen = get_uint32_MSBfirst(data);
-		data += 4;
-		s = data;  // language tag
-		data += slen;
-
 		// num-prompts
 		num = get_uint32_MSBfirst(data);
 		data += 4;
@@ -7514,6 +7524,12 @@
 		}
 		buffer_put_int(msg, num);
 
+		// ƒpƒXƒ[ƒh•ÏX‚̏ꍇAƒƒbƒZ[ƒW‚ª‚ ‚ê‚΁A•\Ž¦‚·‚éB(2010.11.11 yutaka)
+		if (num == 0) {
+			if (strlen(lprompt) > 0) 
+				MessageBox(pvar->cv->HWin, lprompt, "USERAUTH INFO_REQUEST", MB_OK | MB_ICONINFORMATION);
+		}
+
 		// ƒvƒƒ“ƒvƒg‚̐”‚¾‚¯ prompt & echo ‚ªŒJ‚è•Ô‚³‚ê‚éB
 		for (i = 0 ; i < num ; i++) {
 			// get string
@@ -7540,6 +7556,9 @@
 			// TODO: ‚±‚±‚Ńvƒƒ“ƒvƒg‚ð•\Ž¦‚µ‚ㆁ[ƒU‚©‚ç“ü—Í‚³‚¹‚é‚Ì‚ª³‰ðB
 			s = pvar->auth_state.cur_cred.password;
 			buffer_put_string(msg, s, strlen(s));
+
+			// ƒŠƒgƒ‰ƒC‚ɑΉž‚Å‚«‚é‚悤Aƒtƒ‰ƒO‚ðƒNƒŠƒA‚·‚éB(2010.11.11 yutaka)
+			pvar->keyboard_interactive_password_input = 0;
 		}
 
 		len = buffer_len(msg);
@@ -7656,6 +7675,107 @@
 	return TRUE;
 }
 
+#define PASSWD_MAXLEN 150
+
+struct change_password {
+	char passwd[PASSWD_MAXLEN];
+	char new_passwd[PASSWD_MAXLEN];
+};
+
+static BOOL CALLBACK passwd_change_dialog(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+	char retype_passwd[PASSWD_MAXLEN];
+	struct change_password *cp = (struct change_password *)lParam;
+
+	switch (msg) {
+	case WM_INITDIALOG:
+		return TRUE;
+
+	case WM_COMMAND:
+		switch (LOWORD(wParam)) {
+		case IDOK:
+			SendMessage(GetDlgItem(dlg, IDC_PASSWD), WM_GETTEXT , sizeof(cp->passwd), (LPARAM)cp->passwd);
+			SendMessage(GetDlgItem(dlg, IDC_NEW_PASSWD), WM_GETTEXT , sizeof(cp->new_passwd), (LPARAM)cp->new_passwd);
+			SendMessage(GetDlgItem(dlg, IDC_CONFIRM_PASSWD), WM_GETTEXT , sizeof(retype_passwd), (LPARAM)retype_passwd);
+
+			if (strcmp(cp->new_passwd, retype_passwd) == 0) {
+				EndDialog(dlg, 1); // dialog close
+				return TRUE;
+			} 
+			MessageBox(NULL, "Mismatch; try again.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
+			return FALSE;
+
+		case IDCANCEL:
+			EndDialog(dlg, 0); // dialog close
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+BOOL handle_SSH2_userauth_passwd_changereq(PTInstVar pvar)
+{
+	int len;
+	char *data;
+	buffer_t *msg = NULL;
+	char *s, *username;
+	unsigned char *outmsg;
+	char *connect_id = "ssh-connection";
+	char *info, *lang;
+	char buf[128];
+	struct change_password cp;
+
+	notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ was received.", LOG_LEVEL_VERBOSE);
+
+	DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHPASSWD_INPUT), pvar->cv->HWin, passwd_change_dialog, (LPARAM)&cp);
+
+	// 6byteiƒTƒCƒY{ƒpƒfƒBƒ“ƒO{ƒ^ƒCƒvj‚ðŽæ‚菜‚¢‚½ˆÈ~‚̃yƒCƒ[ƒh
+	data = pvar->ssh_state.payload;
+	// ƒpƒPƒbƒgƒTƒCƒY - (ƒpƒfƒBƒ“ƒOƒTƒCƒY+1)G^‚̃pƒPƒbƒgƒTƒCƒY
+	len = pvar->ssh_state.payloadlen;
+
+	info = buffer_get_string(&data, NULL);
+	lang = buffer_get_string(&data, NULL);
+	_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s: info %s lang %s\n", __FUNCTION__, info, lang);
+	notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
+	free(info);
+	free(lang);
+
+	msg = buffer_init();
+	if (msg == NULL) {
+		// TODO: error check
+		return FALSE;
+	}
+
+	// ƒyƒCƒ[ƒh‚̍\’z
+	username = pvar->auth_state.user;  // ƒ†[ƒU–¼
+	buffer_put_string(msg, username, strlen(username));
+
+	// password authentication method
+	s = connect_id;
+	buffer_put_string(msg, s, strlen(s));
+	s = "password";
+	buffer_put_string(msg, s, strlen(s));
+
+	buffer_put_char(msg, 1); // additional info
+
+	s = cp.passwd;
+	buffer_put_string(msg, s, strlen(s));
+
+	s = cp.new_passwd;
+	buffer_put_string(msg, s, strlen(s));
+
+	// ƒpƒPƒbƒg‘—M
+	len = buffer_len(msg);
+	outmsg = begin_send_packet(pvar, SSH2_MSG_USERAUTH_REQUEST, len);
+	memcpy(outmsg, buffer_ptr(msg), len);
+	finish_send_packet(pvar);
+	buffer_free(msg);
+
+	return TRUE;
+}
+
 BOOL send_pty_request(PTInstVar pvar, Channel_t *c)
 {
 	buffer_t *msg, *ttymsg;

Modified: trunk/ttssh2/ttxssh/ssh.h
===================================================================
--- trunk/ttssh2/ttxssh/ssh.h	2010-11-10 06:20:21 UTC (rev 4151)
+++ trunk/ttssh2/ttxssh/ssh.h	2010-11-10 16:15:13 UTC (rev 4152)
@@ -550,6 +550,7 @@
 void halt_ssh_heartbeat_thread(PTInstVar pvar);
 void ssh2_channel_free(void);
 BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar);
+BOOL handle_SSH2_userauth_passwd_changereq(PTInstVar pvar);
 void SSH2_update_compression_myproposal(PTInstVar pvar);
 void SSH2_update_cipher_myproposal(PTInstVar pvar);
 

Modified: trunk/ttssh2/ttxssh/ttxssh.rc
===================================================================
--- trunk/ttssh2/ttxssh/ttxssh.rc	2010-11-10 06:20:21 UTC (rev 4151)
+++ trunk/ttssh2/ttxssh/ttxssh.rc	2010-11-10 16:15:13 UTC (rev 4152)
@@ -13,6 +13,58 @@
 #undef APSTUDIO_READONLY_SYMBOLS
 
 /////////////////////////////////////////////////////////////////////////////
+// “ú–{Œê resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_SSHPASSWD_INPUT DIALOGEX 0, 0, 231, 95
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "TTSSH: Password Authentication"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,174,7,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,174,24,50,14
+    LTEXT           "Password",IDC_STATIC,34,9,32,8
+    EDITTEXT        IDC_PASSWD,67,9,98,14,ES_PASSWORD | ES_AUTOHSCROLL
+    LTEXT           "New Password",IDC_STATIC,17,33,48,8
+    EDITTEXT        IDC_NEW_PASSWD,67,31,97,14,ES_PASSWORD | ES_AUTOHSCROLL
+    LTEXT           "Confirm Password",IDC_STATIC,7,58,59,8
+    EDITTEXT        IDC_CONFIRM_PASSWD,67,56,99,14,ES_PASSWORD | ES_AUTOHSCROLL
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO 
+BEGIN
+    IDD_SSHPASSWD_INPUT, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 224
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 88
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+#endif    // “ú–{Œê resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
 // ‰pŒê (•Ä‘) resources
 
 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
@@ -333,7 +385,7 @@
 IDD_SSHSCP_PROGRESS DIALOGEX 0, 0, 166, 82
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "TTSSH: SCP sending file"
-FONT 8, "Tahoma", 0, 0, 0
+FONT 8, "Tahoma", 0, 0, 0x0
 BEGIN
     PUSHBUTTON      "Cancel",IDCANCEL,39,52,73,14
     LTEXT           "0%",IDC_PROGRESS,7,29,141,10



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