[frogr] Migrate 'checkToken' method to OAuth
- From: Mario Sanchez Prada <msanchez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [frogr] Migrate 'checkToken' method to OAuth
- Date: Mon, 9 Apr 2012 00:00:46 +0000 (UTC)
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]