[frogr] Migrate 'checkToken' method to OAuth



commit 6399a58e595b97bb19b1b690771ff5d62c5321d1
Author: Mario Sanchez Prada <msanchez igalia com>
Date:   Sun Apr 8 22:27:41 2012 +0200

    Migrate 'checkToken' method to OAuth

 src/flicksoup/fsp-error.c   |    1 +
 src/flicksoup/fsp-error.h   |    3 +-
 src/flicksoup/fsp-parser.c  |  117 ++++++++++++++++++++++++++++++++++++++++++-
 src/flicksoup/fsp-parser.h  |    6 ++
 src/flicksoup/fsp-session.c |   23 +++++++-
 5 files changed, 145 insertions(+), 5 deletions(-)
---
diff --git a/src/flicksoup/fsp-error.c b/src/flicksoup/fsp-error.c
index e576b2e..5fb7e00 100644
--- a/src/flicksoup/fsp-error.c
+++ b/src/flicksoup/fsp-error.c
@@ -264,6 +264,7 @@ fsp_error_get_from_response_code        (FspErrorMethod method, gint code)
     {
       switch (method)
         {
+        case FSP_ERROR_METHOD_CHECK_TOKEN:
         case FSP_ERROR_METHOD_EXCHANGE_TOKEN:
         case FSP_ERROR_METHOD_GET_UPLOAD_STATUS:
         case FSP_ERROR_METHOD_GROUP_GET_LIST:
diff --git a/src/flicksoup/fsp-error.h b/src/flicksoup/fsp-error.h
index 8202962..a11a2f2 100644
--- a/src/flicksoup/fsp-error.h
+++ b/src/flicksoup/fsp-error.h
@@ -79,9 +79,9 @@ typedef enum {
   FSP_ERROR_SERVICE_UNAVAILABLE,
 
   /* Errors from flicksoup only */
-  FSP_ERROR_OAUTH_UNKNOWN_ERROR,
   FSP_ERROR_OAUTH_NOT_AUTHORIZED_YET,
   FSP_ERROR_OAUTH_VERIFIER_INVALID,
+  FSP_ERROR_OAUTH_UNKNOWN_ERROR,
 
   /* Default fallback for other kind of errors */
   FSP_ERROR_OTHER
@@ -89,6 +89,7 @@ typedef enum {
 
 typedef enum {
   FSP_ERROR_METHOD_UNDEFINED,
+  FSP_ERROR_METHOD_CHECK_TOKEN,
   FSP_ERROR_METHOD_EXCHANGE_TOKEN,
   FSP_ERROR_METHOD_GET_UPLOAD_STATUS,
   FSP_ERROR_METHOD_PHOTO_UPLOAD,
diff --git a/src/flicksoup/fsp-parser.c b/src/flicksoup/fsp-parser.c
index 4b7b6f6..d85eaef 100644
--- a/src/flicksoup/fsp-parser.c
+++ b/src/flicksoup/fsp-parser.c
@@ -68,6 +68,9 @@ _get_error_method_from_parser           (gpointer (*body_parser)
                                          (xmlDoc  *doc,
                                           GError **error));
 static gpointer
+_check_token_parser                     (xmlDoc  *doc,
+                                         GError **error);
+static gpointer
 _exchange_token_parser                  (xmlDoc  *doc,
                                          GError **error);
 static gpointer
@@ -264,7 +267,9 @@ _get_error_method_from_parser           (gpointer (*body_parser)
 {
   FspErrorMethod error_method = FSP_ERROR_METHOD_UNDEFINED;
 
-  if (body_parser == _exchange_token_parser)
+  if (body_parser == _check_token_parser)
+    error_method = FSP_ERROR_METHOD_CHECK_TOKEN;
+  else if (body_parser == _exchange_token_parser)
     error_method = FSP_ERROR_METHOD_EXCHANGE_TOKEN;
   else if (body_parser == _get_upload_status_parser)
     error_method = FSP_ERROR_METHOD_GET_UPLOAD_STATUS;
@@ -339,6 +344,95 @@ _process_xml_response                          (FspParser  *self,
   return retval;
 }
 
+
+static gpointer
+_check_token_parser                     (xmlDoc  *doc,
+                                         GError **error)
+{
+  xmlXPathContext *xpathCtx = NULL;
+  xmlXPathObject * xpathObj = NULL;
+  FspDataAuthToken *auth_token = NULL;
+  GError *err = NULL;
+
+  g_return_val_if_fail (doc != NULL, NULL);
+
+  xpathCtx = xmlXPathNewContext (doc);
+  xpathObj = xmlXPathEvalExpression ((xmlChar *)"/rsp/oauth", xpathCtx);
+
+  if ((xpathObj != NULL) && (xpathObj->nodesetval->nodeNr > 0))
+    {
+      /* Matching nodes found */
+      xmlNode *node = NULL;
+      xmlChar *content = NULL;
+
+      auth_token = FSP_DATA_AUTH_TOKEN (fsp_data_new (FSP_AUTH_TOKEN));
+
+      /* Traverse children of the 'auth' node */
+      node = xpathObj->nodesetval->nodeTab[0];
+      for (node = node->children; node != NULL; node = node->next)
+        {
+          if (node->type != XML_ELEMENT_NODE)
+            continue;
+
+          /* Token string */
+          if (!g_strcmp0 ((gchar *) node->name, "token"))
+            {
+              content = xmlNodeGetContent (node);
+              auth_token->token = g_strdup ((gchar *) content);
+              xmlFree (content);
+            }
+
+          /* Permissions */
+          if (!g_strcmp0 ((gchar *) node->name, "perms"))
+            {
+              content = xmlNodeGetContent (node);
+              auth_token->permissions = g_strdup ((gchar *) content);
+              xmlFree (content);
+            }
+
+          /* User profile */
+          if (!g_strcmp0 ((gchar *) node->name, "user"))
+            {
+              xmlChar *value = NULL;
+
+              value = xmlGetProp (node, (const xmlChar *) "nsid");
+              auth_token->nsid = g_strdup ((gchar *) value);
+              xmlFree (value);
+
+              value = xmlGetProp (node, (const xmlChar *) "username");
+              auth_token->username = g_strdup ((gchar *) value);
+              xmlFree (value);
+
+              value = xmlGetProp (node, (const xmlChar *) "fullname");
+              auth_token->fullname = g_strdup ((gchar *) value);
+              xmlFree (value);
+            }
+        }
+
+      if (!auth_token->token)
+        {
+          /* If we don't get enough information, return NULL */
+          g_object_unref (auth_token);
+          auth_token = NULL;
+
+          err = g_error_new (FSP_ERROR, FSP_ERROR_MISSING_DATA,
+                             "No token found in the response");
+        }
+    }
+  else
+    err = g_error_new (FSP_ERROR, FSP_ERROR_MISSING_DATA,
+                       "No 'auth' node found in the response");
+  /* Free */
+  xmlXPathFreeObject (xpathObj);
+  xmlXPathFreeContext (xpathCtx);
+
+  /* Propagate error */
+  if (err != NULL)
+    g_propagate_error (error, err);
+
+  return auth_token;
+}
+
 static gpointer
 _exchange_token_parser                  (xmlDoc  *doc,
                                          GError **error)
@@ -1149,6 +1243,27 @@ fsp_parser_get_access_token             (FspParser   *self,
 }
 
 FspDataAuthToken *
+fsp_parser_check_token                  (FspParser  *self,
+                                         const gchar      *buffer,
+                                         gulong            buf_size,
+                                         GError          **error)
+{
+  FspDataAuthToken *auth_token = NULL;
+
+  g_return_val_if_fail (FSP_IS_PARSER (self), NULL);
+  g_return_val_if_fail (buffer != NULL, NULL);
+
+  /* Process the response */
+  auth_token =
+    FSP_DATA_AUTH_TOKEN (_process_xml_response (self, buffer, buf_size,
+                                                _check_token_parser,
+                                                error));
+
+  /* Return value */
+  return auth_token;
+}
+
+FspDataAuthToken *
 fsp_parser_exchange_token               (FspParser  *self,
                                          const gchar      *buffer,
                                          gulong            buf_size,
diff --git a/src/flicksoup/fsp-parser.h b/src/flicksoup/fsp-parser.h
index daf4941..f3fbd4b 100644
--- a/src/flicksoup/fsp-parser.h
+++ b/src/flicksoup/fsp-parser.h
@@ -80,6 +80,12 @@ fsp_parser_get_access_token             (FspParser  *self,
                                          GError          **error);
 
 FspDataAuthToken *
+fsp_parser_check_token                  (FspParser  *self,
+                                         const gchar      *buffer,
+                                         gulong            buf_size,
+                                         GError          **error);
+
+FspDataAuthToken *
 fsp_parser_exchange_token               (FspParser  *self,
                                          const gchar      *buffer,
                                          gulong            buf_size,
diff --git a/src/flicksoup/fsp-session.c b/src/flicksoup/fsp-session.c
index e018ef3..805a59a 100644
--- a/src/flicksoup/fsp-session.c
+++ b/src/flicksoup/fsp-session.c
@@ -138,7 +138,10 @@ static void
 _get_access_token_soup_session_cb       (SoupSession *session,
                                          SoupMessage *msg,
                                          gpointer     data);
-
+static void
+_check_token_soup_session_cb            (SoupSession *session,
+                                         SoupMessage *msg,
+                                         gpointer data);
 static void
 _exchange_token_soup_session_cb         (SoupSession *session,
                                          SoupMessage *msg,
@@ -520,6 +523,20 @@ _get_access_token_soup_session_cb       (SoupSession *session,
 }
 
 static void
+_check_token_soup_session_cb            (SoupSession *session,
+                                         SoupMessage *msg,
+                                         gpointer data)
+{
+  g_assert (SOUP_IS_MESSAGE (msg));
+  g_assert (data != NULL);
+
+  /* Handle message with the right parser */
+  _handle_soup_response (msg,
+                         (FspParserFunc) fsp_parser_check_token,
+                         data);
+}
+
+static void
 _exchange_token_soup_session_cb         (SoupSession *session,
                                          SoupMessage *msg,
                                          gpointer     data)
@@ -1971,12 +1988,12 @@ fsp_session_check_auth_info_async       (FspSession          *self,
       url = _get_signed_url (self,
                              FLICKR_API_BASE_URL,
                              AUTHORIZATION_METHOD_OAUTH_1,
-                             "method", "flickr.auth.checkToken",
+                             "method", "flickr.auth.oauth.checkToken",
                              NULL);
 
       /* Perform the async request */
       _perform_async_request (priv->soup_session, url,
-                              _get_access_token_soup_session_cb, G_OBJECT (self),
+                              _check_token_soup_session_cb, G_OBJECT (self),
                               c, cb, fsp_session_check_auth_info_async, data);
 
       g_free (url);



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