static void do_msg_reuse_test (void) { SoupSession *session; SoupMessage *msg; SoupURI *uri; guint *signal_ids, n_signal_ids; debug_printf (1, "\nSoupMessage reuse\n"); signal_ids = g_signal_list_ids (SOUP_TYPE_MESSAGE, &n_signal_ids); session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL); g_signal_connect (session, "authenticate", G_CALLBACK (reuse_test_authenticate), NULL); debug_printf (1, " First message\n"); msg = soup_message_new_from_uri ("GET", base_uri); soup_session_send_message (session, msg); ensure_no_signal_handlers (msg, signal_ids, n_signal_ids); debug_printf (1, " Redirect message\n"); uri = soup_uri_new_with_base (base_uri, "/redirect"); soup_message_set_uri (msg, uri); soup_uri_free (uri); soup_session_send_message (session, msg); if (!soup_uri_equal (soup_message_get_uri (msg), base_uri)) { debug_printf (1, " Message did not get redirected!\n"); errors++; } ensure_no_signal_handlers (msg, signal_ids, n_signal_ids); debug_printf (1, " Auth message\n"); uri = soup_uri_new_with_base (base_uri, "/auth"); soup_message_set_uri (msg, uri); soup_uri_free (uri); soup_session_send_message (session, msg); if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { debug_printf (1, " Message did not get authenticated!\n"); errors++; } ensure_no_signal_handlers (msg, signal_ids, n_signal_ids); /* One last try to make sure the auth stuff got cleaned up */ debug_printf (1, " Last message\n"); soup_message_set_uri (msg, base_uri); soup_session_send_message (session, msg); ensure_no_signal_handlers (msg, signal_ids, n_signal_ids); soup_test_session_abort_unref (session); g_object_unref (msg); g_free (signal_ids); }
static gboolean check_hex_urp (SoupAuthDomain *domain, SoupMessage *msg, GHashTable *params, const char *username, const char *hex_urp) { const char *uri, *qop, *realm, *msg_username; const char *nonce, *nc, *cnonce, *response; char hex_a1[33], computed_response[33]; int nonce_count; SoupURI *dig_uri, *req_uri; msg_username = g_hash_table_lookup (params, "username"); if (!msg_username || strcmp (msg_username, username) != 0) return FALSE; /* Check uri */ uri = g_hash_table_lookup (params, "uri"); if (!uri) return FALSE; req_uri = soup_message_get_uri (msg); dig_uri = soup_uri_new (uri); if (dig_uri) { if (!soup_uri_equal (dig_uri, req_uri)) { soup_uri_free (dig_uri); return FALSE; } soup_uri_free (dig_uri); } else { char *req_path; req_path = soup_uri_to_string (req_uri, TRUE); if (strcmp (uri, req_path) != 0) { g_free (req_path); return FALSE; } g_free (req_path); } /* Check qop; we only support "auth" for now */ qop = g_hash_table_lookup (params, "qop"); if (!qop || strcmp (qop, "auth") != 0) return FALSE; /* Check realm */ realm = g_hash_table_lookup (params, "realm"); if (!realm || strcmp (realm, soup_auth_domain_get_realm (domain)) != 0) return FALSE; nonce = g_hash_table_lookup (params, "nonce"); if (!nonce) return FALSE; nc = g_hash_table_lookup (params, "nc"); if (!nc) return FALSE; nonce_count = strtoul (nc, NULL, 16); if (nonce_count <= 0) return FALSE; cnonce = g_hash_table_lookup (params, "cnonce"); if (!cnonce) return FALSE; response = g_hash_table_lookup (params, "response"); if (!response) return FALSE; soup_auth_digest_compute_hex_a1 (hex_urp, SOUP_AUTH_DIGEST_ALGORITHM_MD5, nonce, cnonce, hex_a1); soup_auth_digest_compute_response (msg->method, uri, hex_a1, SOUP_AUTH_DIGEST_QOP_AUTH, nonce, cnonce, nonce_count, computed_response); return strcmp (response, computed_response) == 0; }
int main (int argc, char **argv) { SoupURI *base_uri, *uri1, *uri2; char *uri_string; int i; test_init (argc, argv, NULL); debug_printf (1, "Absolute URI parsing\n"); for (i = 0; i < num_abs_tests; i++) { if (!do_uri (NULL, NULL, abs_tests[i].uri_string, abs_tests[i].result, &abs_tests[i].bits)) errors++; } debug_printf (1, "\nRelative URI parsing\n"); base_uri = soup_uri_new (base); if (!base_uri) { fprintf (stderr, "Could not parse %s!\n", base); exit (1); } uri_string = soup_uri_to_string (base_uri, FALSE); if (strcmp (uri_string, base) != 0) { fprintf (stderr, "URI <%s> unparses to <%s>\n", base, uri_string); errors++; } g_free (uri_string); for (i = 0; i < num_rel_tests; i++) { if (!do_uri (base_uri, base, rel_tests[i].uri_string, rel_tests[i].result, &rel_tests[i].bits)) errors++; } soup_uri_free (base_uri); debug_printf (1, "\nURI equality testing\n"); for (i = 0; i < num_eq_tests; i++) { uri1 = soup_uri_new (eq_tests[i].one); uri2 = soup_uri_new (eq_tests[i].two); debug_printf (1, "<%s> == <%s>? ", eq_tests[i].one, eq_tests[i].two); if (soup_uri_equal (uri1, uri2)) debug_printf (1, "OK\n"); else { debug_printf (1, "NO\n"); debug_printf (1, "%s : %s : %s\n%s : %s : %s\n", uri1->scheme, uri1->host, uri1->path, uri2->scheme, uri2->host, uri2->path); errors++; } soup_uri_free (uri1); soup_uri_free (uri2); } do_soup_uri_null_tests (); test_cleanup (); return errors != 0; }