[librest] oauth-proxy: Added 'signature-host' property.



commit 067c80764ba4d8af4261712ec3379fbe4f67848e
Author: Eitan Isaacson <eitan monotonous org>
Date:   Sat Mar 5 17:07:47 2011 -0800

    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

 docs/reference/rest/rest-sections.txt |    2 +
 rest/oauth-proxy-call.c               |   16 ++++++++-
 rest/oauth-proxy-private.h            |    2 +
 rest/oauth-proxy.c                    |   59 ++++++++++++++++++++++++++++++++-
 rest/oauth-proxy.h                    |    4 ++
 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,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]