[gthumb: 6/10] [flickr] store the token in the gnome keyring if available



commit 441966620ae069636228e0ebe069a572b3e21c04
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Wed Apr 7 00:54:00 2010 +0200

    [flickr] store the token in the gnome keyring if available

 extensions/flicker/Makefile.am             |    4 +-
 extensions/flicker/flickr-account.c        |   18 ++++++-
 extensions/flicker/flickr-authentication.c |   80 ++++++++++++++++++++++++++-
 3 files changed, 95 insertions(+), 7 deletions(-)
---
diff --git a/extensions/flicker/Makefile.am b/extensions/flicker/Makefile.am
index 3730c22..d5dc98d 100644
--- a/extensions/flicker/Makefile.am
+++ b/extensions/flicker/Makefile.am
@@ -35,9 +35,9 @@ libflicker_la_SOURCES = 			\
 	flickr-user.h				\
 	main.c
 
-libflicker_la_CFLAGS = $(GTHUMB_CFLAGS) $(LIBSOUP_CFLAGS) -I$(top_srcdir) -I$(top_builddir)/gthumb 
+libflicker_la_CFLAGS = $(GTHUMB_CFLAGS) $(LIBSOUP_CFLAGS) $(GNOME_KEYRING_CFLAGS) -I$(top_srcdir) -I$(top_builddir)/gthumb 
 libflicker_la_LDFLAGS = $(EXTENSION_LIBTOOL_FLAGS)
-libflicker_la_LIBADD = $(GTHUMB_LIBS) $(LIBSOUP_LIBS) 
+libflicker_la_LIBADD = $(GTHUMB_LIBS) $(LIBSOUP_LIBS) $(GNOME_KEYRING_LIBS)
 libflicker_la_DEPENDENCIES = $(top_builddir)/gthumb/gthumb$(EXEEXT)
 
 extensioninidir = $(extensiondir)
diff --git a/extensions/flicker/flickr-account.c b/extensions/flicker/flickr-account.c
index 1242e11..aa1fda4 100644
--- a/extensions/flicker/flickr-account.c
+++ b/extensions/flicker/flickr-account.c
@@ -23,6 +23,9 @@
 #include <config.h>
 #include <stdlib.h>
 #include <string.h>
+#ifdef HAVE_GNOME_KEYRING
+#include <gnome-keyring.h>
+#endif /* HAVE_GNOME_KEYRING */
 #include <gthumb.h>
 #include "flickr-account.h"
 
@@ -57,15 +60,26 @@ flickr_account_create_element (DomDomizable *base,
 			       DomDocument  *doc)
 {
 	FlickrAccount *self;
-	DomElement *element;
+	DomElement    *element;
+	gboolean       set_token;
 
 	self = FLICKR_ACCOUNT (base);
 
 	element = dom_document_create_element (doc, "account", NULL);
 	if (self->username != NULL)
 		dom_element_set_attribute (element, "username", self->username);
-	if (self->token != NULL)
+
+	/* Don't save the token in the configuration file if gnome-keyring is
+	 * available. */
+
+	set_token = TRUE;
+#ifdef HAVE_GNOME_KEYRING
+	if (gnome_keyring_is_available ())
+		set_token = FALSE;
+#endif
+	if (set_token && (self->token != NULL))
 		dom_element_set_attribute (element, "token", self->token);
+
 	if (self->is_default)
 		dom_element_set_attribute (element, "default", "1");
 
diff --git a/extensions/flicker/flickr-authentication.c b/extensions/flicker/flickr-authentication.c
index 845f081..c4ea164 100644
--- a/extensions/flicker/flickr-authentication.c
+++ b/extensions/flicker/flickr-authentication.c
@@ -22,6 +22,9 @@
 
 #include <config.h>
 #include <glib.h>
+#ifdef HAVE_GNOME_KEYRING
+#include <gnome-keyring.h>
+#endif /* HAVE_GNOME_KEYRING */
 #include "flickr-account-chooser-dialog.h"
 #include "flickr-account-manager-dialog.h"
 #include "flickr-authentication.h"
@@ -199,11 +202,16 @@ upload_status_ready_cb (GObject      *source_object,
 }
 
 
+static void start_authorization_process (FlickrAuthentication *self);
+
+
 static void
-connect_to_server (FlickrAuthentication *self)
+connect_to_server_step2 (FlickrAuthentication *self)
 {
-	g_return_if_fail (self->priv->account != NULL);
-
+	if (self->priv->account->token == NULL) {
+		start_authorization_process (self);
+		return;
+	}
 	flickr_connection_set_auth_token (self->priv->conn, self->priv->account->token);
 	flickr_service_get_upload_status (self->priv->service,
 					  self->priv->cancellable,
@@ -212,6 +220,44 @@ connect_to_server (FlickrAuthentication *self)
 }
 
 
+#ifdef HAVE_GNOME_KEYRING
+static void
+find_password_cb (GnomeKeyringResult  result,
+                  const char         *string,
+                  gpointer            user_data)
+{
+	FlickrAuthentication *self = user_data;
+
+	if (string != NULL)
+		self->priv->account->token = g_strdup (string);
+	connect_to_server_step2 (self);
+}
+#endif
+
+
+static void
+connect_to_server (FlickrAuthentication *self)
+{
+	g_return_if_fail (self->priv->account != NULL);
+
+#ifdef HAVE_GNOME_KEYRING
+	if ((self->priv->account->token == NULL) && gnome_keyring_is_available ()) {
+		gnome_keyring_find_password (GNOME_KEYRING_NETWORK_PASSWORD,
+					     find_password_cb,
+					     self,
+					     NULL,
+					     "user", self->priv->account->username,
+					     "server", self->priv->conn->server->url,
+					     "protocol", "http",
+					     NULL);
+		return;
+	}
+#endif
+
+	connect_to_server_step2 (self);
+}
+
+
 static void
 set_account (FlickrAuthentication *self,
 	     FlickrAccount        *account)
@@ -234,6 +280,17 @@ set_account (FlickrAuthentication *self,
 }
 
 
+#ifdef HAVE_GNOME_KEYRING
+static void
+store_password_done_cb (GnomeKeyringResult result,
+			gpointer           user_data)
+{
+	FlickrAuthentication *self = user_data;
+	connect_to_server (self);
+}
+#endif
+
+
 static void
 connection_token_ready_cb (GObject      *source_object,
 			   GAsyncResult *res,
@@ -257,6 +314,23 @@ connection_token_ready_cb (GObject      *source_object,
 	set_account (self, account);
 	g_object_unref (account);
 
+#ifdef HAVE_GNOME_KEYRING
+	if (gnome_keyring_is_available ()) {
+		gnome_keyring_store_password (GNOME_KEYRING_NETWORK_PASSWORD,
+					      GNOME_KEYRING_SESSION,
+					      self->priv->conn->server->name,
+					      flickr_connection_get_auth_token (self->priv->conn),
+					      store_password_done_cb,
+					      self,
+					      NULL,
+					      "user", flickr_connection_get_username (self->priv->conn),
+					      "server", self->priv->conn->server->url,
+					      "protocol", "http",
+					      NULL);
+		return;
+	}
+#endif
+
 	connect_to_server (self);
 }
 



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