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: pX[hÏXÎB + // ½¾µAOpenSSHâOpenSolaris(SSH-2.0-Sun_SSH_1.3)ÅÍA±ÌbZ[WðÁıȢ½ßA + // ¢]¿Bä¦ÉAÀ͵½ªAJú͵Ȣ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); + // pX[hÏXÌêAbZ[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); + } + // vvg̾¯ prompt & echo ªJèÔ³êéB for (i = 0 ; i < num ; i++) { // get string @@ -7540,6 +7556,9 @@ // TODO: ±±Åvvgð\¦µÄ[U©çüͳ¹é̪³ðB s = pvar->auth_state.cur_cred.password; buffer_put_string(msg, s, strlen(s)); + + // gCÉÎÅ«éæ¤AtOðNA·é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); + + // 6byteiTCY{pfBO{^Cvjðæ袽È~ÌyC[h + data = pvar->ssh_state.payload; + // pPbgTCY - (pfBOTCY+1)G^ÌpPbgTCY + 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; + } + + // yC[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)); + + // pPbgM + 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