svnno****@sourc*****
svnno****@sourc*****
2014年 10月 4日 (土) 12:39:29 JST
Revision: 5678 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/5678 Author: maya Date: 2014-10-04 12:39:24 +0900 (Sat, 04 Oct 2014) Log Message: ----------- SSH2 切断シーケンスの調整 ・shell のチャネルが MSG_CHANNEL_CLOSE を受け取ったとき MSG_DISCONNECT を送り、MSG_CHANNEL_CLOSE を送り、socket を切断する ↓ MSG_CHANNEL_CLOSE を送り、MSG_DISCONNECT を送り、socket を切断する ・認証中にユーザがキャンセルしたとき MSG_CHANNEL_CLOSE を送り、socket を切断する ↓ MSG_DISCONNECT を送り、socket を切断する ・MSG_DISCONNECT を受け取ったとき MSG_CHANNEL_CLOSE を送り、socket を切断する ↓ socket を切断する Modified Paths: -------------- trunk/ttssh2/ttxssh/auth.c trunk/ttssh2/ttxssh/crypt.c trunk/ttssh2/ttxssh/hosts.c trunk/ttssh2/ttxssh/kex.c trunk/ttssh2/ttxssh/pkt.c trunk/ttssh2/ttxssh/ssh.c trunk/ttssh2/ttxssh/ttxssh.c trunk/ttssh2/ttxssh/ttxssh.h -------------- next part -------------- Modified: trunk/ttssh2/ttxssh/auth.c =================================================================== --- trunk/ttssh2/ttxssh/auth.c 2014-10-03 14:32:29 UTC (rev 5677) +++ trunk/ttssh2/ttxssh/auth.c 2014-10-04 03:39:24 UTC (rev 5678) @@ -866,7 +866,7 @@ case IDCANCEL: /* kill the connection */ canceled: pvar->auth_state.auth_dialog = NULL; - notify_closed_connection(pvar); + notify_closed_connection(pvar, "authentication cancelled"); EndDialog(dlg, 0); if (DlgAuthFont != NULL) { @@ -969,7 +969,7 @@ UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar, "Server does not support any of the authentication options\n" "provided by TTSSH. This connection will now close."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return 0; } else { if (pvar->auth_state.auth_dialog != NULL) { @@ -1189,7 +1189,7 @@ case IDCANCEL: /* kill the connection */ pvar->auth_state.auth_dialog = NULL; - notify_closed_connection(pvar); + notify_closed_connection(pvar, "authentication cancelled"); EndDialog(dlg, 0); if (DlgTisFont != NULL) { @@ -1232,7 +1232,7 @@ UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar, "Unable to display authentication dialog box.\n" "Connection terminated."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); } } } Modified: trunk/ttssh2/ttxssh/crypt.c =================================================================== --- trunk/ttssh2/ttxssh/crypt.c 2014-10-03 14:32:29 UTC (rev 5677) +++ trunk/ttssh2/ttxssh/crypt.c 2014-10-04 03:39:24 UTC (rev 5678) @@ -235,7 +235,7 @@ "%s encrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "AES128/192/256", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -243,7 +243,7 @@ UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "AES128/192/256"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -283,7 +283,7 @@ "%s decrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "AES128/192/256", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -291,7 +291,7 @@ UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "AES128/192/256"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -333,7 +333,7 @@ "%s encrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "3DES-CBC", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -341,7 +341,7 @@ UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "3DES-CBC"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -381,7 +381,7 @@ "%s decrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "3DES-CBC", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -389,7 +389,7 @@ UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "3DES-CBC"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -430,7 +430,7 @@ "%s encrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Blowfish", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -438,7 +438,7 @@ UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Blowfish"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -469,7 +469,7 @@ "%s decrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Blowfish", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -477,7 +477,7 @@ UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Blowfish"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -509,7 +509,7 @@ "%s encrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Arcfour", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -517,7 +517,7 @@ UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Arcfour"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -548,7 +548,7 @@ "%s decrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Arcfour", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -556,7 +556,7 @@ UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Arcfour"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -588,7 +588,7 @@ "%s encrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "CAST128", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -596,7 +596,7 @@ UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "CAST128"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -627,7 +627,7 @@ "%s decrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "CAST128", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -635,7 +635,7 @@ UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "CAST128"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -666,7 +666,7 @@ "%s encrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Camellia128/192/256", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -674,7 +674,7 @@ UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Camellia128/192/256"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -705,7 +705,7 @@ "%s decrypt error(1): bytes %d (%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Camellia128/192/256", bytes, block_size); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } @@ -713,7 +713,7 @@ UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, "Camellia128/192/256"); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); goto error; } else { @@ -881,7 +881,7 @@ if (key == NULL || key->e == NULL || key->n == NULL) { UTIL_get_lang_msg("MSG_RSAKEY_SETUP_ERROR", pvar, "Error setting up RSA keys"); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); if (key != NULL) { if (key->e != NULL) { @@ -981,14 +981,14 @@ "The server does not support any of the TTSSH encryption algorithms.\n" "A secure connection cannot be made in the TTSSH-to-server direction.\n" "The connection will be closed."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return FALSE; } else if (receiver_ciphers == 0) { UTIL_get_lang_msg("MSG_UNAVAILABLE_CIPHERS_ERROR", pvar, "The server does not support any of the TTSSH encryption algorithms.\n" "A secure connection cannot be made in the TTSSH-to-server direction.\n" "The connection will be closed."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return FALSE; } else { return TRUE; @@ -1160,7 +1160,7 @@ "To communicate with this server, you will have to enable some more ciphers\n" "in the TTSSH Setup dialog box when you run Tera Term again.\n" "This connection will now close."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return FALSE; } else { return TRUE; @@ -1204,7 +1204,7 @@ if (bit_delta < 128 || server_key_bits < 512 || host_key_bits < 512) { UTIL_get_lang_msg("MSG_RASKEY_TOOWEAK_ERROR", pvar, "Server RSA keys are too weak. A secure connection cannot be established."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return 0; } else { /* following Goldberg's code, I'm using MD5(servkey->n || hostkey->n || cookie) @@ -1381,7 +1381,7 @@ UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 1); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); return; } @@ -1391,7 +1391,7 @@ UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 2); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); return; } } @@ -1399,7 +1399,7 @@ UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar, "Cipher initialize error(%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 3); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); return; } @@ -1412,7 +1412,7 @@ "Cipher initialize error(%d)"); _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 3); - notify_fatal_error(pvar, tmp); + notify_fatal_error(pvar, tmp, TRUE); } else { memset(discard, 0, discard_len); @@ -1781,7 +1781,7 @@ if (!isOK) { UTIL_get_lang_msg("MSG_CHPHER_NOTSELECTED_ERROR", pvar, "No cipher selected!"); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return FALSE; } else { memset(encryption_key, 0, CRYPT_KEY_LENGTH); Modified: trunk/ttssh2/ttxssh/hosts.c =================================================================== --- trunk/ttssh2/ttxssh/hosts.c 2014-10-03 14:32:29 UTC (rev 5677) +++ trunk/ttssh2/ttxssh/hosts.c 2014-10-04 03:39:24 UTC (rev 5678) @@ -676,7 +676,7 @@ UTIL_get_lang_msg("MSG_HOSTS_HOSTNAME_INVALID_ERROR", pvar, "The host name contains an invalid character.\n" "This session will be terminated."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); } return 0; } @@ -687,7 +687,7 @@ UTIL_get_lang_msg("MSG_HOSTS_HOSTNAME_EMPTY_ERROR", pvar, "The host name should not be empty.\n" "This session will be terminated."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); } return 0; } @@ -1423,7 +1423,7 @@ case IDCANCEL: /* kill the connection */ canceled: pvar->hosts_state.hosts_dialog = NULL; - notify_closed_connection(pvar); + notify_closed_connection(pvar, "authentication cancelled"); EndDialog(dlg, 0); if (DlgHostsAddFont != NULL) { @@ -1573,7 +1573,7 @@ case IDCANCEL: /* kill the connection */ canceled: pvar->hosts_state.hosts_dialog = NULL; - notify_closed_connection(pvar); + notify_closed_connection(pvar, "authentication cancelled"); EndDialog(dlg, 0); if (DlgHostsReplaceFont != NULL) { @@ -1725,7 +1725,7 @@ case IDCANCEL: /* kill the connection */ canceled: pvar->hosts_state.hosts_dialog = NULL; - notify_closed_connection(pvar); + notify_closed_connection(pvar, "authentication cancelled"); EndDialog(dlg, 0); if (DlgHostsAddFont != NULL) { Modified: trunk/ttssh2/ttxssh/kex.c =================================================================== --- trunk/ttssh2/ttxssh/kex.c 2014-10-03 14:32:29 UTC (rev 5677) +++ trunk/ttssh2/ttxssh/kex.c 2014-10-04 03:39:24 UTC (rev 5678) @@ -120,7 +120,7 @@ return; error:; - notify_fatal_error(pvar, "error occurred @ dh_gen_key()"); + notify_fatal_error(pvar, "error occurred @ dh_gen_key()", TRUE); } Modified: trunk/ttssh2/ttxssh/pkt.c =================================================================== --- trunk/ttssh2/ttxssh/pkt.c 2014-10-03 14:32:29 UTC (rev 5677) +++ trunk/ttssh2/ttxssh/pkt.c 2014-10-04 03:39:24 UTC (rev 5678) @@ -246,7 +246,7 @@ // \x8E\xC0\x8Dۂɂ̓f\x81[\x83^\x89\xBB\x82\xAF\x82ŕ\x9C\x8D\x86\x8E\xB8\x94s\x8E\x9E\x82ɁA\x8C\xEB\x94F\x8E\xAF\x82\xB7\x82邱\x82Ƃ\xAA\x91\xBD\x82\xA2\x81B UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar, "Oversized packet received from server; connection will close."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); } else { int amount_read = recv_data(pvar, max(total_packet_size, READAMOUNT)); Modified: trunk/ttssh2/ttxssh/ssh.c =================================================================== --- trunk/ttssh2/ttxssh/ssh.c 2014-10-03 14:32:29 UTC (rev 5677) +++ trunk/ttssh2/ttxssh/ssh.c 2014-10-04 03:39:24 UTC (rev 5678) @@ -614,7 +614,7 @@ default: UTIL_get_lang_msg("MSG_SSH_INVALID_COMPDATA_ERROR", pvar, "Invalid compressed data in received packet"); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return -1; } } @@ -646,7 +646,7 @@ "Received truncated packet (%ld > %d) @ grab_payload()"); _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, pvar->ssh_state.payload_grabbed, in_buffer); - notify_fatal_error(pvar, buf); + notify_fatal_error(pvar, buf, TRUE); return FALSE; } else { return TRUE; @@ -670,7 +670,7 @@ "Received truncated packet (%ld > %d) @ grab_payload_limited()"); _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, pvar->ssh_state.payload_grabbed, in_buffer); - notify_fatal_error(pvar, buf); + notify_fatal_error(pvar, buf, TRUE); return FALSE; } else { return TRUE; @@ -696,7 +696,7 @@ if (CRYPT_detect_attack(pvar, pvar->ssh_state.payload, len)) { UTIL_get_lang_msg("MSG_SSH_COREINS_ERROR", pvar, "'CORE insertion attack' detected. Aborting connection."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); } CRYPT_decrypt(pvar, pvar->ssh_state.payload, len); @@ -705,7 +705,7 @@ get_uint32_MSBfirst(pvar->ssh_state.payload + len - 4)) { UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar, "Detected corrupted data; connection terminating."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return SSH_MSG_NONE; } @@ -727,7 +727,7 @@ data + len + 4)) { UTIL_get_lang_msg("MSG_SSH_CORRUPTDATA_ERROR", pvar, "Detected corrupted data; connection terminating."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return SSH_MSG_NONE; } @@ -890,7 +890,7 @@ UTIL_get_lang_msg("MSG_SSH_SEND_PKT_ERROR", pvar, "A communications error occurred while sending an SSH packet.\n" "The connection will close."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return FALSE; } else { return TRUE; @@ -928,7 +928,7 @@ "The connection will close. (%s:%d)"); _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, kind, code); - notify_fatal_error(pvar, buf); + notify_fatal_error(pvar, buf, TRUE); return FALSE; #endif } @@ -960,7 +960,7 @@ UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar, "An error occurred while compressing packet data.\n" "The connection will close."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return; } } @@ -1025,7 +1025,7 @@ UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar, "An error occurred while compressing packet data.\n" "The connection will close."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return; } data = buffer_ptr(msg); @@ -1421,8 +1421,16 @@ _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, explanation); } - notify_fatal_error(pvar, buf); + if (SSHv2(pvar)) { + // SSH2_MSG_DISCONNECT \x82\xF0\x8E\xE6\x82\xC1\x82\xBD\x82\xA0\x82Ƃ͉\xBD\x82\xE0\x91\x97\x90M\x82\xB5\x82Ă͂\xA2\x82\xAF\x82Ȃ\xA2 + notify_fatal_error(pvar, buf, FALSE); + } + else { + // SSH1 \x82̏ꍇ\x82̎d\x97l\x82\xAA\x95\xAA\x82\xA9\x82\xE7\x82Ȃ\xA2\x82̂ŁA\x88ȑO\x82̂܂܂ɂ\xB5\x82Ă\xA8\x82\xAD + notify_fatal_error(pvar, buf, TRUE); + } + return TRUE; } @@ -1724,19 +1732,19 @@ if (!parse_protocol_ID(pvar, ID)) { UTIL_get_lang_msg("MSG_SSH_VERSION_ERROR", pvar, "This program does not understand the server's version of the protocol."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); } else if ((negotiate = negotiate_protocol(pvar)) == 1) { UTIL_get_lang_msg("MSG_SSH_VERSION_ERROR", pvar, "This program does not understand the server's version of the protocol."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); } else if (negotiate == -1) { UTIL_get_lang_msg("MSG_SSH_VERSION_MISMATCH", pvar, "Protocol version mismatch. server:%d.%d client:%d"); _snprintf_s(uimsg, sizeof(uimsg), _TRUNCATE, pvar->ts->UIMsg, pvar->protocol_major, pvar->protocol_minor, pvar->settings.ssh_protocol_version); - notify_fatal_error(pvar, uimsg); + notify_fatal_error(pvar, uimsg, TRUE); } else { char TTSSH_ID[1024]; @@ -1770,7 +1778,7 @@ UTIL_get_lang_msg("MSG_SSH_SEND_ID_ERROR", pvar, "An error occurred while sending the SSH ID string.\n" "The connection will close."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); } else { // \x89\xFC\x8Ds\x83R\x81[\x83h\x82̏\x9C\x8B\x8E (2004.8.4 yutaka) pvar->client_version_string[--TTSSH_ID_len] = 0; // \n @@ -1807,7 +1815,7 @@ if (grab_payload(pvar, 4)) { begin_send_packet(pvar, SSH_CMSG_EXIT_CONFIRMATION, 0); finish_send_packet(pvar); - notify_closed_connection(pvar); + notify_closed_connection(pvar, "disconnected by server request"); } return TRUE; } @@ -2080,7 +2088,7 @@ "Unexpected SSH2 message(%d) on current stage(%d)"); _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, message, handle_message_stage); - notify_fatal_error(pvar, buf); + notify_fatal_error(pvar, buf, TRUE); // abort } } @@ -2093,7 +2101,7 @@ "Unexpected packet type received: %d"); _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, message, handle_message_stage); - notify_fatal_error(pvar, buf); + notify_fatal_error(pvar, buf, TRUE); } else { unsigned char FAR *outmsg = begin_send_packet(pvar, SSH2_MSG_UNIMPLEMENTED, 4); @@ -2223,7 +2231,7 @@ UTIL_get_lang_msg("MSG_SSH_SETUP_COMP_ERROR", pvar, "An error occurred while setting up compression.\n" "The connection will close."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return; } else { // SSH2\x82ł͈\xB3\x8Fk\x81E\x93W\x8AJ\x8F\x88\x97\x9D\x82\xF0SSH1\x82Ƃ͕ʂɍs\x82\xA4\x82̂ŁA\x89\xBA\x8BL\x83t\x83\x89\x83O\x82͗\x8E\x82Ƃ\xB5\x82Ă\xA8\x82\xAD\x81B(2005.7.9 yutaka) @@ -2252,7 +2260,7 @@ UTIL_get_lang_msg("MSG_SSH_SETUP_COMP_ERROR", pvar, "An error occurred while setting up compression.\n" "The connection will close."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return; } else { // SSH2\x82ł͈\xB3\x8Fk\x81E\x93W\x8AJ\x8F\x88\x97\x9D\x82\xF0SSH1\x82Ƃ͕ʂɍs\x82\xA4\x82̂ŁA\x89\xBA\x8BL\x83t\x83\x89\x83O\x82͗\x8E\x82Ƃ\xB5\x82Ă\xA8\x82\xAD\x81B(2005.7.9 yutaka) @@ -2362,7 +2370,7 @@ UTIL_get_lang_msg("MSG_SSH_DECRYPT_RSA_ERROR", pvar, "An error occurred while decrypting the RSA challenge.\n" "Perhaps the key file is corrupted."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); } } else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) { @@ -2580,7 +2588,7 @@ default: UTIL_get_lang_msg("MSG_SSH_UNSUPPORT_AUTH_METHOD_ERROR", pvar, "Internal error: unsupported authentication method"); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return; } @@ -2734,32 +2742,28 @@ } else { // for SSH2(yutaka) buffer_t *msg; unsigned char *outmsg; + char *s; int len; - Channel_t *c; - c = ssh2_channel_lookup(pvar->shell_id); - if (c == NULL) - return; - - // SSH2 server\x82\xC9channel close\x82\xF0\x93`\x82\xA6\x82\xE9 + // SSH2 server\x82\xC9disconnect\x82\xF0\x93`\x82\xA6\x82\xE9 msg = buffer_init(); if (msg == NULL) { // TODO: error check return; } - buffer_put_int(msg, c->remote_id); + buffer_put_int(msg, SSH2_DISCONNECT_BY_APPLICATION); + buffer_put_string(msg, reason, strlen(reason)); + s = ""; + buffer_put_string(msg, s, strlen(s)); len = buffer_len(msg); - outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_CLOSE, len); + outmsg = begin_send_packet(pvar, SSH2_MSG_DISCONNECT, len); memcpy(outmsg, buffer_ptr(msg), len); finish_send_packet(pvar); buffer_free(msg); - c->state |= SSH_CHANNEL_STATE_CLOSE_SENT; - - notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_CLOSE was sent at SSH_notify_disconnecting().", LOG_LEVEL_VERBOSE); + notify_verbose_message(pvar, "SSH2_MSG_DISCONNECT was sent at SSH_notify_disconnecting().", LOG_LEVEL_VERBOSE); } - } void SSH_notify_host_OK(PTInstVar pvar) @@ -2971,7 +2975,7 @@ if (deflate(&pvar->ssh_state.compress_stream, Z_NO_FLUSH) != Z_OK) { UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar, "Error compressing packet data"); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return; } @@ -2982,7 +2986,7 @@ if (deflate(&pvar->ssh_state.compress_stream, Z_SYNC_FLUSH) != Z_OK) { UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar, "Error compressing packet data"); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return; } } else { @@ -3022,7 +3026,7 @@ if (inflate(&pvar->ssh_state.decompress_stream, Z_SYNC_FLUSH) != Z_OK) { UTIL_get_lang_msg("MSG_SSH_INVALID_COMPDATA_ERROR", pvar, "Invalid compressed data in received packet"); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return 0; } } @@ -3324,7 +3328,7 @@ if (deflate(&pvar->ssh_state.compress_stream, Z_NO_FLUSH) != Z_OK) { UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar, "Error compressing packet data"); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return; } @@ -3336,7 +3340,7 @@ Z_OK) { UTIL_get_lang_msg("MSG_SSH_COMP_ERROR", pvar, "Error compressing packet data"); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return; } } else { @@ -3810,7 +3814,7 @@ if (c == NULL) { UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar, "Could not open new channel. TTSSH is already opening too many channels."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); goto error; } @@ -3950,7 +3954,7 @@ if (c == NULL) { UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar, "Could not open new channel. TTSSH is already opening too many channels."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); goto error; } @@ -5066,7 +5070,7 @@ buffer_free(pvar->peer_kex); pvar->peer_kex = NULL; - notify_fatal_error(pvar, msg); + notify_fatal_error(pvar, msg, TRUE); return FALSE; } @@ -5127,7 +5131,7 @@ DH_free(dh); buffer_free(msg); - notify_fatal_error(pvar, "error occurred @ SSH2_dh_kex_init()"); + notify_fatal_error(pvar, "error occurred @ SSH2_dh_kex_init()", TRUE); } @@ -5192,7 +5196,7 @@ error:; buffer_free(msg); - notify_fatal_error(pvar, "error occurred @ SSH2_dh_gex_kex_init()"); + notify_fatal_error(pvar, "error occurred @ SSH2_dh_gex_kex_init()", TRUE); } @@ -5333,7 +5337,7 @@ EC_KEY_free(client_key); buffer_free(msg); - notify_fatal_error(pvar, "error occurred @ SSH2_ecdh_kex_init()"); + notify_fatal_error(pvar, "error occurred @ SSH2_ecdh_kex_init()", TRUE); } @@ -5572,7 +5576,7 @@ if (dh_buf != NULL) free(dh_buf); BN_free(share_key); - notify_fatal_error(pvar, emsg); + notify_fatal_error(pvar, emsg, TRUE); return FALSE; } @@ -5806,7 +5810,7 @@ if (dh_buf != NULL) free(dh_buf); BN_free(share_key); - notify_fatal_error(pvar, emsg); + notify_fatal_error(pvar, emsg, TRUE); return FALSE; } @@ -6052,7 +6056,7 @@ if (ecdh_buf != NULL) free(ecdh_buf); BN_free(share_key); - notify_fatal_error(pvar, emsg); + notify_fatal_error(pvar, emsg, TRUE); return FALSE; } @@ -6622,7 +6626,7 @@ if (c == NULL) { UTIL_get_lang_msg("MSG_SSH_NO_FREE_CHANNEL", pvar, "Could not open new channel. TTSSH is already opening too many channels."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return FALSE; } // \x83V\x83F\x83\x8B\x82\xCCID\x82\xF0\x8E\xE6\x82\xC1\x82Ă\xA8\x82\xAD @@ -6682,7 +6686,7 @@ if (cstring == NULL) { UTIL_get_lang_msg("MSG_SSH_SERVER_NO_AUTH_METHOD_ERROR", pvar, "The server doesn't have valid authentication method."); - notify_fatal_error(pvar, pvar->ts->UIMsg); + notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE); return FALSE; } @@ -6763,7 +6767,7 @@ strncat_s(uimsg, sizeof(uimsg), pvar->ts->UIMsg, _TRUNCATE); } } - notify_fatal_error(pvar, uimsg); + notify_fatal_error(pvar, uimsg, TRUE); return TRUE; } @@ -8528,9 +8532,6 @@ char *data; int id; Channel_t *c; - buffer_t *msg; - char *s; - unsigned char *outmsg; char log[128]; // \x83R\x83l\x83N\x83V\x83\x87\x83\x93\x90ؒf\x8E\x9E\x82ɁA\x83p\x83P\x83b\x83g\x83_\x83\x93\x83v\x82\xF0\x83t\x83@\x83C\x83\x8B\x82֑|\x82\xAB\x8Fo\x82\xB7\x81B @@ -8556,33 +8557,10 @@ notify_verbose_message(pvar, log, LOG_LEVEL_VERBOSE); if (c->type == TYPE_SHELL) { - // notify_closed_connection() \x82\xA9\x82\xE7\x8CĂ\xEA\x82\xE9 SSH_notify_disconnecting() \x82̒\x86\x82\xC5 - // SSH2_MSG_CHANNEL_CLOSE \x82\xAA\x91\x97\x90M\x82\xB3\x82\xEA\x82\xE9\x82̂ɔC\x82\xB9\x82\xE9\x81B - // \x83N\x83\x89\x83C\x83A\x83\x93\x83g\x82\xA9\x82\xE7 SSH2_MSG_DISCONNECT \x82𑗂\xE7\x82Ȃ\xAD\x82Ă\xE0\x81A\x82\xB7\x82ׂĂ\xCC CHANNEL \x82\xAA\x95\xB6\x82\xEA\x82\xCE - // \x83T\x81[\x83o\x82\xA9\x82\xE7 SSH2_MSG_DISCONNECT \x82\xAA\x91\x97\x82\xE7\x82\xEA\x82Ă\xAD\x82邱\x82Ƃ\xF0\x8A\xFA\x91҂\xB7\x82\xE9\x81B - /* - msg = buffer_init(); - if (msg == NULL) { - // TODO: error check - return FALSE; - } - buffer_put_int(msg, SSH2_DISCONNECT_PROTOCOL_ERROR); - s = "disconnected by server request"; - buffer_put_string(msg, s, strlen(s)); - s = ""; - buffer_put_string(msg, s, strlen(s)); + ssh2_channel_send_close(pvar, c); - len = buffer_len(msg); - outmsg = begin_send_packet(pvar, SSH2_MSG_DISCONNECT, len); - memcpy(outmsg, buffer_ptr(msg), len); - finish_send_packet(pvar); - buffer_free(msg); - - notify_verbose_message(pvar, "SSH2_MSG_DISCONNECT was sent at handle_SSH2_channel_close().", LOG_LEVEL_VERBOSE); - */ - // TCP connection closed - notify_closed_connection(pvar); + notify_closed_connection(pvar, "disconnected by server request"); } else if (c->type == TYPE_PORTFWD) { // CHANNEL_CLOSE \x82𑗂\xE8\x95Ԃ\xB3\x82Ȃ\xA2\x82ƃ\x8A\x83\x82\x81[\x83g\x82\xCCchannel\x82\xAA\x8AJ\x95\xFA\x82\xB3\x82\xEA\x82Ȃ\xA2 Modified: trunk/ttssh2/ttxssh/ttxssh.c =================================================================== --- trunk/ttssh2/ttxssh/ttxssh.c 2014-10-03 14:32:29 UTC (rev 5677) +++ trunk/ttssh2/ttxssh/ttxssh.c 2014-10-04 03:39:24 UTC (rev 5678) @@ -820,15 +820,14 @@ LOG_LEVEL_VERBOSE); } -void notify_closed_connection(PTInstVar pvar) +void notify_closed_connection(PTInstVar pvar, char FAR * send_msg) { - SSH_notify_disconnecting(pvar, NULL); + SSH_notify_disconnecting(pvar, send_msg); AUTH_notify_disconnecting(pvar); HOSTS_notify_disconnecting(pvar); PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY, pvar->socket, MAKELPARAM(FD_CLOSE, 0)); - } static void add_err_msg(PTInstVar pvar, char FAR * msg) @@ -869,7 +868,7 @@ } } -void notify_fatal_error(PTInstVar pvar, char FAR * msg) +void notify_fatal_error(PTInstVar pvar, char FAR * msg, BOOL send_disconnect) { if (msg[0] != 0) { notify_verbose_message(pvar, msg, LOG_LEVEL_FATAL); @@ -879,7 +878,9 @@ if (!pvar->fatal_error) { pvar->fatal_error = TRUE; - SSH_notify_disconnecting(pvar, msg); + if (send_disconnect) { + SSH_notify_disconnecting(pvar, msg); + } AUTH_notify_disconnecting(pvar); HOSTS_notify_disconnecting(pvar); Modified: trunk/ttssh2/ttxssh/ttxssh.h =================================================================== --- trunk/ttssh2/ttxssh/ttxssh.h 2014-10-03 14:32:29 UTC (rev 5677) +++ trunk/ttssh2/ttxssh/ttxssh.h 2014-10-04 03:39:24 UTC (rev 5678) @@ -298,9 +298,9 @@ #define SSHv2(pvar) ((pvar)->protocol_major == 2) void notify_established_secure_connection(PTInstVar pvar); -void notify_closed_connection(PTInstVar pvar); +void notify_closed_connection(PTInstVar pvar, char FAR * send_msg); void notify_nonfatal_error(PTInstVar pvar, char FAR * msg); -void notify_fatal_error(PTInstVar pvar, char FAR * msg); +void notify_fatal_error(PTInstVar pvar, char FAR * msg, BOOL send_disconnect); void notify_verbose_message(PTInstVar pvar, char FAR * msg, int level); void get_teraterm_dir_relative_name(char FAR * buf, int bufsize, char FAR * basename);