Mercurial > dropbear
annotate cli-session.c @ 733:70811267715c
Run the cleanup handler also when we close due to TCP connection being closed
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Mon, 01 Apr 2013 22:26:55 +0800 |
parents | 9a5438271556 |
children | 619b1ed837fd |
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" |
547
cf376c696dfc
Make it compile, update for changes in channel structure.
Matt Johnston <matt@ucc.asn.au>
parents:
546
diff
changeset
|
38 #include "agentfwd.h" |
26 | 39 |
40 static void cli_remoteclosed(); | |
41 static void cli_sessionloop(); | |
33 | 42 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
|
43 static void cli_finished(); |
727
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
44 static void recv_msg_service_accept(void); |
733
70811267715c
Run the cleanup handler also when we close due to TCP connection being closed
Matt Johnston <matt@ucc.asn.au>
parents:
731
diff
changeset
|
45 static void cli_session_cleanup(void); |
26 | 46 |
47 struct clientsession cli_ses; /* GLOBAL */ | |
48 | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
49 /* 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
|
50 * should be first */ |
26 | 51 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
|
52 /* TYPE, FUNCTION */ |
26 | 53 {SSH_MSG_CHANNEL_DATA, recv_msg_channel_data}, |
107 | 54 {SSH_MSG_CHANNEL_EXTENDED_DATA, recv_msg_channel_extended_data}, |
26 | 55 {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
|
56 {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
|
57 {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
|
58 {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
|
59 {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
|
60 {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
|
61 {SSH_MSG_SERVICE_ACCEPT, recv_msg_service_accept}, /* client */ |
26 | 62 {SSH_MSG_CHANNEL_REQUEST, recv_msg_channel_request}, |
63 {SSH_MSG_CHANNEL_OPEN, recv_msg_channel_open}, | |
64 {SSH_MSG_CHANNEL_EOF, recv_msg_channel_eof}, | |
65 {SSH_MSG_CHANNEL_CLOSE, recv_msg_channel_close}, | |
66 {SSH_MSG_CHANNEL_OPEN_CONFIRMATION, recv_msg_channel_open_confirmation}, | |
67 {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
|
68 {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
|
69 {SSH_MSG_USERAUTH_SPECIFIC_60, recv_msg_userauth_specific_60}, /* client */ |
505
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
486
diff
changeset
|
70 #ifdef ENABLE_CLI_REMOTETCPFWD |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
486
diff
changeset
|
71 {SSH_MSG_REQUEST_SUCCESS, cli_recv_msg_request_success}, /* client */ |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
486
diff
changeset
|
72 {SSH_MSG_REQUEST_FAILURE, cli_recv_msg_request_failure}, /* client */ |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
486
diff
changeset
|
73 #endif |
26 | 74 {0, 0} /* End */ |
75 }; | |
76 | |
77 static const struct ChanType *cli_chantypes[] = { | |
64 | 78 #ifdef ENABLE_CLI_REMOTETCPFWD |
79 &cli_chan_tcpremote, | |
80 #endif | |
225
ca7e76d981d9
- progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
81 #ifdef ENABLE_CLI_AGENTFWD |
ca7e76d981d9
- progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
82 &cli_chan_agent, |
ca7e76d981d9
- progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
83 #endif |
26 | 84 NULL /* Null termination */ |
85 }; | |
33 | 86 |
568
005530560594
Rearrange getaddrstring() etc
Matt Johnston <matt@ucc.asn.au>
parents:
560
diff
changeset
|
87 void cli_session(int sock_in, int sock_out) { |
26 | 88 |
272
3be7ae2e8dfa
Only read /dev/random once when the program starts
Matt Johnston <matt@ucc.asn.au>
parents:
249
diff
changeset
|
89 seedrandom(); |
3be7ae2e8dfa
Only read /dev/random once when the program starts
Matt Johnston <matt@ucc.asn.au>
parents:
249
diff
changeset
|
90 |
26 | 91 crypto_init(); |
272
3be7ae2e8dfa
Only read /dev/random once when the program starts
Matt Johnston <matt@ucc.asn.au>
parents:
249
diff
changeset
|
92 |
568
005530560594
Rearrange getaddrstring() etc
Matt Johnston <matt@ucc.asn.au>
parents:
560
diff
changeset
|
93 common_session_init(sock_in, sock_out); |
26 | 94 |
95 chaninitialise(cli_chantypes); | |
96 | |
33 | 97 /* Set up cli_ses vars */ |
98 cli_session_init(); | |
26 | 99 |
100 /* Ready to go */ | |
101 sessinitdone = 1; | |
102 | |
103 /* Exchange identification */ | |
726
78eda530c000
send out our kexinit packet before blocking to read the SSH version string
Matt Johnston <matt@ucc.asn.au>
parents:
686
diff
changeset
|
104 send_session_identification(); |
26 | 105 |
106 send_msg_kexinit(); | |
107 | |
108 session_loop(cli_sessionloop); | |
109 | |
110 /* Not reached */ | |
111 | |
33 | 112 } |
26 | 113 |
33 | 114 static void cli_session_init() { |
115 | |
116 cli_ses.state = STATE_NOTHING; | |
117 cli_ses.kex_state = KEX_NOTHING; | |
118 | |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
37
diff
changeset
|
119 cli_ses.tty_raw_mode = 0; |
41
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
120 cli_ses.winchange = 0; |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
37
diff
changeset
|
121 |
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
|
122 /* 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
|
123 * (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
|
124 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
|
125 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
|
126 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
|
127 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
|
128 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
|
129 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
|
130 |
108
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
131 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
|
132 specific exit status */ |
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
133 |
47 | 134 /* Auth */ |
215
aad4b3f58556
rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents:
175
diff
changeset
|
135 cli_ses.lastprivkey = NULL; |
136
fb7147e2fb04
- Fixed a couple of compile warnings
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
136 cli_ses.lastauthtype = 0; |
47 | 137 |
686
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
138 #ifdef DROPBEAR_NONE_CIPHER |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
139 cli_ses.cipher_none_after_auth = get_algo_usable(sshciphers, "none"); |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
140 set_algo_usable(sshciphers, "none", 0); |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
141 #else |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
142 cli_ses.cipher_none_after_auth = 0; |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
143 #endif |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
144 |
33 | 145 /* For printing "remote host closed" for the user */ |
146 ses.remoteclosed = cli_remoteclosed; | |
733
70811267715c
Run the cleanup handler also when we close due to TCP connection being closed
Matt Johnston <matt@ucc.asn.au>
parents:
731
diff
changeset
|
147 ses.extra_session_cleanup = cli_session_cleanup; |
33 | 148 ses.buf_match_algo = cli_buf_match_algo; |
149 | |
150 /* packet handlers */ | |
151 ses.packettypes = cli_packettypes; | |
35
0ad5fb979f42
set the isserver flag (oops)
Matt Johnston <matt@ucc.asn.au>
parents:
34
diff
changeset
|
152 |
0ad5fb979f42
set the isserver flag (oops)
Matt Johnston <matt@ucc.asn.au>
parents:
34
diff
changeset
|
153 ses.isserver = 0; |
26 | 154 } |
155 | |
727
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
156 static void send_msg_service_request(char* servicename) { |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
157 |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
158 TRACE(("enter send_msg_service_request: servicename='%s'", servicename)) |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
159 |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
160 CHECKCLEARTOWRITE(); |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
161 |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
162 buf_putbyte(ses.writepayload, SSH_MSG_SERVICE_REQUEST); |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
163 buf_putstring(ses.writepayload, servicename, strlen(servicename)); |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
164 |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
165 encrypt_packet(); |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
166 TRACE(("leave send_msg_service_request")) |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
167 } |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
168 |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
169 static void recv_msg_service_accept(void) { |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
170 // do nothing, if it failed then the server MUST have disconnected |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
171 } |
00bc3df3a9c3
Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents:
726
diff
changeset
|
172 |
33 | 173 /* This function drives the progress of the session - it initiates KEX, |
174 * service, userauth and channel requests */ | |
26 | 175 static void cli_sessionloop() { |
176 | |
731
9a5438271556
Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents:
727
diff
changeset
|
177 TRACE2(("enter cli_sessionloop")) |
33 | 178 |
34
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
179 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
|
180 cli_ses.kex_state = KEXINIT_RCVD; |
33 | 181 } |
182 | |
34
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
183 if (cli_ses.kex_state == KEXINIT_RCVD) { |
33 | 184 |
185 /* We initiate the KEXDH. If DH wasn't the correct type, the KEXINIT | |
186 * negotiation would have failed. */ | |
187 send_msg_kexdh_init(); | |
188 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
|
189 TRACE(("leave cli_sessionloop: done with KEXINIT_RCVD")) |
33 | 190 return; |
191 } | |
192 | |
193 /* A KEX has finished, so we should go back to our KEX_NOTHING state */ | |
194 if (cli_ses.kex_state != KEX_NOTHING && ses.kexstate.recvkexinit == 0 | |
195 && ses.kexstate.sentkexinit == 0) { | |
196 cli_ses.kex_state = KEX_NOTHING; | |
197 } | |
198 | |
199 /* We shouldn't do anything else if a KEX is in progress */ | |
200 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
|
201 TRACE(("leave cli_sessionloop: kex_state != KEX_NOTHING")) |
33 | 202 return; |
203 } | |
204 | |
205 /* We should exit if we haven't donefirstkex: we shouldn't reach here | |
206 * in normal operation */ | |
207 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
|
208 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
|
209 return; |
33 | 210 } |
211 | |
26 | 212 switch (cli_ses.state) { |
213 | |
33 | 214 case STATE_NOTHING: |
215 /* We've got the transport layer sorted, we now need to request | |
216 * userauth */ | |
217 send_msg_service_request(SSH_SERVICE_USERAUTH); | |
218 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
|
219 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
|
220 TRACE(("leave cli_sessionloop: sent userauth methods req")) |
33 | 221 return; |
222 | |
223 case USERAUTH_FAIL_RCVD: | |
224 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
|
225 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
|
226 TRACE(("leave cli_sessionloop: cli_auth_try")) |
33 | 227 return; |
228 | |
37 | 229 case USERAUTH_SUCCESS_RCVD: |
326
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
230 |
686
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
231 #ifdef DROPBEAR_NONE_CIPHER |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
232 if (cli_ses.cipher_none_after_auth) |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
233 { |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
234 set_algo_usable(sshciphers, "none", 1); |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
235 send_msg_kexinit(); |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
236 } |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
237 #endif |
983a817f8e41
- Only request "none" cipher after auth has succeeded
Matt Johnston <matt@ucc.asn.au>
parents:
594
diff
changeset
|
238 |
326
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
239 if (cli_opts.backgrounded) { |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
240 int devnull; |
433
c216212001fc
Fix for -pedantic -ansi compilation, change // to /**/, plus some signedness
Matt Johnston <matt@ucc.asn.au>
parents:
326
diff
changeset
|
241 /* keeping stdin open steals input from the terminal and |
c216212001fc
Fix for -pedantic -ansi compilation, change // to /**/, plus some signedness
Matt Johnston <matt@ucc.asn.au>
parents:
326
diff
changeset
|
242 is confusing, though stdout/stderr could be useful. */ |
326
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
243 devnull = open(_PATH_DEVNULL, O_RDONLY); |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
244 if (devnull < 0) { |
594
a98a2138364a
Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents:
568
diff
changeset
|
245 dropbear_exit("Opening /dev/null: %d %s", |
326
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
246 errno, strerror(errno)); |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
247 } |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
248 dup2(devnull, STDIN_FILENO); |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
249 if (daemon(0, 1) < 0) { |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
250 dropbear_exit("Backgrounding failed: %d %s", |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
251 errno, strerror(errno)); |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
252 } |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
253 } |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
254 |
64 | 255 #ifdef ENABLE_CLI_LOCALTCPFWD |
485
12d845ab7b5f
Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents:
478
diff
changeset
|
256 setup_localtcp(); |
64 | 257 #endif |
65
02e4a7f614f8
Oops, forgot to call the actual code.
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
258 #ifdef ENABLE_CLI_REMOTETCPFWD |
485
12d845ab7b5f
Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents:
478
diff
changeset
|
259 setup_remotetcp(); |
65
02e4a7f614f8
Oops, forgot to call the actual code.
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
260 #endif |
485
12d845ab7b5f
Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents:
478
diff
changeset
|
261 |
12d845ab7b5f
Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents:
478
diff
changeset
|
262 #ifdef ENABLE_CLI_NETCAT |
12d845ab7b5f
Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents:
478
diff
changeset
|
263 if (cli_opts.netcat_host) { |
12d845ab7b5f
Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents:
478
diff
changeset
|
264 cli_send_netcat_request(); |
12d845ab7b5f
Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents:
478
diff
changeset
|
265 } else |
12d845ab7b5f
Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents:
478
diff
changeset
|
266 #endif |
560 | 267 if (!cli_opts.no_cmd) { |
325
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
272
diff
changeset
|
268 cli_send_chansess_request(); |
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
272
diff
changeset
|
269 } |
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
272
diff
changeset
|
270 TRACE(("leave cli_sessionloop: running")) |
37 | 271 cli_ses.state = SESSION_RUNNING; |
272 return; | |
273 | |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
274 case SESSION_RUNNING: |
325
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
272
diff
changeset
|
275 if (ses.chancount < 1 && !cli_opts.no_cmd) { |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
276 cli_finished(); |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
277 } |
41
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
278 |
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
279 if (cli_ses.winchange) { |
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
280 cli_chansess_winchange(); |
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
281 } |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
282 return; |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
283 |
33 | 284 /* XXX more here needed */ |
285 | |
286 | |
287 default: | |
288 break; | |
26 | 289 } |
290 | |
731
9a5438271556
Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents:
727
diff
changeset
|
291 TRACE2(("leave cli_sessionloop: fell out")) |
26 | 292 |
293 } | |
294 | |
733
70811267715c
Run the cleanup handler also when we close due to TCP connection being closed
Matt Johnston <matt@ucc.asn.au>
parents:
731
diff
changeset
|
295 static void cli_session_cleanup(void) { |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
296 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
297 if (!sessinitdone) { |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
298 return; |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
299 } |
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
|
300 |
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
|
301 /* 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
|
302 * we don't revert the flags */ |
100
c72f5c10125d
oops, the fcntl() was commented out
Matt Johnston <matt@ucc.asn.au>
parents:
99
diff
changeset
|
303 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
|
304 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
|
305 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
|
306 |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
307 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
|
308 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
309 } |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
310 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
311 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
|
312 |
733
70811267715c
Run the cleanup handler also when we close due to TCP connection being closed
Matt Johnston <matt@ucc.asn.au>
parents:
731
diff
changeset
|
313 session_cleanup(); |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
314 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
|
315 cli_opts.remotehost, cli_opts.remoteport); |
108
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
316 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
|
317 } |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
318 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
319 |
26 | 320 /* called when the remote side closes the connection */ |
321 static void cli_remoteclosed() { | |
322 | |
323 /* XXX TODO perhaps print a friendlier message if we get this but have | |
324 * already sent/received disconnect message(s) ??? */ | |
479
e3db1f7a2e43
- Split main socket var into ses.sock_in/ses.sock_out in preparation
Matt Johnston <matt@ucc.asn.au>
parents:
433
diff
changeset
|
325 m_close(ses.sock_in); |
e3db1f7a2e43
- Split main socket var into ses.sock_in/ses.sock_out in preparation
Matt Johnston <matt@ucc.asn.au>
parents:
433
diff
changeset
|
326 m_close(ses.sock_out); |
e3db1f7a2e43
- Split main socket var into ses.sock_in/ses.sock_out in preparation
Matt Johnston <matt@ucc.asn.au>
parents:
433
diff
changeset
|
327 ses.sock_in = -1; |
e3db1f7a2e43
- Split main socket var into ses.sock_in/ses.sock_out in preparation
Matt Johnston <matt@ucc.asn.au>
parents:
433
diff
changeset
|
328 ses.sock_out = -1; |
594
a98a2138364a
Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents:
568
diff
changeset
|
329 dropbear_exit("Remote closed the connection"); |
26 | 330 } |
43 | 331 |
332 /* 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
|
333 * characters) text into clean text. |
efbaf6b03837
added keyboard-interactive client support
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
334 * Note: this is safe only with ascii - other charsets could have problems. */ |
43 | 335 void cleantext(unsigned char* dirtytext) { |
336 | |
337 unsigned int i, j; | |
47 | 338 unsigned char c; |
43 | 339 |
340 j = 0; | |
341 for (i = 0; dirtytext[i] != '\0'; i++) { | |
342 | |
343 c = dirtytext[i]; | |
344 /* We can ignore '\r's */ | |
345 if ( (c >= ' ' && c <= '~') || c == '\n' || c == '\t') { | |
346 dirtytext[j] = c; | |
347 j++; | |
348 } | |
349 } | |
350 /* Null terminate */ | |
351 dirtytext[j] = '\0'; | |
352 } |