summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorRon McOuat <rmcouat@smartt.com>2008-11-27 16:43:24 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-11-27 16:43:24 +0000
commit24e30c883470beabbe88e84ead18ad0d24adc99a (patch)
treeaea79052ee5bbf2af453896a6d7319c6ba149480 /tests
parent3f39ed1a0cee75bcf0ef3ae857f02d70f1630e83 (diff)
Add support for basic and digest authentication in souphttpsrc.
Original commit message from CVS: Patch by: Ron McOuat <rmcouat at smartt dot com> * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_class_init), (gst_soup_http_src_init), (gst_soup_http_src_dispose), (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), (gst_soup_http_src_authenticate_cb), (gst_soup_http_src_start): * ext/soup/gstsouphttpsrc.h: * tests/check/elements/souphttpsrc.c: (basic_auth_cb), (digest_auth_cb), (run_test), (GST_START_TEST), (souphttpsrc_suite), (run_server): Add support for basic and digest authentication in souphttpsrc. Fixes bug #561775.
Diffstat (limited to 'tests')
-rw-r--r--tests/check/elements/souphttpsrc.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/tests/check/elements/souphttpsrc.c b/tests/check/elements/souphttpsrc.c
index 408e05e4..2281b727 100644
--- a/tests/check/elements/souphttpsrc.c
+++ b/tests/check/elements/souphttpsrc.c
@@ -28,6 +28,9 @@
#include <libsoup/soup-address.h>
#include <libsoup/soup-message.h>
#include <libsoup/soup-server.h>
+#include <libsoup/soup-auth-domain.h>
+#include <libsoup/soup-auth-domain-basic.h>
+#include <libsoup/soup-auth-domain-digest.h>
#include <gst/check/gstcheck.h>
static int http_port = 0, https_port = 0;
@@ -36,6 +39,17 @@ gboolean redirect = TRUE;
static const char **cookies = NULL;
+/* Variables for authentication tests */
+static const char *user_id = NULL;
+static const char *user_pw = NULL;
+static const char *good_user = "good_user";
+static const char *bad_user = "bad_user";
+static const char *good_pw = "good_pw";
+static const char *bad_pw = "bad_pw";
+static const char *realm = "SOUPHTTPSRC_REALM";
+static const char *basic_auth_path = "/basic_auth";
+static const char *digest_auth_path = "/digest_auth";
+
static int run_server (int *http_port, int *https_port);
@@ -48,6 +62,26 @@ handoff_cb (GstElement * fakesink, GstBuffer * buf, GstPad * pad,
*p_outbuf = gst_buffer_ref (buf);
}
+static gboolean
+basic_auth_cb (SoupAuthDomain * domain, SoupMessage * msg,
+ const char *username, const char *password, gpointer user_data)
+{
+ /* There is only one good login for testing */
+ return (strcmp (username, good_user) == 0)
+ && (strcmp (password, good_pw) == 0);
+}
+
+
+static char *
+digest_auth_cb (SoupAuthDomain * domain, SoupMessage * msg,
+ const char *username, gpointer user_data)
+{
+ /* There is only one good login for testing */
+ if (strcmp (username, good_user) == 0)
+ return soup_auth_domain_digest_encode_password (good_user, realm, good_pw);
+ return NULL;
+}
+
int
run_test (const char *format, ...)
{
@@ -94,6 +128,11 @@ run_test (const char *format, ...)
g_object_set (sink, "signal-handoffs", TRUE, NULL);
g_signal_connect (sink, "preroll-handoff", G_CALLBACK (handoff_cb), &buf);
+ if (user_id != NULL)
+ g_object_set (src, "user-id", user_id, NULL);
+ if (user_pw != NULL)
+ g_object_set (src, "user-pw", user_pw, NULL);
+
ret = gst_element_set_state (pipe, GST_STATE_PAUSED);
if (ret != GST_STATE_CHANGE_ASYNC) {
GST_DEBUG ("failed to start up soup http src, ret = %d", ret);
@@ -114,6 +153,8 @@ run_test (const char *format, ...)
rc = 404;
else if (g_str_has_suffix (err->message, "Forbidden"))
rc = 403;
+ else if (g_str_has_suffix (err->message, "Unauthorized"))
+ rc = 401;
else if (g_str_has_suffix (err->message, "Found"))
rc = 302;
GST_INFO ("debug: %s", debug);
@@ -210,6 +251,90 @@ GST_START_TEST (test_cookies)
GST_END_TEST;
+GST_START_TEST (test_good_user_basic_auth)
+{
+ int res;
+
+ user_id = good_user;
+ user_pw = good_pw;
+ res = run_test ("http://127.0.0.1:%d%s", http_port, basic_auth_path);
+ GST_DEBUG ("Basic Auth user %s password %s res = %d", user_id, user_pw, res);
+ user_id = user_pw = NULL;
+ fail_unless (res == 0);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_bad_user_basic_auth)
+{
+ int res;
+
+ user_id = bad_user;
+ user_pw = good_pw;
+ res = run_test ("http://127.0.0.1:%d%s", http_port, basic_auth_path);
+ GST_DEBUG ("Basic Auth user %s password %s res = %d", user_id, user_pw, res);
+ user_id = user_pw = NULL;
+ fail_unless (res == 401);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_bad_password_basic_auth)
+{
+ int res;
+
+ user_id = good_user;
+ user_pw = bad_pw;
+ res = run_test ("http://127.0.0.1:%d%s", http_port, basic_auth_path);
+ GST_DEBUG ("Basic Auth user %s password %s res = %d", user_id, user_pw, res);
+ user_id = user_pw = NULL;
+ fail_unless (res == 401);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_good_user_digest_auth)
+{
+ int res;
+
+ user_id = good_user;
+ user_pw = good_pw;
+ res = run_test ("http://127.0.0.1:%d%s", http_port, digest_auth_path);
+ GST_DEBUG ("Digest Auth user %s password %s res = %d", user_id, user_pw, res);
+ user_id = user_pw = NULL;
+ fail_unless (res == 0);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_bad_user_digest_auth)
+{
+ int res;
+
+ user_id = bad_user;
+ user_pw = good_pw;
+ res = run_test ("http://127.0.0.1:%d%s", http_port, digest_auth_path);
+ GST_DEBUG ("Digest Auth user %s password %s res = %d", user_id, user_pw, res);
+ user_id = user_pw = NULL;
+ fail_unless (res == 401);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_bad_password_digest_auth)
+{
+ int res;
+
+ user_id = good_user;
+ user_pw = bad_pw;
+ res = run_test ("http://127.0.0.1:%d%s", http_port, digest_auth_path);
+ GST_DEBUG ("Digest Auth user %s password %s res = %d", user_id, user_pw, res);
+ user_id = user_pw = NULL;
+ fail_unless (res == 401);
+}
+
+GST_END_TEST;
+
static gboolean icy_caps = FALSE;
static void
@@ -331,6 +456,12 @@ souphttpsrc_suite (void)
tcase_add_test (tc_chain, test_not_found);
tcase_add_test (tc_chain, test_forbidden);
tcase_add_test (tc_chain, test_cookies);
+ tcase_add_test (tc_chain, test_good_user_basic_auth);
+ tcase_add_test (tc_chain, test_bad_user_basic_auth);
+ tcase_add_test (tc_chain, test_bad_password_basic_auth);
+ tcase_add_test (tc_chain, test_good_user_digest_auth);
+ tcase_add_test (tc_chain, test_bad_user_digest_auth);
+ tcase_add_test (tc_chain, test_bad_password_digest_auth);
suite_add_tcase (s, tc_internet);
tcase_set_timeout (tc_internet, 250);
@@ -440,6 +571,8 @@ run_server (int *http_port, int *https_port)
static int server_running = 0;
+ SoupAuthDomain *domain = NULL;
+
if (server_running)
return 0;
server_running = 1;
@@ -454,6 +587,16 @@ run_server (int *http_port, int *https_port)
*http_port = soup_server_get_port (server);
GST_INFO ("HTTP server listening on port %d", *http_port);
soup_server_add_handler (server, NULL, server_callback, NULL, NULL);
+ domain = soup_auth_domain_basic_new (SOUP_AUTH_DOMAIN_REALM, realm,
+ SOUP_AUTH_DOMAIN_BASIC_AUTH_CALLBACK, basic_auth_cb,
+ SOUP_AUTH_DOMAIN_ADD_PATH, basic_auth_path, NULL);
+ soup_server_add_auth_domain (server, domain);
+ g_object_unref (domain);
+ domain = soup_auth_domain_digest_new (SOUP_AUTH_DOMAIN_REALM, realm,
+ SOUP_AUTH_DOMAIN_DIGEST_AUTH_CALLBACK, digest_auth_cb,
+ SOUP_AUTH_DOMAIN_ADD_PATH, digest_auth_path, NULL);
+ soup_server_add_auth_domain (server, domain);
+ g_object_unref (domain);
soup_server_run_async (server);
if (ssl_cert_file && ssl_key_file) {