From 44bb4bb4c68724d52a014425b6bbcec1c0f45274 Mon Sep 17 00:00:00 2001 From: Toni Uhlig Date: Sat, 21 Apr 2018 20:36:42 +0200 Subject: POTD skeleton #20. Signed-off-by: Toni Uhlig --- src/server_ssh.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to 'src/server_ssh.c') diff --git a/src/server_ssh.c b/src/server_ssh.c index 81dddc6..7082f70 100644 --- a/src/server_ssh.c +++ b/src/server_ssh.c @@ -228,8 +228,10 @@ static void ssh_log_cb(int priority, const char *function, static void * ssh_thread_mainloop(void *arg) { - int s, auth = 0; + int s, auth = 0, shell = 0; ssh_session ses; + ssh_message message; + ssh_channel chan = NULL; assert(arg); ssh_data *d = (ssh_data *) arg; @@ -258,6 +260,59 @@ ssh_thread_mainloop(void *arg) goto failed; } + /* wait for a channel session */ + do { + message = ssh_message_get(ses); + if (message) { + if (ssh_message_type(message) == SSH_REQUEST_CHANNEL_OPEN && + ssh_message_subtype(message) == SSH_CHANNEL_SESSION) + { + chan = ssh_message_channel_request_open_reply_accept(message); + ssh_message_free(message); + break; + } else { + ssh_message_reply_default(message); + ssh_message_free(message); + } + } else { + break; + } + } while (!chan); + + if (!chan) { + W("SSH client did not ask for a channel session: %s", + ssh_get_error(ses)); + goto failed; + } + + /* wait for a shell */ + do { + message = ssh_message_get(ses); + if (message != NULL) { + if (ssh_message_type(message) == SSH_REQUEST_CHANNEL) { + if (ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_SHELL) { + shell = 1; + ssh_message_channel_request_reply_success(message); + ssh_message_free(message); + break; + } else if (ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_PTY) { + ssh_message_channel_request_reply_success(message); + ssh_message_free(message); + continue; + } + } + ssh_message_reply_default(message); + ssh_message_free(message); + } else { + break; + } + } while (!shell); + + if (!shell) { + W("SSH client had no shell requested: %s", ssh_get_error(ses)); + goto failed; + } + failed: ssh_disconnect(ses); ssh_free(ses); @@ -299,7 +354,7 @@ static int authenticate(ssh_session session) case SSH_AUTH_METHOD_NONE: default: - N("SSH: User '%s' wants to auth with unknown auth '%d'\n", + N("SSH: User '%s' wants to auth with unknown auth '%d'", ssh_message_auth_user(message), ssh_message_subtype(message)); ssh_message_auth_set_methods(message, -- cgit v1.2.3