summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEitan Isaacson <eitan@monotonous.org>2011-03-05 17:07:47 -0800
committerEitan Isaacson <eitan@monotonous.org>2011-03-07 16:11:39 -0500
commit067c80764ba4d8af4261712ec3379fbe4f67848e (patch)
treeed3a69e01abe7ff658acb213f57f778cd949501b
parent30ea270ebc3b1347a11f92e110e7905646b7fb1b (diff)
downloadlibrest-067c80764ba4d8af4261712ec3379fbe4f67848e.tar.gz
oauth-proxy: Added 'signature-host' property.
This enables signing with a different hostname than the one in the endpoint. The case in point is Photobucket: It has "silo" URLs that are used for certain types of operations, such as api123.photobucket.com, yet the signature still expects to use api.photobucket.com in the base string. Fixes: https://bugs.meego.com/show_bug.cgi?id=14192
-rw-r--r--docs/reference/rest/rest-sections.txt2
-rw-r--r--rest/oauth-proxy-call.c16
-rw-r--r--rest/oauth-proxy-private.h2
-rw-r--r--rest/oauth-proxy.c59
-rw-r--r--rest/oauth-proxy.h4
5 files changed, 80 insertions, 3 deletions
diff --git a/docs/reference/rest/rest-sections.txt b/docs/reference/rest/rest-sections.txt
index 23664d1..1418001 100644
--- a/docs/reference/rest/rest-sections.txt
+++ b/docs/reference/rest/rest-sections.txt
@@ -165,6 +165,8 @@ oauth_proxy_get_token
oauth_proxy_set_token
oauth_proxy_get_token_secret
oauth_proxy_set_token_secret
+oauth_proxy_get_signature_host
+oauth_proxy_set_signature_host
<SUBSECTION Standard>
OAuthProxyPrivate
OAuthProxyClass
diff --git a/rest/oauth-proxy-call.c b/rest/oauth-proxy-call.c
index 42a0b6e..b667b20 100644
--- a/rest/oauth-proxy-call.c
+++ b/rest/oauth-proxy-call.c
@@ -129,10 +129,22 @@ sign_hmac (OAuthProxy *proxy, RestProxyCall *call, GHashTable *oauth_params)
text = g_string_new (NULL);
g_string_append (text, rest_proxy_call_get_method (REST_PROXY_CALL (call)));
g_string_append_c (text, '&');
- if (priv->oauth_echo)
+ if (priv->oauth_echo) {
g_string_append_uri_escaped (text, priv->service_url, NULL, FALSE);
- else
+ } else if (priv->signature_host != NULL) {
+ SoupURI *url = soup_uri_new (callpriv->url);
+ gchar *signing_url;
+
+ soup_uri_set_host (url, priv->signature_host);
+ signing_url = soup_uri_to_string (url, FALSE);
+
+ g_string_append_uri_escaped (text, signing_url, NULL, FALSE);
+
+ soup_uri_free (url);
+ g_free (signing_url);
+ } else {
g_string_append_uri_escaped (text, callpriv->url, NULL, FALSE);
+ }
g_string_append_c (text, '&');
/* Merge the OAuth parameters with the query parameters */
diff --git a/rest/oauth-proxy-private.h b/rest/oauth-proxy-private.h
index e3943a9..2d178a5 100644
--- a/rest/oauth-proxy-private.h
+++ b/rest/oauth-proxy-private.h
@@ -40,4 +40,6 @@ typedef struct {
/* OAuth Echo */
gboolean oauth_echo;
char *service_url;
+ /* URL to use for signatures */
+ char *signature_host;
} OAuthProxyPrivate;
diff --git a/rest/oauth-proxy.c b/rest/oauth-proxy.c
index 03549dc..38c9e4a 100644
--- a/rest/oauth-proxy.c
+++ b/rest/oauth-proxy.c
@@ -33,7 +33,8 @@ enum {
PROP_CONSUMER_KEY,
PROP_CONSUMER_SECRET,
PROP_TOKEN,
- PROP_TOKEN_SECRET
+ PROP_TOKEN_SECRET,
+ PROP_SIGNATURE_HOST,
};
static RestProxyCall *
@@ -67,6 +68,9 @@ oauth_proxy_get_property (GObject *object, guint property_id,
case PROP_TOKEN_SECRET:
g_value_set_string (value, priv->token_secret);
break;
+ case PROP_SIGNATURE_HOST:
+ g_value_set_string (value, priv->signature_host);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
@@ -99,6 +103,11 @@ oauth_proxy_set_property (GObject *object, guint property_id,
g_free (priv->token_secret);
priv->token_secret = g_value_dup_string (value);
break;
+ case PROP_SIGNATURE_HOST:
+ if (priv->signature_host)
+ g_free (priv->signature_host);
+ priv->signature_host = g_value_dup_string (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
@@ -166,6 +175,13 @@ oauth_proxy_class_init (OAuthProxyClass *klass)
PROP_TOKEN_SECRET,
pspec);
+ pspec = g_param_spec_string ("signature-host", "signature-host",
+ "The base URL used in the signature string",
+ NULL, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class,
+ PROP_SIGNATURE_HOST,
+ pspec);
+
/* TODO: add enum property for signature method */
}
@@ -686,6 +702,47 @@ oauth_proxy_is_oauth10a (OAuthProxy *proxy)
return PROXY_GET_PRIVATE (proxy)->oauth_10a;
}
+/**
+ * oauth_proxy_get_signature_host:
+ * @proxy: an #OAuthProxy
+ *
+ * Get the signature hostname used when creating a signature base string.
+ *
+ * Returns: the signature hostname, or %NULL if there is none set.
+ * This string is owned by #OAuthProxy and should not be freed.
+ */
+const char *
+oauth_proxy_get_signature_host (OAuthProxy *proxy)
+{
+ OAuthProxyPrivate *priv;
+
+ g_return_val_if_fail (OAUTH_IS_PROXY (proxy), NULL);
+ priv = PROXY_GET_PRIVATE (proxy);
+
+ return priv->signature_host;
+}
+
+/**
+ * oauth_proxy_set_signature_host:
+ * @proxy: an #OAuthProxy
+ * @signature_host: the signature host
+ *
+ * Set the signature hostname used when creating a signature base string.
+ */
+void
+oauth_proxy_set_signature_host (OAuthProxy *proxy,
+ const char *signature_host)
+{
+ OAuthProxyPrivate *priv;
+
+ g_return_if_fail (OAUTH_IS_PROXY (proxy));
+ priv = PROXY_GET_PRIVATE (proxy);
+
+ g_free (priv->signature_host);
+
+ priv->signature_host = g_strdup (signature_host);
+}
+
RestProxy *
oauth_proxy_new_echo_proxy (OAuthProxy *proxy,
/* TODO: should this be a function on the base url? */
diff --git a/rest/oauth-proxy.h b/rest/oauth-proxy.h
index c84a1b0..24749a3 100644
--- a/rest/oauth-proxy.h
+++ b/rest/oauth-proxy.h
@@ -152,6 +152,10 @@ void oauth_proxy_set_token (OAuthProxy *proxy, const char *token);
const char * oauth_proxy_get_token_secret (OAuthProxy *proxy);
void oauth_proxy_set_token_secret (OAuthProxy *proxy, const char *token_secret);
+const char * oauth_proxy_get_signature_host (OAuthProxy *proxy);
+
+void oauth_proxy_set_signature_host (OAuthProxy *proxy,
+ const char *signature_host);
RestProxy *oauth_proxy_new_echo_proxy (OAuthProxy *proxy,
const char *service_url,