[libsoup/wip/tpopela/negotiate] soup-misc: Introduce the soup_host_matches_host function
- From: Tomas Popela <tpopela src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup/wip/tpopela/negotiate] soup-misc: Introduce the soup_host_matches_host function
- Date: Wed, 10 Feb 2016 16:16:18 +0000 (UTC)
commit f4dd4bb212641ee1f01d089ea620c215b2fba79f
Author: Tomas Popela <tpopela redhat com>
Date: Wed Feb 10 17:02:37 2016 +0100
soup-misc: Introduce the soup_host_matches_host function
Refactor the soup_cookie_domain_matches function's code to the
soup_host_matches_host function to avoid code duplication between soup-cookie
and soup-auth-negotiate.
libsoup/soup-auth-negotiate.c | 38 ++++++--------------------------------
libsoup/soup-cookie.c | 20 +-------------------
libsoup/soup-misc.c | 35 +++++++++++++++++++++++++++++++++++
libsoup/soup-misc.h | 2 ++
4 files changed, 44 insertions(+), 51 deletions(-)
---
diff --git a/libsoup/soup-auth-negotiate.c b/libsoup/soup-auth-negotiate.c
index 3a800c9..d0fc3af 100644
--- a/libsoup/soup-auth-negotiate.c
+++ b/libsoup/soup-auth-negotiate.c
@@ -305,44 +305,18 @@ remove_server_response_handler (SoupMessage *msg, gpointer state)
state);
}
-/* check if scheme://host:port from msg matches the trusted uri */
+/* Check if scheme://host:port from message matches the given URI. */
static gint
-match_base_uri (SoupURI *trusted_uri, SoupURI *msg_uri)
+match_base_uri (SoupURI *list_uri, SoupURI *msg_uri)
{
- if (msg_uri->scheme != trusted_uri->scheme)
+ if (msg_uri->scheme != list_uri->scheme)
return 1;
- if (trusted_uri->port && (msg_uri->port != trusted_uri->port))
+ if (list_uri->port && (msg_uri->port != list_uri->port))
return 1;
- if (trusted_uri->host) {
- const gchar *msg_host = NULL;
- const gchar *trusted_host = NULL;
-
- msg_host = soup_uri_get_host (msg_uri);
- trusted_host = soup_uri_get_host (trusted_uri);
-
- if (g_str_has_suffix (msg_host, trusted_host)) {
- /* if the msg host ends with host from the trusted uri, then make
- * sure it is either an exact match, or prefixed with a dot. We
- * don't want "foobar.com" to match "bar.com"
- */
- if (g_ascii_strcasecmp (msg_host, trusted_host) == 0) {
- return 0;
- } else {
- gint trusted_host_len, msg_host_len;
-
- /* we don't want example.com to match fooexample.com */
- trusted_host_len = strlen (trusted_host);
- msg_host_len = strlen (msg_host);
- if (msg_host[msg_host_len - trusted_host_len - 1] == '.') {
- return 0;
- }
- }
- }
-
- return 1;
- }
+ if (list_uri->host)
+ return !soup_host_matches_host (msg_uri->host, list_uri->host);
return 0;
}
diff --git a/libsoup/soup-cookie.c b/libsoup/soup-cookie.c
index 5af36e9..63f98aa 100644
--- a/libsoup/soup-cookie.c
+++ b/libsoup/soup-cookie.c
@@ -107,28 +107,10 @@ soup_cookie_copy (SoupCookie *cookie)
gboolean
soup_cookie_domain_matches (SoupCookie *cookie, const char *host)
{
- char *match;
- int dlen;
- const char *domain;
-
g_return_val_if_fail (cookie != NULL, FALSE);
g_return_val_if_fail (host != NULL, FALSE);
- domain = cookie->domain;
-
- if (!g_ascii_strcasecmp (domain, host))
- return TRUE;
- if (*domain != '.')
- return FALSE;
- if (!g_ascii_strcasecmp (domain + 1, host))
- return TRUE;
- dlen = strlen (domain);
- while ((match = strstr (host, domain))) {
- if (!match[dlen])
- return TRUE;
- host = match + 1;
- }
- return FALSE;
+ return soup_host_matches_host (cookie->domain, host);
}
static inline const char *
diff --git a/libsoup/soup-misc.c b/libsoup/soup-misc.c
index 325b587..a7cf6c7 100644
--- a/libsoup/soup-misc.c
+++ b/libsoup/soup-misc.c
@@ -237,3 +237,38 @@ const char soup_char_attributes[] = {
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
};
+
+/**
+ * soup_host_matches_host
+ * @host: a URI
+ * @compare_with: a URI
+ *
+ * Checks if the @host and @compare_with exactly match or prefixed with a dot.
+ *
+ * Return value: %TRUE if the hosts match, %FALSE otherwise
+ *
+ * Since: 2.53
+ **/
+gboolean
+soup_host_matches_host (const gchar *host, const gchar *compare_with)
+{
+ char *match;
+ int dlen;
+
+ g_return_val_if_fail (host != NULL, FALSE);
+ g_return_val_if_fail (compare_with != NULL, FALSE);
+
+ if (!g_ascii_strcasecmp (host, compare_with))
+ return TRUE;
+ if (*host != '.')
+ return FALSE;
+ if (!g_ascii_strcasecmp (host + 1, compare_with))
+ return TRUE;
+ dlen = strlen (host);
+ while ((match = strstr (compare_with, host))) {
+ if (!match[dlen])
+ return TRUE;
+ compare_with = match + 1;
+ }
+ return FALSE;
+}
diff --git a/libsoup/soup-misc.h b/libsoup/soup-misc.h
index 534b59d..d534e2a 100644
--- a/libsoup/soup-misc.h
+++ b/libsoup/soup-misc.h
@@ -33,6 +33,8 @@ GSource *soup_add_timeout (GMainContext *async_context,
guint soup_str_case_hash (gconstpointer key);
gboolean soup_str_case_equal (gconstpointer v1,
gconstpointer v2);
+gboolean soup_host_matches_host (const gchar *host,
+ const gchar *compare_with);
#define _SOUP_ATOMIC_INTERN_STRING(variable, value) ((const char *)(g_atomic_pointer_get (&(variable)) ?
(variable) : (g_atomic_pointer_set (&(variable), (gpointer)g_intern_static_string (value)), (variable))))
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]