SSH channel open 要求の結果を Forwarding Filter に渡すようにした。
SSH2_MSG_CHANNEL_OPEN_FAILURE を受けた時に FWD_failed_open() を呼ぶようにした。
FWD_free_channel() の呼び出しを削除。(FWD_failed_open() の中で呼ばれる)
@@ -1517,11 +1517,27 @@ | ||
1517 | 1517 | { |
1518 | 1518 | SOCKET s; |
1519 | 1519 | FWDChannel *channel; |
1520 | + FwdFilterResult action = FWD_FILTER_RETAIN; | |
1520 | 1521 | |
1521 | 1522 | if (!FWD_check_local_channel_num(pvar, local_channel_num)) |
1522 | 1523 | return; |
1523 | 1524 | |
1524 | 1525 | channel = pvar->fwd_state.channels + local_channel_num; |
1526 | + | |
1527 | + if (channel->filter != NULL) { | |
1528 | + action = channel->filter(channel->filter_closure, FWD_FILTER_OPENCONFIRM, NULL, NULL); | |
1529 | + switch (action) { | |
1530 | + case FWD_FILTER_REMOVE: | |
1531 | + channel->filter(channel->filter_closure, FWD_FILTER_CLEANUP, NULL, NULL); | |
1532 | + channel->filter = NULL; | |
1533 | + channel->filter_closure = NULL; | |
1534 | + break; | |
1535 | + case FWD_FILTER_CLOSECHANNEL: | |
1536 | + closed_local_connection(pvar, local_channel_num); | |
1537 | + break; | |
1538 | + } | |
1539 | + } | |
1540 | + | |
1525 | 1541 | s = channel->local_socket; |
1526 | 1542 | if (s != INVALID_SOCKET) { |
1527 | 1543 | channel->remote_num = remote_channel_num; |
@@ -1535,15 +1551,28 @@ | ||
1535 | 1551 | } |
1536 | 1552 | } |
1537 | 1553 | |
1538 | -void FWD_failed_open(PTInstVar pvar, uint32 local_channel_num) | |
1554 | +void FWD_failed_open(PTInstVar pvar, uint32 local_channel_num, int reason) | |
1539 | 1555 | { |
1556 | + FWDChannel *channel; | |
1557 | + int r = reason; | |
1558 | + | |
1540 | 1559 | if (!FWD_check_local_channel_num(pvar, local_channel_num)) |
1541 | 1560 | return; |
1542 | 1561 | |
1543 | - UTIL_get_lang_msg("MSG_FWD_DENIED_BY_SERVER_ERROR", pvar, | |
1544 | - "A program on the local machine attempted to connect to a forwarded port.\n" | |
1545 | - "The forwarding request was denied by the server. The connection has been closed."); | |
1546 | - notify_nonfatal_error(pvar, pvar->ts->UIMsg); | |
1562 | + channel = pvar->fwd_state.channels + local_channel_num; | |
1563 | + | |
1564 | + // SSH2 では呼び出し元で既にポップアップを出しているので、 | |
1565 | + // ここでは SSH1 の時のみポップアップを出す | |
1566 | + if (SSHv1(pvar)) { | |
1567 | + UTIL_get_lang_msg("MSG_FWD_DENIED_BY_SERVER_ERROR", pvar, | |
1568 | + "A program on the local machine attempted to connect to a forwarded port.\n" | |
1569 | + "The forwarding request was denied by the server. The connection has been closed."); | |
1570 | + notify_nonfatal_error(pvar, pvar->ts->UIMsg); | |
1571 | + } | |
1572 | + | |
1573 | + if (channel->filter != NULL) { | |
1574 | + channel->filter(channel->filter_closure, FWD_FILTER_OPENFAILURE, &r, NULL); | |
1575 | + } | |
1547 | 1576 | FWD_free_channel(pvar, local_channel_num); |
1548 | 1577 | } |
1549 | 1578 |
@@ -50,6 +50,8 @@ | ||
50 | 50 | |
51 | 51 | typedef enum { |
52 | 52 | FWD_FILTER_CLEANUP, |
53 | + FWD_FILTER_OPENCONFIRM, | |
54 | + FWD_FILTER_OPENFAILURE, | |
53 | 55 | FWD_FILTER_FROM_CLIENT, |
54 | 56 | FWD_FILTER_FROM_SERVER |
55 | 57 | } FwdFilterEvent; |
@@ -143,7 +145,7 @@ | ||
143 | 145 | int *chan_num); |
144 | 146 | void FWD_confirmed_open(PTInstVar pvar, uint32 local_channel_num, |
145 | 147 | uint32 remote_channel_num); |
146 | -void FWD_failed_open(PTInstVar pvar, uint32 local_channel_num); | |
148 | +void FWD_failed_open(PTInstVar pvar, uint32 local_channel_num, int reason); | |
147 | 149 | void FWD_received_data(PTInstVar pvar, uint32 local_channel_num, |
148 | 150 | unsigned char *data, int length); |
149 | 151 | void FWD_channel_input_eof(PTInstVar pvar, uint32 local_channel_num); |
@@ -1946,7 +1946,7 @@ | ||
1946 | 1946 | static BOOL handle_channel_open_failure(PTInstVar pvar) |
1947 | 1947 | { |
1948 | 1948 | if (grab_payload(pvar, 4)) { |
1949 | - FWD_failed_open(pvar, get_payload_uint32(pvar, 0)); | |
1949 | + FWD_failed_open(pvar, get_payload_uint32(pvar, 0), -1); | |
1950 | 1950 | } |
1951 | 1951 | return FALSE; |
1952 | 1952 | } |
@@ -7688,9 +7688,8 @@ | ||
7688 | 7688 | |
7689 | 7689 | free(cstring); |
7690 | 7690 | |
7691 | - // 転送チャネル内にあるソケットの解放漏れを修正 (2007.7.26 maya) | |
7692 | 7691 | if (c->type == TYPE_PORTFWD) { |
7693 | - FWD_free_channel(pvar, c->local_num); | |
7692 | + FWD_failed_open(pvar, c->local_num, reason); | |
7694 | 7693 | } |
7695 | 7694 | |
7696 | 7695 | // チャネルの解放漏れを修正 (2007.5.1 maya) |