Blame tests/client/torture_proxycommand.c

Packit 6c0a39
#include "config.h"
Packit 6c0a39
Packit 6c0a39
#define LIBSSH_STATIC
Packit 6c0a39
Packit 6c0a39
#include "torture.h"
Packit 6c0a39
#include <libssh/libssh.h>
Packit 6c0a39
#include "libssh/priv.h"
Packit 6c0a39
Packit 6c0a39
#include <sys/types.h>
Packit 6c0a39
#include <pwd.h>
Packit 6c0a39
#include <errno.h>
Packit 6c0a39
#include <fcntl.h>
Packit 6c0a39
Packit 6c0a39
static int sshd_setup(void **state)
Packit 6c0a39
{
Packit 6c0a39
    torture_setup_sshd_server(state, false);
Packit 6c0a39
Packit 6c0a39
    return 0;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
static int sshd_teardown(void **state) {
Packit 6c0a39
    torture_teardown_sshd_server(state);
Packit 6c0a39
Packit 6c0a39
    return 0;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
static int session_setup(void **state)
Packit 6c0a39
{
Packit 6c0a39
    struct torture_state *s = *state;
Packit 6c0a39
    int verbosity = torture_libssh_verbosity();
Packit 6c0a39
    struct passwd *pwd;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    pwd = getpwnam("bob");
Packit 6c0a39
    assert_non_null(pwd);
Packit 6c0a39
Packit 6c0a39
    rc = setuid(pwd->pw_uid);
Packit 6c0a39
    assert_return_code(rc, errno);
Packit 6c0a39
Packit 6c0a39
    s->ssh.session = ssh_new();
Packit 6c0a39
    assert_non_null(s->ssh.session);
Packit 6c0a39
Packit 6c0a39
    ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
Packit 6c0a39
    ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);
Packit 6c0a39
Packit 6c0a39
    ssh_options_set(s->ssh.session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);
Packit 6c0a39
Packit 6c0a39
    return 0;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
static int session_teardown(void **state)
Packit 6c0a39
{
Packit 6c0a39
    struct torture_state *s = *state;
Packit 6c0a39
Packit 6c0a39
    ssh_disconnect(s->ssh.session);
Packit 6c0a39
    ssh_free(s->ssh.session);
Packit 6c0a39
Packit 6c0a39
    return 0;
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
static void torture_options_set_proxycommand(void **state)
Packit 6c0a39
{
Packit 6c0a39
    struct torture_state *s = *state;
Packit 6c0a39
    ssh_session session = s->ssh.session;
Packit 6c0a39
    const char *address = torture_server_address(AF_INET);
Packit 6c0a39
    int port = torture_server_port();
Packit 6c0a39
    char command[255] = {0};
Packit 6c0a39
    int rc;
Packit 6c0a39
    socket_t fd;
Packit 6c0a39
Packit 6c0a39
    rc = snprintf(command, sizeof(command), "nc %s %d", address, port);
Packit 6c0a39
    assert_true((size_t)rc < sizeof(command));
Packit 6c0a39
Packit 6c0a39
    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, command);
Packit 6c0a39
    assert_int_equal(rc, 0);
Packit 6c0a39
    rc = ssh_connect(session);
Packit 6c0a39
    assert_ssh_return_code(session, rc);
Packit 6c0a39
    fd = ssh_get_fd(session);
Packit 6c0a39
    assert_true(fd != SSH_INVALID_SOCKET);
Packit 6c0a39
    rc = fcntl(fd, F_GETFL);
Packit 6c0a39
    assert_int_equal(rc & O_RDWR, O_RDWR);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
static void torture_options_set_proxycommand_notexist(void **state) {
Packit 6c0a39
    struct torture_state *s = *state;
Packit 6c0a39
    ssh_session session = s->ssh.session;
Packit 6c0a39
    int rc;
Packit 6c0a39
Packit 6c0a39
    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, "this_command_does_not_exist");
Packit 6c0a39
    assert_ssh_return_code(session, rc);
Packit 6c0a39
Packit 6c0a39
    rc = ssh_connect(session);
Packit 6c0a39
    assert_ssh_return_code_equal(session, rc, SSH_ERROR);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
static void torture_options_set_proxycommand_ssh(void **state)
Packit 6c0a39
{
Packit 6c0a39
    struct torture_state *s = *state;
Packit 6c0a39
    ssh_session session = s->ssh.session;
Packit 6c0a39
    const char *address = torture_server_address(AF_INET);
Packit 6c0a39
    char command[255] = {0};
Packit 6c0a39
    int rc;
Packit 6c0a39
    socket_t fd;
Packit 6c0a39
Packit 6c0a39
    rc = snprintf(command, sizeof(command), "ssh -W [%%h]:%%p alice@%s", address);
Packit 6c0a39
    assert_true((size_t)rc < sizeof(command));
Packit 6c0a39
Packit 6c0a39
    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, command);
Packit 6c0a39
    assert_int_equal(rc, 0);
Packit 6c0a39
    rc = ssh_connect(session);
Packit 6c0a39
    assert_ssh_return_code(session, rc);
Packit 6c0a39
    fd = ssh_get_fd(session);
Packit 6c0a39
    assert_true(fd != SSH_INVALID_SOCKET);
Packit 6c0a39
    rc = fcntl(fd, F_GETFL);
Packit 6c0a39
    assert_int_equal(rc & O_RDWR, O_RDWR);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
static void torture_options_set_proxycommand_ssh_stderr(void **state)
Packit 6c0a39
{
Packit 6c0a39
    struct torture_state *s = *state;
Packit 6c0a39
    ssh_session session = s->ssh.session;
Packit 6c0a39
    const char *address = torture_server_address(AF_INET);
Packit 6c0a39
    char command[255] = {0};
Packit 6c0a39
    int rc;
Packit 6c0a39
    socket_t fd;
Packit 6c0a39
Packit 6c0a39
    rc = snprintf(command, sizeof(command), "ssh -vvv -W [%%h]:%%p alice@%s", address);
Packit 6c0a39
    assert_true((size_t)rc < sizeof(command));
Packit 6c0a39
Packit 6c0a39
    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, command);
Packit 6c0a39
    assert_int_equal(rc, 0);
Packit 6c0a39
    rc = ssh_connect(session);
Packit 6c0a39
    assert_ssh_return_code(session, rc);
Packit 6c0a39
    fd = ssh_get_fd(session);
Packit 6c0a39
    assert_true(fd != SSH_INVALID_SOCKET);
Packit 6c0a39
    rc = fcntl(fd, F_GETFL);
Packit 6c0a39
    assert_int_equal(rc & O_RDWR, O_RDWR);
Packit 6c0a39
}
Packit 6c0a39
Packit 6c0a39
int torture_run_tests(void) {
Packit 6c0a39
    int rc;
Packit 6c0a39
    struct CMUnitTest tests[] = {
Packit 6c0a39
        cmocka_unit_test_setup_teardown(torture_options_set_proxycommand,
Packit 6c0a39
                                        session_setup,
Packit 6c0a39
                                        session_teardown),
Packit 6c0a39
        cmocka_unit_test_setup_teardown(torture_options_set_proxycommand_notexist,
Packit 6c0a39
                                        session_setup,
Packit 6c0a39
                                        session_teardown),
Packit 6c0a39
        cmocka_unit_test_setup_teardown(torture_options_set_proxycommand_ssh,
Packit 6c0a39
                                        session_setup,
Packit 6c0a39
                                        session_teardown),
Packit 6c0a39
        cmocka_unit_test_setup_teardown(torture_options_set_proxycommand_ssh_stderr,
Packit 6c0a39
                                        session_setup,
Packit 6c0a39
                                        session_teardown),
Packit 6c0a39
    };
Packit 6c0a39
Packit 6c0a39
Packit 6c0a39
    ssh_init();
Packit 6c0a39
Packit 6c0a39
    torture_filter_tests(tests);
Packit 6c0a39
    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);
Packit 6c0a39
    ssh_finalize();
Packit 6c0a39
Packit 6c0a39
    return rc;
Packit 6c0a39
}