aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAnderson Toshiyuki Sasaki <ansasaki@redhat.com>2019-06-25 13:27:41 +0200
committerAnderson Toshiyuki Sasaki <ansasaki@redhat.com>2019-06-26 17:36:46 +0200
commitabf571216062d30fa4ea6ba0eb74c09e833ca5b2 (patch)
tree53267d2268eae862bcd1bc0acc8bd0be6002d86a /tests
parent1aef599ab10aef044c2b51814e35f730a31e84e4 (diff)
downloadlibssh-abf571216062d30fa4ea6ba0eb74c09e833ca5b2.tar.gz
libssh-abf571216062d30fa4ea6ba0eb74c09e833ca5b2.tar.xz
libssh-abf571216062d30fa4ea6ba0eb74c09e833ca5b2.zip
tests: Introduce torture_client_global_requests
Added a test case where invalid global requests are sent to the server which should reject them, but not stop working. Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com> Reviewed-by: Jakub Jelen <jjelen@redhat.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/client/CMakeLists.txt3
-rw-r--r--tests/client/torture_client_global_requests.c152
2 files changed, 154 insertions, 1 deletions
diff --git a/tests/client/CMakeLists.txt b/tests/client/CMakeLists.txt
index 6da5452c..0998e4aa 100644
--- a/tests/client/CMakeLists.txt
+++ b/tests/client/CMakeLists.txt
@@ -14,7 +14,8 @@ set(LIBSSH_CLIENT_TESTS
torture_knownhosts_verify
torture_proxycommand
torture_session
- torture_request_env)
+ torture_request_env
+ torture_client_global_requests)
if (DEFAULT_C_NO_DEPRECATION_FLAGS)
set_source_files_properties(torture_knownhosts.c
diff --git a/tests/client/torture_client_global_requests.c b/tests/client/torture_client_global_requests.c
new file mode 100644
index 00000000..1320ea00
--- /dev/null
+++ b/tests/client/torture_client_global_requests.c
@@ -0,0 +1,152 @@
+/*
+ * torture_client_global_requests.c - Tests for client global requests
+ *
+ * This file is part of the SSH Library
+ *
+ * Copyright (c) 2019 by Red Hat, Inc.
+ *
+ * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
+ *
+ * The SSH Library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ *
+ * The SSH Library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with the SSH Library; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#define LIBSSH_STATIC
+
+#include "torture.h"
+#include "libssh/libssh.h"
+#include "libssh/priv.h"
+#include "libssh/session.h"
+#include "libssh/channels.h"
+
+#include <errno.h>
+#include <sys/types.h>
+#include <pwd.h>
+
+static int sshd_setup(void **state)
+{
+ torture_setup_sshd_server(state, true);
+
+ return 0;
+}
+
+static int sshd_teardown(void **state)
+{
+ torture_teardown_sshd_server(state);
+
+ return 0;
+}
+
+static int session_setup(void **state)
+{
+ struct torture_state *s = *state;
+ int verbosity = torture_libssh_verbosity();
+ struct passwd *pwd;
+ bool b = false;
+ int rc;
+
+ pwd = getpwnam("bob");
+ assert_non_null(pwd);
+
+ rc = setuid(pwd->pw_uid);
+ assert_return_code(rc, errno);
+
+ s->ssh.session = ssh_new();
+ assert_non_null(s->ssh.session);
+
+ ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
+ ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);
+
+ /* Make sure no other configuration options from system will get used */
+ rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &b);
+ assert_ssh_return_code(s->ssh.session, rc);
+
+ return 0;
+}
+
+static int session_teardown(void **state)
+{
+ struct torture_state *s = *state;
+
+ ssh_disconnect(s->ssh.session);
+ ssh_free(s->ssh.session);
+
+ return 0;
+}
+
+static int authenticate(void **state)
+{
+ struct torture_state *s = *state;
+ ssh_session session = s->ssh.session;
+ int rc;
+
+ rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_BOB);
+ assert_int_equal(rc, SSH_OK);
+
+ rc = ssh_connect(session);
+ assert_int_equal(rc, SSH_OK);
+
+ rc = ssh_userauth_password(session, NULL, TORTURE_SSH_USER_BOB_PASSWORD);
+ assert_int_equal(rc, SSH_AUTH_SUCCESS);
+
+ return rc;
+}
+
+static void torture_unknown_request(void **state)
+{
+ struct torture_state *s = *state;
+ ssh_session session = s->ssh.session;
+ ssh_channel channel;
+ int rc;
+
+ rc = authenticate(state);
+ assert_ssh_return_code(session, rc);
+
+ /* Request asking for reply */
+ rc = ssh_global_request(session, "unknown-request-00@test.com", NULL, 1);
+ assert_ssh_return_code_equal(session, rc, SSH_ERROR);
+
+ /* Request and don't ask for reply */
+ rc = ssh_global_request(session, "another-bad-req-00@test.com", NULL, 0);
+ assert_ssh_return_code(session, rc);
+
+ /* Open channel to make sure the session is still working */
+ channel = ssh_channel_new(session);
+ assert_non_null(channel);
+
+ rc = ssh_channel_open_session(channel);
+ assert_ssh_return_code(session, rc);
+
+ ssh_channel_close(channel);
+}
+
+int torture_run_tests(void)
+{
+ int rc;
+ struct CMUnitTest tests[] = {
+ cmocka_unit_test_setup_teardown(torture_unknown_request,
+ session_setup,
+ session_teardown),
+ };
+
+ ssh_init();
+ torture_filter_tests(tests);
+ rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);
+ ssh_finalize();
+
+ return rc;
+}