Mercurial > dropbear
annotate cli-session.c @ 255:89ace56293f6
* common-algo.c: use zlib for dbclient
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Tue, 08 Nov 2005 11:35:52 +0000 |
parents | efbaf6b03837 |
children | 3be7ae2e8dfa 740e782679be |
rev | line source |
---|---|
74
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
1 /* |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
2 * Dropbear SSH |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
3 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
4 * Copyright (c) 2002,2003 Matt Johnston |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
5 * Copyright (c) 2004 by Mihnea Stoenescu |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
6 * All rights reserved. |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
7 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
8 * Permission is hereby granted, free of charge, to any person obtaining a copy |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
9 * of this software and associated documentation files (the "Software"), to deal |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
10 * in the Software without restriction, including without limitation the rights |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
12 * copies of the Software, and to permit persons to whom the Software is |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
13 * furnished to do so, subject to the following conditions: |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
14 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
15 * The above copyright notice and this permission notice shall be included in |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
16 * all copies or substantial portions of the Software. |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
17 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
24 * SOFTWARE. */ |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
25 |
26 | 26 #include "includes.h" |
27 #include "session.h" | |
28 #include "dbutil.h" | |
29 #include "kex.h" | |
30 #include "ssh.h" | |
31 #include "packet.h" | |
64 | 32 #include "tcpfwd.h" |
26 | 33 #include "channel.h" |
34 #include "random.h" | |
33 | 35 #include "service.h" |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
36 #include "runopts.h" |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
37 #include "chansession.h" |
26 | 38 |
39 static void cli_remoteclosed(); | |
40 static void cli_sessionloop(); | |
33 | 41 static void cli_session_init(); |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
42 static void cli_finished(); |
26 | 43 |
44 struct clientsession cli_ses; /* GLOBAL */ | |
45 | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
46 /* Sorted in decreasing frequency will be more efficient - data and window |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
47 * should be first */ |
26 | 48 static const packettype cli_packettypes[] = { |
74
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
49 /* TYPE, FUNCTION */ |
26 | 50 {SSH_MSG_CHANNEL_DATA, recv_msg_channel_data}, |
107 | 51 {SSH_MSG_CHANNEL_EXTENDED_DATA, recv_msg_channel_extended_data}, |
26 | 52 {SSH_MSG_CHANNEL_WINDOW_ADJUST, recv_msg_channel_window_adjust}, |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
53 {SSH_MSG_USERAUTH_FAILURE, recv_msg_userauth_failure}, /* client */ |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
54 {SSH_MSG_USERAUTH_SUCCESS, recv_msg_userauth_success}, /* client */ |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
55 {SSH_MSG_KEXINIT, recv_msg_kexinit}, |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
56 {SSH_MSG_KEXDH_REPLY, recv_msg_kexdh_reply}, /* client */ |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
57 {SSH_MSG_NEWKEYS, recv_msg_newkeys}, |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
58 {SSH_MSG_SERVICE_ACCEPT, recv_msg_service_accept}, /* client */ |
26 | 59 {SSH_MSG_CHANNEL_REQUEST, recv_msg_channel_request}, |
60 {SSH_MSG_CHANNEL_OPEN, recv_msg_channel_open}, | |
61 {SSH_MSG_CHANNEL_EOF, recv_msg_channel_eof}, | |
62 {SSH_MSG_CHANNEL_CLOSE, recv_msg_channel_close}, | |
63 {SSH_MSG_CHANNEL_OPEN_CONFIRMATION, recv_msg_channel_open_confirmation}, | |
64 {SSH_MSG_CHANNEL_OPEN_FAILURE, recv_msg_channel_open_failure}, | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
65 {SSH_MSG_USERAUTH_BANNER, recv_msg_userauth_banner}, /* client */ |
249
efbaf6b03837
added keyboard-interactive client support
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
66 {SSH_MSG_USERAUTH_SPECIFIC_60, recv_msg_userauth_specific_60}, /* client */ |
26 | 67 {0, 0} /* End */ |
68 }; | |
69 | |
70 static const struct ChanType *cli_chantypes[] = { | |
64 | 71 #ifdef ENABLE_CLI_REMOTETCPFWD |
72 &cli_chan_tcpremote, | |
73 #endif | |
26 | 74 NULL /* Null termination */ |
75 }; | |
33 | 76 |
26 | 77 void cli_session(int sock, char* remotehost) { |
78 | |
79 crypto_init(); | |
80 common_session_init(sock, remotehost); | |
81 | |
82 chaninitialise(cli_chantypes); | |
83 | |
84 | |
33 | 85 /* Set up cli_ses vars */ |
86 cli_session_init(); | |
26 | 87 |
88 /* Ready to go */ | |
89 sessinitdone = 1; | |
90 | |
91 /* Exchange identification */ | |
92 session_identification(); | |
93 | |
94 seedrandom(); | |
95 | |
96 send_msg_kexinit(); | |
97 | |
98 /* XXX here we do stuff differently */ | |
99 | |
100 session_loop(cli_sessionloop); | |
101 | |
102 /* Not reached */ | |
103 | |
33 | 104 } |
26 | 105 |
33 | 106 static void cli_session_init() { |
107 | |
108 cli_ses.state = STATE_NOTHING; | |
109 cli_ses.kex_state = KEX_NOTHING; | |
110 | |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
37
diff
changeset
|
111 cli_ses.tty_raw_mode = 0; |
41
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
112 cli_ses.winchange = 0; |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
37
diff
changeset
|
113 |
175
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
114 /* We store std{in,out,err}'s flags, so we can set them back on exit |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
115 * (otherwise busybox's ash isn't happy */ |
99
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
116 cli_ses.stdincopy = dup(STDIN_FILENO); |
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
117 cli_ses.stdinflags = fcntl(STDIN_FILENO, F_GETFL, 0); |
175
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
118 cli_ses.stdoutcopy = dup(STDOUT_FILENO); |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
119 cli_ses.stdoutflags = fcntl(STDOUT_FILENO, F_GETFL, 0); |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
120 cli_ses.stderrcopy = dup(STDERR_FILENO); |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
121 cli_ses.stderrflags = fcntl(STDERR_FILENO, F_GETFL, 0); |
99
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
122 |
108
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
123 cli_ses.retval = EXIT_SUCCESS; /* Assume it's clean if we don't get a |
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
124 specific exit status */ |
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
125 |
47 | 126 /* Auth */ |
215
aad4b3f58556
rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents:
175
diff
changeset
|
127 cli_ses.lastprivkey = NULL; |
136
fb7147e2fb04
- Fixed a couple of compile warnings
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
128 cli_ses.lastauthtype = 0; |
47 | 129 |
33 | 130 /* For printing "remote host closed" for the user */ |
131 ses.remoteclosed = cli_remoteclosed; | |
132 ses.buf_match_algo = cli_buf_match_algo; | |
133 | |
134 /* packet handlers */ | |
135 ses.packettypes = cli_packettypes; | |
35
0ad5fb979f42
set the isserver flag (oops)
Matt Johnston <matt@ucc.asn.au>
parents:
34
diff
changeset
|
136 |
0ad5fb979f42
set the isserver flag (oops)
Matt Johnston <matt@ucc.asn.au>
parents:
34
diff
changeset
|
137 ses.isserver = 0; |
26 | 138 } |
139 | |
33 | 140 /* This function drives the progress of the session - it initiates KEX, |
141 * service, userauth and channel requests */ | |
26 | 142 static void cli_sessionloop() { |
143 | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
144 TRACE(("enter cli_sessionloop")) |
33 | 145 |
34
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
146 if (ses.lastpacket == SSH_MSG_KEXINIT && cli_ses.kex_state == KEX_NOTHING) { |
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
147 cli_ses.kex_state = KEXINIT_RCVD; |
33 | 148 } |
149 | |
34
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
150 if (cli_ses.kex_state == KEXINIT_RCVD) { |
33 | 151 |
152 /* We initiate the KEXDH. If DH wasn't the correct type, the KEXINIT | |
153 * negotiation would have failed. */ | |
154 send_msg_kexdh_init(); | |
155 cli_ses.kex_state = KEXDH_INIT_SENT; | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
156 TRACE(("leave cli_sessionloop: done with KEXINIT_RCVD")) |
33 | 157 return; |
158 } | |
159 | |
160 /* A KEX has finished, so we should go back to our KEX_NOTHING state */ | |
161 if (cli_ses.kex_state != KEX_NOTHING && ses.kexstate.recvkexinit == 0 | |
162 && ses.kexstate.sentkexinit == 0) { | |
163 cli_ses.kex_state = KEX_NOTHING; | |
164 } | |
165 | |
166 /* We shouldn't do anything else if a KEX is in progress */ | |
167 if (cli_ses.kex_state != KEX_NOTHING) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
168 TRACE(("leave cli_sessionloop: kex_state != KEX_NOTHING")) |
33 | 169 return; |
170 } | |
171 | |
172 /* We should exit if we haven't donefirstkex: we shouldn't reach here | |
173 * in normal operation */ | |
174 if (ses.kexstate.donefirstkex == 0) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
175 TRACE(("XXX XXX might be bad! leave cli_sessionloop: haven't donefirstkex")) |
34
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
176 return; |
33 | 177 } |
178 | |
26 | 179 switch (cli_ses.state) { |
180 | |
33 | 181 case STATE_NOTHING: |
182 /* We've got the transport layer sorted, we now need to request | |
183 * userauth */ | |
184 send_msg_service_request(SSH_SERVICE_USERAUTH); | |
185 cli_ses.state = SERVICE_AUTH_REQ_SENT; | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
186 TRACE(("leave cli_sessionloop: sent userauth service req")) |
33 | 187 return; |
26 | 188 |
33 | 189 /* userauth code */ |
190 case SERVICE_AUTH_ACCEPT_RCVD: | |
191 cli_auth_getmethods(); | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
192 cli_ses.state = USERAUTH_REQ_SENT; |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
193 TRACE(("leave cli_sessionloop: sent userauth methods req")) |
33 | 194 return; |
195 | |
196 case USERAUTH_FAIL_RCVD: | |
197 cli_auth_try(); | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
198 cli_ses.state = USERAUTH_REQ_SENT; |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
199 TRACE(("leave cli_sessionloop: cli_auth_try")) |
33 | 200 return; |
201 | |
47 | 202 /* |
37 | 203 case USERAUTH_SUCCESS_RCVD: |
204 send_msg_service_request(SSH_SERVICE_CONNECTION); | |
205 cli_ses.state = SERVICE_CONN_REQ_SENT; | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
206 TRACE(("leave cli_sessionloop: sent ssh-connection service req")) |
37 | 207 return; |
208 | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
209 case SERVICE_CONN_ACCEPT_RCVD: |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
210 cli_send_chansess_request(); |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
211 TRACE(("leave cli_sessionloop: cli_send_chansess_request")) |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
212 cli_ses.state = SESSION_RUNNING; |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
213 return; |
47 | 214 */ |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
215 |
37 | 216 case USERAUTH_SUCCESS_RCVD: |
64 | 217 #ifdef ENABLE_CLI_LOCALTCPFWD |
218 setup_localtcp(); | |
219 #endif | |
65
02e4a7f614f8
Oops, forgot to call the actual code.
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
220 #ifdef ENABLE_CLI_REMOTETCPFWD |
02e4a7f614f8
Oops, forgot to call the actual code.
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
221 setup_remotetcp(); |
02e4a7f614f8
Oops, forgot to call the actual code.
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
222 #endif |
37 | 223 cli_send_chansess_request(); |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
224 TRACE(("leave cli_sessionloop: cli_send_chansess_request")) |
37 | 225 cli_ses.state = SESSION_RUNNING; |
226 return; | |
227 | |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
228 case SESSION_RUNNING: |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
229 if (ses.chancount < 1) { |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
230 cli_finished(); |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
231 } |
41
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
232 |
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
233 if (cli_ses.winchange) { |
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
234 cli_chansess_winchange(); |
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
235 } |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
236 return; |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
237 |
33 | 238 /* XXX more here needed */ |
239 | |
240 | |
241 default: | |
242 break; | |
26 | 243 } |
244 | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
245 TRACE(("leave cli_sessionloop: fell out")) |
26 | 246 |
247 } | |
248 | |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
249 void cli_session_cleanup() { |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
250 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
251 if (!sessinitdone) { |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
252 return; |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
253 } |
99
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
254 |
175
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
255 /* Set std{in,out,err} back to non-blocking - busybox ash dies nastily if |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
256 * we don't revert the flags */ |
100
c72f5c10125d
oops, the fcntl() was commented out
Matt Johnston <matt@ucc.asn.au>
parents:
99
diff
changeset
|
257 fcntl(cli_ses.stdincopy, F_SETFL, cli_ses.stdinflags); |
175
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
258 fcntl(cli_ses.stdoutcopy, F_SETFL, cli_ses.stdoutflags); |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
259 fcntl(cli_ses.stderrcopy, F_SETFL, cli_ses.stderrflags); |
99
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
260 |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
261 cli_tty_cleanup(); |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
262 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
263 } |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
264 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
265 static void cli_finished() { |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
266 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
267 cli_session_cleanup(); |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
268 common_session_cleanup(); |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
269 fprintf(stderr, "Connection to %s@%s:%s closed.\n", cli_opts.username, |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
270 cli_opts.remotehost, cli_opts.remoteport); |
108
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
271 exit(cli_ses.retval); |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
272 } |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
273 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
274 |
26 | 275 /* called when the remote side closes the connection */ |
276 static void cli_remoteclosed() { | |
277 | |
278 /* XXX TODO perhaps print a friendlier message if we get this but have | |
279 * already sent/received disconnect message(s) ??? */ | |
280 close(ses.sock); | |
281 ses.sock = -1; | |
33 | 282 dropbear_exit("remote closed the connection"); |
26 | 283 } |
43 | 284 |
285 /* Operates in-place turning dirty (untrusted potentially containing control | |
249
efbaf6b03837
added keyboard-interactive client support
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
286 * characters) text into clean text. |
efbaf6b03837
added keyboard-interactive client support
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
287 * Note: this is safe only with ascii - other charsets could have problems. */ |
43 | 288 void cleantext(unsigned char* dirtytext) { |
289 | |
290 unsigned int i, j; | |
47 | 291 unsigned char c; |
43 | 292 |
293 j = 0; | |
294 for (i = 0; dirtytext[i] != '\0'; i++) { | |
295 | |
296 c = dirtytext[i]; | |
297 /* We can ignore '\r's */ | |
298 if ( (c >= ' ' && c <= '~') || c == '\n' || c == '\t') { | |
299 dirtytext[j] = c; | |
300 j++; | |
301 } | |
302 } | |
303 /* Null terminate */ | |
304 dirtytext[j] = '\0'; | |
305 } |