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