[gthumb] picasaweb: remember application authorization
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] picasaweb: remember application authorization
- Date: Thu, 26 Oct 2017 16:53:24 +0000 (UTC)
commit 9a52ea18528b9755868f8387f8ccedb04a855f3f
Author: Paolo Bacchilega <paobac src gnome org>
Date: Thu Oct 26 18:43:03 2017 +0200
picasaweb: remember application authorization
when an auth error occurs ask for a new access token
[bug #784142]
extensions/picasaweb/picasa-web-service.c | 107 +++++++++++++++++++----------
1 files changed, 70 insertions(+), 37 deletions(-)
---
diff --git a/extensions/picasaweb/picasa-web-service.c b/extensions/picasaweb/picasa-web-service.c
index a7f247d..b2322a2 100644
--- a/extensions/picasaweb/picasa-web-service.c
+++ b/extensions/picasaweb/picasa-web-service.c
@@ -39,6 +39,7 @@
#define PICASA_WEB_REDIRECT_URI "urn:ietf:wg:oauth:2.0:oob"
#define PICASA_WEB_REDIRECT_TITLE "Success code="
#define PICASA_WEB_SERVICE_ERROR_TOKEN_EXPIRED 190
+#define PICASA_WEB_SERVICE_ERROR_UNAUTHORIZED 401
#define GTHUMB_PICASA_WEB_CLIENT_ID "499958842898.apps.googleusercontent.com"
#define GTHUMB_PICASA_WEB_CLIENT_SECRET "-DdIqzDxVRc_Wkobuf-2g-of"
@@ -87,6 +88,7 @@ struct _PicasaWebServicePrivate {
guint64 quota_limit;
guint64 quota_used;
PostPhotosData *post_photos;
+ int n_auth_errors;
};
@@ -174,6 +176,7 @@ picasa_web_utils_parse_json_response (SoupMessage *msg,
/* -- _picasa_web_service_get_refresh_token -- */
+
static void
_picasa_web_service_get_refresh_token_ready_cb (SoupSession *session,
SoupMessage *msg,
@@ -299,6 +302,7 @@ picasa_web_service_get_authorization_url (PicasaWebService *self)
g_hash_table_insert (data_set, "client_id", GTHUMB_PICASA_WEB_CLIENT_ID);
g_hash_table_insert (data_set, "redirect_uri", PICASA_WEB_REDIRECT_URI);
g_hash_table_insert (data_set, "scope", "https://picasaweb.google.com/data/
https://www.googleapis.com/auth/userinfo.profile");
+ g_hash_table_insert (data_set, "access_type", "offline");
link = g_string_new ("https://accounts.google.com/o/oauth2/auth?");
keys = g_hash_table_get_keys (data_set);
@@ -424,12 +428,36 @@ _picasa_web_service_get_access_token_finish (PicasaWebService *service,
/* -- picasa_web_service_get_user_info -- */
+typedef struct {
+ PicasaWebService *service;
+ GCancellable *cancellable;
+ GAsyncReadyCallback callback;
+ gpointer user_data;
+} AccessTokenData;
+
+
+static void
+access_token_data_free (AccessTokenData *data)
+{
+ _g_object_unref (data->cancellable);
+ g_free (data);
+}
+
+
+static void
+picasa_web_service_get_user_info (WebService *base,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+
static void
picasa_web_service_get_user_info_ready_cb (SoupSession *session,
SoupMessage *msg,
gpointer user_data)
{
- PicasaWebService *self = user_data;
+ AccessTokenData *data = user_data;
+ PicasaWebService *self = data->service;
GSimpleAsyncResult *result;
GError *error = NULL;
JsonNode *node;
@@ -451,37 +479,38 @@ picasa_web_service_get_user_info_ready_cb (SoupSession *session,
_g_object_unref (account);
json_node_free (node);
}
- else
+ else {
+ if (error->code == PICASA_WEB_SERVICE_ERROR_UNAUTHORIZED) {
+ self->priv->n_auth_errors += 1;
+ if (self->priv->n_auth_errors == 1) {
+ OAuthAccount *account;
+
+ /* reset the account token to force asking the
+ * access token again. */
+
+ account = web_service_get_current_account (WEB_SERVICE (self));
+ if (account != NULL)
+ _g_strset (&account->token, NULL);
+
+ picasa_web_service_get_user_info (WEB_SERVICE (self),
+ data->cancellable,
+ data->callback,
+ data->user_data);
+ access_token_data_free (data);
+ return;
+ }
+ }
g_simple_async_result_set_from_error (result, error);
+ }
+ self->priv->n_auth_errors = 0;
g_simple_async_result_complete_in_idle (result);
-}
-
-typedef struct {
- PicasaWebService *service;
- GCancellable *cancellable;
- GAsyncReadyCallback callback;
- gpointer user_data;
-} AccessTokenData;
-
-
-static void
-access_token_data_free (AccessTokenData *data)
-{
- _g_object_unref (data->cancellable);
- g_free (data);
+ access_token_data_free (data);
}
static void
-picasa_web_service_get_user_info (WebService *base,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-
-static void
access_token_ready_cb (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
@@ -493,6 +522,9 @@ access_token_ready_cb (GObject *source_object,
if (! _picasa_web_service_get_access_token_finish (self, result, &error)) {
GSimpleAsyncResult *result;
+ if (error->code == PICASA_WEB_SERVICE_ERROR_UNAUTHORIZED)
+ self->priv->n_auth_errors += 1;
+
result = g_simple_async_result_new (G_OBJECT (self),
data->callback,
data->user_data,
@@ -522,8 +554,8 @@ picasa_web_service_get_user_info (WebService *base,
{
PicasaWebService *self = PICASA_WEB_SERVICE (base);
OAuthAccount *account;
- GHashTable *data_set;
SoupMessage *msg;
+ AccessTokenData *data;
account = web_service_get_current_account (WEB_SERVICE (self));
if (account != NULL) {
@@ -531,8 +563,16 @@ picasa_web_service_get_user_info (WebService *base,
_g_strset (&self->priv->access_token, account->token);
}
- data_set = g_hash_table_new (g_str_hash, g_str_equal);
+ data = g_new0 (AccessTokenData, 1);
+ data->service = self;
+ data->cancellable = _g_object_ref (cancellable);
+ data->callback = callback;
+ data->user_data = user_data;
+
if (self->priv->access_token != NULL) {
+ GHashTable *data_set;
+
+ data_set = g_hash_table_new (g_str_hash, g_str_equal);
msg = soup_form_request_new_from_hash ("GET",
"https://www.googleapis.com/oauth2/v2/userinfo", data_set);
_picasa_web_service_add_headers (self, msg);
_web_service_send_message (WEB_SERVICE (self),
@@ -542,26 +582,18 @@ picasa_web_service_get_user_info (WebService *base,
user_data,
picasa_web_service_get_user_info,
picasa_web_service_get_user_info_ready_cb,
- self);
+ data);
+
+ g_hash_table_destroy (data_set);
}
else {
/* Get the access token from the refresh token */
-
- AccessTokenData *data;
-
- data = g_new0 (AccessTokenData, 1);
- data->service = self;
- data->cancellable = _g_object_ref (cancellable);
- data->callback = callback;
- data->user_data = user_data;
_picasa_web_service_get_access_token (self,
self->priv->refresh_token,
cancellable,
access_token_ready_cb,
data);
}
-
- g_hash_table_destroy (data_set);
}
@@ -591,6 +623,7 @@ picasa_web_service_init (PicasaWebService *self)
self->priv->quota_limit = 0;
self->priv->quota_used = 0;
self->priv->post_photos = NULL;
+ self->priv->n_auth_errors = 0;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]