diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2014-02-16 17:58:55 +0100 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2014-02-16 17:58:55 +0100 |
commit | c7cb2d0657b92c10e2a5201c5d2c22873c933d66 (patch) | |
tree | 822e5f643bbbab50d822d2c5ac4c2d6111278ee4 /examples | |
parent | fd50a4dd9f83f8a99ac6491fd5dd1437d95d0b5d (diff) | |
download | libssh-c7cb2d0657b92c10e2a5201c5d2c22873c933d66.tar.gz libssh-c7cb2d0657b92c10e2a5201c5d2c22873c933d66.tar.xz libssh-c7cb2d0657b92c10e2a5201c5d2c22873c933d66.zip |
examples: Remove old samplesshd-tty.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/CMakeLists.txt | 3 | ||||
-rw-r--r-- | examples/samplesshd-tty.c | 472 |
2 files changed, 0 insertions, 475 deletions
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index aaecf56d..5e6d1bfc 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -27,9 +27,6 @@ if (UNIX AND NOT WIN32) if (WITH_SERVER) if (HAVE_LIBUTIL) - add_executable(samplesshd-tty samplesshd-tty.c) - target_link_libraries(samplesshd-tty ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES} util) - add_executable(ssh_server_fork ssh_server_fork.c) target_link_libraries(ssh_server_fork ${LIBSSH_SHARED_LIBRARY} ${ARGP_LIBRARIES} util) endif (HAVE_LIBUTIL) diff --git a/examples/samplesshd-tty.c b/examples/samplesshd-tty.c deleted file mode 100644 index 5e9e56ce..00000000 --- a/examples/samplesshd-tty.c +++ /dev/null @@ -1,472 +0,0 @@ -/* This is a sample implementation of a libssh based SSH server */ -/* -Copyright 2003-2011 Aris Adamantiadis - -This file is part of the SSH Library - -You are free to copy this file, modify it in any way, consider it being public -domain. This does not apply to the rest of the library though, but it is -allowed to cut-and-paste working code from this file to any license of -program. -The goal is to show the API in action. It's not a reference on how terminal -clients must be made or how a client should react. -*/ - -#include "config.h" - -#include <libssh/libssh.h> -#include <libssh/server.h> -#include <libssh/callbacks.h> - -#ifdef HAVE_ARGP_H -#include <argp.h> -#endif -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <poll.h> -#ifdef HAVE_PTY_H -#include <pty.h> -#endif -#ifdef HAVE_UTIL_H -#include <util.h> -#endif -#ifdef HAVE_LIBUTIL_H -#include <libutil.h> -#endif -#ifdef HAVE_TERMIOS_H -#include <termios.h> -#endif -#define SSHD_USER "libssh" -#define SSHD_PASSWORD "libssh" - -#ifndef KEYS_FOLDER -#ifdef _WIN32 -#define KEYS_FOLDER -#else -#define KEYS_FOLDER "/etc/ssh/" -#endif -#endif - -static int port = 22; - -#ifdef WITH_PCAP -const char *pcap_file="debug.server.pcap"; -ssh_pcap_file pcap; - -static void set_pcap(ssh_session session){ - if(!pcap_file) - return; - pcap=ssh_pcap_file_new(); - if(ssh_pcap_file_open(pcap,pcap_file) == SSH_ERROR){ - printf("Error opening pcap file\n"); - ssh_pcap_file_free(pcap); - pcap=NULL; - return; - } - ssh_set_pcap_file(session,pcap); -} - -static void cleanup_pcap(){ - ssh_pcap_file_free(pcap); - pcap=NULL; -} -#endif - - -static int auth_password(const char *user, const char *password){ - if(strcmp(user, SSHD_USER)) - return 0; - if(strcmp(password, SSHD_PASSWORD)) - return 0; - return 1; // authenticated -} -#ifdef HAVE_ARGP_H -const char *argp_program_version = "libssh server example " - SSH_STRINGIFY(LIBSSH_VERSION); -const char *argp_program_bug_address = "<libssh@libssh.org>"; - -/* Program documentation. */ -static char doc[] = "libssh -- a Secure Shell protocol implementation"; - -/* A description of the arguments we accept. */ -static char args_doc[] = "BINDADDR"; - -/* The options we understand. */ -static struct argp_option options[] = { - { - .name = "port", - .key = 'p', - .arg = "PORT", - .flags = 0, - .doc = "Set the port to bind.", - .group = 0 - }, - { - .name = "hostkey", - .key = 'k', - .arg = "FILE", - .flags = 0, - .doc = "Set the host key.", - .group = 0 - }, - { - .name = "dsakey", - .key = 'd', - .arg = "FILE", - .flags = 0, - .doc = "Set the dsa key.", - .group = 0 - }, - { - .name = "rsakey", - .key = 'r', - .arg = "FILE", - .flags = 0, - .doc = "Set the rsa key.", - .group = 0 - }, - { - .name = "verbose", - .key = 'v', - .arg = NULL, - .flags = 0, - .doc = "Get verbose output.", - .group = 0 - }, - {NULL, 0, 0, 0, NULL, 0} -}; - -/* Parse a single option. */ -static error_t parse_opt (int key, char *arg, struct argp_state *state) { - /* Get the input argument from argp_parse, which we - * know is a pointer to our arguments structure. - */ - ssh_bind sshbind = state->input; - - switch (key) { - case 'p': - ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT_STR, arg); - port = atoi(arg); - break; - case 'd': - ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, arg); - break; - case 'k': - ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, arg); - break; - case 'r': - ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, arg); - break; - case 'v': - ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR, "3"); - break; - case ARGP_KEY_ARG: - if (state->arg_num >= 1) { - /* Too many arguments. */ - argp_usage (state); - } - ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDADDR, arg); - break; - case ARGP_KEY_END: - if (state->arg_num < 1) { - /* Not enough arguments. */ - argp_usage (state); - } - break; - default: - return ARGP_ERR_UNKNOWN; - } - - return 0; -} - -/* Our argp parser. */ -static struct argp argp = {options, parse_opt, args_doc, doc, NULL, NULL, NULL}; -#endif /* HAVE_ARGP_H */ - -static int authenticate(ssh_session session) { - ssh_message message; - - do { - message=ssh_message_get(session); - if(!message) - break; - switch(ssh_message_type(message)){ - case SSH_REQUEST_AUTH: - switch(ssh_message_subtype(message)){ - case SSH_AUTH_METHOD_PASSWORD: - printf("User %s wants to auth with pass %s\n", - ssh_message_auth_user(message), - ssh_message_auth_password(message)); - if(auth_password(ssh_message_auth_user(message), - ssh_message_auth_password(message))){ - ssh_message_auth_reply_success(message,0); - ssh_message_free(message); - return 1; - } - ssh_message_auth_set_methods(message, - SSH_AUTH_METHOD_PASSWORD | - SSH_AUTH_METHOD_INTERACTIVE); - // not authenticated, send default message - ssh_message_reply_default(message); - break; - - case SSH_AUTH_METHOD_NONE: - default: - printf("User %s wants to auth with unknown auth %d\n", - ssh_message_auth_user(message), - ssh_message_subtype(message)); - ssh_message_auth_set_methods(message, - SSH_AUTH_METHOD_PASSWORD | - SSH_AUTH_METHOD_INTERACTIVE); - ssh_message_reply_default(message); - break; - } - break; - default: - ssh_message_auth_set_methods(message, - SSH_AUTH_METHOD_PASSWORD | - SSH_AUTH_METHOD_INTERACTIVE); - ssh_message_reply_default(message); - } - ssh_message_free(message); - } while (1); - return 0; -} - -static int copy_fd_to_chan(socket_t fd, int revents, void *userdata) { - ssh_channel chan = (ssh_channel)userdata; - char buf[2048]; - int sz = 0; - - if(!chan) { - close(fd); - return -1; - } - if(revents & POLLIN) { - sz = read(fd, buf, 2048); - if(sz > 0) { - ssh_channel_write(chan, buf, sz); - } - } - if(revents & POLLHUP) { - ssh_channel_close(chan); - sz = -1; - } - return sz; -} - -static int copy_chan_to_fd(ssh_session session, - ssh_channel channel, - void *data, - uint32_t len, - int is_stderr, - void *userdata) { - int fd = *(int*)userdata; - int sz; - (void)session; - (void)channel; - (void)is_stderr; - - sz = write(fd, data, len); - return sz; -} - -static void chan_close(ssh_session session, ssh_channel channel, void *userdata) { - int fd = *(int*)userdata; - (void)session; - (void)channel; - - close(fd); -} - -struct ssh_channel_callbacks_struct cb = { - .channel_data_function = copy_chan_to_fd, - .channel_eof_function = chan_close, - .channel_close_function = chan_close, - .userdata = NULL -}; - -static int main_loop(ssh_channel chan) { - ssh_session session = ssh_channel_get_session(chan); - socket_t fd; - struct termios *term = NULL; - struct winsize *win = NULL; - pid_t childpid; - ssh_event event; - short events; - int rc; - - childpid = forkpty(&fd, NULL, term, win); - if(childpid == 0) { - execl("/bin/bash", "/bin/bash", (char *)NULL); - abort(); - } - - cb.userdata = &fd; - ssh_callbacks_init(&cb); - ssh_set_channel_callbacks(chan, &cb); - - events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL; - - event = ssh_event_new(); - if(event == NULL) { - printf("Couldn't get a event\n"); - return -1; - } - if(ssh_event_add_fd(event, fd, events, copy_fd_to_chan, chan) != SSH_OK) { - printf("Couldn't add an fd to the event\n"); - ssh_event_free(event); - return -1; - } - if(ssh_event_add_session(event, session) != SSH_OK) { - printf("Couldn't add the session to the event\n"); - ssh_event_remove_fd(event, fd); - ssh_event_free(event); - return -1; - } - - do { - rc = ssh_event_dopoll(event, 1000); - if (rc == SSH_ERROR){ - fprintf(stderr, "Error : %s\n", ssh_get_error(session)); - ssh_event_free(event); - ssh_disconnect(session); - return -1; - } - } while(!ssh_channel_is_closed(chan)); - - ssh_event_remove_fd(event, fd); - - ssh_event_remove_session(event, session); - - ssh_event_free(event); - return 0; -} - - -int main(int argc, char **argv){ - ssh_session session; - ssh_bind sshbind; - ssh_message message; - ssh_channel chan=0; - int auth=0; - int shell=0; - int r; - - sshbind=ssh_bind_new(); - session=ssh_new(); - - ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, - KEYS_FOLDER "ssh_host_dsa_key"); - ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, - KEYS_FOLDER "ssh_host_rsa_key"); - -#ifdef HAVE_ARGP_H - /* - * Parse our arguments; every option seen by parse_opt will - * be reflected in arguments. - */ - argp_parse (&argp, argc, argv, 0, 0, sshbind); -#else - (void) argc; - (void) argv; -#endif -#ifdef WITH_PCAP - set_pcap(session); -#endif - - if(ssh_bind_listen(sshbind)<0){ - printf("Error listening to socket: %s\n", ssh_get_error(sshbind)); - return 1; - } - printf("Started sample libssh sshd on port %d\n", port); - printf("You can login as the user %s with the password %s\n", SSHD_USER, - SSHD_PASSWORD); - r = ssh_bind_accept(sshbind, session); - if(r==SSH_ERROR){ - printf("Error accepting a connection: %s\n", ssh_get_error(sshbind)); - return 1; - } - if (ssh_handle_key_exchange(session)) { - printf("ssh_handle_key_exchange: %s\n", ssh_get_error(session)); - return 1; - } - - /* proceed to authentication */ - auth = authenticate(session); - if(!auth){ - printf("Authentication error: %s\n", ssh_get_error(session)); - ssh_disconnect(session); - return 1; - } - - - /* wait for a channel session */ - do { - message = ssh_message_get(session); - 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) { - printf("Error: cleint did not ask for a channel session (%s)\n", - ssh_get_error(session)); - ssh_finalize(); - return 1; - } - - - /* wait for a shell */ - do { - message = ssh_message_get(session); - 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) { - printf("Error: No shell requested (%s)\n", ssh_get_error(session)); - return 1; - } - - printf("it works !\n"); - - main_loop(chan); - - ssh_disconnect(session); - ssh_bind_free(sshbind); -#ifdef WITH_PCAP - cleanup_pcap(); -#endif - ssh_finalize(); - return 0; -} - |