svnno****@sourc*****
svnno****@sourc*****
2017年 6月 12日 (月) 19:43:25 JST
Revision: 6798 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6798 Author: doda Date: 2017-06-12 19:43:25 +0900 (Mon, 12 Jun 2017) Log Message: ----------- 条件分岐が多すぎて見通しが悪いので、共通部分を関数に括りだして分岐を一箇所にまとめた。 コネクションタイプ独自の処理が増えるようならば、関数に括りだすようにする。 Modified Paths: -------------- trunk/ttssh2/ttxssh/ssh.c -------------- next part -------------- Modified: trunk/ttssh2/ttxssh/ssh.c =================================================================== --- trunk/ttssh2/ttxssh/ssh.c 2017-06-12 01:47:12 UTC (rev 6797) +++ trunk/ttssh2/ttxssh/ssh.c 2017-06-12 10:43:25 UTC (rev 6798) @@ -7372,6 +7372,47 @@ return TRUE; } +/* + * SSH_MSG_CHANNEL_REQUEST \x91\x97\x90M\x8A\x94 + * type-specific data \x82\xAA string \x82\xC5 0 \x81` 2 \x82̕\xA8\x82ɑΉ\x9E\x81B + * \x8Eg\x97p\x82\xB5\x82Ȃ\xA2\x83\x81\x83b\x83Z\x81[\x83W\x82\xCD NULL \x82ɂ\xB7\x82\xE9\x81B + * type-specific data \x82\xAA\x91\xBC\x82̌`\x8E\xAE\x82ɂ͑Ή\x9E\x82\xB5\x82Ă\xA2\x82Ȃ\xA2\x82̂ŁA\x8E\xA9\x91O\x82ő\x97\x82鎖\x81B + */ +static BOOL send_channel_request_gen(PTInstVar pvar, Channel_t *c, unsigned char *req, int want_reply, unsigned char *msg1, unsigned char *msg2) +{ + buffer_t *msg; + unsigned char *outmsg; + int len; + + msg = buffer_init(); + if (msg == NULL) { + return FALSE; + } + + buffer_put_int(msg, c->remote_id); + buffer_put_string(msg, req, strlen(req)); + + buffer_put_char(msg, want_reply); + + if (msg1) { + buffer_put_string(msg, msg1, strlen(msg1)); + } + if (msg2) { + buffer_put_string(msg, msg1, strlen(msg1)); + } + + len = buffer_len(msg); + outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len); + memcpy(outmsg, buffer_ptr(msg), len); + finish_send_packet(pvar); + buffer_free(msg); + + logprintf(pvar, LOG_LEVEL_VERBOSE, __FUNCTION__ ": sending SSH2_MSG_CHANNEL_REQUEST. " + "local: %d, remote: %d, request-type: %s, msg1=%s, msg2=%s", + c->self_id, c->remote_id, req, msg1 ? msg1 : "none", msg2 ? msg2 : "none"); + return TRUE; +} + BOOL send_pty_request(PTInstVar pvar, Channel_t *c) { buffer_t *msg, *ttymsg; @@ -7459,18 +7500,17 @@ } static BOOL handle_SSH2_open_confirm(PTInstVar pvar) -{ - buffer_t *msg; - char *s; - unsigned char *outmsg; +{ int len; char *data; int id, remote_id; Channel_t *c; + char buff[MAX_PATH + 30]; + #ifdef DONT_WANTCONFIRM - int wantconfirm = 0; // false + int want_reply = 0; // false #else - int wantconfirm = 1; // true + int want_reply = 1; // true #endif notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_OPEN_CONFIRMATION was received.", LOG_LEVEL_VERBOSE); @@ -7505,97 +7545,42 @@ c->remote_maxpacket = get_uint32_MSBfirst(data); data += 4; - if (c->type == TYPE_PORTFWD) { + switch (c->type) { + case TYPE_PORTFWD: // port-forwading\x82\xCC"direct-tcpip"\x82\xAA\x90\xAC\x8C\xF7\x81B FWD_confirmed_open(pvar, c->local_num, -1); - return TRUE; - } + break; - if (c->type == TYPE_SHELL) { + case TYPE_SHELL: // \x83|\x81[\x83g\x83t\x83H\x83\x8F\x81[\x83f\x83B\x83\x93\x83O\x82̏\x80\x94\xF5 (2005.2.26, 2005.6.21 yutaka) // \x83V\x83F\x83\x8B\x83I\x81[\x83v\x83\x93\x82\xB5\x82\xBD\x82\xA0\x82Ƃ\xC9 X11 \x82̗v\x8B\x81\x82\xF0\x8Fo\x82\xB3\x82Ȃ\xAD\x82Ă͂Ȃ\xE7\x82Ȃ\xA2\x81B(2005.7.3 yutaka) FWD_prep_forwarding(pvar); FWD_enter_interactive_mode(pvar); - } - //debug_print(100, data, len); - - if (c->type == TYPE_SHELL) { // \x83G\x81[\x83W\x83F\x83\x93\x83g\x93]\x91\x97 (2008.11.25 maya) if (pvar->session_settings.ForwardAgent) { // pty-req \x82\xE6\x82\xE8\x91O\x82Ƀ\x8A\x83N\x83G\x83X\x83g\x82\xB5\x82Ȃ\xA2\x82ƃG\x83\x89\x81[\x82ɂȂ\xE9\x96͗l - - msg = buffer_init(); - if (msg == NULL) { - // TODO: error check - return FALSE; - } - buffer_put_int(msg, c->remote_id); - s = "auth-****@opens*****"; - buffer_put_string(msg, s, strlen(s)); - buffer_put_char(msg, 1); // want reply - len = buffer_len(msg); - outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len); - memcpy(outmsg, buffer_ptr(msg), len); - finish_send_packet(pvar); - buffer_free(msg); - - notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at handle_SSH2_channel_success().", LOG_LEVEL_VERBOSE); - return TRUE; + return send_channel_request_gen(pvar, c, "auth-****@opens*****", 1, NULL, NULL); } else { return send_pty_request(pvar, c); } - } + break; - msg = buffer_init(); - if (msg == NULL) { - // TODO: error check - return FALSE; - } - - buffer_put_int(msg, remote_id); - if (c->type == TYPE_SCP) { - s = "exec"; - } else if (c->type == TYPE_SFTP || c->type == TYPE_SUBSYSTEM_GEN) { - s = "subsystem"; - } else { - s = ""; // NOT REACHED - } - buffer_put_string(msg, s, strlen(s)); - buffer_put_char(msg, wantconfirm); // wantconfirm (disable\x82ɕύX 2005/3/28 yutaka) - - if (c->type == TYPE_SCP) { - char sbuf[MAX_PATH + 30]; + case TYPE_SCP: if (c->scp.dir == TOREMOTE) { - _snprintf_s(sbuf, sizeof(sbuf), _TRUNCATE, "scp -t %s", c->scp.remotefile); + _snprintf_s(buff, sizeof(buff), _TRUNCATE, "scp -t %s", c->scp.remotefile); } else { // \x83t\x83@\x83C\x83\x8B\x96\xBC\x82ɋ\xF0\x8A܂܂\xEA\x82Ă\xA2\x82Ă\xE0\x82悢\x82悤\x82ɁA\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x93\xF1\x8Fd\x88\xF8\x97p\x95\x84\x82ň͂ށB // (2014.7.13 yutaka) - _snprintf_s(sbuf, sizeof(sbuf), _TRUNCATE, "scp -p -f \"%s\"", c->scp.remotefile); + _snprintf_s(buff, sizeof(buff), _TRUNCATE, "scp -p -f \"%s\"", c->scp.remotefile); + } + if (!send_channel_request_gen(pvar, c, "exec", want_reply, buff, NULL)) { + return FALSE;; } - buffer_put_string(msg, sbuf, strlen(sbuf)); - } - else if (c->type == TYPE_SFTP) { - char *sbuf = "sftp"; - buffer_put_string(msg, sbuf, strlen(sbuf)); - } - else if (c->type == TYPE_SUBSYSTEM_GEN) { - buffer_put_string(msg, pvar->subsystem_name, strlen(pvar->subsystem_name)); - pvar->session_nego_status = 0; - } - len = buffer_len(msg); - outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len); - memcpy(outmsg, buffer_ptr(msg), len); - finish_send_packet(pvar); - buffer_free(msg); - - notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at handle_SSH2_open_confirm().", LOG_LEVEL_VERBOSE); - - if (c->type == TYPE_SCP) { // SCP\x82\xC5 remote-to-local \x82̏ꍇ\x82́A\x83T\x81[\x83o\x82\xA9\x82\xE7\x82̃t\x83@\x83C\x83\x8B\x91\x97\x90M\x97v\x8B\x81\x82\xF0\x8Fo\x82\xB7\x81B // \x82\xB1\x82̎\x9E\x93_\x82ł\xCD remote window size \x82\xAA"0"\x82Ȃ̂ŁA\x82\xB7\x82\xAE\x82ɂ͑\x97\x82\xE7\x82\xEA\x82Ȃ\xA2\x82\xAA\x81A\x92x\x89\x84\x91\x97\x90M\x8F\x88\x97\x9D\x82ő\x97\x82\xE7\x82\xEA\x82\xE9\x81B // (2007.12.27 yutaka) @@ -7603,18 +7588,32 @@ char ch = '\0'; SSH2_send_channel_data(pvar, c, &ch, 1, 0); } + break; - } else if (c->type == TYPE_SFTP) { + case TYPE_SFTP: + if (!send_channel_request_gen(pvar, c, "subsystem", want_reply, "sftp", NULL)) { + return FALSE;; + } + // SFTP\x83Z\x83b\x83V\x83\x87\x83\x93\x82\xF0\x8AJ\x8En\x82\xB7\x82邽\x82߂̃l\x83S\x83V\x83G\x81[\x83V\x83\x87\x83\x93\x82\xF0\x8Ds\x82\xA4\x81B // (2012.5.3 yutaka) sftp_do_init(pvar, c); + break; + case TYPE_SUBSYSTEM_GEN: + if (!send_channel_request_gen(pvar, c, "subsystem", want_reply, pvar->subsystem_name, NULL)) { + return FALSE;; + } + pvar->session_nego_status = 0; + break; + + default: // NOT REACHED + logprintf(pvar, LOG_LEVEL_ERROR, __FUNCTION__ ": Invalid channel-type. (%d)", c->type); + return FALSE; } - return TRUE; } - // SSH2 port-forwarding \x82ɂ\xA8\x82\xA2\x82ăZ\x83b\x83V\x83\x87\x83\x93\x82\xAA\x83I\x81[\x83v\x83\x93\x82ł\xAB\x82Ȃ\xA2\x8Fꍇ\x82̃T\x81[\x83o\x82\xA9\x82\xE7\x82̃\x8A\x83v\x83\x89\x83C\x81i\x8E\xB8\x94s\x81j static BOOL handle_SSH2_open_failure(PTInstVar pvar) { @@ -7679,7 +7678,6 @@ return TRUE; } - // SSH2_MSG_GLOBAL_REQUEST for OpenSSH 6.8 static BOOL handle_SSH2_client_global_request(PTInstVar pvar) { @@ -7764,15 +7762,11 @@ static BOOL handle_SSH2_channel_success(PTInstVar pvar) { - buffer_t *msg; - char *s; - unsigned char *outmsg; - int len; Channel_t *c; #ifdef DONT_WANTCONFIRM - int wantconfirm = 0; // false + int want_reply = 0; // false #else - int wantconfirm = 1; // true + int want_reply = 1; // true #endif char buf[128]; @@ -7793,11 +7787,7 @@ } else if (pvar->session_nego_status == 2) { pvar->session_nego_status = 3; - msg = buffer_init(); - if (msg == NULL) { - // TODO: error check - return FALSE; - } + // find channel by shell id(2005.2.27 yutaka) c = ssh2_channel_lookup(pvar->shell_id); if (c == NULL) { @@ -7804,22 +7794,12 @@ // TODO: error check return FALSE; } - buffer_put_int(msg, c->remote_id); -// buffer_put_int(msg, pvar->remote_id); - s = "shell"; - buffer_put_string(msg, s, strlen(s)); // ctype - buffer_put_char(msg, wantconfirm); // wantconfirm (disable\x82ɕύX 2005/3/28 yutaka) + if (!send_channel_request_gen(pvar, c, "shell", want_reply, NULL, NULL)) { + return FALSE;; + } - len = buffer_len(msg); - outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_REQUEST, len); - memcpy(outmsg, buffer_ptr(msg), len); - finish_send_packet(pvar); - buffer_free(msg); - - notify_verbose_message(pvar, "SSH2_MSG_CHANNEL_REQUEST was sent at handle_SSH2_channel_success().", LOG_LEVEL_VERBOSE); - - if (wantconfirm == 0) { + if (want_reply == 0) { handle_SSH2_channel_success(pvar); } @@ -7838,7 +7818,6 @@ Channel_t *c; char *data; int channel_id; - char buf[128]; data = pvar->ssh_state.payload; channel_id = get_uint32_MSBfirst(data); @@ -7864,12 +7843,10 @@ if (pvar->session_nego_status == 1) { // \x83\x8A\x83\x82\x81[\x83g\x82\xC5 auth-****@opens***** \x82\xAA\x83T\x83|\x81[\x83g\x82\xB3\x82\xEA\x82ĂȂ\xA2\x82̂\xC5 // \x83G\x83\x89\x81[\x82͋C\x82ɂ\xB9\x82\xB8\x8E\x9F\x82i\x82\xDE + notify_verbose_message(pvar, + "auth-****@opens***** is not supported by remote host.", + LOG_LEVEL_VERBOSE); - strncpy_s(buf, sizeof(buf), - "auth-****@opens***** is not supported by remote host.", - _TRUNCATE); - notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE); - return send_pty_request(pvar, c); } }