annotate cli-session.c @ 1908:eadd023fde4d

Support RSA OpenSSH new format in dropbearconvert Added support for reading and writing. PEM writing support has been removed. OpenSSH file format routines have been moved to signkey_ossh.c
author Matt Johnston <matt@ucc.asn.au>
date Tue, 29 Mar 2022 22:27:55 +0800
parents 62e4baa059c3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
26 #include "includes.h"
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
27 #include "session.h"
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
28 #include "dbutil.h"
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
29 #include "kex.h"
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
30 #include "ssh.h"
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
31 #include "packet.h"
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
32 #include "tcpfwd.h"
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
33 #include "channel.h"
858
220f55d540ae rename random.h to dbrandom.h since some OSes have a system random.h
Matt Johnston <matt@ucc.asn.au>
parents: 857
diff changeset
34 #include "dbrandom.h"
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
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"
766
d1575fdc29a6 start on ecdsa keys
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
39 #include "crypto_desc.h"
1032
0da8ba489c23 Move generic network routines to netio.c
Matt Johnston <matt@ucc.asn.au>
parents: 1031
diff changeset
40 #include "netio.h"
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
41
1276
9169e4e7cbee fix empty C prototypes
Francois Perrad <francois.perrad@gadz.org>
parents: 1212
diff changeset
42 static void cli_remoteclosed(void) ATTRIB_NORETURN;
9169e4e7cbee fix empty C prototypes
Francois Perrad <francois.perrad@gadz.org>
parents: 1212
diff changeset
43 static void cli_sessionloop(void);
1208
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
44 static void cli_session_init(pid_t proxy_cmd_pid);
1276
9169e4e7cbee fix empty C prototypes
Francois Perrad <francois.perrad@gadz.org>
parents: 1212
diff changeset
45 static void cli_finished(void) ATTRIB_NORETURN;
727
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
46 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
47 static void cli_session_cleanup(void);
937
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
48 static void recv_msg_global_request_cli(void);
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
49
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
50 struct clientsession cli_ses; /* GLOBAL */
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
51
45
9ee8996a375f Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents: 43
diff changeset
52 /* 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
53 * should be first */
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
54 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
55 /* TYPE, FUNCTION */
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
56 {SSH_MSG_CHANNEL_DATA, recv_msg_channel_data},
107
Matt Johnston <matt@ucc.asn.au>
parents: 100
diff changeset
57 {SSH_MSG_CHANNEL_EXTENDED_DATA, recv_msg_channel_extended_data},
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
58 {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
59 {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
60 {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
61 {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
62 {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
63 {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
64 {SSH_MSG_SERVICE_ACCEPT, recv_msg_service_accept}, /* client */
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
65 {SSH_MSG_CHANNEL_REQUEST, recv_msg_channel_request},
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
66 {SSH_MSG_CHANNEL_OPEN, recv_msg_channel_open},
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
67 {SSH_MSG_CHANNEL_EOF, recv_msg_channel_eof},
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
68 {SSH_MSG_CHANNEL_CLOSE, recv_msg_channel_close},
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
69 {SSH_MSG_CHANNEL_OPEN_CONFIRMATION, recv_msg_channel_open_confirmation},
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
70 {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
71 {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
72 {SSH_MSG_USERAUTH_SPECIFIC_60, recv_msg_userauth_specific_60}, /* client */
937
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
73 {SSH_MSG_GLOBAL_REQUEST, recv_msg_global_request_cli},
970
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 968
diff changeset
74 {SSH_MSG_CHANNEL_SUCCESS, ignore_recv_response},
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 968
diff changeset
75 {SSH_MSG_CHANNEL_FAILURE, ignore_recv_response},
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1278
diff changeset
76 #if DROPBEAR_CLI_REMOTETCPFWD
505
805e557fdff7 Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents: 486
diff changeset
77 {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
78 {SSH_MSG_REQUEST_FAILURE, cli_recv_msg_request_failure}, /* client */
968
f7f6c15b0ec3 Don't send SSH_MSG_UNIMPLEMENTED for keepalive responses
Matt Johnston <matt@ucc.asn.au>
parents: 937
diff changeset
79 #else
970
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 968
diff changeset
80 /* For keepalive */
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 968
diff changeset
81 {SSH_MSG_REQUEST_SUCCESS, ignore_recv_response},
0bb16232e7c4 Make keepalive handling more robust, this should now match what OpenSSH does
Matt Johnston <matt@ucc.asn.au>
parents: 968
diff changeset
82 {SSH_MSG_REQUEST_FAILURE, ignore_recv_response},
505
805e557fdff7 Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents: 486
diff changeset
83 #endif
1676
d5cdc60db08e ext-info handling for server-sig-algs
Matt Johnston <matt@ucc.asn.au>
parents: 1625
diff changeset
84 {SSH_MSG_EXT_INFO, recv_msg_ext_info},
1404
e8f67918fdc9 when pointer, use NULL instead of 0
Francois Perrad <francois.perrad@gadz.org>
parents: 1387
diff changeset
85 {0, NULL} /* End */
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
86 };
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
87
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
88 static const struct ChanType *cli_chantypes[] = {
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1278
diff changeset
89 #if DROPBEAR_CLI_REMOTETCPFWD
64
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
90 &cli_chan_tcpremote,
efb5e0b335cf TCP forwarding works.
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
91 #endif
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1278
diff changeset
92 #if DROPBEAR_CLI_AGENTFWD
225
ca7e76d981d9 - progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents: 215
diff changeset
93 &cli_chan_agent,
ca7e76d981d9 - progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents: 215
diff changeset
94 #endif
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
95 NULL /* Null termination */
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
96 };
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
97
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
98 void cli_connected(int result, int sock, void* userdata, const char *errstring)
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
99 {
1032
0da8ba489c23 Move generic network routines to netio.c
Matt Johnston <matt@ucc.asn.au>
parents: 1031
diff changeset
100 struct sshsession *myses = userdata;
0da8ba489c23 Move generic network routines to netio.c
Matt Johnston <matt@ucc.asn.au>
parents: 1031
diff changeset
101 if (result == DROPBEAR_FAILURE) {
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
102 dropbear_exit("Connect failed: %s", errstring);
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
103 }
1032
0da8ba489c23 Move generic network routines to netio.c
Matt Johnston <matt@ucc.asn.au>
parents: 1031
diff changeset
104 myses->sock_in = myses->sock_out = sock;
1894
62e4baa059c3 changed TRACE to DEBUG1 for dbclient
HansH111 <hans@atbas.org>
parents: 1859
diff changeset
105 DEBUG1(("cli_connected"))
1859
1d86a58fb52d Leave non-interactive at default QoS class
Matt Johnston <matt@ucc.asn.au>
parents: 1830
diff changeset
106 ses.socket_prio = DROPBEAR_PRIO_NORMAL;
1d86a58fb52d Leave non-interactive at default QoS class
Matt Johnston <matt@ucc.asn.au>
parents: 1830
diff changeset
107 /* switches to lowdelay */
1031
64c0aa01e2b6 Update priority once the socket is open
Matt Johnston <matt@ucc.asn.au>
parents: 1027
diff changeset
108 update_channel_prio();
1025
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
109 }
02baa0b334e8 async connections working
Matt Johnston <matt@ucc.asn.au>
parents: 970
diff changeset
110
1208
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
111 void cli_session(int sock_in, int sock_out, struct dropbear_progress_connection *progress, pid_t proxy_cmd_pid) {
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
112
568
005530560594 Rearrange getaddrstring() etc
Matt Johnston <matt@ucc.asn.au>
parents: 560
diff changeset
113 common_session_init(sock_in, sock_out);
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
114
1027
daf21fd50abf In theory TFO should work. Needs platform cleanup and testing
Matt Johnston <matt@ucc.asn.au>
parents: 1025
diff changeset
115 if (progress) {
daf21fd50abf In theory TFO should work. Needs platform cleanup and testing
Matt Johnston <matt@ucc.asn.au>
parents: 1025
diff changeset
116 connect_set_writequeue(progress, &ses.writequeue);
daf21fd50abf In theory TFO should work. Needs platform cleanup and testing
Matt Johnston <matt@ucc.asn.au>
parents: 1025
diff changeset
117 }
daf21fd50abf In theory TFO should work. Needs platform cleanup and testing
Matt Johnston <matt@ucc.asn.au>
parents: 1025
diff changeset
118
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
119 chaninitialise(cli_chantypes);
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
120
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
121 /* Set up cli_ses vars */
1208
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
122 cli_session_init(proxy_cmd_pid);
1027
daf21fd50abf In theory TFO should work. Needs platform cleanup and testing
Matt Johnston <matt@ucc.asn.au>
parents: 1025
diff changeset
123
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
124 /* Ready to go */
1495
0c16b4ccbd54 make signal flags volatile, simplify handling
Matt Johnston <matt@ucc.asn.au>
parents: 1479
diff changeset
125 ses.init_done = 1;
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
126
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
127 /* 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
128 send_session_identification();
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
129
1083
8e0280986710 Make sure kexfirstinitialise is called early enough
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
130 kexfirstinitialise(); /* initialise the kex state */
8e0280986710 Make sure kexfirstinitialise is called early enough
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
131
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
132 send_msg_kexinit();
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
133
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
134 session_loop(cli_sessionloop);
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
135
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
136 /* Not reached */
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
137
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
138 }
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
139
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1278
diff changeset
140 #if DROPBEAR_KEX_FIRST_FOLLOWS
739
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
141 static void cli_send_kex_first_guess() {
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
142 send_msg_kexdh_init();
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
143 }
746
465fefc4f6e0 Put some #ifdef options around first-follows options in case they
Matt Johnston <matt@ucc.asn.au>
parents: 745
diff changeset
144 #endif
739
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
145
1208
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
146 static void cli_session_init(pid_t proxy_cmd_pid) {
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
147
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
148 cli_ses.state = STATE_NOTHING;
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
149 cli_ses.kex_state = KEX_NOTHING;
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
150
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents: 37
diff changeset
151 cli_ses.tty_raw_mode = 0;
41
18eccbfb9641 added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
152 cli_ses.winchange = 0;
39
0883c0906870 tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents: 37
diff changeset
153
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
154 /* 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
155 * (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
156 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
157 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
158 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
159 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
160 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
161 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
162
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
163 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
164 specific exit status */
1208
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
165 cli_ses.proxy_cmd_pid = proxy_cmd_pid;
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
166 TRACE(("proxy command PID='%d'", proxy_cmd_pid));
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
167
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
168 /* Auth */
215
aad4b3f58556 rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents: 175
diff changeset
169 cli_ses.lastprivkey = NULL;
136
fb7147e2fb04 - Fixed a couple of compile warnings
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
170 cli_ses.lastauthtype = 0;
1821
df8d8ec1801c added option to disable trivial auth methods (#128)
Manfred Kaiser <37737811+manfred-kaiser@users.noreply.github.com>
parents: 1789
diff changeset
171 cli_ses.is_trivial_auth = 1;
47
4b53a43f0082 - client pubkey auth works
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
172
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
173 /* For printing "remote host closed" for the user */
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
174 ses.remoteclosed = cli_remoteclosed;
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
175
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
176 ses.extra_session_cleanup = cli_session_cleanup;
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
177
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
178 /* packet handlers */
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
179 ses.packettypes = cli_packettypes;
35
0ad5fb979f42 set the isserver flag (oops)
Matt Johnston <matt@ucc.asn.au>
parents: 34
diff changeset
180
0ad5fb979f42 set the isserver flag (oops)
Matt Johnston <matt@ucc.asn.au>
parents: 34
diff changeset
181 ses.isserver = 0;
739
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
182
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1278
diff changeset
183 #if DROPBEAR_KEX_FIRST_FOLLOWS
739
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
184 ses.send_kex_first_guess = cli_send_kex_first_guess;
746
465fefc4f6e0 Put some #ifdef options around first-follows options in case they
Matt Johnston <matt@ucc.asn.au>
parents: 745
diff changeset
185 #endif
739
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
186
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
187 }
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
188
1538
f20038b513a5 more linting (#58)
François Perrad <francois.perrad@gadz.org>
parents: 1495
diff changeset
189 static void send_msg_service_request(const char* servicename) {
727
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
190
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
191 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
192
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
193 CHECKCLEARTOWRITE();
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
194
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
195 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
196 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
197
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
198 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
199 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
200 }
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
201
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
202 static void recv_msg_service_accept(void) {
857
c19acba28590 use oldstyle comments
Matt Johnston <matt@ucc.asn.au>
parents: 801
diff changeset
203 /* do nothing, if it failed then the server MUST have disconnected */
727
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
204 }
00bc3df3a9c3 Don't bother waiting for a ssh-connection service reply - the server
Matt Johnston <matt@ucc.asn.au>
parents: 726
diff changeset
205
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
206 /* This function drives the progress of the session - it initiates KEX,
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
207 * service, userauth and channel requests */
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
208 static void cli_sessionloop() {
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
209
731
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 727
diff changeset
210 TRACE2(("enter cli_sessionloop"))
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
211
745
15999b098cc9 Don't usually need to recalculate dh_e for the repeated kexdh_init packet
Matt Johnston <matt@ucc.asn.au>
parents: 743
diff changeset
212 if (ses.lastpacket == 0) {
15999b098cc9 Don't usually need to recalculate dh_e for the repeated kexdh_init packet
Matt Johnston <matt@ucc.asn.au>
parents: 743
diff changeset
213 TRACE2(("exit cli_sessionloop: no real packets yet"))
15999b098cc9 Don't usually need to recalculate dh_e for the repeated kexdh_init packet
Matt Johnston <matt@ucc.asn.au>
parents: 743
diff changeset
214 return;
15999b098cc9 Don't usually need to recalculate dh_e for the repeated kexdh_init packet
Matt Johnston <matt@ucc.asn.au>
parents: 743
diff changeset
215 }
15999b098cc9 Don't usually need to recalculate dh_e for the repeated kexdh_init packet
Matt Johnston <matt@ucc.asn.au>
parents: 743
diff changeset
216
34
e2a1eaa19f22 Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents: 33
diff changeset
217 if (ses.lastpacket == SSH_MSG_KEXINIT && cli_ses.kex_state == KEX_NOTHING) {
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
218 /* We initiate the KEXDH. If DH wasn't the correct type, the KEXINIT
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
219 * negotiation would have failed. */
739
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
220 if (!ses.kexstate.our_first_follows_matches) {
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
221 send_msg_kexdh_init();
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
222 }
d44325108d0e first_kex_packet_follows working, needs tidying
Matt Johnston <matt@ucc.asn.au>
parents: 686
diff changeset
223 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
224 TRACE(("leave cli_sessionloop: done with KEXINIT_RCVD"))
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
225 return;
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
226 }
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
227
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
228 /* A KEX has finished, so we should go back to our KEX_NOTHING state */
753
d63ef1e211ea Take transmit and receive keys into use separately
Matt Johnston <matt@ucc.asn.au>
parents: 750
diff changeset
229 if (cli_ses.kex_state != KEX_NOTHING && ses.kexstate.sentnewkeys) {
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
230 cli_ses.kex_state = KEX_NOTHING;
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
231 }
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
232
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
233 /* We shouldn't do anything else if a KEX is in progress */
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
234 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
235 TRACE(("leave cli_sessionloop: kex_state != KEX_NOTHING"))
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
236 return;
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
237 }
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
238
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
239 if (ses.kexstate.donefirstkex == 0) {
745
15999b098cc9 Don't usually need to recalculate dh_e for the repeated kexdh_init packet
Matt Johnston <matt@ucc.asn.au>
parents: 743
diff changeset
240 /* We might reach here if we have partial packet reads or have
15999b098cc9 Don't usually need to recalculate dh_e for the repeated kexdh_init packet
Matt Johnston <matt@ucc.asn.au>
parents: 743
diff changeset
241 * received SSG_MSG_IGNORE etc. Just skip it */
753
d63ef1e211ea Take transmit and receive keys into use separately
Matt Johnston <matt@ucc.asn.au>
parents: 750
diff changeset
242 TRACE2(("donefirstkex false\n"))
34
e2a1eaa19f22 Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents: 33
diff changeset
243 return;
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
244 }
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
245
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
246 switch (cli_ses.state) {
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
247
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
248 case STATE_NOTHING:
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
249 /* We've got the transport layer sorted, we now need to request
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
250 * userauth */
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
251 send_msg_service_request(SSH_SERVICE_USERAUTH);
1825
7a0068effc65 Add a comment about sending initial auth request
Matt Johnston <matt@ucc.asn.au>
parents: 1789
diff changeset
252 /* We aren't using any "implicit server authentication" methods,
7a0068effc65 Add a comment about sending initial auth request
Matt Johnston <matt@ucc.asn.au>
parents: 1789
diff changeset
253 so don't need to wait for a response for SSH_SERVICE_USERAUTH
7a0068effc65 Add a comment about sending initial auth request
Matt Johnston <matt@ucc.asn.au>
parents: 1789
diff changeset
254 before sending the auth messages (rfc4253 10) */
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
255 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
256 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
257 TRACE(("leave cli_sessionloop: sent userauth methods req"))
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
258 return;
883
ff597bf2cfb0 DROPBEAR_CLI_AUTH_IMMEDIATE fixed, now enabled by default
Matt Johnston <matt@ucc.asn.au>
parents: 858
diff changeset
259
ff597bf2cfb0 DROPBEAR_CLI_AUTH_IMMEDIATE fixed, now enabled by default
Matt Johnston <matt@ucc.asn.au>
parents: 858
diff changeset
260 case USERAUTH_REQ_SENT:
ff597bf2cfb0 DROPBEAR_CLI_AUTH_IMMEDIATE fixed, now enabled by default
Matt Johnston <matt@ucc.asn.au>
parents: 858
diff changeset
261 TRACE(("leave cli_sessionloop: waiting, req_sent"))
ff597bf2cfb0 DROPBEAR_CLI_AUTH_IMMEDIATE fixed, now enabled by default
Matt Johnston <matt@ucc.asn.au>
parents: 858
diff changeset
262 return;
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
263
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
264 case USERAUTH_FAIL_RCVD:
734
619b1ed837fd Be a bit more careful about when we want to use CLI_AUTH_IMMEDIATE
Matt Johnston <matt@ucc.asn.au>
parents: 733
diff changeset
265 if (cli_auth_try() == DROPBEAR_FAILURE) {
619b1ed837fd Be a bit more careful about when we want to use CLI_AUTH_IMMEDIATE
Matt Johnston <matt@ucc.asn.au>
parents: 733
diff changeset
266 dropbear_exit("No auth methods could be used.");
619b1ed837fd Be a bit more careful about when we want to use CLI_AUTH_IMMEDIATE
Matt Johnston <matt@ucc.asn.au>
parents: 733
diff changeset
267 }
45
9ee8996a375f Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents: 43
diff changeset
268 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
269 TRACE(("leave cli_sessionloop: cli_auth_try"))
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
270 return;
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
271
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 35
diff changeset
272 case USERAUTH_SUCCESS_RCVD:
1212
bf626d259eb1 Support syslog logging in dbclient.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1208
diff changeset
273 #ifndef DISABLE_SYSLOG
bf626d259eb1 Support syslog logging in dbclient.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1208
diff changeset
274 if (opts.usingsyslog) {
bf626d259eb1 Support syslog logging in dbclient.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1208
diff changeset
275 dropbear_log(LOG_INFO, "Authentication succeeded.");
bf626d259eb1 Support syslog logging in dbclient.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1208
diff changeset
276 }
bf626d259eb1 Support syslog logging in dbclient.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1208
diff changeset
277 #endif
326
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
278
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
279 if (cli_opts.backgrounded) {
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
280 int devnull;
433
c216212001fc Fix for -pedantic -ansi compilation, change // to /**/, plus some signedness
Matt Johnston <matt@ucc.asn.au>
parents: 326
diff changeset
281 /* 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
282 is confusing, though stdout/stderr could be useful. */
1387
e7f11ed5fe28 Use DROPBEAR_PATH_DEVNULL instead of undefined _PATH_DEVNULL
Ben Gardner <bgardner@wabtec.com>
parents: 1295
diff changeset
283 devnull = open(DROPBEAR_PATH_DEVNULL, O_RDONLY);
326
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
284 if (devnull < 0) {
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 568
diff changeset
285 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
286 errno, strerror(errno));
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
287 }
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
288 dup2(devnull, STDIN_FILENO);
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
289 if (daemon(0, 1) < 0) {
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
290 dropbear_exit("Backgrounding failed: %d %s",
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
291 errno, strerror(errno));
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
292 }
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
293 }
d965110e3f5c add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents: 325
diff changeset
294
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1278
diff changeset
295 #if DROPBEAR_CLI_NETCAT
485
12d845ab7b5f Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents: 478
diff changeset
296 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
297 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
298 } else
12d845ab7b5f Rework netcat-alike to be a proper mode, with -B argument.
Matt Johnston <matt@ucc.asn.au>
parents: 478
diff changeset
299 #endif
560
52d7301e46bd Agent forwarding works
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
300 if (!cli_opts.no_cmd) {
325
0e4f225b7e07 Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents: 272
diff changeset
301 cli_send_chansess_request();
0e4f225b7e07 Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents: 272
diff changeset
302 }
754
2400b8685762 setup tcp after requesting a channel - might hide some DNS latency
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
303
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1278
diff changeset
304 #if DROPBEAR_CLI_LOCALTCPFWD
754
2400b8685762 setup tcp after requesting a channel - might hide some DNS latency
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
305 setup_localtcp();
2400b8685762 setup tcp after requesting a channel - might hide some DNS latency
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
306 #endif
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1278
diff changeset
307 #if DROPBEAR_CLI_REMOTETCPFWD
754
2400b8685762 setup tcp after requesting a channel - might hide some DNS latency
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
308 setup_remotetcp();
2400b8685762 setup tcp after requesting a channel - might hide some DNS latency
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
309 #endif
2400b8685762 setup tcp after requesting a channel - might hide some DNS latency
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
310
325
0e4f225b7e07 Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents: 272
diff changeset
311 TRACE(("leave cli_sessionloop: running"))
37
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 35
diff changeset
312 cli_ses.state = SESSION_RUNNING;
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 35
diff changeset
313 return;
0913e2ee3545 we're nearly there yet
Matt Johnston <matt@ucc.asn.au>
parents: 35
diff changeset
314
40
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
315 case SESSION_RUNNING:
325
0e4f225b7e07 Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents: 272
diff changeset
316 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
317 cli_finished();
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
318 }
41
18eccbfb9641 added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
319
18eccbfb9641 added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
320 if (cli_ses.winchange) {
18eccbfb9641 added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
321 cli_chansess_winchange();
18eccbfb9641 added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents: 40
diff changeset
322 }
40
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
323 return;
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
324
33
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
325 /* XXX more here needed */
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
326
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
327
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
328 default:
f789045062e6 Progressing client support
Matt Johnston <matt@ucc.asn.au>
parents: 26
diff changeset
329 break;
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
330 }
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
331
731
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 727
diff changeset
332 TRACE2(("leave cli_sessionloop: fell out"))
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
333
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
334 }
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
335
1208
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
336 void kill_proxy_command(void) {
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
337 /*
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
338 * Send SIGHUP to proxy command if used. We don't wait() in
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
339 * case it hangs and instead rely on init to reap the child
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
340 */
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
341 if (cli_ses.proxy_cmd_pid > 1) {
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
342 TRACE(("killing proxy command with PID='%d'", cli_ses.proxy_cmd_pid));
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
343 kill(cli_ses.proxy_cmd_pid, SIGHUP);
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
344 }
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
345 }
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
346
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
347 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
348
1495
0c16b4ccbd54 make signal flags volatile, simplify handling
Matt Johnston <matt@ucc.asn.au>
parents: 1479
diff changeset
349 if (!ses.init_done) {
40
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
350 return;
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
351 }
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
352
1208
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
353 kill_proxy_command();
fb58cf341951 Client: kill proxy command when exiting application.
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1124
diff changeset
354
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
355 /* 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
356 * we don't revert the flags */
1258
854f39ff5105 ignore return value from fcntl()
Matt Johnston <matt@ucc.asn.au>
parents: 1212
diff changeset
357 /* Ignore return value since there's nothing we can do */
854f39ff5105 ignore return value from fcntl()
Matt Johnston <matt@ucc.asn.au>
parents: 1212
diff changeset
358 (void)fcntl(cli_ses.stdincopy, F_SETFL, cli_ses.stdinflags);
854f39ff5105 ignore return value from fcntl()
Matt Johnston <matt@ucc.asn.au>
parents: 1212
diff changeset
359 (void)fcntl(cli_ses.stdoutcopy, F_SETFL, cli_ses.stdoutflags);
854f39ff5105 ignore return value from fcntl()
Matt Johnston <matt@ucc.asn.au>
parents: 1212
diff changeset
360 (void)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
361
1742
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
362 /* Don't leak */
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
363 m_close(cli_ses.stdincopy);
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
364 m_close(cli_ses.stdoutcopy);
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
365 m_close(cli_ses.stderrcopy);
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
366
40
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
367 cli_tty_cleanup();
1676
d5cdc60db08e ext-info handling for server-sig-algs
Matt Johnston <matt@ucc.asn.au>
parents: 1625
diff changeset
368 if (cli_ses.server_sig_algs) {
d5cdc60db08e ext-info handling for server-sig-algs
Matt Johnston <matt@ucc.asn.au>
parents: 1625
diff changeset
369 buf_free(cli_ses.server_sig_algs);
d5cdc60db08e ext-info handling for server-sig-algs
Matt Johnston <matt@ucc.asn.au>
parents: 1625
diff changeset
370 }
40
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
371 }
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
372
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
373 static void cli_finished() {
1686
83d48276885b fix typo
Matt Johnston <matt@ucc.asn.au>
parents: 1676
diff changeset
374 TRACE(("cli_finished()"))
40
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
375
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
376 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
377 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
378 cli_opts.remotehost, cli_opts.remoteport);
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
379 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
380 }
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
381
b4874d772210 - Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents: 39
diff changeset
382
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
383 /* called when the remote side closes the connection */
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
384 static void cli_remoteclosed() {
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
385
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
386 /* XXX TODO perhaps print a friendlier message if we get this but have
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
387 * 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
388 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
389 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
390 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
391 ses.sock_out = -1;
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 568
diff changeset
392 dropbear_exit("Remote closed the connection");
26
0969767bca0d snapshot of stuff
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
393 }
43
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
394
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
395 /* 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
396 * characters) text into clean text.
efbaf6b03837 added keyboard-interactive client support
Matt Johnston <matt@ucc.asn.au>
parents: 215
diff changeset
397 * Note: this is safe only with ascii - other charsets could have problems. */
1101
94ff5316980f Turn cleantext()'s dirtytext argument into char *
Gaël PORTAY <gael.portay@gmail.com>
parents: 1094
diff changeset
398 void cleantext(char* dirtytext) {
43
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
399
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
400 unsigned int i, j;
1101
94ff5316980f Turn cleantext()'s dirtytext argument into char *
Gaël PORTAY <gael.portay@gmail.com>
parents: 1094
diff changeset
401 char c;
43
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
402
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
403 j = 0;
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
404 for (i = 0; dirtytext[i] != '\0'; i++) {
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
405
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
406 c = dirtytext[i];
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
407 /* We can ignore '\r's */
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
408 if ( (c >= ' ' && c <= '~') || c == '\n' || c == '\t') {
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
409 dirtytext[j] = c;
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
410 j++;
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
411 }
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
412 }
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
413 /* Null terminate */
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
414 dirtytext[j] = '\0';
942b22d7dd1c Banner printing
Matt Johnston <matt@ucc.asn.au>
parents: 41
diff changeset
415 }
937
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
416
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
417 static void recv_msg_global_request_cli(void) {
1788
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
418 unsigned int wantreply = 0;
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
419
1789
249681d9ecda Use buf_eatstring instead
Matt Johnston <matt@ucc.asn.au>
parents: 1788
diff changeset
420 buf_eatstring(ses.payload);
1788
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
421 wantreply = buf_getbool(ses.payload);
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
422
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
423 TRACE(("recv_msg_global_request_cli: want_reply: %u", wantreply));
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
424
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
425 if (wantreply) {
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
426 /* Send a proper rejection */
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
427 send_msg_request_failure();
1fc0012b9c38 Fix handling of replies to global requests (#112)
Dirkjan Bussink <d.bussink@gmail.com>
parents: 1742
diff changeset
428 }
937
4ad38e223ccd Send a failure response if a client receives a global request
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
429 }
1741
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
430
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
431 void cli_dropbear_exit(int exitcode, const char* format, va_list param) {
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
432 char exitmsg[150];
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
433 char fullmsg[300];
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
434
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
435 /* Note that exit message must be rendered before session cleanup */
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
436
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
437 /* Render the formatted exit message */
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
438 vsnprintf(exitmsg, sizeof(exitmsg), format, param);
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
439 TRACE(("Exited, cleaning up: %s", exitmsg))
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
440
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
441 /* Add the prefix depending on session/auth state */
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
442 if (!ses.init_done) {
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
443 snprintf(fullmsg, sizeof(fullmsg), "Exited: %s", exitmsg);
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
444 } else {
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
445 snprintf(fullmsg, sizeof(fullmsg),
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
446 "Connection to %s@%s:%s exited: %s",
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
447 cli_opts.username, cli_opts.remotehost,
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
448 cli_opts.remoteport, exitmsg);
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
449 }
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
450
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
451 /* Do the cleanup first, since then the terminal will be reset */
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
452 session_cleanup();
1742
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
453
1741
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
454 #if DROPBEAR_FUZZ
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
455 if (fuzz.do_jmp) {
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
456 longjmp(fuzz.jmp, 1);
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
457 }
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
458 #endif
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
459
1742
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
460 /* Avoid printing onwards from terminal cruft */
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
461 fprintf(stderr, "\n");
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
462
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
463 dropbear_log(LOG_INFO, "%s", fullmsg);
6e71440b1e47 Add fuzzer-client_nomaths, fix client fuzzer
Matt Johnston <matt@ucc.asn.au>
parents: 1741
diff changeset
464
1741
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
465 exit(exitcode);
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
466 }
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
467
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
468 void cli_dropbear_log(int priority, const char* format, va_list param) {
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
469
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
470 char printbuf[1024];
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
471 const char *name;
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
472
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
473 name = cli_opts.progname;
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
474 if (!name) {
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
475 name = "dbclient";
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
476 }
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
477
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
478 vsnprintf(printbuf, sizeof(printbuf), format, param);
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
479
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
480 #ifndef DISABLE_SYSLOG
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
481 if (opts.usingsyslog) {
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
482 syslog(priority, "%s", printbuf);
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
483 }
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
484 #endif
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
485
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
486 fprintf(stderr, "%s: %s\n", name, printbuf);
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
487 fflush(stderr);
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
488 }
d1b279aa5ed1 Get client fuzzer building and starting (fails straight away)
Matt Johnston <matt@ucc.asn.au>
parents: 1686
diff changeset
489